New: Multi target net framework 4.6.2 and net core 3.0

pull/3823/head
ta264 5 years ago committed by Qstick
parent d0f13e16d5
commit 057829c3b0

6
.gitignore vendored

@ -134,6 +134,12 @@ bin
obj
output/*
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# Packages
Radarr_*/
Radarr_*.zip

@ -69,17 +69,21 @@ stages:
artifact: '$(osName)Backend'
displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net462/win-x64/publish'
artifact: WindowsTests
displayName: Publish Test Package
- publish: '$(testsFolder)/netcoreapp3.0/win-x64/publish'
artifact: WindowsCoreTests
displayName: Publish Windows Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net462/linux-x64/publish'
artifact: LinuxTests
displayName: Publish Test Package
displayName: Publish Linux Mono Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net462/osx-x64/publish'
artifact: MacTests
displayName: Publish Test Package
- publish: '$(testsFolder)/netcoreapp3.0/linux-x64/publish'
artifact: LinuxCoreTests
displayName: Publish Linux Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.0/osx-x64/publish'
artifact: MacCoreTests
displayName: Publish MacOS Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Build_Frontend
@ -145,9 +149,9 @@ stages:
- bash: ./build.sh --packages
displayName: Create Packages
- bash: |
setup/inno/ISCC.exe setup/radarr.iss //DFramework=net462
cp setup/output/Radarr.*windows.net462.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-installer.exe
displayName: Create .NET 462 Windows installer
setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.0
cp setup/output/Radarr.*windows.netcoreapp3.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
displayName: Create .NET Core Windows installer
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller'
displayName: Publish Installer
@ -183,35 +187,59 @@ stages:
find . -name "Radarr.Update" -exec chmod a+x {} \;
displayName: Set executable bits
- task: ArchiveFiles@2
displayName: Create Windows zip
displayName: Create Windows Core zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows.zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/windows/net462
rootFolderOrFile: $(artifactsFolder)/windows/netcoreapp3.0
- task: ArchiveFiles@2
displayName: Create MacOS app
displayName: Create MacOS Core app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app.zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos-app/net462
rootFolderOrFile: $(artifactsFolder)/macos-app/netcoreapp3.0
- task: ArchiveFiles@2
displayName: Create MacOS tar
displayName: Create MacOS Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx.tar.gz'
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).osx-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos/net462
rootFolderOrFile: $(artifactsFolder)/macos/netcoreapp3.0
- task: ArchiveFiles@2
displayName: Create Linux tar
displayName: Create Linux Mono tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net462
- task: ArchiveFiles@2
displayName: Create Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/netcoreapp3.0
- task: ArchiveFiles@2
displayName: Create ARM32 Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/netcoreapp3.0
- task: ArchiveFiles@2
displayName: Create ARM64 Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux-core-arm64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/netcoreapp3.0
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
@ -238,23 +266,35 @@ stages:
displayName: Unit Native
strategy:
matrix:
Mac:
MacCore:
osName: 'Mac'
testName: 'MacCore'
imageName: 'macos-10.13'
Windows:
WindowsCore:
osName: 'Windows'
testName: 'WindowsCore'
imageName: 'windows-2019'
LinuxCore:
osName: 'Linux'
testName: 'LinuxCore'
imageName: 'ubuntu-16.04'
pattern: 'Radarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
steps:
- checkout: none
- task: UseDotNet@2
displayName: 'Install .net core 3.0'
inputs:
version: $(dotnetVersion)
condition: ne(variables['osName'], 'Windows')
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(osName)Tests'
artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- bash: |
wget https://mediaarea.net/repo/deb/repo-mediaarea_1.0-9_all.deb
@ -266,6 +306,11 @@ stages:
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- bash: |
wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz
sudo tar xf chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz --strip-components=1 --directory /usr/bin
displayName: Install fpcalc
condition: and(succeeded(), eq(variables['osName'], 'Linux'))
- bash: |
SYMLINK=5_18_1
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
@ -289,7 +334,7 @@ stages:
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Unit Tests'
testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
- job: Unit_Docker
@ -334,6 +379,11 @@ stages:
steps:
- bash: mono --version
displayName: Check Mono version
- task: UseDotNet@2
displayName: 'Install .net core 3.0'
inputs:
version: $(dotnetVersion)
condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
@ -364,14 +414,21 @@ stages:
displayName: Integration Native
strategy:
matrix:
Mac:
MacCore:
osName: 'Mac'
testName: 'MacCore'
imageName: 'macos-10.13'
pattern: 'Radarr.**.osx.tar.gz'
Windows:
pattern: 'Radarr.**.osx-core-x64.tar.gz'
WindowsCore:
osName: 'Windows'
testName: 'WindowsCore'
imageName: 'windows-2019'
pattern: 'Radarr.**.windows.zip'
pattern: 'Radarr.**.windows-core-x64.zip'
LinuxCore:
osName: 'Linux'
testName: 'LinuxCore'
imageName: 'ubuntu-16.04'
pattern: 'Radarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
@ -385,12 +442,17 @@ stages:
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
displayName: Set Mono Version
condition: and(succeeded(), eq(variables['osName'], 'Mac'))
- task: UseDotNet@2
displayName: 'Install .net core 3.0'
inputs:
version: $(dotnetVersion)
condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(osName)Tests'
artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@ -418,7 +480,7 @@ stages:
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Integration Tests'
testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
displayName: Publish Test Results
@ -467,12 +529,17 @@ stages:
steps:
- bash: mono --version
displayName: Check Mono version
- task: UseDotNet@2
displayName: 'Install .net core 3.0'
inputs:
version: $(dotnetVersion)
condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: 'LinuxTests'
artifactName: LinuxTests
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
@ -516,29 +583,34 @@ stages:
Linux:
osName: 'Linux'
imageName: 'ubuntu-16.04'
pattern: 'Radarr.**.linux.tar.gz'
pattern: 'Radarr.**.linux-core-x64.tar.gz'
failBuild: true
Mac:
osName: 'Mac'
imageName: 'macos-10.13' # Fails due to firefox not being installed on image
pattern: 'Radarr.**.osx.tar.gz'
pattern: 'Radarr.**.osx-core-x64.tar.gz'
failBuild: false
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pattern: 'Radarr.**.windows.zip'
pattern: 'Radarr.**.windows-core-x64.zip'
failBuild: true
pool:
vmImage: $(imageName)
steps:
- task: UseDotNet@2
displayName: 'Install .net core 3.0'
inputs:
version: $(dotnetVersion)
condition: ne(variables['osName'], 'Windows')
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(osName)Tests'
artifactName: '$(osName)CoreTests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact

@ -5,8 +5,6 @@ outputFolder='_output'
testPackageFolder='_tests'
artifactsFolder="_artifacts";
nuget='tools/nuget/nuget.exe';
ProgressStart()
{
echo "Start '$1'"
@ -131,6 +129,10 @@ PackageLinux()
echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update
if [ "$framework" = "netcoreapp3.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
fi
ProgressEnd "Creating $runtime Package for $framework"
}
@ -159,6 +161,10 @@ PackageMacOS()
echo "Adding Radarr.Mono to UpdatePackage"
cp $folder/Radarr.Mono.* $folder/Radarr.Update
if [ "$framework" = "netcoreapp3.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Radarr.Update
cp $folder/libMonoPosixHelper.* $folder/Radarr.Update
fi
ProgressEnd 'Creating MacOS Package'
}
@ -189,26 +195,17 @@ PackageTests()
{
ProgressStart 'Creating Test Package'
cp test.sh $testPackageFolder/net462/win-x64/publish
cp test.sh $testPackageFolder/net462/linux-x64/publish
cp test.sh $testPackageFolder/net462/osx-x64/publish
cp test.sh $testPackageFolder/netcoreapp3.0/win-x64/publish
cp test.sh $testPackageFolder/netcoreapp3.0/linux-x64/publish
cp test.sh $testPackageFolder/netcoreapp3.0/osx-x64/publish
if [ $os = "windows" ] ; then
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/win-x64/publish
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/linux-x64/publish
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/osx-x64/publish
else
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/win-x64/publish
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/linux-x64/publish
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolder/net462/osx-x64/publish
fi
rm -f $testPackageFolder/*.log.config
# geckodriver.exe isn't copied by dotnet publish
curl -Lo gecko.zip "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-win64.zip"
unzip -o gecko.zip
cp geckodriver.exe $testPackageFolder/net462/win-x64/publish
cp geckodriver.exe $testPackageFolder/netcoreapp3.0/win-x64/publish
CleanFolder $testPackageFolder
@ -227,6 +224,8 @@ PackageWindows()
echo "Removing Radarr.Mono"
rm -f $folder/Radarr.Mono.*
rm -f $folder/Mono.Posix.NETStandard.*
rm -f $folder/libMonoPosixHelper.*
echo "Adding Radarr.Windows to UpdatePackage"
cp $folder/Radarr.Windows.* $folder/Radarr.Update
@ -318,8 +317,11 @@ fi
if [ "$PACKAGES" = "YES" ];
then
UpdateVersionNumber
PackageWindows "net462"
PackageWindows "netcoreapp3.0"
PackageLinux "net462" "linux-x64"
PackageMacOS "net462"
PackageMacOSApp "net462"
PackageLinux "netcoreapp3.0" "linux-x64"
PackageLinux "netcoreapp3.0" "linux-arm64"
PackageLinux "netcoreapp3.0" "linux-arm"
PackageMacOS "netcoreapp3.0"
PackageMacOSApp "netcoreapp3.0"
fi

@ -54,6 +54,37 @@ const mapDispatchToProps = {
dispatchFetchTagDetails: fetchTagDetails
};
function Logger(minimumLogLevel) {
this.minimumLogLevel = minimumLogLevel;
}
Logger.prototype.cleanse = function(message) {
const apikey = new RegExp(`access_token=${window.Radarr.apiKey}`, 'g');
return message.replace(apikey, 'access_token=(removed)');
};
Logger.prototype.log = function(logLevel, message) {
// see https://github.com/aspnet/AspNetCore/blob/21c9e2cc954c10719878839cd3f766aca5f57b34/src/SignalR/clients/ts/signalr/src/Utils.ts#L147
if (logLevel >= this.minimumLogLevel) {
switch (logLevel) {
case signalR.LogLevel.Critical:
case signalR.LogLevel.Error:
console.error(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
break;
case signalR.LogLevel.Warning:
console.warn(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
break;
case signalR.LogLevel.Information:
console.info(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
break;
default:
// console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug
console.log(`[signalR] ${signalR.LogLevel[logLevel]}: ${this.cleanse(message)}`);
break;
}
}
};
class SignalRConnector extends Component {
//
@ -71,6 +102,7 @@ class SignalRConnector extends Component {
const url = `${window.Radarr.urlBase}/signalr/messages`;
this.connection = new signalR.HubConnectionBuilder()
.configureLogging(new Logger(signalR.LogLevel.Information))
.withUrl(`${url}?access_token=${window.Radarr.apiKey}`)
.withAutomaticReconnect({
nextRetryDelayInMilliseconds: (retryContext) => {

@ -97,7 +97,6 @@ class GeneralSettings extends Component {
settings,
hasSettings,
isResettingApiKey,
isMono,
isWindows,
isWindowsService,
mode,
@ -162,7 +161,7 @@ class GeneralSettings extends Component {
<UpdateSettings
advancedSettings={advancedSettings}
settings={settings}
isMono={isMono}
isWindows={isWindows}
onInputChange={onInputChange}
/>
@ -203,7 +202,6 @@ GeneralSettings.propTypes = {
settings: PropTypes.object.isRequired,
isResettingApiKey: PropTypes.bool.isRequired,
hasSettings: PropTypes.bool.isRequired,
isMono: PropTypes.bool.isRequired,
isWindows: PropTypes.bool.isRequired,
isWindowsService: PropTypes.bool.isRequired,
mode: PropTypes.string.isRequired,

@ -24,7 +24,6 @@ function createMapStateToProps() {
return {
advancedSettings,
isResettingApiKey,
isMono: systemStatus.isMono,
isWindows: systemStatus.isWindows,
isWindowsService: systemStatus.isWindows && systemStatus.mode === 'service',
mode: systemStatus.mode,

@ -88,7 +88,7 @@ function HostSettings(props) {
</FormGroup>
{
enableSsl.value &&
enableSsl.value ?
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
@ -104,11 +104,12 @@ function HostSettings(props) {
onChange={onInputChange}
{...sslPort}
/>
</FormGroup>
</FormGroup> :
null
}
{
enableSsl.value &&
enableSsl.value ?
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
@ -123,11 +124,12 @@ function HostSettings(props) {
onChange={onInputChange}
{...sslCertPath}
/>
</FormGroup>
</FormGroup> :
null
}
{
enableSsl.value &&
enableSsl.value ?
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
@ -142,7 +144,8 @@ function HostSettings(props) {
onChange={onInputChange}
{...sslCertPassword}
/>
</FormGroup>
</FormGroup> :
null
}
{

@ -10,7 +10,7 @@ function UpdateSettings(props) {
const {
advancedSettings,
settings,
isMono,
isWindows,
onInputChange
} = props;
@ -49,7 +49,7 @@ function UpdateSettings(props) {
</FormGroup>
{
isMono &&
!isWindows &&
<div>
<FormGroup
advancedSettings={advancedSettings}
@ -110,7 +110,7 @@ function UpdateSettings(props) {
UpdateSettings.propTypes = {
advancedSettings: PropTypes.bool.isRequired,
settings: PropTypes.object.isRequired,
isMono: PropTypes.bool.isRequired,
isWindows: PropTypes.bool.isRequired,
onInputChange: PropTypes.func.isRequired
};

@ -38,7 +38,7 @@ class MediaManagement extends Component {
error,
settings,
hasSettings,
isMono,
isWindows,
onInputChange,
onSavePress,
...otherProps
@ -118,7 +118,7 @@ class MediaManagement extends Component {
legend="Importing"
>
{
isMono &&
!isWindows &&
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
@ -319,7 +319,7 @@ class MediaManagement extends Component {
</FieldSet>
{
advancedSettings && isMono &&
advancedSettings && !isWindows &&
<FieldSet
legend="Permissions"
>
@ -424,7 +424,7 @@ MediaManagement.propTypes = {
error: PropTypes.object,
settings: PropTypes.object.isRequired,
hasSettings: PropTypes.bool.isRequired,
isMono: PropTypes.bool.isRequired,
isWindows: PropTypes.bool.isRequired,
onSavePress: PropTypes.func.isRequired,
onInputChange: PropTypes.func.isRequired
};

@ -22,7 +22,7 @@ function createMapStateToProps() {
advancedSettings,
...sectionSettings,
hasPendingChanges: !_.isEmpty(namingSettings.pendingChanges) || sectionSettings.hasPendingChanges,
isMono: systemStatus.isMono
isWindows: systemStatus.isWindows
};
}
);

@ -15,7 +15,8 @@ class About extends Component {
render() {
const {
version,
isMonoRuntime,
isNetCore,
isMono,
isDocker,
runtimeVersion,
migrationVersion,
@ -36,18 +37,26 @@ class About extends Component {
/>
{
isMonoRuntime &&
isMono &&
<DescriptionListItem
title="Mono Version"
data={runtimeVersion}
/>
}
{
isNetCore &&
<DescriptionListItem
title=".NET Core"
data={'Yes'}
/>
}
{
isDocker &&
<DescriptionListItem
title="Docker"
data={'True'}
data={'Yes'}
/>
}
@ -90,7 +99,8 @@ class About extends Component {
About.propTypes = {
version: PropTypes.string.isRequired,
isMonoRuntime: PropTypes.bool.isRequired,
isNetCore: PropTypes.bool.isRequired,
isMono: PropTypes.bool.isRequired,
runtimeVersion: PropTypes.string.isRequired,
isDocker: PropTypes.bool.isRequired,
migrationVersion: PropTypes.number.isRequired,

@ -5,7 +5,8 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64;linux-arm;linux-arm64</RuntimeIdentifiers>
<ExcludedRuntimeFrameworkPairs>win-x64:net462;osx-x64:net462;linux-arm:net462;linux-arm64:net462</ExcludedRuntimeFrameworkPairs>
<RadarrRootDir>$(MSBuildThisFileDirectory)..\</RadarrRootDir>

Binary file not shown.

@ -38,15 +38,6 @@ namespace Marr.Data
private DbCommand _command;
/// <summary>
/// Initializes a DataMapper for the given provider type and connection string.
/// </summary>
/// <param name="providerName">Ex: </param>
/// <param name="connectionString">The database connection string.</param>
public DataMapper(string providerName, string connectionString)
: this(DbProviderFactories.GetFactory(providerName), connectionString)
{ }
/// <summary>
/// A database provider agnostic initialization.
/// </summary>

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<AssemblyVersion>3.17.0.0</AssemblyVersion>
<GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>

@ -1,68 +0,0 @@
/* Copyright (C) 2008 - 2011 Jordan Marr
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>. */
using System;
using System.Data;
using System.Data.OleDb;
namespace Marr.Data.Parameters
{
public class OleDbTypeBuilder : IDbTypeBuilder
{
public Enum GetDbType(Type type)
{
if (type == typeof(String))
return OleDbType.VarChar;
if (type == typeof(Int32))
return OleDbType.Integer;
if (type == typeof(Decimal))
return OleDbType.Decimal;
if (type == typeof(DateTime))
return OleDbType.DBTimeStamp;
if (type == typeof(Boolean))
return OleDbType.Boolean;
if (type == typeof(Int16))
return OleDbType.SmallInt;
if (type == typeof(Int64))
return OleDbType.BigInt;
if (type == typeof(Double))
return OleDbType.Double;
if (type == typeof(Byte))
return OleDbType.Binary;
if (type == typeof(Byte[]))
return OleDbType.VarBinary;
if (type == typeof(Guid))
return OleDbType.Guid;
return OleDbType.Variant;
}
public void SetDbType(IDbDataParameter param, Enum dbType)
{
var oleDbParam = (OleDbParameter)param;
oleDbParam.OleDbType = (OleDbType)dbType;
}
}
}

@ -1,71 +0,0 @@
/* Copyright (C) 2008 - 2011 Jordan Marr
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>. */
using System;
using System.Data;
using System.Data.SqlClient;
namespace Marr.Data.Parameters
{
public class SqlDbTypeBuilder : IDbTypeBuilder
{
public Enum GetDbType(Type type)
{
if (type == typeof(String))
return SqlDbType.VarChar;
if (type == typeof(Int32))
return SqlDbType.Int;
if (type == typeof(Decimal))
return SqlDbType.Decimal;
if (type == typeof(DateTime))
return SqlDbType.DateTime;
if (type == typeof(Boolean))
return SqlDbType.Bit;
if (type == typeof(Int16))
return SqlDbType.SmallInt;
if (type == typeof(Int64))
return SqlDbType.BigInt;
if (type == typeof(Double))
return SqlDbType.Float;
if (type == typeof(Char))
return SqlDbType.Char;
if (type == typeof(Byte))
return SqlDbType.Binary;
if (type == typeof(Byte[]))
return SqlDbType.VarBinary;
if (type == typeof(Guid))
return SqlDbType.UniqueIdentifier;
return SqlDbType.Variant;
}
public void SetDbType(IDbDataParameter param, Enum dbType)
{
var sqlDbParam = (SqlParameter)param;
sqlDbParam.SqlDbType = (SqlDbType)dbType;
}
}
}

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<Version>9.0.21022</Version>
</PropertyGroup>

@ -1,8 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
<PackageReference Include="NBuilder" Version="6.0.1" />
</ItemGroup>
<ItemGroup>
@ -10,4 +14,4 @@
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\Radarr.Http\Radarr.Http.csproj" />
</ItemGroup>
</Project>
</Project>

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="8.4.0" />

@ -57,7 +57,7 @@ namespace NzbDrone.Api.System
AppData = _appFolderInfo.GetAppDataPath(),
OsName = _osInfo.Name,
OsVersion = _osInfo.Version,
IsMonoRuntime = PlatformInfo.IsMono,
IsNetCore = PlatformInfo.IsNetCore,
IsMono = PlatformInfo.IsMono,
IsLinux = OsInfo.IsLinux,
IsOsx = OsInfo.IsOsx,

@ -1,8 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
<PackageReference Include="Selenium.Firefox.WebDriver" Version="0.24.0" />
<PackageReference Include="Selenium.Support" Version="3.141.0" />
</ItemGroup>

@ -158,7 +158,7 @@ namespace NzbDrone.Common.Test.Http
var response = Subject.Get<HttpBinResource>(request);
response.Resource.Headers["Accept-Encoding"].ToString().Should().Be(compression);
response.Headers.ContentLength.Should().BeLessOrEqualTo(response.Content.Length);
response.Resource.Gzipped.Should().BeTrue();
}
[TestCase(HttpStatusCode.Unauthorized)]
@ -711,6 +711,7 @@ namespace NzbDrone.Common.Test.Http
public string Origin { get; set; }
public string Url { get; set; }
public string Data { get; set; }
public bool Gzipped { get; set; }
}
public class HttpCookieResource

@ -223,7 +223,7 @@ namespace NzbDrone.Common.Test
public void get_actual_casing_should_return_actual_casing_for_local_dir_in_windows()
{
WindowsOnly();
var path = Directory.GetCurrentDirectory().Replace("c:\\","C:\\").Replace("system32", "System32");
var path = Directory.GetCurrentDirectory().Replace("c:\\","C:\\").Replace("d:\\","D:\\").Replace("system32", "System32");
path.ToUpper().GetActualCasing().Should().Be(path);
path.ToLower().GetActualCasing().Should().Be(path);
@ -280,7 +280,7 @@ namespace NzbDrone.Common.Test
[Test]
public void GetUpdateClientExePath()
{
GetIAppDirectoryInfo().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\radarr_update\Radarr.Update.exe".AsOsAgnostic());
GetIAppDirectoryInfo().GetUpdateClientExePath(PlatformType.DotNet).Should().BeEquivalentTo(@"C:\Temp\radarr_update\Radarr.Update.exe".AsOsAgnostic());
}
[Test]

@ -6,6 +6,7 @@ using System.Linq;
using System.Threading;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Model;
using NzbDrone.Common.Processes;
using NzbDrone.Test.Common;
@ -162,7 +163,17 @@ namespace NzbDrone.Common.Test
{
var processStarted = new ManualResetEventSlim();
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, DummyApp.DUMMY_PROCCESS_NAME + ".exe");
string suffix;
if (OsInfo.IsWindows || PlatformInfo.IsMono)
{
suffix = ".exe";
}
else
{
suffix = "";
}
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, DummyApp.DUMMY_PROCCESS_NAME + suffix);
var process = Subject.Start(path, onOutputDataReceived: (string data) => {
if (data.StartsWith("Dummy process. ID:"))
{

@ -1,13 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Dummy\Radarr.Test.Dummy.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.ServiceProcess" />
</ItemGroup>
</Project>
</Project>

@ -4,13 +4,13 @@ using System.ServiceProcess;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Processes;
using NzbDrone.Test.Common;
using NzbDrone.Test.Common.Categories;
namespace NzbDrone.Common.Test
{
[TestFixture]
[Timeout(15000)]
public class ServiceProviderTests : TestBase<ServiceProvider>
{
private const string ALWAYS_INSTALLED_SERVICE = "SCardSvr"; //Smart Card
@ -20,6 +20,9 @@ namespace NzbDrone.Common.Test
public void Setup()
{
WindowsOnly();
Mocker.SetConstant<IProcessProvider>(Mocker.Resolve<ProcessProvider>());
CleanupService();
}
@ -143,4 +146,4 @@ namespace NzbDrone.Common.Test
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
}
}
}

@ -6,6 +6,12 @@ using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Messaging;
using TinyIoC;
#if NETCOREAPP3_0
using System.IO;
using System.Runtime.Loader;
using System.Runtime.InteropServices;
#endif
namespace NzbDrone.Common.Composition
{
public abstract class ContainerBuilderBase
@ -21,15 +27,82 @@ namespace NzbDrone.Common.Composition
assemblies.Add(OsInfo.IsWindows ? "Radarr.Windows" : "Radarr.Mono");
assemblies.Add("Radarr.Common");
#if !NETCOREAPP3_0
foreach (var assembly in assemblies)
{
_loadedTypes.AddRange(Assembly.Load(assembly).GetTypes());
}
#else
var _startupPath = AppDomain.CurrentDomain.BaseDirectory;
foreach (var assemblyName in assemblies)
{
_loadedTypes.AddRange(AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.Combine(_startupPath, $"{assemblyName}.dll")).GetTypes());
}
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler);
RegisterNativeResolver(new [] {"System.Data.SQLite.dll", "Radarr.Core.dll"});
#endif
Container = new Container(new TinyIoCContainer(), _loadedTypes);
AutoRegisterInterfaces();
Container.Register(args);
}
}
#if NETCOREAPP3_0
private static Assembly ContainerResolveEventHandler(object sender, ResolveEventArgs args)
{
var _resolver = new AssemblyDependencyResolver(args.RequestingAssembly.Location);
var assemblyPath = _resolver.ResolveAssemblyToPath(new AssemblyName(args.Name));
if (assemblyPath == null)
{
return null;
}
return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);
}
public static void RegisterNativeResolver(IEnumerable<string> assemblyNames)
{
// This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which
// is less likely to exist.
foreach (var name in assemblyNames)
{
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, name)
);
try
{
NativeLibrary.SetDllImportResolver(assembly, LoadNativeLib);
}
catch (InvalidOperationException)
{
// This can only be set once per assembly
// Catch required for NzbDrone.Host tests
}
}
}
private static IntPtr LoadNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath)
{
var mappedName = libraryName;
if (OsInfo.IsLinux)
{
if (libraryName == "sqlite3")
{
mappedName = "libsqlite3.so.0";
}
else if (libraryName == "mediainfo")
{
mappedName = "libmediainfo.so.0";
}
}
return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath);
}
#endif
private void AutoRegisterInterfaces()
{

@ -119,21 +119,26 @@ namespace NzbDrone.Common.EnvironmentInfo
try
{
var configHome = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
if (configHome == "/.config" ||
// It seems that DoNotVerify is the mono behaviour even though .net docs specify a blank string
// should be returned if the data doesn't exist. For compatibility with .net core, explicitly
// set DoNotVerify (which makes sense given we're explicitly checking that the folder exists)
var configHome = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.DoNotVerify);
if (configHome.IsNullOrWhiteSpace() ||
configHome == "/.config" ||
configHome.EndsWith("/.config") && !_diskProvider.FolderExists(configHome.GetParentPath()) ||
!_diskProvider.FolderExists(configHome))
{
// Tell mono to use appData/.config as ApplicationData folder.
// Tell mono/netcore to use appData/.config as ApplicationData folder.
Environment.SetEnvironmentVariable("XDG_CONFIG_HOME", Path.Combine(_appFolderInfo.AppDataFolder, ".config"));
}
var dataHome = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
if (dataHome == "/.local/share" ||
var dataHome = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.DoNotVerify);
if (dataHome.IsNullOrWhiteSpace() ||
dataHome == "/.local/share" ||
dataHome.EndsWith("/.local/share") && !_diskProvider.FolderExists(dataHome.GetParentPath().GetParentPath()) ||
!_diskProvider.FolderExists(dataHome))
{
// Tell mono to use appData/.config/share as LocalApplicationData folder.
// Tell mono/netcore to use appData/.config/share as LocalApplicationData folder.
Environment.SetEnvironmentVariable("XDG_DATA_HOME", Path.Combine(_appFolderInfo.AppDataFolder, ".config/share"));
}
}

@ -33,7 +33,7 @@ namespace NzbDrone.Common.EnvironmentInfo
}
else
{
AppDataFolder = Path.Combine(Environment.GetFolderPath(DATA_SPECIAL_FOLDER, Environment.SpecialFolderOption.None), "Radarr");
AppDataFolder = Path.Combine(Environment.GetFolderPath(DATA_SPECIAL_FOLDER, Environment.SpecialFolderOption.DoNotVerify), "Radarr");
}
StartUpFolder = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName;
@ -46,4 +46,4 @@ namespace NzbDrone.Common.EnvironmentInfo
public string TempFolder { get; private set; }
}
}
}

@ -9,7 +9,8 @@ namespace NzbDrone.Common.EnvironmentInfo
public enum PlatformType
{
DotNet = 0,
Mono = 1
Mono = 1,
NetCore = 2
}
public interface IPlatformInfo
@ -26,6 +27,10 @@ namespace NzbDrone.Common.EnvironmentInfo
static PlatformInfo()
{
#if NETCOREAPP3_0
_platform = PlatformType.NetCore;
_version = new Version("3.0");
#else
if (Type.GetType("Mono.Runtime") != null)
{
_platform = PlatformType.Mono;
@ -36,11 +41,13 @@ namespace NzbDrone.Common.EnvironmentInfo
_platform = PlatformType.DotNet;
_version = GetDotNetVersion();
}
#endif
}
public static PlatformType Platform => _platform;
public static bool IsMono => Platform == PlatformType.Mono;
public static bool IsDotNet => Platform == PlatformType.DotNet;
public static bool IsNetCore => Platform == PlatformType.NetCore;
public static string PlatformName
{
@ -50,8 +57,14 @@ namespace NzbDrone.Common.EnvironmentInfo
{
return ".NET";
}
return "Mono";
else if (IsMono)
{
return "Mono";
}
else
{
return ".NET Core";
}
}
}

@ -7,6 +7,10 @@ using System.ServiceProcess;
using NLog;
using NzbDrone.Common.Processes;
#if NETCOREAPP3_0
using Microsoft.Extensions.Hosting.WindowsServices;
#endif
namespace NzbDrone.Common.EnvironmentInfo
{
public class RuntimeInfo : IRuntimeInfo
@ -55,7 +59,12 @@ namespace NzbDrone.Common.EnvironmentInfo
}
}
#if !NETCOREAPP3_0
public static bool IsUserInteractive => Environment.UserInteractive;
#else
// Note that Environment.UserInteractive is always true on net core: https://stackoverflow.com/a/57325783
public static bool IsUserInteractive => OsInfo.IsWindows && !WindowsServiceHelpers.IsWindowsService();
#endif
bool IRuntimeInfo.IsUserInteractive => IsUserInteractive;
@ -63,6 +72,11 @@ namespace NzbDrone.Common.EnvironmentInfo
{
get
{
if (OsInfo.IsNotWindows)
{
return false;
}
try
{
var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

@ -137,5 +137,15 @@ namespace NzbDrone.Common.Extensions
{
return list.Contains(source);
}
public static string ConcatToString<TSource>(this IEnumerable<TSource> source, string separator = ", ")
{
return string.Join(separator, source.Select(x => x.ToString()));
}
public static string ConcatToString<TSource>(this IEnumerable<TSource> source, Func<TSource, string> predicate, string separator = ", ")
{
return string.Join(separator, source.Select(predicate));
}
}
}

@ -15,7 +15,7 @@ namespace NzbDrone.Common.Extensions
private const string DB_RESTORE = "radarr.restore";
private const string LOG_DB = "logs.db";
private const string NLOG_CONFIG_FILE = "nlog.config";
private const string UPDATE_CLIENT_EXE = "Radarr.Update.exe";
private const string UPDATE_CLIENT_EXE_NAME = "Radarr.Update";
private static readonly string UPDATE_SANDBOX_FOLDER_NAME = "radarr_update" + Path.DirectorySeparatorChar;
private static readonly string UPDATE_PACKAGE_FOLDER_NAME = "Radarr" + Path.DirectorySeparatorChar;
@ -221,6 +221,21 @@ namespace NzbDrone.Common.Extensions
return null;
}
public static string ProcessNameToExe(this string processName, PlatformType runtime)
{
if (OsInfo.IsWindows || runtime != PlatformType.NetCore)
{
processName += ".exe";
}
return processName;
}
public static string ProcessNameToExe(this string processName)
{
return processName.ProcessNameToExe(PlatformInfo.Platform);
}
public static string GetAppDataPath(this IAppFolderInfo appFolderInfo)
{
return appFolderInfo.AppDataFolder;
@ -281,9 +296,9 @@ namespace NzbDrone.Common.Extensions
return Path.Combine(GetUpdatePackageFolder(appFolderInfo), UPDATE_CLIENT_FOLDER_NAME);
}
public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo)
public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo, PlatformType runtime)
{
return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE);
return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE_NAME).ProcessNameToExe(runtime);
}
public static string GetDatabase(this IAppFolderInfo appFolderInfo)

@ -4,7 +4,11 @@
{
public static readonly HttpAccept Rss = new HttpAccept("application/rss+xml, text/rss+xml, application/xml, text/xml");
public static readonly HttpAccept Json = new HttpAccept("application/json");
#if NETCOREAPP3_0
public static readonly HttpAccept JsonCharset = new HttpAccept("application/json; charset=utf-8");
#else
public static readonly HttpAccept JsonCharset = new HttpAccept("application/json;charset=utf-8");
#endif
public static readonly HttpAccept Html = new HttpAccept("text/html");
public string Value { get; private set; }

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNet4.SocksProxy" Version="1.4.0.1" />
@ -11,8 +11,15 @@
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="System.Data.SQLite.Core.Lidarr" Version="1.0.111.0-5" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Configuration.Install" />
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.6.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.6.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="4.6.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="3.0.0" />
<PackageReference Include="Microsoft.Win32.Registry" Version="4.6.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.ServiceProcess" />
</ItemGroup>
<ItemGroup>

@ -1,6 +1,4 @@
using System;
using System.Collections.Specialized;
using System.Configuration.Install;
using System;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
@ -62,30 +60,36 @@ namespace NzbDrone.Common
public virtual void Install(string serviceName)
{
_logger.Info("Installing service '{0}'", serviceName);
_logger.Info("Installing service '{0}'", serviceName);
var installer = new ServiceProcessInstaller
{
Account = ServiceAccount.LocalSystem
};
var args = $"create {serviceName} " +
$"DisplayName= \"{serviceName}\" " +
$"binpath= \"{Process.GetCurrentProcess().MainModule.FileName}\" " +
"start= auto " +
"depend= EventLog/Tcpip/http " +
"obj= \"NT AUTHORITY\\LocalService\"";
var serviceInstaller = new ServiceInstaller();
_logger.Info(args);
var installOutput = _processProvider.StartAndCapture("sc.exe", args);
string[] cmdline = { @"/assemblypath=" + Process.GetCurrentProcess().MainModule.FileName };
if (installOutput.ExitCode != 0)
{
_logger.Error($"Failed to install service: {installOutput.Lines.Select(x => x.Content).ConcatToString("\n")}");
throw new ApplicationException("Failed to install service");
}
var context = new InstallContext("service_install.log", cmdline);
serviceInstaller.Context = context;
serviceInstaller.DisplayName = serviceName;
serviceInstaller.ServiceName = serviceName;
serviceInstaller.Description = "Radarr Application Server";
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServicesDependedOn = new[] { "EventLog", "Tcpip", "http" };
_logger.Info(installOutput.Lines.Select(x => x.Content).ConcatToString("\n"));
serviceInstaller.Parent = installer;
var descOutput = _processProvider.StartAndCapture("sc.exe", $"description {serviceName} \"Radarr Application Server\"");
if (descOutput.ExitCode != 0)
{
_logger.Error($"Failed to install service: {descOutput.Lines.Select(x => x.Content).ConcatToString("\n")}");
throw new ApplicationException("Failed to install service");
}
serviceInstaller.Install(new ListDictionary());
_logger.Info(descOutput.Lines.Select(x => x.Content).ConcatToString("\n"));
_logger.Info("Service Has installed successfully.");
}
@ -96,12 +100,8 @@ namespace NzbDrone.Common
Stop(serviceName);
var serviceInstaller = new ServiceInstaller();
var context = new InstallContext("service_uninstall.log", null);
serviceInstaller.Context = context;
serviceInstaller.ServiceName = serviceName;
serviceInstaller.Uninstall(null);
var output = _processProvider.StartAndCapture("sc.exe", $"delete {serviceName}");
_logger.Info(output.Lines.Select(x => x.Content).ConcatToString("\n"));
_logger.Info("{0} successfully uninstalled", serviceName);
}
@ -228,4 +228,4 @@ namespace NzbDrone.Common
_processProvider.Start("sc.exe", $"sdset {serviceName} {dacls}").WaitForExit();
}
}
}
}

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
<ApplicationManifest>app.manifest</ApplicationManifest>

@ -156,7 +156,7 @@ namespace NzbDrone.Core.Test.Download
Mocker.GetMock<IIndexerStatusService>()
.Verify(v => v.RecordFailure(It.IsAny<int>(),
It.IsInRange<TimeSpan>(TimeSpan.FromMinutes(4.9), TimeSpan.FromMinutes(5.1), Range.Inclusive)), Times.Once());
It.IsInRange<TimeSpan>(TimeSpan.FromMinutes(4.9), TimeSpan.FromMinutes(5.1), Moq.Range.Inclusive)), Times.Once());
}
[Test]

@ -1,57 +0,0 @@
using System;
using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.HealthCheck.Checks;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.HealthCheck.Checks
{
[TestFixture]
public class DotnetVersionCheckFixture : CoreTest<DotnetVersionCheck>
{
private void GivenOutput(string version)
{
WindowsOnly();
Mocker.GetMock<IPlatformInfo>()
.SetupGet(s => s.Version)
.Returns(new Version(version));
}
[TestCase("4.7.2")]
[TestCase("4.8")]
public void should_return_ok(string version)
{
GivenOutput(version);
Subject.Check().ShouldBeOk();
}
[TestCase("4.6.2")]
[TestCase("4.7")]
[TestCase("4.7.1")]
public void should_return_notice(string version)
{
GivenOutput(version);
Subject.Check().ShouldBeNotice();
}
public void should_return_warning(string version)
{
GivenOutput(version);
Subject.Check().ShouldBeWarning();
}
[TestCase("4.5")]
[TestCase("4.5.2")]
[TestCase("4.6.1")]
public void should_return_error(string version)
{
GivenOutput(version);
Subject.Check().ShouldBeError();
}
}
}

@ -1,7 +1,7 @@
using System;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using Microsoft.Practices.ObjectBuilder2;
using NUnit.Framework;
using NzbDrone.Core.Housekeeping.Housekeepers;
using NzbDrone.Core.Jobs;
@ -24,7 +24,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
Subject.Clean();
AllStoredModels.ForEach(t => t.LastExecution.Should().NotBeAfter(DateTime.UtcNow));
AllStoredModels.ToList().ForEach(t => t.LastExecution.Should().NotBeAfter(DateTime.UtcNow));
}
[Test]
@ -41,7 +41,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
Subject.Clean();
AllStoredModels.ForEach(t => t.LastExecution.Should().Be(expectedTime));
AllStoredModels.ToList().ForEach(t => t.LastExecution.Should().Be(expectedTime));
}
}
}
}

@ -81,9 +81,13 @@ namespace NzbDrone.Core.Test.MediaFiles
var imported = Builder<History.History>.CreateNew()
.With(h => h.EventType = HistoryEventType.DownloadFolderImported)
.With(h => h.SourceTitle = "My Movie 2018.mkv").Build();
Mocker.GetMock<IHistoryService>().Setup(s => s.GetByMovieId(It.IsAny<int>(), null))
.Returns(new List<History.History> {imported});
Mocker.GetMock<IParsingService>().Setup(s => s.ParseMovieInfo("My Movie 2018.mkv", It.IsAny<List<object>>()))
.Returns(_newInfo);
ExecuteCommand();
Mocker.GetMock<IParsingService>().Verify(s => s.ParseMovieInfo("My Movie 2018.mkv", It.IsAny<List<object>>()));

@ -1,8 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
<PackageReference Include="NBuilder" Version="6.0.1" />
<PackageReference Include="System.Data.SQLite.Core.Lidarr" Version="1.0.111.0-5" />
</ItemGroup>
@ -10,6 +14,9 @@
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />
</ItemGroup>
<ItemGroup>
<RuntimeFiles Include="..\Runtimes\$(RuntimeIdentifier)\*"/>
</ItemGroup>
<ItemGroup>
<None Include="..\..\Logo\1024.png">
<Link>Files\1024.png</Link>
@ -19,24 +26,10 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Target Name="CopyWindowsRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='win-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\MediaInfo.dll" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyWindowsRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='win-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\MediaInfo.dll" DestinationFolder="$(PublishDir)" />
</Target>
<Target Name="CopyMacOSRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='osx-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\libmediainfo.dylib" DestinationFolder="$(OutDir)" />
<Copy SourceFiles="..\NzbDrone.Core\Radarr.Core.dll.config" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyMacOSRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='osx-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\libmediainfo.dylib" DestinationFolder="$(PublishDir)" />
<Copy SourceFiles="..\NzbDrone.Core\Radarr.Core.dll.config" DestinationFolder="$(PublishDir)" />
</Target>
<Target Name="CopyLinuxRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='linux-x64'">
<Copy SourceFiles="..\NzbDrone.Core\Radarr.Core.dll.config" DestinationFolder="$(OutDir)" />
<Target Name="CopyRuntimeFilesOnBuild" AfterTargets="AfterBuild" >
<Copy SourceFiles="@(RuntimeFiles)" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyLinuxRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='linux-x64'">
<Copy SourceFiles="..\NzbDrone.Core\Radarr.Core.dll.config" DestinationFolder="$(PublishDir)" />
<Target Name="CopyRuntimeFilesOnPublish" AfterTargets="Publish" >
<Copy SourceFiles="@(RuntimeFiles)" DestinationFolder="$(PublishDir)" />
</Target>
</Project>

@ -25,6 +25,7 @@ namespace NzbDrone.Core.Test.UpdateTests
}
[Test]
[Platform(Exclude="NetCore")]
public void finds_update_when_version_lower()
{
UseRealHttp();

@ -8,8 +8,6 @@ using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Movies.Events;
using System.Collections.Generic;
using NzbDrone.Core.Languages;
namespace NzbDrone.Core.Blacklisting
{

@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
namespace NzbDrone.Core.CustomFormats
{

@ -3,10 +3,8 @@ using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Hosting;
using Marr.Data;
using Marr.Data.QGen;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.Datastore.Extensions;

@ -1,12 +1,14 @@
using System.Collections.Generic;
using System.Data;
using FluentMigrator;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
[Migration(85)]
public class expand_transmission_urlbase : NzbDroneMigrationBase
{

@ -2,12 +2,14 @@
using System.Data;
using FluentMigrator;
using Newtonsoft.Json.Linq;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
[Migration(86)]
public class pushbullet_device_ids : NzbDroneMigrationBase
{

@ -2,12 +2,14 @@
using System.Collections.Generic;
using System.Data;
using FluentMigrator;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
[Migration(88)]
public class pushbullet_devices_channels_list : NzbDroneMigrationBase
{

@ -5,11 +5,13 @@ using NzbDrone.Core.Datastore.Converters;
using NzbDrone.Core.Languages;
using System;
using System.Collections.Generic;
using NzbDrone.Common.Extensions;
using System.Linq;
namespace NzbDrone.Core.Datastore.Migration
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
[Migration(154)]
public class add_language_to_files_history_blacklist : NzbDroneMigrationBase
{

@ -3,7 +3,6 @@ using System.Linq;
using System.Collections.Generic;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Http;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.MediaFiles.TorrentInfo;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Configuration;
@ -16,6 +15,9 @@ using NzbDrone.Core.Organizer;
namespace NzbDrone.Core.Download.Clients.Deluge
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
public class Deluge : TorrentClientBase<DelugeSettings>
{
private readonly IDelugeProxy _proxy;

@ -6,7 +6,6 @@ using System.Linq;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Exceptions;
@ -17,6 +16,9 @@ using NzbDrone.Core.Organizer;
namespace NzbDrone.Core.Download.Clients.Nzbget
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
public class Nzbget : UsenetClientBase<NzbgetSettings>
{
private readonly INzbgetProxy _proxy;

@ -1,5 +1,4 @@
using System.Linq;
using System.Collections.Generic;
using System.Collections.Generic;
using NLog;
using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Common.Extensions;
@ -16,7 +15,6 @@ using NzbDrone.Core.Movies;
using System;
using System.IO;
using NzbDrone.Core.Parser;
using NzbDrone.Core.IndexerSearch;
using NzbDrone.Core.IndexerSearch.Definitions;
namespace NzbDrone.Core.MetadataSource.PreDB

@ -368,8 +368,7 @@ namespace NzbDrone.Core.Parser
value = value.ToLowerInvariant();
//Remove all accents
var bytes = Encoding.GetEncoding("ISO-8859-8").GetBytes(value);
value = Encoding.ASCII.GetString(bytes);
value = value.RemoveAccent();
//Replace spaces
value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled);

@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.3" />
<PackageReference Include="System.ServiceModel.Syndication" Version="4.6.0" />
<PackageReference Include="FluentMigrator.Runner" Version="4.0.0-alpha.268" />
<PackageReference Include="FluentMigrator.Runner.SQLite" Version="4.0.0-alpha.268" />
<PackageReference Include="FluentValidation" Version="8.4.0" />
@ -20,33 +21,22 @@
<ProjectReference Include="..\MonoTorrent\MonoTorrent.csproj" />
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
</ItemGroup>
<ItemGroup>
<RuntimeFiles Include="..\Runtimes\$(RuntimeIdentifier)\*"/>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="..\..\Logo\64.png">
<Link>Resources\Logo\64.png</Link>
</EmbeddedResource>
</ItemGroup>
<Target Name="CopyWindowsRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='win-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\MediaInfo.dll" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyWindowsRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='win-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\MediaInfo.dll" DestinationFolder="$(PublishDir)" />
</Target>
<Target Name="CopyMacOSRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='osx-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\libmediainfo.dylib" DestinationFolder="$(OutDir)" />
<Copy SourceFiles="Radarr.Core.dll.config" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyMacOSRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='osx-x64'">
<Copy SourceFiles="..\Libraries\MediaInfo\libmediainfo.dylib" DestinationFolder="$(PublishDir)" />
<Copy SourceFiles="Radarr.Core.dll.config" DestinationFolder="$(PublishDir)" />
</Target>
<Target Name="CopyLinuxRuntimesOnBuild" AfterTargets="AfterBuild" Condition="'$(RuntimeIdentifier)'=='linux-x64'">
<Copy SourceFiles="Radarr.Core.dll.config" DestinationFolder="$(OutDir)" />
<Target Name="CopyRuntimeFilesOnBuild" AfterTargets="AfterBuild" >
<Copy SourceFiles="@(RuntimeFiles)" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyLinuxRuntimesOnPublish" AfterTargets="Publish" Condition="'$(RuntimeIdentifier)'=='linux-x64'">
<Copy SourceFiles="Radarr.Core.dll.config" DestinationFolder="$(PublishDir)" />
<Target Name="CopyRuntimeFilesOnPublish" AfterTargets="Publish" >
<Copy SourceFiles="@(RuntimeFiles)" DestinationFolder="$(PublishDir)" />
</Target>
</Project>
</Project>

@ -137,10 +137,16 @@ namespace NzbDrone.Core.Update
_logger.Info("Preparing client");
_diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move, false);
_logger.Info("Starting update client {0}", _appFolderInfo.GetUpdateClientExePath());
// Set executable flag on update app
if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore))
{
_diskProvider.SetPermissions(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), "0755", null, null);
}
_logger.Info("Starting update client {0}", _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime));
_logger.ProgressInfo("Radarr will restart shortly.");
_processProvider.Start(_appFolderInfo.GetUpdateClientExePath(), GetUpdaterArgs(updateSandboxFolder));
_processProvider.Start(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), GetUpdaterArgs(updateSandboxFolder));
}
private void EnsureValidBranch(UpdatePackage package)

@ -1,5 +1,5 @@
using System;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Core.Update
{
@ -12,5 +12,6 @@ namespace NzbDrone.Core.Update
public UpdateChanges Changes { get; set; }
public string Hash { get; set; }
public string Branch { get; set; }
public PlatformType Runtime { get; set; }
}
}

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using NzbDrone.Common.Cloud;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Http;
@ -34,6 +35,8 @@ namespace NzbDrone.Core.Update
.Resource("/update/{branch}")
.AddQueryParam("version", currentVersion)
.AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant())
.AddQueryParam("arch", RuntimeInformation.OSArchitecture)
.AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant())
.AddQueryParam("runtimeVer", _platformInfo.Version)
.SetSegment("branch", branch);
@ -70,4 +73,4 @@ namespace NzbDrone.Core.Update
return updates.Resource;
}
}
}
}

@ -1,12 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.ServiceProcess" />
</ItemGroup>
</Project>
</Project>

@ -1,20 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.0" />
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="2.2.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="3.0.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NLog.Extensions.Logging" Version="1.5.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Api\Radarr.Api.csproj" />
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />
<ProjectReference Include="..\NzbDrone.Mono\Radarr.Mono.csproj" />
<ProjectReference Include="..\NzbDrone.SignalR\Radarr.SignalR.csproj" />
<ProjectReference Include="..\NzbDrone.Windows\Radarr.Windows.csproj" />
<ProjectReference Include="..\Radarr.Api.V2\Radarr.Api.V2.csproj" />
<ProjectReference Include="..\Radarr.Http\Radarr.Http.csproj" />
</ItemGroup>
@ -23,6 +29,8 @@
<HintPath>..\Libraries\Interop.NetFwTypeLib.dll</HintPath>
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.ServiceProcess" />
</ItemGroup>
</Project>

@ -15,6 +15,7 @@ namespace Radarr.Host.Middleware
private readonly IContainer _container;
private readonly Logger _logger;
private static string API_KEY;
private static string URL_BASE;
public int Order => 1;
public SignalRMiddleware(IContainer container,
@ -24,6 +25,7 @@ namespace Radarr.Host.Middleware
_container = container;
_logger = logger;
API_KEY = configFileProvider.ApiKey;
URL_BASE = configFileProvider.UrlBase;
}
public void Attach(IApplicationBuilder appBuilder)
@ -55,11 +57,17 @@ namespace Radarr.Host.Middleware
}
});
appBuilder.UseSignalR(routes =>
#if NETCOREAPP3_0
appBuilder.UseEndpoints(x =>
{
routes.MapHub<MessageHub>("/signalr/messages");
x.MapHub<MessageHub>(URL_BASE + "/signalr/messages");
});
#else
appBuilder.UseSignalR(x =>
{
x.MapHub<MessageHub>("/signalr/messages");
});
#endif
// This is a side effect of haing multiple IoC containers, TinyIoC and whatever
// Kestrel/SignalR is using. Ideally we'd have one IoC container, but that's non-trivial with TinyIoC
// TODO: Use a single IoC container if supported for TinyIoC or if we switch to another system (ie Autofac).

@ -92,15 +92,23 @@ namespace Radarr.Host
{
services
.AddSignalR()
.AddJsonProtocol(options =>
#if !NETCOREAPP3_0
.AddJsonProtocol(
#else
.AddNewtonsoftJsonProtocol(
#endif
options =>
{
options.PayloadSerializerSettings = Json.GetSerializerSettings();
});
})
.Configure(app =>
{
app.UsePathBase(_configFileProvider.UrlBase);
#if NETCOREAPP3_0
app.UseRouting();
#endif
app.Properties["host.AppName"] = BuildInfo.AppName;
app.UsePathBase(_configFileProvider.UrlBase);
foreach (var middleWare in _middlewares.OrderBy(c => c.Order))
{

@ -8,6 +8,7 @@ using NzbDrone.Common.Disk;
using System.Reflection;
using System.IO;
using System.Collections.Generic;
using NzbDrone.Common;
namespace NzbDrone.Integration.Test.ApiTests
{
@ -61,7 +62,7 @@ namespace NzbDrone.Integration.Test.ApiTests
result.Directories.Should().NotBeNullOrEmpty();
result.Files.Should().NotBeNullOrEmpty();
result.Files.Should().Contain(v => v.Path == _file && v.Type == FileSystemEntityType.File);
result.Files.Should().Contain(v => PathEqualityComparer.Instance.Equals(v.Path, _file) && v.Type == FileSystemEntityType.File);
}
[Test]

@ -69,7 +69,9 @@ namespace NzbDrone.Integration.Test.Client
private static void AssertDisableCache(IList<Parameter> headers)
{
headers.Single(c => c.Name == "Cache-Control").Value.Should().Be("no-cache, no-store, must-revalidate, max-age=0");
// cache control header gets reordered on net core
((string)headers.Single(c => c.Name == "Cache-Control").Value).Split(',').Select(x => x.Trim())
.Should().BeEquivalentTo("no-store, must-revalidate, no-cache, max-age=0".Split(',').Select(x => x.Trim()));
headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache");
headers.Single(c => c.Name == "Expires").Value.Should().Be("0");
}

@ -1,10 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="1.1.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\Radarr.Api.V2\Radarr.Api.V2.csproj" />

@ -1,8 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
</ItemGroup>
</Project>
</Project>

@ -1,20 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<PackageReference Include="Mono.Posix-4.5" Version="4.5.0" PrivateAssets="all"/>
</ItemGroup>
<!--
The netstandard veresion here doesn't work in net framework
See https://github.com/xamarin/XamarinComponents/issues/282
-->
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common.Test\Radarr.Common.Test.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Mono\Radarr.Mono.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="Mono.Posix">
<HintPath>..\Libraries\Mono.Posix.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Update="Files\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
</Project>

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using Mono.Unix;
using Mono.Unix.Native;
using NLog;
@ -57,9 +58,10 @@ namespace NzbDrone.Mono.Disk
try
{
var fs = File.GetAccessControl(filename);
var file = new FileInfo(filename);
var fs = file.GetAccessControl();
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(filename, fs);
file.SetAccessControl(fs);
}
catch (NotImplementedException)
{

@ -5,10 +5,12 @@ using System.Linq;
using System.Text.RegularExpressions;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Mono.Disk
{
// this is here to resolve ambiguity in GetValueOrDefault extension method in net core 3
using NzbDrone.Common.Extensions;
public interface IProcMountProvider
{
List<IMount> GetMounts();

@ -1,16 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="4.6.7" />
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<PackageReference Include="Mono.Posix-4.5" Version="4.5.0" PrivateAssets="all"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
<!--
The netstandard veresion here doesn't work in net framework
See https://github.com/xamarin/XamarinComponents/issues/282
-->
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.6.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="Mono.Posix">
<HintPath>..\Libraries\Mono.Posix.dll</HintPath>
</Reference>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
</ItemGroup>
</Project>
</Project>

@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
</ItemGroup>
</Project>

@ -9,6 +9,7 @@ using System.Runtime.CompilerServices;
using Unity;
using Moq;
using Moq.Language.Flow;
using NzbDrone.Common.Composition;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Test.Common.AutoMoq.Unity;
using Unity.Resolution;
@ -140,6 +141,10 @@ namespace NzbDrone.Test.Common.AutoMoq
_registeredMocks = new Dictionary<Type, object>();
AddTheAutoMockingContainerExtensionToTheContainer(container);
#if NETCOREAPP3_0
ContainerBuilderBase.RegisterNativeResolver(new [] {"System.Data.SQLite.dll", "Radarr.Core.dll"});
#endif
}
private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container)

@ -36,15 +36,28 @@ namespace NzbDrone.Test.Common
GenerateConfigFile();
var radarrConsoleExe = OsInfo.IsWindows ? "Radarr.Console.exe" : "Radarr.exe";
string consoleExe;
if (OsInfo.IsWindows)
{
consoleExe = "Radarr.Console.exe";
}
else if (PlatformInfo.IsMono)
{
consoleExe = "Radarr.exe";
}
else
{
consoleExe = "Radarr";
}
if (BuildInfo.IsDebug)
{
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net462", "Radarr.Console.exe"));
var frameworkFolder = PlatformInfo.IsNetCore ? "netcoreapp3.0" : "net462";
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", frameworkFolder, consoleExe));
}
else
{
Start(Path.Combine("bin", radarrConsoleExe));
Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "bin", consoleExe));
}
while (true)

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.9.0" />
@ -9,10 +9,10 @@
<PackageReference Include="NLog" Version="4.6.7" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="RestSharp" Version="106.6.10" />
<PackageReference Include="Unity" Version="2.1.505.2" />
<PackageReference Include="Unity" Version="5.11.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Core\Radarr.Core.csproj" />
</ItemGroup>
</Project>
</Project>

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

@ -1,9 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Update\Radarr.Update.csproj" />
</ItemGroup>
</Project>
</Project>

@ -3,6 +3,7 @@ using Moq;
using NUnit.Framework;
using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Processes;
using NzbDrone.Test.Common;
using NzbDrone.Update.UpdateEngine;
@ -27,7 +28,7 @@ namespace NzbDrone.Update.Test
public void should_start_console_if_app_type_was_service_but_start_failed_because_of_permissions()
{
string targetFolder = "c:\\Radarr\\".AsOsAgnostic();
string targetProcess = "c:\\Radarr\\Radarr.Console.exe".AsOsAgnostic();
string targetProcess = "c:\\Radarr\\Radarr.Console".AsOsAgnostic().ProcessNameToExe();
Mocker.GetMock<IServiceProvider>().Setup(c => c.Start(ServiceProvider.SERVICE_NAME)).Throws(new InvalidOperationException());

@ -1,241 +0,0 @@
/*
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FizzWare.NBuilder;
using Moq;
using NUnit.Framework;
using NzbDrone.Common;
using NzbDrone.Common.Model;
using NzbDrone.Test.Common;
using NzbDrone.Update.UpdateEngine;
namespace NzbDrone.Update.Test
{
[TestFixture]
public class UpdateProviderStartFixture : TestBase
{
private const string UPDATE_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone\";
private const string BACKUP_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone_backup\";
private const string TARGET_FOLDER = @"C:\NzbDrone\";
Mock<IIAppDirectoryInfo> _IAppDirectoryInfo;
[SetUp]
public void Setup()
{
_IAppDirectoryInfo = Mocker.GetMock<IIAppDirectoryInfo>();
_IAppDirectoryInfo.SetupGet(c => c.SystemTemp).Returns(@"C:\Temp\");
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.FolderExists(UPDATE_FOLDER))
.Returns(true);
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.FolderExists(TARGET_FOLDER))
.Returns(true);
}
private void WithInstalledService()
{
Mocker.GetMock<IServiceProvider>()
.Setup(c => c.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME))
.Returns(true);
}
private void WithServiceRunning(bool state)
{
Mocker.GetMock<IServiceProvider>()
.Setup(c => c.IsServiceRunning(ServiceProvider.NZBDRONE_SERVICE_NAME)).Returns(state);
}
[Test]
public void should_stop_nzbdrone_service_if_installed_and_running()
{
WithInstalledService();
WithServiceRunning(true);
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IServiceProvider>().Verify(c => c.Stop(ServiceProvider.NZBDRONE_SERVICE_NAME), Times.Once());
}
[Test]
public void should_not_stop_nzbdrone_service_if_installed_but_not_running()
{
WithInstalledService();
WithServiceRunning(false);
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IServiceProvider>().Verify(c => c.Stop(ServiceProvider.NZBDRONE_SERVICE_NAME), Times.Never());
}
[Test]
public void should_not_stop_nzbdrone_service_if_service_isnt_installed()
{
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IServiceProvider>().Verify(c => c.Stop(It.IsAny<string>()), Times.Never());
}
[Test]
public void should_kill_nzbdrone_process_if_running()
{
var proccesses = Builder<ProcessInfo>.CreateListOfSize(2).Build().ToList();
Mocker.GetMock<IProcessProvider>()
.Setup(c => c.GetProcessByName(ProcessProvider.NzbDroneProcessName))
.Returns(proccesses);
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IProcessProvider>().Verify(c => c.KillAll(ProcessProvider.NzbDroneProcessName), Times.Once());
}
[Test]
public void should_not_kill_nzbdrone_process_not_running()
{
Mocker.GetMock<IProcessProvider>()
.Setup(c => c.GetProcessByName(ProcessProvider.NzbDroneProcessName))
.Returns(new List<ProcessInfo>());
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IProcessProvider>().Verify(c => c.Kill(It.IsAny<int>()), Times.Never());
}
[Test]
public void should_create_backup_of_current_installation()
{
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.CopyDirectory(TARGET_FOLDER, BACKUP_FOLDER));
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
}
[Test]
public void should_copy_update_package_to_target()
{
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.CopyDirectory(UPDATE_FOLDER, TARGET_FOLDER));
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.DeleteFolder(UPDATE_FOLDER, true));
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
}
[Test]
public void should_restore_if_update_fails()
{
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.CopyDirectory(UPDATE_FOLDER, TARGET_FOLDER))
.Throws(new IOException());
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
Mocker.GetMock<IDiskProvider>()
.Verify(c => c.CopyDirectory(BACKUP_FOLDER, TARGET_FOLDER), Times.Once());
ExceptionVerification.ExpectedFatals(1);
}
[Test]
public void should_restart_service_if_service_was_running()
{
WithInstalledService();
WithServiceRunning(true);
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
VerifyServiceRestart();
}
[Test]
public void should_restart_process_if_service_was_not_running()
{
WithInstalledService();
WithServiceRunning(false);
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
VerifyProcessRestart();
}
[Test]
public void should_restart_service_if_service_was_running_and_update_fails()
{
WithInstalledService();
WithServiceRunning(true);
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.CopyDirectory(UPDATE_FOLDER, TARGET_FOLDER))
.Throws(new IOException());
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
VerifyServiceRestart();
ExceptionVerification.ExpectedFatals(1);
}
[Test]
public void should_restart_process_if_service_was_not_running_and_update_fails()
{
WithInstalledService();
WithServiceRunning(false);
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.CopyDirectory(UPDATE_FOLDER, TARGET_FOLDER))
.Throws(new IOException());
Mocker.Resolve<InstallUpdateService>().Start(TARGET_FOLDER);
VerifyProcessRestart();
ExceptionVerification.ExpectedFatals(1);
}
private void VerifyServiceRestart()
{
Mocker.GetMock<IServiceProvider>()
.Verify(c => c.Start(ServiceProvider.NZBDRONE_SERVICE_NAME), Times.Once());
Mocker.GetMock<IProcessProvider>()
.Verify(c => c.Start(It.IsAny<string>()), Times.Never());
}
private void VerifyProcessRestart()
{
Mocker.GetMock<IServiceProvider>()
.Verify(c => c.Start(It.IsAny<string>()), Times.Never());
Mocker.GetMock<IProcessProvider>()
.Verify(c => c.Start(TARGET_FOLDER + "radarr.exe"), Times.Once());
}
}
}
*/

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="4.6.7" />

@ -116,8 +116,8 @@ namespace NzbDrone.Update.UpdateEngine
_logger.Info("Copying new files to target folder");
_diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder);
// Set executable flag on Sonarr app
if (OsInfo.IsOsx)
// Set executable flag on app
if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore))
{
_diskProvider.SetPermissions(Path.Combine(installationFolder, "Radarr"), "0755", null, null);
var plistPath = Path.Combine(installationFolder, "..", "Info.plist");

@ -3,6 +3,7 @@ using System.IO;
using NLog;
using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Processes;
using IServiceProvider = NzbDrone.Common.IServiceProvider;
@ -62,12 +63,12 @@ namespace NzbDrone.Update.UpdateEngine
private void StartWinform(string installationFolder)
{
Start(installationFolder, "Radarr.exe");
Start(installationFolder, "Radarr".ProcessNameToExe());
}
private void StartConsole(string installationFolder)
{
Start(installationFolder, "Radarr.Console.exe");
Start(installationFolder, "Radarr.Console".ProcessNameToExe());
}
private void Start(string installationFolder, string fileName)
@ -83,4 +84,4 @@ namespace NzbDrone.Update.UpdateEngine
_processProvider.SpawnNewProcess(path, _startupContext.PreservedArguments);
}
}
}
}

@ -25,15 +25,17 @@ namespace NzbDrone.Windows.Test.DiskProviderTests
if (Directory.Exists(path))
{
var ds = Directory.GetAccessControl(path);
var directory = new DirectoryInfo(path);
var ds = directory.GetAccessControl();
ds.SetAccessRule(new FileSystemAccessRule(owner, FileSystemRights.Write, accessControlType));
Directory.SetAccessControl(path, ds);
directory.SetAccessControl(ds);
}
else
{
var fs = File.GetAccessControl(path);
var file = new FileInfo(path);
var fs = file.GetAccessControl();
fs.SetAccessRule(new FileSystemAccessRule(owner, FileSystemRights.Write, accessControlType));
File.SetAccessControl(path, fs);
file.SetAccessControl(fs);
}
}
}

@ -6,7 +6,7 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Windows.Test.EnvironmentInfo
{
[TestFixture]
[Platform("Win")]
[Platform("Net")]
public class DotNetPlatformInfoFixture : TestBase<PlatformInfo>
{
[Test]

@ -1,10 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
<PackageReference Include="NunitXml.TestLogger" Version="2.1.41" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common.Test\Radarr.Common.Test.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Windows\Radarr.Windows.csproj" />
</ItemGroup>
</Project>
</Project>

@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnsureThat;
@ -39,9 +40,10 @@ namespace NzbDrone.Windows.Disk
{
Ensure.That(filename, () => filename).IsValidPath();
var fs = File.GetAccessControl(filename);
var file = new FileInfo(filename);
var fs = file.GetAccessControl();
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(filename, fs);
file.SetAccessControl(fs);
}
public override void SetPermissions(string path, string mask, string user, string group)

@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="4.6.7" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.6.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />

@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
<RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>..\NzbDrone.Host\Radarr.ico</ApplicationIcon>
<ApplicationManifest>app.manifest</ApplicationManifest>
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
@ -14,7 +14,7 @@
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Radarr.Host.csproj" />
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>

@ -1,20 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Marr.Data;
using Nancy;
using NzbDrone.Api;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Messaging;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.MovieImport;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.MetadataSource.RadarrAPI;
using NzbDrone.Core.Movies.AlternativeTitles;
using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Movies;
using NzbDrone.Core.Movies.Events;
using Radarr.Http;

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="8.4.0" />

@ -59,7 +59,7 @@ namespace Radarr.Api.V2.System
AppData = _appFolderInfo.GetAppDataPath(),
OsName = _osInfo.Name,
OsVersion = _osInfo.Version,
IsMonoRuntime = PlatformInfo.IsMono,
IsNetCore = PlatformInfo.IsNetCore,
IsMono = PlatformInfo.IsMono,
IsLinux = OsInfo.IsLinux,
IsOsx = OsInfo.IsOsx,

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net462</TargetFrameworks>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="8.4.0" />

@ -1,293 +1,216 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29025.244
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Console", "NzbDrone.Console\Radarr.Console.csproj", "{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}"
ProjectSection(ProjectDependencies) = postProject
{EF32E669-774D-4144-A9AB-06E5094F1B5F} = {EF32E669-774D-4144-A9AB-06E5094F1B5F}
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35} = {0D62DE9B-33B5-4CC2-B288-E8561C27FF35}
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C} = {D171CDAA-22BE-4598-984B-F9B4A7A6D30C}
{C5953DAB-89DB-46D9-A401-D620F54B776E} = {C5953DAB-89DB-46D9-A401-D620F54B776E}
{38497DC6-E488-4B9E-A973-A1A7961B33C4} = {38497DC6-E488-4B9E-A973-A1A7961B33C4}
{BB0DC9D7-93EB-4668-82B2-AA7503685A38} = {BB0DC9D7-93EB-4668-82B2-AA7503685A38}
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5} = {0B4F09FE-275D-4A94-9FEF-CA1594639AF5}
EndProjectSection
EndProject
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{57A04B72-8088-4F75-A582-1158CF8291F7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test.Common", "Test.Common", "{47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsServiceHelpers", "WindowsServiceHelpers", "{F9E67978-5CD6-4A5F-827B-4249711C0B02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceInstall", "ServiceHelpers\ServiceInstall\ServiceInstall.csproj", "{6BCE712F-846D-4846-9D1B-A66B858DA755}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceUninstall", "ServiceHelpers\ServiceUninstall\ServiceUninstall.csproj", "{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E6B3CBE-1578-41C1-9BF9-78D818740BE9}"
ProjectSection(SolutionItems) = preProject
.nuget\NuGet.exe = .nuget\NuGet.exe
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Host", "Host", "{486ADF86-DD89-4E19-B805-9D94F19800D9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marr.Data", "Marr.Data\Marr.Data.csproj", "{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platform", "Platform", "{0F0D4998-8F5D-4467-A909-BB192C4B3B4B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platform", "Platform", "{4EACDBBC-BCD7-4765-A57B-3E08331E4749}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoTorrent", "MonoTorrent\MonoTorrent.csproj", "{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api", "NzbDrone.Api\Radarr.Api.csproj", "{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api.V2", "Radarr.Api.V2\Radarr.Api.V2.csproj", "{D1D48E1D-9EEB-470B-992C-3954F90FB014}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Http", "Radarr.Http\Radarr.Http.csproj", "{F8A02FD4-A7A4-40D0-BB81-6319105A3302}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marr.Data", "Marr.Data\Marr.Data.csproj", "{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Http", "Radarr.Http\Radarr.Http.csproj", "{C5953DAB-89DB-46D9-A401-D620F54B776E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoTorrent", "MonoTorrent\MonoTorrent.csproj", "{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api.V2", "Radarr.Api.V2\Radarr.Api.V2.csproj", "{38497DC6-E488-4B9E-A973-A1A7961B33C4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api.Test", "NzbDrone.Api.Test\Radarr.Api.Test.csproj", "{E2EA47B1-6996-417D-A6EC-28C4F202715C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api", "NzbDrone.Api\Radarr.Api.csproj", "{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Automation.Test", "NzbDrone.Automation.Test\Radarr.Automation.Test.csproj", "{2356C987-F992-4084-9DA2-5DAD1DA35E85}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Common", "NzbDrone.Common\Radarr.Common.csproj", "{BA949432-D73A-425E-B4B1-4292405DFAF6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Common.Test", "NzbDrone.Common.Test\Radarr.Common.Test.csproj", "{A628FEA4-75CC-4039-8823-27258C55D2BF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Core", "NzbDrone.Core\Radarr.Core.csproj", "{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Common", "NzbDrone.Common\Radarr.Common.csproj", "{74BF1D46-710C-42C1-82DD-34B42C58F843}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.SignalR", "NzbDrone.SignalR\Radarr.SignalR.csproj", "{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Console", "NzbDrone.Console\Radarr.Console.csproj", "{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Update", "NzbDrone.Update\Radarr.Update.csproj", "{D1C4B2AA-8776-4429-A3E3-71146C230037}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Core.Test", "NzbDrone.Core.Test\Radarr.Core.Test.csproj", "{04ECC74F-C340-4987-863E-757FB62D27C9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api.Test", "NzbDrone.Api.Test\Radarr.Api.Test.csproj", "{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Core", "NzbDrone.Core\Radarr.Core.csproj", "{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Automation.Test", "NzbDrone.Automation.Test\Radarr.Automation.Test.csproj", "{779D577B-2287-4FB8-8760-D653DBB87109}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Host.Test", "NzbDrone.Host.Test\Radarr.Host.Test.csproj", "{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Common.Test", "NzbDrone.Common.Test\Radarr.Common.Test.csproj", "{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Host", "NzbDrone.Host\Radarr.Host.csproj", "{B6913970-FB88-4F6F-83F9-00728218E3FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Core.Test", "NzbDrone.Core.Test\Radarr.Core.Test.csproj", "{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Integration.Test", "NzbDrone.Integration.Test\Radarr.Integration.Test.csproj", "{6D5618FB-45B9-44AE-BF99-8EF37519CB30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Host.Test", "NzbDrone.Host.Test\Radarr.Host.Test.csproj", "{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Libraries.Test", "NzbDrone.Libraries.Test\Radarr.Libraries.Test.csproj", "{1969394D-3181-404F-8E2C-E3E71A5BAD30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Integration.Test", "NzbDrone.Integration.Test\Radarr.Integration.Test.csproj", "{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Mono.Test", "NzbDrone.Mono.Test\Radarr.Mono.Test.csproj", "{CCE9ABBC-96BA-425B-8140-DC8102290BE3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Libraries.Test", "NzbDrone.Libraries.Test\Radarr.Libraries.Test.csproj", "{4E16E633-5AA2-426E-B5C9-D212D4F40B44}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Mono", "NzbDrone.Mono\Radarr.Mono.csproj", "{504CD0A8-523B-4A0E-99BE-C179DECA9B76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Update.Test", "NzbDrone.Update.Test\Radarr.Update.Test.csproj", "{10C356B1-0E60-4385-A3FA-3670159B5660}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.SignalR", "NzbDrone.SignalR\Radarr.SignalR.csproj", "{B30BE76E-4D20-47AA-9E03-E32613D888CC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Mono.Test", "NzbDrone.Mono.Test\Radarr.Mono.Test.csproj", "{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Test.Common", "NzbDrone.Test.Common\Radarr.Test.Common.csproj", "{B8706292-5BE8-4099-94CA-F26DDD3757E0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Windows.Test", "NzbDrone.Windows.Test\Radarr.Windows.Test.csproj", "{10B4E062-4985-4897-99DB-745DFBEED055}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Test.Dummy", "NzbDrone.Test.Dummy\Radarr.Test.Dummy.csproj", "{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Test.Common", "NzbDrone.Test.Common\Radarr.Test.Common.csproj", "{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Update.Test", "NzbDrone.Update.Test\Radarr.Update.Test.csproj", "{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Test.Dummy", "NzbDrone.Test.Dummy\Radarr.Test.Dummy.csproj", "{63872633-A00E-45DE-AB4D-61DFF4B02370}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Update", "NzbDrone.Update\Radarr.Update.csproj", "{4FBA2CBC-B022-41D6-B6DA-3166991B9172}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Mono", "NzbDrone.Mono\Radarr.Mono.csproj", "{EF32E669-774D-4144-A9AB-06E5094F1B5F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Windows.Test", "NzbDrone.Windows.Test\Radarr.Windows.Test.csproj", "{7BEDCC1E-0763-4553-B32B-0430B334ACBB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Windows", "NzbDrone.Windows\Radarr.Windows.csproj", "{BB0DC9D7-93EB-4668-82B2-AA7503685A38}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Windows", "NzbDrone.Windows\Radarr.Windows.csproj", "{3F076242-A6FA-4657-8606-AF1D150367FC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Host", "NzbDrone.Host\Radarr.Host.csproj", "{B044A5E8-D914-4671-8724-A92ADAB04C5A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceInstall", "ServiceHelpers\ServiceInstall\ServiceInstall.csproj", "{7DA231E8-A31D-4F53-8760-820861B6CE65}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceUninstall", "ServiceHelpers\ServiceUninstall\ServiceUninstall.csproj", "{0E2B067C-4A97-430C-8767-D19ACB09A63A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Mono|x86 = Mono|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.ActiveCfg = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.Build.0 = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Mono|x86.ActiveCfg = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.ActiveCfg = Release|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.Build.0 = Release|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.ActiveCfg = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.Build.0 = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Mono|x86.ActiveCfg = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.ActiveCfg = Release|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.Build.0 = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.ActiveCfg = Debug|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.Build.0 = Debug|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.ActiveCfg = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.Build.0 = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.ActiveCfg = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.Build.0 = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Debug|x86.ActiveCfg = Debug|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Debug|x86.Build.0 = Debug|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Mono|x86.ActiveCfg = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Mono|x86.Build.0 = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Release|x86.ActiveCfg = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Release|x86.Build.0 = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Debug|x86.ActiveCfg = Debug|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Debug|x86.Build.0 = Debug|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Mono|x86.ActiveCfg = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Mono|x86.Build.0 = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Release|x86.ActiveCfg = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Release|x86.Build.0 = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Debug|x86.ActiveCfg = Debug|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Debug|x86.Build.0 = Debug|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Mono|x86.ActiveCfg = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Mono|x86.Build.0 = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Release|x86.ActiveCfg = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Release|x86.Build.0 = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Debug|x86.ActiveCfg = Debug|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Debug|x86.Build.0 = Debug|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Mono|x86.ActiveCfg = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Mono|x86.Build.0 = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Release|x86.ActiveCfg = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Release|x86.Build.0 = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Debug|x86.ActiveCfg = Debug|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Debug|x86.Build.0 = Debug|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Mono|x86.ActiveCfg = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Mono|x86.Build.0 = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Release|x86.ActiveCfg = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Release|x86.Build.0 = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Debug|x86.ActiveCfg = Debug|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Debug|x86.Build.0 = Debug|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Mono|x86.ActiveCfg = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Mono|x86.Build.0 = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Release|x86.ActiveCfg = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Release|x86.Build.0 = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Debug|x86.ActiveCfg = Debug|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Debug|x86.Build.0 = Debug|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Mono|x86.ActiveCfg = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Mono|x86.Build.0 = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Release|x86.ActiveCfg = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Release|x86.Build.0 = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Debug|x86.ActiveCfg = Debug|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Debug|x86.Build.0 = Debug|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Mono|x86.ActiveCfg = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Mono|x86.Build.0 = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Release|x86.ActiveCfg = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Release|x86.Build.0 = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Debug|x86.ActiveCfg = Debug|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Debug|x86.Build.0 = Debug|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Mono|x86.ActiveCfg = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Mono|x86.Build.0 = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Release|x86.ActiveCfg = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Release|x86.Build.0 = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Debug|x86.ActiveCfg = Debug|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Debug|x86.Build.0 = Debug|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Mono|x86.ActiveCfg = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Mono|x86.Build.0 = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Release|x86.ActiveCfg = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Release|x86.Build.0 = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Debug|x86.ActiveCfg = Debug|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Debug|x86.Build.0 = Debug|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Mono|x86.ActiveCfg = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Mono|x86.Build.0 = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Release|x86.ActiveCfg = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Release|x86.Build.0 = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Debug|x86.ActiveCfg = Debug|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Debug|x86.Build.0 = Debug|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Mono|x86.ActiveCfg = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Mono|x86.Build.0 = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Release|x86.ActiveCfg = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Release|x86.Build.0 = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Debug|x86.ActiveCfg = Debug|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Debug|x86.Build.0 = Debug|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Mono|x86.ActiveCfg = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Mono|x86.Build.0 = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Release|x86.ActiveCfg = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Release|x86.Build.0 = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Debug|x86.ActiveCfg = Debug|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Debug|x86.Build.0 = Debug|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Mono|x86.ActiveCfg = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Mono|x86.Build.0 = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Release|x86.ActiveCfg = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Release|x86.Build.0 = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Debug|x86.ActiveCfg = Debug|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Debug|x86.Build.0 = Debug|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Mono|x86.ActiveCfg = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Mono|x86.Build.0 = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Release|x86.ActiveCfg = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Release|x86.Build.0 = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Debug|x86.ActiveCfg = Debug|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Debug|x86.Build.0 = Debug|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Mono|x86.ActiveCfg = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Mono|x86.Build.0 = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Release|x86.ActiveCfg = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Release|x86.Build.0 = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Debug|x86.ActiveCfg = Debug|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Debug|x86.Build.0 = Debug|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Mono|x86.ActiveCfg = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Mono|x86.Build.0 = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Release|x86.ActiveCfg = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Release|x86.Build.0 = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Debug|x86.ActiveCfg = Debug|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Debug|x86.Build.0 = Debug|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Mono|x86.ActiveCfg = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Mono|x86.Build.0 = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Release|x86.ActiveCfg = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Release|x86.Build.0 = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Debug|x86.ActiveCfg = Debug|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Debug|x86.Build.0 = Debug|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Mono|x86.ActiveCfg = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Mono|x86.Build.0 = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Release|x86.ActiveCfg = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Release|x86.Build.0 = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Debug|x86.ActiveCfg = Debug|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Debug|x86.Build.0 = Debug|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Mono|x86.ActiveCfg = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Mono|x86.Build.0 = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Release|x86.ActiveCfg = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Release|x86.Build.0 = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Debug|x86.ActiveCfg = Debug|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Debug|x86.Build.0 = Debug|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Mono|x86.ActiveCfg = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Mono|x86.Build.0 = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Release|x86.ActiveCfg = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Release|x86.Build.0 = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Debug|x86.ActiveCfg = Debug|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Debug|x86.Build.0 = Debug|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Mono|x86.ActiveCfg = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Mono|x86.Build.0 = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Release|x86.ActiveCfg = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Release|x86.Build.0 = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Debug|x86.ActiveCfg = Debug|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Debug|x86.Build.0 = Debug|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Mono|x86.ActiveCfg = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Mono|x86.Build.0 = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Release|x86.ActiveCfg = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Release|x86.Build.0 = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Debug|x86.ActiveCfg = Debug|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Debug|x86.Build.0 = Debug|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Mono|x86.ActiveCfg = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Mono|x86.Build.0 = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Release|x86.ActiveCfg = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Release|x86.Build.0 = Release|x86
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Release|Any CPU.Build.0 = Release|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Release|Any CPU.Build.0 = Release|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Release|Any CPU.Build.0 = Release|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Release|Any CPU.Build.0 = Release|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Release|Any CPU.Build.0 = Release|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Release|Any CPU.Build.0 = Release|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Release|Any CPU.Build.0 = Release|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Release|Any CPU.Build.0 = Release|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Release|Any CPU.Build.0 = Release|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Release|Any CPU.Build.0 = Release|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Release|Any CPU.Build.0 = Release|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Release|Any CPU.Build.0 = Release|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Release|Any CPU.Build.0 = Release|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Release|Any CPU.Build.0 = Release|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Release|Any CPU.Build.0 = Release|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Release|Any CPU.Build.0 = Release|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Debug|Any CPU.Build.0 = Debug|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Release|Any CPU.ActiveCfg = Release|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Release|Any CPU.Build.0 = Release|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Release|Any CPU.Build.0 = Release|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Release|Any CPU.Build.0 = Release|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Release|Any CPU.Build.0 = Release|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Release|Any CPU.Build.0 = Release|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Release|Any CPU.Build.0 = Release|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Release|Any CPU.Build.0 = Release|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Release|Any CPU.Build.0 = Release|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Release|Any CPU.Build.0 = Release|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Release|Any CPU.Build.0 = Release|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6BCE712F-846D-4846-9D1B-A66B858DA755} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{B8706292-5BE8-4099-94CA-F26DDD3757E0} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{04ECC74F-C340-4987-863E-757FB62D27C9} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{A628FEA4-75CC-4039-8823-27258C55D2BF} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{E2EA47B1-6996-417D-A6EC-28C4F202715C} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{1969394D-3181-404F-8E2C-E3E71A5BAD30} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6D5618FB-45B9-44AE-BF99-8EF37519CB30} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{2356C987-F992-4084-9DA2-5DAD1DA35E85} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{7DA231E8-A31D-4F53-8760-820861B6CE65} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{0E2B067C-4A97-430C-8767-D19ACB09A63A} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{B6913970-FB88-4F6F-83F9-00728218E3FD} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{504CD0A8-523B-4A0E-99BE-C179DECA9B76} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{3F076242-A6FA-4657-8606-AF1D150367FC} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{4EACDBBC-BCD7-4765-A57B-3E08331E4749} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{779D577B-2287-4FB8-8760-D653DBB87109} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{4E16E633-5AA2-426E-B5C9-D212D4F40B44} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{10C356B1-0E60-4385-A3FA-3670159B5660} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{10B4E062-4985-4897-99DB-745DFBEED055} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{63872633-A00E-45DE-AB4D-61DFF4B02370} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{EF32E669-774D-4144-A9AB-06E5094F1B5F} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{BB0DC9D7-93EB-4668-82B2-AA7503685A38} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{B044A5E8-D914-4671-8724-A92ADAB04C5A} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35;packages\Unity.2.1.505.2\lib\NET35
SolutionGuid = {2955716E-0882-41EC-935D-C95694C5C30F}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = NzbDrone.Console\NzbDrone.Console.csproj
EndGlobalSection
GlobalSection(JSLint) = preSolution
SolutionConfigurationLocation = JSLintOptions.xml
{7BEDCC1E-0763-4553-B32B-0430B334ACBB} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{CCE9ABBC-96BA-425B-8140-DC8102290BE3} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
EndGlobalSection
EndGlobal

@ -1,302 +1,225 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29025.244
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Console", "NzbDrone.Console\Radarr.Console.csproj", "{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}"
ProjectSection(ProjectDependencies) = postProject
{EF32E669-774D-4144-A9AB-06E5094F1B5F} = {EF32E669-774D-4144-A9AB-06E5094F1B5F}
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35} = {0D62DE9B-33B5-4CC2-B288-E8561C27FF35}
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C} = {D171CDAA-22BE-4598-984B-F9B4A7A6D30C}
{C5953DAB-89DB-46D9-A401-D620F54B776E} = {C5953DAB-89DB-46D9-A401-D620F54B776E}
{38497DC6-E488-4B9E-A973-A1A7961B33C4} = {38497DC6-E488-4B9E-A973-A1A7961B33C4}
{BB0DC9D7-93EB-4668-82B2-AA7503685A38} = {BB0DC9D7-93EB-4668-82B2-AA7503685A38}
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5} = {0B4F09FE-275D-4A94-9FEF-CA1594639AF5}
EndProjectSection
EndProject
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{57A04B72-8088-4F75-A582-1158CF8291F7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test.Common", "Test.Common", "{47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowsServiceHelpers", "WindowsServiceHelpers", "{F9E67978-5CD6-4A5F-827B-4249711C0B02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceInstall", "ServiceHelpers\ServiceInstall\ServiceInstall.csproj", "{6BCE712F-846D-4846-9D1B-A66B858DA755}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceUninstall", "ServiceHelpers\ServiceUninstall\ServiceUninstall.csproj", "{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E6B3CBE-1578-41C1-9BF9-78D818740BE9}"
ProjectSection(SolutionItems) = preProject
.nuget\NuGet.exe = .nuget\NuGet.exe
EndProjectSection
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ServiceHelpers", "ServiceHelpers", "{CF5BF374-71E4-485E-A74C-39B581323D9A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Host", "Host", "{486ADF86-DD89-4E19-B805-9D94F19800D9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marr.Data", "Marr.Data\Marr.Data.csproj", "{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platform", "Platform", "{0F0D4998-8F5D-4467-A909-BB192C4B3B4B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platform", "Platform", "{4EACDBBC-BCD7-4765-A57B-3E08331E4749}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoTorrent", "MonoTorrent\MonoTorrent.csproj", "{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api", "NzbDrone.Api\Radarr.Api.csproj", "{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api.V2", "Radarr.Api.V2\Radarr.Api.V2.csproj", "{D1D48E1D-9EEB-470B-992C-3954F90FB014}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Http", "Radarr.Http\Radarr.Http.csproj", "{F8A02FD4-A7A4-40D0-BB81-6319105A3302}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marr.Data", "Marr.Data\Marr.Data.csproj", "{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoTorrent", "MonoTorrent\MonoTorrent.csproj", "{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Http", "Radarr.Http\Radarr.Http.csproj", "{C5953DAB-89DB-46D9-A401-D620F54B776E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Api.Test", "NzbDrone.Api.Test\Radarr.Api.Test.csproj", "{E2EA47B1-6996-417D-A6EC-28C4F202715C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api.V2", "Radarr.Api.V2\Radarr.Api.V2.csproj", "{38497DC6-E488-4B9E-A973-A1A7961B33C4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Automation.Test", "NzbDrone.Automation.Test\Radarr.Automation.Test.csproj", "{2356C987-F992-4084-9DA2-5DAD1DA35E85}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api", "NzbDrone.Api\Radarr.Api.csproj", "{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Common.Test", "NzbDrone.Common.Test\Radarr.Common.Test.csproj", "{A628FEA4-75CC-4039-8823-27258C55D2BF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Common", "NzbDrone.Common\Radarr.Common.csproj", "{BA949432-D73A-425E-B4B1-4292405DFAF6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Common", "NzbDrone.Common\Radarr.Common.csproj", "{74BF1D46-710C-42C1-82DD-34B42C58F843}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Core", "NzbDrone.Core\Radarr.Core.csproj", "{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Console", "NzbDrone.Console\Radarr.Console.csproj", "{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.SignalR", "NzbDrone.SignalR\Radarr.SignalR.csproj", "{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Core.Test", "NzbDrone.Core.Test\Radarr.Core.Test.csproj", "{04ECC74F-C340-4987-863E-757FB62D27C9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Update", "NzbDrone.Update\Radarr.Update.csproj", "{D1C4B2AA-8776-4429-A3E3-71146C230037}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Core", "NzbDrone.Core\Radarr.Core.csproj", "{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Api.Test", "NzbDrone.Api.Test\Radarr.Api.Test.csproj", "{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Host.Test", "NzbDrone.Host.Test\Radarr.Host.Test.csproj", "{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Automation.Test", "NzbDrone.Automation.Test\Radarr.Automation.Test.csproj", "{779D577B-2287-4FB8-8760-D653DBB87109}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Host", "NzbDrone.Host\Radarr.Host.csproj", "{B6913970-FB88-4F6F-83F9-00728218E3FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Common.Test", "NzbDrone.Common.Test\Radarr.Common.Test.csproj", "{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Integration.Test", "NzbDrone.Integration.Test\Radarr.Integration.Test.csproj", "{6D5618FB-45B9-44AE-BF99-8EF37519CB30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Core.Test", "NzbDrone.Core.Test\Radarr.Core.Test.csproj", "{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Libraries.Test", "NzbDrone.Libraries.Test\Radarr.Libraries.Test.csproj", "{1969394D-3181-404F-8E2C-E3E71A5BAD30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Host.Test", "NzbDrone.Host.Test\Radarr.Host.Test.csproj", "{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Mono.Test", "NzbDrone.Mono.Test\Radarr.Mono.Test.csproj", "{CCE9ABBC-96BA-425B-8140-DC8102290BE3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Integration.Test", "NzbDrone.Integration.Test\Radarr.Integration.Test.csproj", "{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Mono", "NzbDrone.Mono\Radarr.Mono.csproj", "{504CD0A8-523B-4A0E-99BE-C179DECA9B76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Libraries.Test", "NzbDrone.Libraries.Test\Radarr.Libraries.Test.csproj", "{4E16E633-5AA2-426E-B5C9-D212D4F40B44}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.SignalR", "NzbDrone.SignalR\Radarr.SignalR.csproj", "{B30BE76E-4D20-47AA-9E03-E32613D888CC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Update.Test", "NzbDrone.Update.Test\Radarr.Update.Test.csproj", "{10C356B1-0E60-4385-A3FA-3670159B5660}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Test.Common", "NzbDrone.Test.Common\Radarr.Test.Common.csproj", "{B8706292-5BE8-4099-94CA-F26DDD3757E0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Mono.Test", "NzbDrone.Mono.Test\Radarr.Mono.Test.csproj", "{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Test.Dummy", "NzbDrone.Test.Dummy\Radarr.Test.Dummy.csproj", "{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Windows.Test", "NzbDrone.Windows.Test\Radarr.Windows.Test.csproj", "{10B4E062-4985-4897-99DB-745DFBEED055}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Update.Test", "NzbDrone.Update.Test\Radarr.Update.Test.csproj", "{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Test.Common", "NzbDrone.Test.Common\Radarr.Test.Common.csproj", "{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Update", "NzbDrone.Update\Radarr.Update.csproj", "{4FBA2CBC-B022-41D6-B6DA-3166991B9172}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Test.Dummy", "NzbDrone.Test.Dummy\Radarr.Test.Dummy.csproj", "{63872633-A00E-45DE-AB4D-61DFF4B02370}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Windows.Test", "NzbDrone.Windows.Test\Radarr.Windows.Test.csproj", "{7BEDCC1E-0763-4553-B32B-0430B334ACBB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Mono", "NzbDrone.Mono\Radarr.Mono.csproj", "{EF32E669-774D-4144-A9AB-06E5094F1B5F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr.Windows", "NzbDrone.Windows\Radarr.Windows.csproj", "{3F076242-A6FA-4657-8606-AF1D150367FC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Windows", "NzbDrone.Windows\Radarr.Windows.csproj", "{BB0DC9D7-93EB-4668-82B2-AA7503685A38}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Radarr", "NzbDrone\Radarr.csproj", "{0DC43D36-6680-4237-BE39-D5D094DBCE29}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr", "NzbDrone\Radarr.csproj", "{2F5F4802-BF35-476F-8F26-D53863C9B595}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceInstall", "ServiceHelpers\ServiceInstall\ServiceInstall.csproj", "{7DA231E8-A31D-4F53-8760-820861B6CE65}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radarr.Host", "NzbDrone.Host\Radarr.Host.csproj", "{B044A5E8-D914-4671-8724-A92ADAB04C5A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceUninstall", "ServiceHelpers\ServiceUninstall\ServiceUninstall.csproj", "{0E2B067C-4A97-430C-8767-D19ACB09A63A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Mono|x86 = Mono|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.ActiveCfg = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.Build.0 = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Mono|x86.ActiveCfg = Debug|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.ActiveCfg = Release|x86
{6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.Build.0 = Release|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.ActiveCfg = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.Build.0 = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Mono|x86.ActiveCfg = Debug|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.ActiveCfg = Release|x86
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.Build.0 = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.ActiveCfg = Debug|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.Build.0 = Debug|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.ActiveCfg = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.Build.0 = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.ActiveCfg = Release|x86
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.Build.0 = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Debug|x86.ActiveCfg = Debug|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Debug|x86.Build.0 = Debug|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Mono|x86.ActiveCfg = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Mono|x86.Build.0 = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Release|x86.ActiveCfg = Release|x86
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8}.Release|x86.Build.0 = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Debug|x86.ActiveCfg = Debug|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Debug|x86.Build.0 = Debug|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Mono|x86.ActiveCfg = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Mono|x86.Build.0 = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Release|x86.ActiveCfg = Release|x86
{C5953DAB-89DB-46D9-A401-D620F54B776E}.Release|x86.Build.0 = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Debug|x86.ActiveCfg = Debug|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Debug|x86.Build.0 = Debug|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Mono|x86.ActiveCfg = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Mono|x86.Build.0 = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Release|x86.ActiveCfg = Release|x86
{38497DC6-E488-4B9E-A973-A1A7961B33C4}.Release|x86.Build.0 = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Debug|x86.ActiveCfg = Debug|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Debug|x86.Build.0 = Debug|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Mono|x86.ActiveCfg = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Mono|x86.Build.0 = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Release|x86.ActiveCfg = Release|x86
{D171CDAA-22BE-4598-984B-F9B4A7A6D30C}.Release|x86.Build.0 = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Debug|x86.ActiveCfg = Debug|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Debug|x86.Build.0 = Debug|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Mono|x86.ActiveCfg = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Mono|x86.Build.0 = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Release|x86.ActiveCfg = Release|x86
{BA949432-D73A-425E-B4B1-4292405DFAF6}.Release|x86.Build.0 = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Debug|x86.ActiveCfg = Debug|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Debug|x86.Build.0 = Debug|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Mono|x86.ActiveCfg = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Mono|x86.Build.0 = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Release|x86.ActiveCfg = Release|x86
{0D62DE9B-33B5-4CC2-B288-E8561C27FF35}.Release|x86.Build.0 = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Debug|x86.ActiveCfg = Debug|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Debug|x86.Build.0 = Debug|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Mono|x86.ActiveCfg = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Mono|x86.Build.0 = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Release|x86.ActiveCfg = Release|x86
{0B4F09FE-275D-4A94-9FEF-CA1594639AF5}.Release|x86.Build.0 = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Debug|x86.ActiveCfg = Debug|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Debug|x86.Build.0 = Debug|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Mono|x86.ActiveCfg = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Mono|x86.Build.0 = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Release|x86.ActiveCfg = Release|x86
{D1C4B2AA-8776-4429-A3E3-71146C230037}.Release|x86.Build.0 = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Debug|x86.ActiveCfg = Debug|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Debug|x86.Build.0 = Debug|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Mono|x86.ActiveCfg = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Mono|x86.Build.0 = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Release|x86.ActiveCfg = Release|x86
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0}.Release|x86.Build.0 = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Debug|x86.ActiveCfg = Debug|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Debug|x86.Build.0 = Debug|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Mono|x86.ActiveCfg = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Mono|x86.Build.0 = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Release|x86.ActiveCfg = Release|x86
{779D577B-2287-4FB8-8760-D653DBB87109}.Release|x86.Build.0 = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Debug|x86.ActiveCfg = Debug|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Debug|x86.Build.0 = Debug|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Mono|x86.ActiveCfg = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Mono|x86.Build.0 = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Release|x86.ActiveCfg = Release|x86
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813}.Release|x86.Build.0 = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Debug|x86.ActiveCfg = Debug|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Debug|x86.Build.0 = Debug|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Mono|x86.ActiveCfg = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Mono|x86.Build.0 = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Release|x86.ActiveCfg = Release|x86
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD}.Release|x86.Build.0 = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Debug|x86.ActiveCfg = Debug|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Debug|x86.Build.0 = Debug|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Mono|x86.ActiveCfg = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Mono|x86.Build.0 = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Release|x86.ActiveCfg = Release|x86
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A}.Release|x86.Build.0 = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Debug|x86.ActiveCfg = Debug|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Debug|x86.Build.0 = Debug|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Mono|x86.ActiveCfg = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Mono|x86.Build.0 = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Release|x86.ActiveCfg = Release|x86
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F}.Release|x86.Build.0 = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Debug|x86.ActiveCfg = Debug|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Debug|x86.Build.0 = Debug|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Mono|x86.ActiveCfg = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Mono|x86.Build.0 = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Release|x86.ActiveCfg = Release|x86
{4E16E633-5AA2-426E-B5C9-D212D4F40B44}.Release|x86.Build.0 = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Debug|x86.ActiveCfg = Debug|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Debug|x86.Build.0 = Debug|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Mono|x86.ActiveCfg = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Mono|x86.Build.0 = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Release|x86.ActiveCfg = Release|x86
{10C356B1-0E60-4385-A3FA-3670159B5660}.Release|x86.Build.0 = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Debug|x86.ActiveCfg = Debug|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Debug|x86.Build.0 = Debug|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Mono|x86.ActiveCfg = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Mono|x86.Build.0 = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Release|x86.ActiveCfg = Release|x86
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8}.Release|x86.Build.0 = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Debug|x86.ActiveCfg = Debug|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Debug|x86.Build.0 = Debug|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Mono|x86.ActiveCfg = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Mono|x86.Build.0 = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Release|x86.ActiveCfg = Release|x86
{10B4E062-4985-4897-99DB-745DFBEED055}.Release|x86.Build.0 = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Debug|x86.ActiveCfg = Debug|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Debug|x86.Build.0 = Debug|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Mono|x86.ActiveCfg = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Mono|x86.Build.0 = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Release|x86.ActiveCfg = Release|x86
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E}.Release|x86.Build.0 = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Debug|x86.ActiveCfg = Debug|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Debug|x86.Build.0 = Debug|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Mono|x86.ActiveCfg = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Mono|x86.Build.0 = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Release|x86.ActiveCfg = Release|x86
{63872633-A00E-45DE-AB4D-61DFF4B02370}.Release|x86.Build.0 = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Debug|x86.ActiveCfg = Debug|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Debug|x86.Build.0 = Debug|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Mono|x86.ActiveCfg = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Mono|x86.Build.0 = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Release|x86.ActiveCfg = Release|x86
{EF32E669-774D-4144-A9AB-06E5094F1B5F}.Release|x86.Build.0 = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Debug|x86.ActiveCfg = Debug|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Debug|x86.Build.0 = Debug|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Mono|x86.ActiveCfg = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Mono|x86.Build.0 = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Release|x86.ActiveCfg = Release|x86
{BB0DC9D7-93EB-4668-82B2-AA7503685A38}.Release|x86.Build.0 = Release|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Debug|x86.ActiveCfg = Debug|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Debug|x86.Build.0 = Debug|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Mono|x86.ActiveCfg = Release|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Mono|x86.Build.0 = Release|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Release|x86.ActiveCfg = Release|x86
{2F5F4802-BF35-476F-8F26-D53863C9B595}.Release|x86.Build.0 = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Debug|x86.ActiveCfg = Debug|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Debug|x86.Build.0 = Debug|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Mono|x86.ActiveCfg = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Mono|x86.Build.0 = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Release|x86.ActiveCfg = Release|x86
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B}.Release|x86.Build.0 = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Debug|x86.ActiveCfg = Debug|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Debug|x86.Build.0 = Debug|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Mono|x86.ActiveCfg = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Mono|x86.Build.0 = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Release|x86.ActiveCfg = Release|x86
{B044A5E8-D914-4671-8724-A92ADAB04C5A}.Release|x86.Build.0 = Release|x86
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1D48E1D-9EEB-470B-992C-3954F90FB014}.Release|Any CPU.Build.0 = Release|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8A02FD4-A7A4-40D0-BB81-6319105A3302}.Release|Any CPU.Build.0 = Release|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A}.Release|Any CPU.Build.0 = Release|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80}.Release|Any CPU.Build.0 = Release|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2EA47B1-6996-417D-A6EC-28C4F202715C}.Release|Any CPU.Build.0 = Release|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2356C987-F992-4084-9DA2-5DAD1DA35E85}.Release|Any CPU.Build.0 = Release|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A628FEA4-75CC-4039-8823-27258C55D2BF}.Release|Any CPU.Build.0 = Release|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74BF1D46-710C-42C1-82DD-34B42C58F843}.Release|Any CPU.Build.0 = Release|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313}.Release|Any CPU.Build.0 = Release|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04ECC74F-C340-4987-863E-757FB62D27C9}.Release|Any CPU.Build.0 = Release|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82EBE37B-E3A7-4365-9B06-FA647BCC7AF0}.Release|Any CPU.Build.0 = Release|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92}.Release|Any CPU.Build.0 = Release|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6913970-FB88-4F6F-83F9-00728218E3FD}.Release|Any CPU.Build.0 = Release|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D5618FB-45B9-44AE-BF99-8EF37519CB30}.Release|Any CPU.Build.0 = Release|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1969394D-3181-404F-8E2C-E3E71A5BAD30}.Release|Any CPU.Build.0 = Release|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CCE9ABBC-96BA-425B-8140-DC8102290BE3}.Release|Any CPU.Build.0 = Release|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Debug|Any CPU.Build.0 = Debug|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Release|Any CPU.ActiveCfg = Release|Any CPU
{504CD0A8-523B-4A0E-99BE-C179DECA9B76}.Release|Any CPU.Build.0 = Release|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B30BE76E-4D20-47AA-9E03-E32613D888CC}.Release|Any CPU.Build.0 = Release|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8706292-5BE8-4099-94CA-F26DDD3757E0}.Release|Any CPU.Build.0 = Release|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D}.Release|Any CPU.Build.0 = Release|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3}.Release|Any CPU.Build.0 = Release|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FBA2CBC-B022-41D6-B6DA-3166991B9172}.Release|Any CPU.Build.0 = Release|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7BEDCC1E-0763-4553-B32B-0430B334ACBB}.Release|Any CPU.Build.0 = Release|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F076242-A6FA-4657-8606-AF1D150367FC}.Release|Any CPU.Build.0 = Release|Any CPU
{0DC43D36-6680-4237-BE39-D5D094DBCE29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0DC43D36-6680-4237-BE39-D5D094DBCE29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0DC43D36-6680-4237-BE39-D5D094DBCE29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0DC43D36-6680-4237-BE39-D5D094DBCE29}.Release|Any CPU.Build.0 = Release|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7DA231E8-A31D-4F53-8760-820861B6CE65}.Release|Any CPU.Build.0 = Release|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E2B067C-4A97-430C-8767-D19ACB09A63A}.Release|Any CPU.Build.0 = Release|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{59D9DA5C-FD93-4599-BE2F-AFC540B180C8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6BCE712F-846D-4846-9D1B-A66B858DA755} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{700D0B95-95CD-43F3-B6C9-FAA0FC1358D4} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{F6FC6BE7-0847-4817-A1ED-223DC647C3D7} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{AFA7F48E-DB81-4E39-843B-78715C6ADF0D} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{B8706292-5BE8-4099-94CA-F26DDD3757E0} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{04ECC74F-C340-4987-863E-757FB62D27C9} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6D4DE6D5-9594-4AE4-85E0-41C7FFCCED92} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{A76441EE-AB2E-4E9D-8CD3-58BE5A8514D3} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{A628FEA4-75CC-4039-8823-27258C55D2BF} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{E2EA47B1-6996-417D-A6EC-28C4F202715C} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{1969394D-3181-404F-8E2C-E3E71A5BAD30} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6D5618FB-45B9-44AE-BF99-8EF37519CB30} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{2356C987-F992-4084-9DA2-5DAD1DA35E85} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{7DA231E8-A31D-4F53-8760-820861B6CE65} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{0E2B067C-4A97-430C-8767-D19ACB09A63A} = {F9E67978-5CD6-4A5F-827B-4249711C0B02}
{AEA9EE9A-19BF-45CB-93D9-52CA443FD313} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{B6913970-FB88-4F6F-83F9-00728218E3FD} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{0DC43D36-6680-4237-BE39-D5D094DBCE29} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{8D7D5F17-96BB-4EDD-A6E6-3BCA2D6B401A} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{504CD0A8-523B-4A0E-99BE-C179DECA9B76} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{3F076242-A6FA-4657-8606-AF1D150367FC} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{4EACDBBC-BCD7-4765-A57B-3E08331E4749} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{411A9E0E-FDC6-4E25-828A-0C2CD1CD96F8} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
{D9468BE6-8242-4E7F-9470-EE6FDA8832D0} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{779D577B-2287-4FB8-8760-D653DBB87109} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{175CE3A0-0D8C-48DB-9D8D-C7BBD9591813} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{4EF23885-C1DD-4AE0-B6AF-DB045A0E83BD} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{3FDB2B34-A754-49C5-AEB2-16BC6E92372A} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{6EEF2080-FAA9-4403-A7B4-0AA91E5A390F} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{4E16E633-5AA2-426E-B5C9-D212D4F40B44} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{10C356B1-0E60-4385-A3FA-3670159B5660} = {57A04B72-8088-4F75-A582-1158CF8291F7}
{FD08732A-60BB-4ACB-9AD2-F17C8BE694C8} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{10B4E062-4985-4897-99DB-745DFBEED055} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{9D841A99-B3EA-4C35-86D0-F27C69E72B3E} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{63872633-A00E-45DE-AB4D-61DFF4B02370} = {47697CDB-27B6-4B05-B4F8-0CBE6F6EDF97}
{EF32E669-774D-4144-A9AB-06E5094F1B5F} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{BB0DC9D7-93EB-4668-82B2-AA7503685A38} = {0F0D4998-8F5D-4467-A909-BB192C4B3B4B}
{2F5F4802-BF35-476F-8F26-D53863C9B595} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{2019313B-86BD-445C-A6F9-1BCEC49FBA9B} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
{B044A5E8-D914-4671-8724-A92ADAB04C5A} = {486ADF86-DD89-4E19-B805-9D94F19800D9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35;packages\Unity.2.1.505.2\lib\NET35
SolutionGuid = {2955716E-0882-41EC-935D-C95694C5C30F}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = NzbDrone.Console\NzbDrone.Console.csproj
EndGlobalSection
GlobalSection(JSLint) = preSolution
SolutionConfigurationLocation = JSLintOptions.xml
{7BEDCC1E-0763-4553-B32B-0430B334ACBB} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{CCE9ABBC-96BA-425B-8140-DC8102290BE3} = {4EACDBBC-BCD7-4765-A57B-3E08331E4749}
{BE8533CC-A1ED-46A6-811F-2FA29CC6AD80} = {F6E3A728-AE77-4D02-BAC8-82FBC1402DDA}
EndGlobalSection
EndGlobal

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<dllmap os="osx" dll="mediainfo" target="libmediainfo.dylib"/>
<dllmap os="linux" dll="mediainfo" target="libmediainfo.so.0" />
<dllmap os="freebsd" dll="mediainfo" target="libmediainfo.so.0" />
<dllmap os="solaris" dll="mediainfo" target="libmediainfo.so.0.0.0" />
</configuration>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<dllmap os="osx" dll="mediainfo" target="libmediainfo.dylib"/>
<dllmap os="linux" dll="mediainfo" target="libmediainfo.so.0" />
<dllmap os="freebsd" dll="mediainfo" target="libmediainfo.so.0" />
<dllmap os="solaris" dll="mediainfo" target="libmediainfo.so.0.0.0" />
</configuration>

@ -1,6 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net462</TargetFrameworks>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net462;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<PackageReference Include="System.Security.Principal.Windows" Version="4.6.0" />
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save