diff --git a/.external b/.external
deleted file mode 100644
index 95a3956a53a..00000000000
--- a/.external
+++ /dev/null
@@ -1 +0,0 @@
-DevDiv/android-platform-support:main@9c8f9978a9806230f520469b38a9596ed3a607f8
diff --git a/.gdn/policheck/PoliCheck.Exclusions.xml b/.gdn/policheck/PoliCheck.Exclusions.xml
index 6300aae539a..c88953595cb 100644
--- a/.gdn/policheck/PoliCheck.Exclusions.xml
+++ b/.gdn/policheck/PoliCheck.Exclusions.xml
@@ -3,7 +3,7 @@
LICENSE-DATA|LOCALIZE
- src\Mono.Android\Profiles|src\Mono.Android\PublicAPI
+ Localize\loc|src\Mono.Android\Profiles|src\Mono.Android\PublicAPI|src\Xamarin.Installer.AndroidSDK\Feeds|src\Xamarin.Installer.AndroidSDK\Resources|src\Xamarin.Installer.AndroidSDK\Xamarin.Installer.AndroidSDK\Kajabity.Tools.Java
diff --git a/.gitignore b/.gitignore
index 77ef9330505..61bad7b5f60 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,9 +22,7 @@ apk-sizes-*.txt
*.binlog
*.ProjectImports.zip
*~
-external/android-platform-support/
external/monodroid/
-external/android-platform-support/
external/mono/
tests/api-compatibility/reference/*/*.dll
tests/api-compatibility/reference/*/*.cs
diff --git a/.gitmodules b/.gitmodules
index c5443e9db15..760c2b84aeb 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -34,3 +34,6 @@
path = external/xxHash
url = https://github.com/Cyan4973/xxHash.git
branch = release
+[submodule "external/termux-elf-cleaner"]
+ path = external/termux-elf-cleaner
+ url = https://github.com/termux/termux-elf-cleaner
diff --git a/Directory.Build.props b/Directory.Build.props
index f80effb6135..a33b7f5ea0d 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -57,6 +57,16 @@
2.17.32.14.15.9.3
+
+ 2.3.0
+ 2.5.2
+ 5.0.0
+ 7.1.0-final.1.21458.1
+ 7.2.4
+ 3.2.26
+ 3.2.26
+ 1.3.3
+ 7.0.0
@@ -75,6 +85,8 @@
<_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.Android.Build.Tests.csproj' ">true
<_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.Android.JcwGen-Tests.csproj' ">true
<_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.Android.NUnitLite.NET.csproj' ">true
+ <_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.Installer.AndroidSDK.csproj' ">true
+ <_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.Installer.Common.csproj' ">true
<_AllowProjectWarnings Condition=" '$(MSBuildProjectFile)' == 'Xamarin.ProjectTools.csproj' ">true
true
diff --git a/Documentation/building/unix/instructions.md b/Documentation/building/unix/instructions.md
index e2e848b5d64..7283fa25f3c 100644
--- a/Documentation/building/unix/instructions.md
+++ b/Documentation/building/unix/instructions.md
@@ -16,16 +16,7 @@ can also be used by setting the `$(MSBUILD)` make variable to `xbuild`.
4. (Optional) [Configure the build](../configuration.md).
- 5. (For Microsoft team members only) (Optional) Prepare external
- proprietary git dependencies
-
- make prepare-external-git-dependencies
-
- This will clone or update a monodroid checkout in `external` and
- ensure that subsequent `prepare` and `make` invocations will build
- proprietary components.
-
- 6. Prepare the project:
+ 5. Prepare the project:
make prepare
# -or-
@@ -108,9 +99,6 @@ Alternatively, .NET for Android workload packs can be built with:
Several `.nupkg` files will be output in `./bin/Build$(Configuration)/nuget-unsigned`.
-Commercial installers will be created by this command if the
-`make prepare-external-git-dependencies` command was ran before building.
-
# Running Unit Tests
diff --git a/Documentation/building/windows/instructions.md b/Documentation/building/windows/instructions.md
index 70a214b821f..9fe2b5a8657 100644
--- a/Documentation/building/windows/instructions.md
+++ b/Documentation/building/windows/instructions.md
@@ -30,16 +30,7 @@ be available within the Command-Line environment.
dotnet-local.cmd build Xamarin.Android.sln
- 7. (For Microsoft team members only - Optional) In a [Developer Command
- Prompt][developer-prompt], build external proprietary git
- dependencies:
-
- dotnet-local.cmd build Xamarin.Android.sln -t:BuildExternal
-
- This will clone and build external proprietary components such as
- the `android-platform-support` repository in Azure DevOps.
-
- 8. Configure local `android` workload:
+ 7. Configure local `android` workload:
dotnet-local.cmd build build-tools/create-packs/Microsoft.Android.Sdk.proj -t:ConfigureLocalWorkload
@@ -114,10 +105,6 @@ Once `dotnet msbuild Xamarin.Android.sln -t:Prepare` is complete,
Several `.nupkg` files will be output in `.\bin\Build$(Configuration)\nuget-unsigned`.
-Commercial packages will be created by this command if the
-`dotnet-local.cmd build Xamarin.Android.sln -t:BuildExternal`
-command was ran before building.
-
## Building Unit Tests
Once `dotnet-local.cmd build Xamarin.Android.sln` has completed, the unit tests may
diff --git a/Documentation/guides/vscode-support.md b/Documentation/guides/vscode-support.md
index 38ceb27b73d..6d0a2d94620 100644
--- a/Documentation/guides/vscode-support.md
+++ b/Documentation/guides/vscode-support.md
@@ -16,7 +16,6 @@ Select **Build All .NET for Android**. You will then be presented with a
list of options:
* `Prepare` - Installs the required Dependencies.
-* `PrepareExternal` - Installs the required Commercial Dependencies (Xamarin Team Members Only)
* `Build` - Build .NET for Android.
* `Pack` - Create the NuGet Packages.
* `Everything` - Calls Prepare, Build and Pack.
@@ -25,10 +24,6 @@ The normal order is `Prepare`, `Build` then `Pack`. This will result in
a usable copy of .NET for Android. You can now use it to build apps
and run the unit tests.
-Note: `PrepareExternal` is for internal Xamarin Team members only, this sets up
-the commercial parts of the repository. Trying to use this command when you
-do not have access to the required repositories will result in a failure.
-
## Running/Debugging Unit Tests
Xamarin.Android Legacy uses the
diff --git a/Localize/LocProject.json b/Localize/LocProject.json
index 430efece892..2d7569187a5 100644
--- a/Localize/LocProject.json
+++ b/Localize/LocProject.json
@@ -12,6 +12,36 @@
"CopyOption": "LangIDOnName",
"SourceFile": ".\\src\\Xamarin.Android.Build.Tasks\\Properties\\Resources.resx",
"OutputPath": ".\\src\\Xamarin.Android.Build.Tasks\\Properties\\"
+ },
+ {
+ "CopyOption": "LangIDOnName",
+ "SourceFile": ".\\src\\Xamarin.Installer.Common\\Properties\\Resources.resx",
+ "OutputPath": ".\\src\\Xamarin.Installer.Common\\Properties\\",
+ "LclFile": "Localize\\loc\\{Lang}\\Xamarin.Installer.Common\\Properties\\Resources.resx.lcl"
+ },
+ {
+ "CopyOption": "LangIDOnName",
+ "SourceFile": ".\\src\\Xamarin.Installer.AndroidSDK\\Properties\\Resources.resx",
+ "OutputPath": ".\\src\\Xamarin.Installer.AndroidSDK\\Properties\\",
+ "LclFile": "Localize\\loc\\{Lang}\\Xamarin.Installer.AndroidSDK\\Properties\\Resources.resx.lcl"
+ },
+ {
+ "CopyOption": "LangIDOnName",
+ "SourceFile": ".\\src\\Xamarin.Installer.Build.Tasks\\Properties\\Resources.resx",
+ "OutputPath": ".\\src\\Xamarin.Installer.Build.Tasks\\Properties\\",
+ "LclFile": "Localize\\loc\\{Lang}\\Xamarin.Installer.Build.Tasks\\Properties\\Resources.resx.lcl"
+ },
+ {
+ "CopyOption": "LangIDOnName",
+ "SourceFile": ".\\src\\Xamarin.AndroidTools\\Properties\\Resources.resx",
+ "OutputPath": ".\\src\\Xamarin.AndroidTools\\Properties\\",
+ "LclFile": "Localize\\loc\\{Lang}\\Xamarin.AndroidTools\\Properties\\Resources.resx.lcl"
+ },
+ {
+ "CopyOption": "LangIDOnName",
+ "SourceFile": ".\\src\\Xamarin.Android.Build.Debugging.Tasks\\Properties\\Resources.resx",
+ "OutputPath": ".\\src\\Xamarin.Android.Build.Debugging.Tasks\\Properties\\",
+ "LclFile": "Localize\\loc\\{Lang}\\tools\\msbuild\\Properties\\Resources.resx.lcl"
}
]
}
diff --git a/Localize/loc/cs/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/cs/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..bf0bdc4c106
--- /dev/null
+++ b/Localize/loc/cs/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/cs/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/cs/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..9eeec9c1b19
--- /dev/null
+++ b/Localize/loc/cs/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/cs/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/cs/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..d4b9a89379c
--- /dev/null
+++ b/Localize/loc/cs/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/cs/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/cs/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..6184e829c3f
--- /dev/null
+++ b/Localize/loc/cs/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/cs/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/cs/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..47766a3804d
--- /dev/null
+++ b/Localize/loc/cs/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Odeslat zpětnou vazbu->Nahlásit problém v aplikaci Visual Studio]D;]A; nebo Nápověda->Nahlásit problém v aplikaci Visual Studio pro Mac. Pokud je to možné, připojte úplný diagnostický]D;]A; protokol buildu k sestavě zpětné vazby, protože to nám pomůže diagnostikovat problém.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Odeslat zpětnou vazbu->Nahlásit problém v aplikaci Visual Studio]D;]A;nebo Nápověda->Nahlásit problém v aplikaci Visual Studio pro Mac.]D;]A;Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/de/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..8cb023d9455
--- /dev/null
+++ b/Localize/loc/de/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/de/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..32a8dcd3a6f
--- /dev/null
+++ b/Localize/loc/de/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/de/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..b6aa0d8d034
--- /dev/null
+++ b/Localize/loc/de/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/de/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..10a0243eed7
--- /dev/null
+++ b/Localize/loc/de/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/de/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..91dddd38ca0
--- /dev/null
+++ b/Localize/loc/de/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Feedback senden->Ein Problem melden“ in Visual Studio]D;]A; oder „Hilfe->Ein Problem melden“ in Visual Studio für Mac. Fügen Sie nach Möglichkeit ein vollständiges Diagnosebuild]D;]A; Protokoll im Feedbackbericht an, da uns dies bei der Diagnose des Problems hilft.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Feedback senden->Ein Problem melden“ in Visual Studio]D;]A;oder „Hilfe->Ein Problem melden“ in Visual Studio für Mac.]D;]A;Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/es/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..c4092ea900e
--- /dev/null
+++ b/Localize/loc/es/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/es/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..cd436a3e0c1
--- /dev/null
+++ b/Localize/loc/es/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/es/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..2c01886e191
--- /dev/null
+++ b/Localize/loc/es/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/es/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..0866890b955
--- /dev/null
+++ b/Localize/loc/es/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/es/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..e9a1dad5bc6
--- /dev/null
+++ b/Localize/loc/es/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Send Feedback->Report a Problem" en Visual Studio]D;]A; o "Help->Report a Problem" en Visual Studio para Mac. Si es posible, adjunte una compilación de diagnóstico completa]D;]A; inicie sesión en el informe de comentarios, ya que esto nos ayudará a diagnosticar el problema.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Send Feedback->Report a Problem" en Visual Studio]D;]A;o "Help->Report a Problem" en Visual Studio para Mac.]D;]A;Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/fr/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..04011c4e2a8
--- /dev/null
+++ b/Localize/loc/fr/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/fr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..7ad9fb3b555
--- /dev/null
+++ b/Localize/loc/fr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/fr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..518cac0c4c4
--- /dev/null
+++ b/Localize/loc/fr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/fr/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..cfe52251cca
--- /dev/null
+++ b/Localize/loc/fr/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/fr/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..cee0e747579
--- /dev/null
+++ b/Localize/loc/fr/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Send Feedback->Report a Problem » dans Visual Studio]D;]A; ou « Help->Reporter un problème » dans Visual Studio pour Mac. Si possible, attachez une build de diagnostic complète]D;]A; connectez-vous au rapport de commentaires, car cela nous aidera à diagnostiquer le problème.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Send Feedback->Report a Problem » dans Visual Studio]D;]A;ou « Help->Reporter un problème » dans Visual Studio pour Mac.]D;]A;Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/it/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..895f2b27b8c
--- /dev/null
+++ b/Localize/loc/it/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/it/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..daf185bfef5
--- /dev/null
+++ b/Localize/loc/it/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/it/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..3401f80618d
--- /dev/null
+++ b/Localize/loc/it/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/it/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..9247a68a6f9
--- /dev/null
+++ b/Localize/loc/it/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/it/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..2056de6cd0e
--- /dev/null
+++ b/Localize/loc/it/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Invia Feedback->Segnala un problema' in Visual Studio]D;]A; o 'Guida->Segnala un problema' in Visual Studio per Mac. Se possibile, allegare un log di compilazione diagnostica completa]D;]A; il report di feedback, perché questo aiuterà a diagnosticare il problema.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Invia feedback->Segnala un problema" in Visual Studio]D;]A;o 'Guida->Segnala un problema' in Visual Studio per Mac.]D;]A;Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/ja/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..62e490fd48c
--- /dev/null
+++ b/Localize/loc/ja/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/ja/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..5384cf83641
--- /dev/null
+++ b/Localize/loc/ja/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ja/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..9505e9c2b52
--- /dev/null
+++ b/Localize/loc/ja/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/ja/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..3f1b05254c5
--- /dev/null
+++ b/Localize/loc/ja/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/ja/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..4c7f4c3adca
--- /dev/null
+++ b/Localize/loc/ja/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ [フィードバックを送信]5D; -> [問題を報告]5D; メニュー項目を使用するか]D;]A; または Visual Studio for Mac で [ヘルプ]5D; -> [問題を報告]5D; を使用して実際のエラー メッセージを付けて問題を申請してください。可能ならば、完全な診断ビルド ]D;]A; ログをフィードバック レポートに添付してください。これにより Microsoft が問題を診断するのに役立ちます。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ [フィードバックを送信]5D; -> [問題を報告]5D; メニュー項目を使用するか]D;]A;または Visual Studio for Mac で [ヘルプ]5D; -> [問題を報告]5D; を使用して実際のエラー メッセージを付けて問題を申請してください。]D;]A;'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/ko/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..94b9203e2d0
--- /dev/null
+++ b/Localize/loc/ko/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/ko/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..195652d4a3b
--- /dev/null
+++ b/Localize/loc/ko/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ko/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..65617509d92
--- /dev/null
+++ b/Localize/loc/ko/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/ko/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..44b35e33dd2
--- /dev/null
+++ b/Localize/loc/ko/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/ko/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..e3477528367
--- /dev/null
+++ b/Localize/loc/ko/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ 피드백 보내기->문제 보고' 메뉴 항목 또는 Mac용 Visual Studio의 '도움말->문제 보고'를 사용하여]D;]A; 정확한 오류 메시지와 함께 문제를 제출하세요. 가능한 경우 문제를 진단하는 데 도움이 되므로]D;]A; 전체 진단 빌드 로그를 피드백 보고서에 첨부하세요.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ 피드백 보내기->문제 보고' 메뉴 항목 또는 Mac용 Visual Studio의 '도움말->문제 보고'를 사용하여]D;]A;정확한 오류 메시지와 함께 문제를 제출하세요.]D;]A;'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/pl/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..715960688e1
--- /dev/null
+++ b/Localize/loc/pl/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/pl/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..413de8fb44c
--- /dev/null
+++ b/Localize/loc/pl/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/pl/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..f1b5b0f2436
--- /dev/null
+++ b/Localize/loc/pl/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/pl/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..265ebda77d2
--- /dev/null
+++ b/Localize/loc/pl/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/pl/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..d6ef80a59e5
--- /dev/null
+++ b/Localize/loc/pl/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Prześlij opinię->Zgłoś problem” w programie Visual Studio]D;]A; lub „Pomoc->Zgłoś problem” w programie Visual Studio dla komputerów Mac. Jeśli to możliwe, dołącz dziennik kompilacji]D;]A; pełnej diagnostyki do raportu opinii, ponieważ pomoże nam to zdiagnozować problem.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Prześlij opinię->Zgłoś problem” w programie Visual Studio]D;]A;lub „Pomoc->Zgłoś problem” w programie Visual Studio dla komputerów Mac.]D;]A;Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..ed3221e0458
--- /dev/null
+++ b/Localize/loc/pt-BR/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..d8f908257d0
--- /dev/null
+++ b/Localize/loc/pt-BR/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..541815d4dcb
--- /dev/null
+++ b/Localize/loc/pt-BR/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..258228d651a
--- /dev/null
+++ b/Localize/loc/pt-BR/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..df071c7430d
--- /dev/null
+++ b/Localize/loc/pt-BR/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Enviar comentários->Relatar um Problema" no Visual Studio]D;]A; ou "Ajuda->Relatar um problema" no Visual Studio para Mac. Se possível, anexe um log de compilação de diagnóstico completo]D;]A; ao relatório de comentários, pois isso nos ajudará a diagnosticar o problema.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Enviar comentários->Relatar um Problema" no Visual Studio]D;]A;ou "Ajuda->Relatar um problema" no Visual Studio para Mac.]D;]A;Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/ru/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..4dcba6674fc
--- /dev/null
+++ b/Localize/loc/ru/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/ru/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..a5dbc2d8fa3
--- /dev/null
+++ b/Localize/loc/ru/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ru/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..e65ab669b3c
--- /dev/null
+++ b/Localize/loc/ru/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/ru/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..9da4d924910
--- /dev/null
+++ b/Localize/loc/ru/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/ru/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..5765d778145
--- /dev/null
+++ b/Localize/loc/ru/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Отправить отзыв->Сообщить о проблеме" в Visual Studio. ]D;]A; или "Справка->Сообщить о проблеме" в Visual Studio для Mac. Если возможно, прикрепите к отзыву ]D;]A; полный журнал диагностической сборки, так как это поможет нам диагностировать проблему.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Отправить отзыв->Сообщить о проблеме" в Visual Studio ]D;]A;или "Справка->Сообщить о проблеме" в Visual Studio для Mac. ]D;]A;Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/tr/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..480c29ce322
--- /dev/null
+++ b/Localize/loc/tr/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/tr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..6b35cd450d7
--- /dev/null
+++ b/Localize/loc/tr/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/tr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..325bb8d1aa5
--- /dev/null
+++ b/Localize/loc/tr/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/tr/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..3bc61a64c30
--- /dev/null
+++ b/Localize/loc/tr/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/tr/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..40280f0e578
--- /dev/null
+++ b/Localize/loc/tr/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ Geri Bildirim->Sorun Bildir” veya Mac için Visual Studio’da “Yardım->Sorun Bildir” menü öğesini]D;]A; kullanarak tam hata iletisini içeren bir sorun bildirin. Mümkünse sorunun tanılanmasına yardımcı olması için]D;]A; rapora tam tanılama derleme günlüğünü ekleyin.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ Geri Bildirim Gönder->Sorun Bildir” veya Mac için Visual Studio’da “Yardım->Sorun Bildir” menü öğesini]D;]A;kullanarak tam hata iletisini içeren bir sorun bildirin.]D;]A;Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..fd679ff8fc7
--- /dev/null
+++ b/Localize/loc/zh-Hans/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..f21aa856123
--- /dev/null
+++ b/Localize/loc/zh-Hans/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..4abdbad66b8
--- /dev/null
+++ b/Localize/loc/zh-Hans/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..fc8a681aaed
--- /dev/null
+++ b/Localize/loc/zh-Hans/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..722e13703db
--- /dev/null
+++ b/Localize/loc/zh-Hans/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ “发送反馈”->“报告问题”菜单项]D;]A; 或 Visual Studio for Mac 中的“帮助”->“报告问题”,提交包含确切错误消息的问题反馈。如果可能,请在反馈报告中附上完整的诊断生成]D;]A; 日志,因为这将有助于我们诊断问题。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ 发送反馈 -> 报告问题”菜单项]D;]A;或 Visual Studio for Mac 中的“帮助”->“报告问题”,提交包含确切错误消息的问题反馈。]D;]A;请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/Xamarin.AndroidTools/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/Xamarin.AndroidTools/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..358349cbb7a
--- /dev/null
+++ b/Localize/loc/zh-Hant/Xamarin.AndroidTools/Properties/Resources.resx.lcl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..df7d8355bf3
--- /dev/null
+++ b/Localize/loc/zh-Hant/Xamarin.Installer.AndroidSDK/Properties/Resources.resx.lcl
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..d5b34139c4b
--- /dev/null
+++ b/Localize/loc/zh-Hant/Xamarin.Installer.Build.Tasks/Properties/Resources.resx.lcl
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/Xamarin.Installer.Common/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/Xamarin.Installer.Common/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..4013ec8cedf
--- /dev/null
+++ b/Localize/loc/zh-Hant/Xamarin.Installer.Common/Properties/Resources.resx.lcl
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/tools/msbuild/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/tools/msbuild/Properties/Resources.resx.lcl
new file mode 100644
index 00000000000..eed29c21e57
--- /dev/null
+++ b/Localize/loc/zh-Hant/tools/msbuild/Properties/Resources.resx.lcl
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A; or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build]D;]A; log to the feedback report as this will help us diagnose the issue.]]>
+
+ 傳送意見反應->回報問題' 功能表項目,或在 Visual Studio for Mac 中的]D;]A; '說明->回報問題' 中提交包含完整錯誤訊息的問題報告。可能的話,請附加完整的診斷組建]D;]A; 記錄到意見反應報告,以協助我們診斷問題。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback->Report a Problem' menu item in Visual Studio]D;]A;or 'Help->Report a Problem' in Visual Studio for Mac.]D;]A;Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.]]>
+
+ 傳送意見反應->回報問題' 功能表項目,或在 Visual Studio for Mac 中的]D;]A;'說明->回報問題' 中提交包含完整錯誤訊息的問題報告。]D;]A;請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 8ca80967153..06c3078f549 100644
--- a/Makefile
+++ b/Makefile
@@ -132,10 +132,6 @@ prepare:
prepare-help:
$(call SYSTEM_DOTNET_BINLOG,prepare-help,run) --project "$(PREPARE_PROJECT)" --framework $(PREPARE_NET_FX) -- -h
-prepare-external-git-dependencies:
- $(call SYSTEM_DOTNET_BINLOG,prepare-external-git-dependencies,run) --project "$(PREPARE_PROJECT)" --framework $(PREPARE_NET_FX) \
- -- -s:PrepareExternalGitDependencies $(_PREPARE_ARGS)
-
APK_SIZES_REFERENCE_DIR=tests/apk-sizes-reference
update-apk-sizes-reference:
diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT
index d2635a4ac93..b8a4ff3a1ad 100644
--- a/THIRD-PARTY-NOTICES.TXT
+++ b/THIRD-PARTY-NOTICES.TXT
@@ -1766,6 +1766,31 @@ The MIT License (MIT)
END OF JamesNK/Newtonsoft.Json NOTICES AND INFORMATION
+%% Kajabity/Kajabity.Tools.Java NOTICES AND INFORMATION BEGIN HERE
+==================================================================
+Copyright 2009-15 Williams Technologies Limited.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Kajbity is a trademark of Williams Technologies Limited.
+
+http://www.kajabity.com
+
+
+==================================================================
+END OF Kajabity/Kajabity.Tools.Java NOTICES AND INFORMATION
+
+
%% KonradKuczynski/ELFSharp NOTICES AND INFORMATION BEGIN HERE
==============================================================
Copyright (c) 2011 Konrad Kruczyński and other contributors
diff --git a/Xamarin.Android.sln b/Xamarin.Android.sln
index 82205d0743a..543fcad8123 100644
--- a/Xamarin.Android.sln
+++ b/Xamarin.Android.sln
@@ -145,268 +145,882 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "proguard-android", "src\pro
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Android.Runtime.NativeAOT", "src\Microsoft.Android.Runtime.NativeAOT\Microsoft.Android.Runtime.NativeAOT.csproj", "{E8831F32-11D7-D42C-E43C-711998BC357A}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Installer.Common", "src\Xamarin.Installer.Common\Xamarin.Installer.Common.csproj", "{0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.AndroidTools", "src\Mono.AndroidTools\Mono.AndroidTools.csproj", "{3AAA188D-5F22-4596-8C4F-76C7AA899EAA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.AndroidTools", "src\Xamarin.AndroidTools\Xamarin.AndroidTools.csproj", "{65633E01-3521-4219-BBE1-9A4DB4009A91}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Installer.AndroidSDK", "src\Xamarin.Installer.AndroidSDK\Xamarin.Installer.AndroidSDK.csproj", "{D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Installer.Build.Tasks", "src\Xamarin.Installer.Build.Tasks\Xamarin.Installer.Build.Tasks.csproj", "{79BBD075-BC73-4D35-8DE6-BE70C9AFC708}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Build.Debugging.Tasks", "src\Xamarin.Android.Build.Debugging.Tasks\Xamarin.Android.Build.Debugging.Tasks.csproj", "{624C58EB-57CF-4754-95EF-E9893E584296}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fastdevtools", "tools\fastdev\fastdevtools.csproj", "{4723786E-4BB5-4939-BBFD-3C2D0EAE236B}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|AnyCPU = Debug|AnyCPU
- Release|AnyCPU = Release|AnyCPU
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|AnyCPU.Build.0 = Release|Any CPU
- {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|AnyCPU.Build.0 = Release|Any CPU
- {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|AnyCPU.Build.0 = Release|Any CPU
- {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|AnyCPU.Build.0 = Release|Any CPU
- {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|AnyCPU.Build.0 = Release|Any CPU
- {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|AnyCPU.Build.0 = Release|Any CPU
- {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|AnyCPU.Build.0 = Release|Any CPU
- {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|AnyCPU.Build.0 = Release|Any CPU
- {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|AnyCPU.Build.0 = Release|Any CPU
- {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|AnyCPU.Build.0 = Release|Any CPU
- {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|AnyCPU.Build.0 = Release|Any CPU
- {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|AnyCPU.Build.0 = Release|Any CPU
- {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|AnyCPU.Build.0 = Release|Any CPU
- {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|AnyCPU.Build.0 = Release|Any CPU
- {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|AnyCPU.Build.0 = Release|Any CPU
- {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|AnyCPU.Build.0 = Release|Any CPU
- {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|AnyCPU.Build.0 = Release|Any CPU
- {507759AE-93DF-411B-8645-31F680319F5C}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {507759AE-93DF-411B-8645-31F680319F5C}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {507759AE-93DF-411B-8645-31F680319F5C}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {507759AE-93DF-411B-8645-31F680319F5C}.Release|AnyCPU.Build.0 = Release|Any CPU
- {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|AnyCPU.Build.0 = Release|Any CPU
- {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|AnyCPU.Build.0 = Release|Any CPU
- {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|AnyCPU.Build.0 = Release|Any CPU
- {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|AnyCPU.Build.0 = Release|Any CPU
- {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|AnyCPU.Build.0 = Release|Any CPU
- {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {7387E151-48E3-4885-B2CA-A74434A34045}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {7387E151-48E3-4885-B2CA-A74434A34045}.Release|AnyCPU.Build.0 = Release|Any CPU
- {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|AnyCPU.Build.0 = Release|Any CPU
- {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|AnyCPU.Build.0 = Release|Any CPU
- {B8105878-D423-4159-A3E7-028298281EC6}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {B8105878-D423-4159-A3E7-028298281EC6}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {B8105878-D423-4159-A3E7-028298281EC6}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {B8105878-D423-4159-A3E7-028298281EC6}.Release|AnyCPU.Build.0 = Release|Any CPU
- {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|AnyCPU.Build.0 = Release|Any CPU
- {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|AnyCPU.Build.0 = Release|Any CPU
- {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|AnyCPU.Build.0 = Release|Any CPU
- {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|AnyCPU.Build.0 = Release|Any CPU
- {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.Build.0 = Release|Any CPU
- {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|AnyCPU.Build.0 = Release|Any CPU
- {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|AnyCPU.Build.0 = Release|Any CPU
- {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|AnyCPU.Build.0 = Release|Any CPU
- {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|AnyCPU.Build.0 = Release|Any CPU
- {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|AnyCPU.Build.0 = Release|Any CPU
- {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|AnyCPU.Build.0 = Release|Any CPU
- {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|AnyCPU.Build.0 = Release|Any CPU
- {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|AnyCPU.Build.0 = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|AnyCPU.Build.0 = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|AnyCPU.Build.0 = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|AnyCPU.Build.0 = Release|Any CPU
- {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|AnyCPU.Build.0 = Release|Any CPU
- {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|AnyCPU.Build.0 = Release|Any CPU
- {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|AnyCPU.Build.0 = Release|Any CPU
- {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|AnyCPU.Build.0 = Release|Any CPU
- {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|AnyCPU.Build.0 = Release|Any CPU
- {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|AnyCPU.Build.0 = Release|Any CPU
- {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|AnyCPU.ActiveCfg = Debug|anycpu
- {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|AnyCPU.Build.0 = Debug|anycpu
- {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|AnyCPU.ActiveCfg = Release|anycpu
- {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|AnyCPU.Build.0 = Release|anycpu
- {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|AnyCPU.ActiveCfg = Debug|anycpu
- {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|AnyCPU.Build.0 = Debug|anycpu
- {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|AnyCPU.ActiveCfg = Release|anycpu
- {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|AnyCPU.Build.0 = Release|anycpu
- {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|AnyCPU.Build.0 = Release|Any CPU
- {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|AnyCPU.Build.0 = Release|Any CPU
- {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|AnyCPU.Build.0 = Release|Any CPU
- {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|AnyCPU.Build.0 = Release|Any CPU
- {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|AnyCPU.Build.0 = Release|Any CPU
- {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|AnyCPU.Build.0 = Release|Any CPU
- {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|AnyCPU.Build.0 = Release|Any CPU
- {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
- {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|AnyCPU.Build.0 = Debug|Any CPU
- {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|AnyCPU.ActiveCfg = Release|Any CPU
- {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|AnyCPU.Build.0 = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|x64.Build.0 = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Debug|x86.Build.0 = Debug|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|x64.ActiveCfg = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|x64.Build.0 = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|x86.ActiveCfg = Release|Any CPU
+ {1D4FC8F1-0DA4-4F38-BE68-11AEBA9A0EA4}.Release|x86.Build.0 = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|x64.Build.0 = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Debug|x86.Build.0 = Debug|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|x64.ActiveCfg = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|x64.Build.0 = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|x86.ActiveCfg = Release|Any CPU
+ {AFB8F6D1-6EA9-42C3-950B-98F34C669AD2}.Release|x86.Build.0 = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|x64.Build.0 = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Debug|x86.Build.0 = Debug|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|x64.Build.0 = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|x86.ActiveCfg = Release|Any CPU
+ {3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}.Release|x86.Build.0 = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x64.Build.0 = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x86.Build.0 = Debug|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|Any CPU.Build.0 = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x64.ActiveCfg = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x64.Build.0 = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x86.ActiveCfg = Release|Any CPU
+ {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x86.Build.0 = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|x64.Build.0 = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Debug|x86.Build.0 = Debug|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|x64.ActiveCfg = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|x64.Build.0 = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|x86.ActiveCfg = Release|Any CPU
+ {D14A1B5C-2060-4930-92BE-F7190256C735}.Release|x86.Build.0 = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|x64.Build.0 = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Debug|x86.Build.0 = Debug|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|x64.ActiveCfg = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|x64.Build.0 = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|x86.ActiveCfg = Release|Any CPU
+ {D27AD8F7-7710-40BE-B03B-55EFBEC13C44}.Release|x86.Build.0 = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|x64.Build.0 = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Debug|x86.Build.0 = Debug|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|x64.ActiveCfg = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|x64.Build.0 = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|x86.ActiveCfg = Release|Any CPU
+ {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}.Release|x86.Build.0 = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x64.Build.0 = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x86.Build.0 = Debug|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x64.ActiveCfg = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x64.Build.0 = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x86.ActiveCfg = Release|Any CPU
+ {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x86.Build.0 = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|x64.Build.0 = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Debug|x86.Build.0 = Debug|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|x64.ActiveCfg = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|x64.Build.0 = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|x86.ActiveCfg = Release|Any CPU
+ {71FE54FA-0BF5-48EF-ACAA-17557B28C9F4}.Release|x86.Build.0 = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|x64.Build.0 = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Debug|x86.Build.0 = Debug|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|x64.ActiveCfg = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|x64.Build.0 = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|x86.ActiveCfg = Release|Any CPU
+ {B17475BC-45A2-47A3-B8FC-62F3A0959EE0}.Release|x86.Build.0 = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|x64.Build.0 = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Debug|x86.Build.0 = Debug|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|Any CPU.Build.0 = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|x64.ActiveCfg = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|x64.Build.0 = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|x86.ActiveCfg = Release|Any CPU
+ {52C7D9B6-E8C8-47D0-9471-652D278D7D77}.Release|x86.Build.0 = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|x64.Build.0 = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Debug|x86.Build.0 = Debug|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|x64.ActiveCfg = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|x64.Build.0 = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|x86.ActiveCfg = Release|Any CPU
+ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A}.Release|x86.Build.0 = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|x64.Build.0 = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Debug|x86.Build.0 = Debug|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|x64.ActiveCfg = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|x64.Build.0 = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|x86.ActiveCfg = Release|Any CPU
+ {1268EADF-8344-431C-81F6-FCB7CBC99F49}.Release|x86.Build.0 = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|x64.Build.0 = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Debug|x86.Build.0 = Debug|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|x64.ActiveCfg = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|x64.Build.0 = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|x86.ActiveCfg = Release|Any CPU
+ {07BC4495-1267-4B78-9EA6-B76FEEA2A64A}.Release|x86.Build.0 = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|x64.Build.0 = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Debug|x86.Build.0 = Debug|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|Any CPU.Build.0 = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|x64.ActiveCfg = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|x64.Build.0 = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|x86.ActiveCfg = Release|Any CPU
+ {64CC4E44-CE3A-4319-BF3F-6CF8BD513870}.Release|x86.Build.0 = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|x64.Build.0 = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Debug|x86.Build.0 = Debug|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|x64.ActiveCfg = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|x64.Build.0 = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|x86.ActiveCfg = Release|Any CPU
+ {D48EE8D0-0A0A-4493-AEF5-DAF5F8CF86AD}.Release|x86.Build.0 = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|x64.Build.0 = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Debug|x86.Build.0 = Debug|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|x64.ActiveCfg = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|x64.Build.0 = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|x86.ActiveCfg = Release|Any CPU
+ {53EE4C57-1C03-405A-8243-8DA539546C88}.Release|x86.Build.0 = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|x64.Build.0 = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Debug|x86.Build.0 = Debug|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|x64.ActiveCfg = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|x64.Build.0 = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|x86.ActiveCfg = Release|Any CPU
+ {9B42A5BB-74CB-46E2-BCE0-AF763A792551}.Release|x86.Build.0 = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|x64.Build.0 = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Debug|x86.Build.0 = Debug|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|x64.ActiveCfg = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|x64.Build.0 = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|x86.ActiveCfg = Release|Any CPU
+ {645E1718-C8C4-4C23-8A49-5A37E4ECF7ED}.Release|x86.Build.0 = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x64.Build.0 = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x86.Build.0 = Debug|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x64.ActiveCfg = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x64.Build.0 = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x86.ActiveCfg = Release|Any CPU
+ {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x86.Build.0 = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|x64.Build.0 = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Debug|x86.Build.0 = Debug|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|x64.ActiveCfg = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|x64.Build.0 = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|x86.ActiveCfg = Release|Any CPU
+ {53E4ABF0-1085-45F9-B964-DCAE4B819998}.Release|x86.Build.0 = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|x64.Build.0 = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Debug|x86.Build.0 = Debug|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|x64.ActiveCfg = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|x64.Build.0 = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|x86.ActiveCfg = Release|Any CPU
+ {507759AE-93DF-411B-8645-31F680319F5C}.Release|x86.Build.0 = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|x64.Build.0 = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Debug|x86.Build.0 = Debug|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|x64.ActiveCfg = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|x64.Build.0 = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|x86.ActiveCfg = Release|Any CPU
+ {F9CD012E-67AC-4A4E-B2A7-252387F91256}.Release|x86.Build.0 = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|x64.Build.0 = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|x86.Build.0 = Debug|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|x64.ActiveCfg = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|x64.Build.0 = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|x86.ActiveCfg = Release|Any CPU
+ {C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|x86.Build.0 = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|x64.Build.0 = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|x86.Build.0 = Debug|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|x64.ActiveCfg = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|x64.Build.0 = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|x86.ActiveCfg = Release|Any CPU
+ {A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|x86.Build.0 = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|x64.Build.0 = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|x86.Build.0 = Debug|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|x64.ActiveCfg = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|x64.Build.0 = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|x86.ActiveCfg = Release|Any CPU
+ {2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|x86.Build.0 = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|x64.Build.0 = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|x86.Build.0 = Debug|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|x64.ActiveCfg = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|x64.Build.0 = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|x86.ActiveCfg = Release|Any CPU
+ {38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|x86.Build.0 = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|x64.Build.0 = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Debug|x86.Build.0 = Debug|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|x64.ActiveCfg = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|x64.Build.0 = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|x86.ActiveCfg = Release|Any CPU
+ {7387E151-48E3-4885-B2CA-A74434A34045}.Release|x86.Build.0 = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|x64.Build.0 = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Debug|x86.Build.0 = Debug|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|x64.ActiveCfg = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|x64.Build.0 = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|x86.ActiveCfg = Release|Any CPU
+ {8A6CB07C-E493-4A4F-AB94-038645A27118}.Release|x86.Build.0 = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|x64.Build.0 = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|x86.Build.0 = Debug|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|x64.ActiveCfg = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|x64.Build.0 = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|x86.ActiveCfg = Release|Any CPU
+ {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|x86.Build.0 = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|x64.Build.0 = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Debug|x86.Build.0 = Debug|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|x64.ActiveCfg = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|x64.Build.0 = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|x86.ActiveCfg = Release|Any CPU
+ {B8105878-D423-4159-A3E7-028298281EC6}.Release|x86.Build.0 = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|x64.Build.0 = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Debug|x86.Build.0 = Debug|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|x64.ActiveCfg = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|x64.Build.0 = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|x86.ActiveCfg = Release|Any CPU
+ {43564FB3-0F79-4FF4-A2B0-B1637072FF01}.Release|x86.Build.0 = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|x64.Build.0 = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Debug|x86.Build.0 = Debug|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|x64.ActiveCfg = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|x64.Build.0 = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|x86.ActiveCfg = Release|Any CPU
+ {3DE17662-DCD6-4F49-AF06-D39AACC8649A}.Release|x86.Build.0 = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|x64.Build.0 = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|x86.Build.0 = Debug|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|x64.ActiveCfg = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|x64.Build.0 = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|x86.ActiveCfg = Release|Any CPU
+ {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|x86.Build.0 = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|x86.Build.0 = Debug|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|x64.Build.0 = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|x86.Build.0 = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|x64.Build.0 = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|x86.Build.0 = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|x64.ActiveCfg = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|x64.Build.0 = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|x86.ActiveCfg = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|x86.Build.0 = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|x64.Build.0 = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|x86.Build.0 = Debug|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|x64.ActiveCfg = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|x64.Build.0 = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|x86.ActiveCfg = Release|Any CPU
+ {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|x86.Build.0 = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|x64.Build.0 = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|x86.Build.0 = Debug|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|x64.ActiveCfg = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|x64.Build.0 = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|x86.ActiveCfg = Release|Any CPU
+ {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|x86.Build.0 = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|x64.Build.0 = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Debug|x86.Build.0 = Debug|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|x64.ActiveCfg = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|x64.Build.0 = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|x86.ActiveCfg = Release|Any CPU
+ {A0AEF446-3368-4591-9DE6-BC3B2B33337D}.Release|x86.Build.0 = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|x64.Build.0 = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Debug|x86.Build.0 = Debug|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|x64.ActiveCfg = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|x64.Build.0 = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|x86.ActiveCfg = Release|Any CPU
+ {B2BC20D1-F468-46A9-B9B0-1C80CC4D4F36}.Release|x86.Build.0 = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|x64.Build.0 = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Debug|x86.Build.0 = Debug|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|x64.ActiveCfg = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|x64.Build.0 = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|x86.ActiveCfg = Release|Any CPU
+ {7A180B05-DE3F-4D89-9F40-03A8E186AE82}.Release|x86.Build.0 = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|x64.Build.0 = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Debug|x86.Build.0 = Debug|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|x64.ActiveCfg = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|x64.Build.0 = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|x86.ActiveCfg = Release|Any CPU
+ {3E45D81B-4C4A-4E3F-B891-A0D8A3E2F0C1}.Release|x86.Build.0 = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|x64.Build.0 = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Debug|x86.Build.0 = Debug|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|x64.ActiveCfg = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|x64.Build.0 = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|x86.ActiveCfg = Release|Any CPU
+ {F3CFF31C-037B-450F-B22D-1D6E529B2DCC}.Release|x86.Build.0 = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|x64.Build.0 = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Debug|x86.Build.0 = Debug|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|x64.ActiveCfg = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|x64.Build.0 = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|x86.ActiveCfg = Release|Any CPU
+ {16DB2680-399B-4111-AA26-6CDBBFA334D8}.Release|x86.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x64.Build.0 = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Debug|x86.Build.0 = Debug|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x64.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x64.Build.0 = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x86.ActiveCfg = Release|Any CPU
+ {372E8E3E-29D5-4B4D-88A2-4711CD628C4E}.Release|x86.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x64.Build.0 = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Debug|x86.Build.0 = Debug|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x64.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x64.Build.0 = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x86.ActiveCfg = Release|Any CPU
+ {90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}.Release|x86.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x64.Build.0 = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Debug|x86.Build.0 = Debug|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x64.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x64.Build.0 = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x86.ActiveCfg = Release|Any CPU
+ {DE40756E-57F6-4AF2-B155-55E3A88CCED8}.Release|x86.Build.0 = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|x64.Build.0 = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Debug|x86.Build.0 = Debug|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|x64.ActiveCfg = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|x64.Build.0 = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|x86.ActiveCfg = Release|Any CPU
+ {6410DA0F-5E14-4FC0-9AEE-F4C542C96C7A}.Release|x86.Build.0 = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|x64.Build.0 = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Debug|x86.Build.0 = Debug|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|x64.ActiveCfg = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|x64.Build.0 = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|x86.ActiveCfg = Release|Any CPU
+ {D28957BF-5E66-4D60-B528-22820C60AC82}.Release|x86.Build.0 = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|x64.Build.0 = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Debug|x86.Build.0 = Debug|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|x64.ActiveCfg = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|x64.Build.0 = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|x86.ActiveCfg = Release|Any CPU
+ {1FED3F23-1175-42AA-BE87-EF1E8DB52F8B}.Release|x86.Build.0 = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|x64.Build.0 = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Debug|x86.Build.0 = Debug|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|x64.ActiveCfg = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|x64.Build.0 = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|x86.ActiveCfg = Release|Any CPU
+ {2CE4CD4B-B7B7-4EAE-A9BE-2699824D6096}.Release|x86.Build.0 = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|x64.Build.0 = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Debug|x86.Build.0 = Debug|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|x64.ActiveCfg = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|x64.Build.0 = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|x86.ActiveCfg = Release|Any CPU
+ {86A8DEFE-7ABB-4097-9389-C249581E243D}.Release|x86.Build.0 = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|x64.Build.0 = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Debug|x86.Build.0 = Debug|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|x64.ActiveCfg = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|x64.Build.0 = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|x86.ActiveCfg = Release|Any CPU
+ {37FCD325-1077-4603-98E7-4509CAD648D6}.Release|x86.Build.0 = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|x64.Build.0 = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Debug|x86.Build.0 = Debug|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|x64.ActiveCfg = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|x64.Build.0 = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|x86.ActiveCfg = Release|Any CPU
+ {88B746FF-8D6E-464D-9D66-FF2ECCF148E0}.Release|x86.Build.0 = Release|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|Any CPU.ActiveCfg = Debug|anycpu
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|Any CPU.Build.0 = Debug|anycpu
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|x64.Build.0 = Debug|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Debug|x86.Build.0 = Debug|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|Any CPU.ActiveCfg = Release|anycpu
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|Any CPU.Build.0 = Release|anycpu
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|x64.ActiveCfg = Release|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|x64.Build.0 = Release|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|x86.ActiveCfg = Release|Any CPU
+ {1A273ED2-AE84-48E9-9C23-E978C2D0CB34}.Release|x86.Build.0 = Release|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|Any CPU.ActiveCfg = Debug|anycpu
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|Any CPU.Build.0 = Debug|anycpu
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|x64.Build.0 = Debug|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Debug|x86.Build.0 = Debug|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|Any CPU.ActiveCfg = Release|anycpu
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|Any CPU.Build.0 = Release|anycpu
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|x64.ActiveCfg = Release|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|x64.Build.0 = Release|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|x86.ActiveCfg = Release|Any CPU
+ {DA50FC92-7FE7-48B5-BDB6-CDA57B37BB51}.Release|x86.Build.0 = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|x64.Build.0 = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Debug|x86.Build.0 = Debug|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|x64.ActiveCfg = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|x64.Build.0 = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|x86.ActiveCfg = Release|Any CPU
+ {4EFCED6E-9A6B-453A-94E4-CE4B736EC684}.Release|x86.Build.0 = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|x64.Build.0 = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Debug|x86.Build.0 = Debug|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|x64.ActiveCfg = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|x64.Build.0 = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|x86.ActiveCfg = Release|Any CPU
+ {D8E14B43-E929-4C18-9FA6-2C3DC47EFC17}.Release|x86.Build.0 = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|x64.Build.0 = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Debug|x86.Build.0 = Debug|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|x64.ActiveCfg = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|x64.Build.0 = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|x86.ActiveCfg = Release|Any CPU
+ {C0E44558-FEE3-4DD3-986A-3F46DD1BF41B}.Release|x86.Build.0 = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|x64.Build.0 = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Debug|x86.Build.0 = Debug|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|x64.ActiveCfg = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|x64.Build.0 = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|x86.ActiveCfg = Release|Any CPU
+ {BA4D889D-066B-4C2C-A973-09E319CBC396}.Release|x86.Build.0 = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|x64.Build.0 = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Debug|x86.Build.0 = Debug|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|x64.ActiveCfg = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|x64.Build.0 = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|x86.ActiveCfg = Release|Any CPU
+ {A39B6D7C-6616-40D6-8AE4-C6CEE93D2708}.Release|x86.Build.0 = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|x86.Build.0 = Debug|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|x64.Build.0 = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|x86.Build.0 = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|x64.Build.0 = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|x86.Build.0 = Debug|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|x64.ActiveCfg = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|x64.Build.0 = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|x86.ActiveCfg = Release|Any CPU
+ {5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|x86.Build.0 = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|x64.Build.0 = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Debug|x86.Build.0 = Debug|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|x64.ActiveCfg = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|x64.Build.0 = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|x86.ActiveCfg = Release|Any CPU
+ {E8831F32-11D7-D42C-E43C-711998BC357A}.Release|x86.Build.0 = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|x64.Build.0 = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Debug|x86.Build.0 = Debug|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|x64.ActiveCfg = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|x64.Build.0 = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|x86.ActiveCfg = Release|Any CPU
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E}.Release|x86.Build.0 = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|x64.Build.0 = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Debug|x86.Build.0 = Debug|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|x64.ActiveCfg = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|x64.Build.0 = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|x86.ActiveCfg = Release|Any CPU
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA}.Release|x86.Build.0 = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|x64.Build.0 = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Debug|x86.Build.0 = Debug|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|x64.ActiveCfg = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|x64.Build.0 = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|x86.ActiveCfg = Release|Any CPU
+ {65633E01-3521-4219-BBE1-9A4DB4009A91}.Release|x86.Build.0 = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|x64.Build.0 = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Debug|x86.Build.0 = Debug|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|x64.ActiveCfg = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|x64.Build.0 = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|x86.ActiveCfg = Release|Any CPU
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB}.Release|x86.Build.0 = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|x64.Build.0 = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Debug|x86.Build.0 = Debug|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|x64.ActiveCfg = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|x64.Build.0 = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|x86.ActiveCfg = Release|Any CPU
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708}.Release|x86.Build.0 = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|x64.Build.0 = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Debug|x86.Build.0 = Debug|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|Any CPU.Build.0 = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|x64.ActiveCfg = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|x64.Build.0 = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|x86.ActiveCfg = Release|Any CPU
+ {624C58EB-57CF-4754-95EF-E9893E584296}.Release|x86.Build.0 = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|x64.Build.0 = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Debug|x86.Build.0 = Debug|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|x64.ActiveCfg = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|x64.Build.0 = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|x86.ActiveCfg = Release|Any CPU
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -474,6 +1088,13 @@ Global
{5E806C9F-1B67-4B6B-A6AB-258834250DBB} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
{5FD0133B-69E5-4474-9B67-9FD1D0150C70} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
{E8831F32-11D7-D42C-E43C-711998BC357A} = {04E3E11E-B47D-4599-8AFC-50515A95E715}
+ {0DCDA993-A945-44D0-B9C0-FF9FAB127C7E} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {3AAA188D-5F22-4596-8C4F-76C7AA899EAA} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {65633E01-3521-4219-BBE1-9A4DB4009A91} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {D8B7DCCF-E27A-4BDF-B0A0-40D1F2F758EB} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {79BBD075-BC73-4D35-8DE6-BE70C9AFC708} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {624C58EB-57CF-4754-95EF-E9893E584296} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
+ {4723786E-4BB5-4939-BBFD-3C2D0EAE236B} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {53A1F287-EFB2-4D97-A4BB-4A5E145613F6}
diff --git a/build-tools/android-platform-support/AndroidTools.GitInfo.targets b/build-tools/android-platform-support/AndroidTools.GitInfo.targets
new file mode 100644
index 00000000000..c943f9a4c56
--- /dev/null
+++ b/build-tools/android-platform-support/AndroidTools.GitInfo.targets
@@ -0,0 +1,45 @@
+
+
+
+
+ false
+ main
+
+ $(MSBuildThisFileDirectory)GitInfo.txt
+
+
+
+
+ $(GitSemVerMajor).$(GitSemVerMinor).$(GitSemVerPatch)
+ $(Version); git-rev-head:$(GitCommit); git-branch:$(GitBranch)
+
+
+
+
+
+ $(MicroBuild_SigningEnabled)
+ false
+
+
+ $(TargetsTriggeredByCompilation);
+ EnableMicroBuildSigningPostCompile
+
+
+
+
+
+ $(MicroBuild_SigningEnabled_Old)
+
+
+
diff --git a/build-tools/android-platform-support/GitInfo.txt b/build-tools/android-platform-support/GitInfo.txt
new file mode 100644
index 00000000000..9459d4ba2a0
--- /dev/null
+++ b/build-tools/android-platform-support/GitInfo.txt
@@ -0,0 +1 @@
+1.1
diff --git a/build-tools/android-platform-support/version.txt b/build-tools/android-platform-support/version.txt
new file mode 100644
index 00000000000..d4df1049f25
--- /dev/null
+++ b/build-tools/android-platform-support/version.txt
@@ -0,0 +1 @@
+18.1.0
diff --git a/build-tools/automation/azure-pipelines-nightly.yaml b/build-tools/automation/azure-pipelines-nightly.yaml
index fcce624fdc5..97811fe5a0a 100644
--- a/build-tools/automation/azure-pipelines-nightly.yaml
+++ b/build-tools/automation/azure-pipelines-nightly.yaml
@@ -15,10 +15,6 @@ resources:
type: git
name: DevDiv/Xamarin.yaml-templates
ref: refs/heads/main
- - repository: android-platform-support
- type: git
- name: DevDiv/android-platform-support
- ref: refs/heads/main
- repository: maui
type: github
name: dotnet/maui
diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml
index b73b4f5ee57..f11fdd1d613 100644
--- a/build-tools/automation/azure-pipelines.yaml
+++ b/build-tools/automation/azure-pipelines.yaml
@@ -19,10 +19,6 @@ resources:
type: git
name: DevDiv/Xamarin.yaml-templates
ref: refs/heads/main
- - repository: android-platform-support
- type: git
- name: DevDiv/android-platform-support
- ref: refs/heads/main
- repository: maui
type: github
name: dotnet/maui
@@ -75,9 +71,6 @@ extends:
image: $(WindowsPoolImage1ESPT)
os: windows
sourceRepositoriesToScan:
- include:
- - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - repository: android-platform-support
exclude:
- repository: yaml-templates
- repository: maui
diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml
index 53cd23ea184..d53525fb085 100644
--- a/build-tools/automation/yaml-templates/build-linux.yaml
+++ b/build-tools/automation/yaml-templates/build-linux.yaml
@@ -55,21 +55,9 @@ stages:
# https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path
- checkout: maui
- - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - checkout: android-platform-support
- clean: true
- submodules: recursive
- path: s/android/external/android-platform-support
- persistCredentials: true
-
- template: /build-tools/automation/yaml-templates/build-linux-steps.yaml
parameters:
buildResultArtifactName: ${{ parameters.buildResultArtifactName }}
xaSourcePath: ${{ parameters.xaSourcePath }}
nugetArtifactName: ${{ parameters.nugetArtifactName }}
use1ESTemplate: ${{ parameters.use1ESTemplate }}
-
- - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration)
- workingDirectory: ${{ parameters.xaSourcePath }}
- displayName: make prepare-external-git-dependencies
diff --git a/build-tools/automation/yaml-templates/build-macos.yaml b/build-tools/automation/yaml-templates/build-macos.yaml
index 3dae9491c34..040d4934bb7 100644
--- a/build-tools/automation/yaml-templates/build-macos.yaml
+++ b/build-tools/automation/yaml-templates/build-macos.yaml
@@ -77,12 +77,6 @@ stages:
# https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path
- checkout: maui
- - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - checkout: android-platform-support
- submodules: recursive
- path: s/android/external/android-platform-support
- persistCredentials: true
-
- task: CodeQL3000Init@0
displayName: CodeQL 3000 Init
condition: and(succeeded(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
@@ -98,11 +92,6 @@ stages:
buildResultArtifactName: ${{ parameters.buildResultArtifactName }}
use1ESTemplate: ${{ parameters.use1ESTemplate }}
- - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration)
- workingDirectory: ${{ parameters.xaSourcePath }}
- displayName: make prepare-external-git-dependencies
-
- task: CodeQL3000Finalize@0
displayName: CodeQL 3000 Finalize
condition: and(succeededOrFailed(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
diff --git a/build-tools/automation/yaml-templates/commercial-build.yaml b/build-tools/automation/yaml-templates/commercial-build.yaml
index c91210eb1b8..35af92b8d57 100644
--- a/build-tools/automation/yaml-templates/commercial-build.yaml
+++ b/build-tools/automation/yaml-templates/commercial-build.yaml
@@ -26,16 +26,6 @@ steps:
# https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path
- checkout: maui
-- ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}:
- - checkout: android-platform-support
- submodules: recursive
- path: s/android/external/android-platform-support
- persistCredentials: true
-
- - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration)
- workingDirectory: ${{ parameters.xaSourcePath }}
- displayName: make prepare-external-git-dependencies
-
- task: CodeQL3000Init@0
displayName: CodeQL 3000 Init
condition: and(succeeded(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets
index 77fedd4c0c5..50d387f7983 100644
--- a/build-tools/installers/create-installers.targets
+++ b/build-tools/installers/create-installers.targets
@@ -19,7 +19,6 @@
dllFalse
<_HasCommercialFiles Condition="Exists('$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Common.Debugging.targets')">True
- <_MonoDroidPath Condition=" '$(_MonoDroidPath)' == '' ">..\..\external\android-platform-support
@@ -245,9 +244,38 @@
-
-
-
+
+
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)ICSharpCode.SharpZipLib.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)ICSharpCode.SharpZipLib.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)INIFileParser.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Mono.AndroidTools.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Mono.AndroidTools.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Build.Debugging.Tasks.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Build.Debugging.Tasks.pdb" />
+ <_MSBuildFiles Include="@(_LocalizationLanguages->'$(MicrosoftAndroidSdkOutDir)%(Identity)\Xamarin.Android.Build.Debugging.Tasks.resources.dll')" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Common.Debugging.props" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Common.Debugging.targets" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.AndroidTools.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.AndroidTools.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.AndroidSDK.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.AndroidSDK.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Build.Tasks.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Build.Tasks.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.dll" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.pdb" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.props" />
+ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.targets" />
+
+
+ <_MSBuildFiles Include="@(AndroidSupportedTargetJitAbi->'$(MicrosoftAndroidSdkOutDir)lib\%(Identity)\xamarin.sync')" />
+ <_MSBuildFiles Include="@(AndroidSupportedTargetJitAbi->'$(MicrosoftAndroidSdkOutDir)lib\%(Identity)\xamarin.find')" />
+ <_MSBuildFiles Include="@(AndroidSupportedTargetJitAbi->'$(MicrosoftAndroidSdkOutDir)lib\%(Identity)\xamarin.stat')" />
+ <_MSBuildFiles Include="@(AndroidSupportedTargetJitAbi->'$(MicrosoftAndroidSdkOutDir)lib\%(Identity)\xamarin.cp')" />
+ maui-android
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Databáze adb není spuštěna. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Neplatný název cíle adb {0}. Názvy cílů musí začínat na -d, -e nebo -s.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Žádné dostupné zařízení.
+
+
+ Vybrané zařízení není spuštěné.
+
+
+ Nelze načíst rozhraní Android ABI pro připojené zařízení nebo emulátor {0}. Znovu připojte zařízení nebo restartujte emulátor a zkuste to znovu.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Nepovedlo se zkopírovat nástroje rychlého nasazení do {0}/{1} na cílovém zařízení.
+Toto zařízení pravděpodobně není kompatibilní s rychlým nasazením.
+Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Při nasazování {0} pomocí {1} došlo k chybě: {2}.
+Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Systémová vlastnost log.redirect-stdio zařízení Android je na cílovém zařízení nebo emulátoru nastavená na true.
+Pokud chcete povolit kompatibilitu s rychlým nasazením, nastavte vlastnost na false nebo restartujte zařízení nebo emulátor, aby se hodnota vymazala.
+
+
+ Při nasazování {0} došlo k chybě.
+Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Omlouváme se. Rychlé nasazení se podporuje jenom na zařízeních s operačním systémem Android 5.0 (rozhraní API úrovně 21) nebo vyšším.
+Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.
+
+
+ Nástroj run-as byl na tomto zařízení zakázán. Buď ho povolte aktivací možností pro vývojáře na zařízení, nebo nastavením ro.boot.disable_runas na false.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Balíček nebyl nainstalován. Zkontrolujte prosím, že ho nemáte nainstalovaný pod žádným jiným uživatelem.
+Pokud se balíček na zařízení zobrazí, zkuste ho odinstalovat ručně a zkuste to znovu.
+Aplikaci byste měli být schopni odinstalovat prostřednictvím aplikace Nastavení na zařízení.
+ The following are literal names and should not be translated:
+
+
+
+ Nástroj run-as vyžadovaný systémem rychlého nasazení byl na tomto zařízení zakázán výrobcem.
+Zakažte rychlé nasazení na stránkách vlastností projektu Visual Studio nebo upravte soubor projektu v textovém editoru a nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ Aplikace nemá v androidManifest.xml nastaven atribut android:debuggable.
+Aby rychlé nasazení fungovalo, je to nutné. Ve výchozím nastavení je tato možnost standardně povolená
+sestavovacím systémem .NET for Android pro sestavení Debug (ladění). Ověřte, jestli nemáte tento atribut nastavený
+pro element application v souboru AndroidManifest.xml.
+Pokud máte třídu, která se odvozuje z Android.App.Application a používáte [Application], ujistěte se, že vlastnost
+Debuggable není vůbec nastavená, protože přepíše hodnotu pro sestavení ladění.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Balíček je systémová aplikace. Jedná se o aplikace, které se instalují v rámci
+ systémového uživatele na zařízení. Tyto typy aplikací nemohou používat příkaz run-as.
+ Systém rychlého nasazení měl tuto konkrétní chybu zpracovat automaticky
+ a použít záložní instalační cestu. Pokud se vám ale tato chyba zobrazuje, vytvořte prosím
+ problém s přesnou chybovou zprávou pomocí položky nabídky Nápověda->Odeslat zpětnou vazbu->Nahlásit problém v aplikaci Visual Studio
+ nebo Nápověda->Nahlásit problém v aplikaci Visual Studio pro Mac. Pokud je to možné, připojte úplný diagnostický
+ protokol buildu k sestavě zpětné vazby, protože to nám pomůže diagnostikovat problém.
+ The following are literal names and should not be translated:
+
+
+
+ Příkaz run-as selhal s chybou {0}.
+Aktuální instalace balíčku je poškozena. Ručně odinstalujte balíček
+od všech uživatelů na zařízení a zkuste to znovu. Pokud to nepomůže, můžete rychlé nasazení zakázat.
+Rychlé nasazení lze zakázat na stránkách vlastností projektu Visual Studio nebo upravit soubor projektu v textovém editoru a nastavit vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Příkaz run-as selhal s chybou {0}.
+Rychlé nasazení se v současné době na tomto zařízení nepodporuje.
+Nahlaste prosím problém s přesnou chybovou zprávou pomocí položky nabídky Nápověda->Odeslat zpětnou vazbu->Nahlásit problém v aplikaci Visual Studio
+nebo Nápověda->Nahlásit problém v aplikaci Visual Studio pro Mac.
+Pokud chcete zakázat rychlé nasazení na stránkách vlastností projektu Visual Studio, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na hodnotu true, nebo upravte soubor projektu v textovém editoru.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Při nasazování {0} pomocí {1} došlo k chybě: {2}.
+To je obvykle způsobeno chybou v adb, když se data souboru odesílají do zařízení.
+Obvyklou příčinou je uvolněný nebo nekvalitní kabel USB. Zkuste prosím použít jiný kabel.
+Případně zkuste použít ladění Wifi, které může být u některých zařízení spolehlivější než ladění USB.
+Pokud se žádným z těchto způsobů nepovede problém vyřešit, nastavte vlastnost MSBuild EmbedAssembliesIntoApk na true, aby se rychlé nasazení zakázalo na stránkách vlastností projektu Visual Studio, nebo upravte soubor projektu v textovém editoru.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Spouští se ladicí program na {0}:{1}
+Spusťte sdb a pak spusťte následující příkaz
+ connect {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.de.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.de.resx
new file mode 100644
index 00000000000..88b2f2d3ec8
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.de.resx
@@ -0,0 +1,266 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb wird nicht ausgeführt. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Ungültiger adb-Zielname '{0}'. Zielnamen müssen mit "-d", "-e" oder "-s" beginnen.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Kein Gerät verfügbar.
+
+
+ Ausgewähltes Gerät wird nicht ausgeführt.
+
+
+ Die Android-ABI für das angeschlossene Gerät oder den Emulator "{0}" konnte nicht abgerufen werden. Schließen Sie das Gerät erneut an, oder starten Sie den Emulator neu, und versuchen Sie es noch mal.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Die Tools für die Schnelle Bereitstellung können auf dem Zielgerät nicht nach „{0}/{1}“ kopiert werden.
+Dieses Gerät ist möglicherweise nicht mit der Schnellen Bereitstellung kompatibel.
+Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Fehler beim Bereitstellen von „{0}“ mit „{1}: {2}“.
+Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Die Android-Systemeigenschaft „log.redirect-stdio“ ist auf dem Zielgerät oder Emulator auf WAHR festgelegt.
+Um die Kompatibilität mit der Schnellen Bereitstellung zu aktivieren, legen Sie die Eigenschaft auf FALSCH fest, oder starten Sie das Gerät oder den Emulator neu, um den Wert zu löschen.
+
+
+ Fehler beim Bereitstellen von „{0}“.
+Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Entschuldigung. Die Schnelle Bereitstellung wird nur auf Geräten mit Android 5.0 (API-Ebene 21) oder höher unterstützt.
+Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+
+
+ Das "run-as"-Tool wurde auf diesem Gerät deaktiviert. Aktivieren Sie die Option, indem Sie die Entwickleroptionen auf dem Gerät aktivieren oder "ro.boot.disable_runas" auf "false" festlegen.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Das Paket wurde nicht installiert. Überprüfen Sie, dass es unter keinem anderen Benutzenden installiert ist.
+Wenn das Paket auf dem Gerät angezeigt wird, deinstallieren Sie es manuell, und versuchen Sie es dann erneut.
+Sie sollten die App über die Einstellungs-App auf dem Gerät deinstallieren können.
+ The following are literal names and should not be translated:
+
+
+
+ Das Tool „run-as“, das für das System für Schnelle Bereitstellung erforderlich ist, wurde auf diesem Gerät vom Hersteller deaktiviert.
+Deaktivieren Sie die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten, oder bearbeiten Sie die Projektdatei in einem Text-Editor, und legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ Für die Anwendung ist das Attribut „android:debuggable“ im AndroidManifest.xml nicht festgelegt.
+Dies ist erforderlich, damit die Schnelle Bereitstellung funktioniert. Dies ist in der Regel standardmäßig aktiviert durch
+das .NET für Android-Buildsystem für Debugbuilds. Stellen Sie sicher, dass dieses Attribut
+nicht auf das Element „application“ in Ihrem „AndroidManifest.xml“ festgelegt ist.
+Wenn Sie über eine Klasse verfügen, die von „Android.App.Application“ abgeleitet ist und „[Application]“ verwenden, stellen Sie sicher, dass die
+Eigenschaft „Debuggable“ absolut nicht festgelegt ist, da sie den Wert für Debugbuilds überschreibt.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Das Paket ist eine „system“-Anwendung. Dies sind Anwendungen, die unter
+ der „system“-Benutzende auf einem Gerät installiert werden. Diese Anwendungstypen können „run-as“ nicht verwenden.
+ Der spezielle Fehler sollte vom System für Schnelle Bereitstellung automatisch behandelt worden sein
+ und hätte einen Sicherungsinstallationspfad verwenden sollen. Wenn dieser Fehler angezeigt wird, erstellen Sie
+ ein Ticket mit der genauen Fehlermeldung mithilfe des Menüelements „Hilfe->Feedback senden->Ein Problem melden“ in Visual Studio
+ oder „Hilfe->Ein Problem melden“ in Visual Studio für Mac. Fügen Sie nach Möglichkeit ein vollständiges Diagnosebuild
+ Protokoll im Feedbackbericht an, da uns dies bei der Diagnose des Problems hilft.
+ The following are literal names and should not be translated:
+
+
+
+ Fehler beim Befehl „run-as“ mit „{0}“.
+Die aktuelle Installation des Pakets ist beschädigt. Deinstallieren Sie das
+Paket von allen Benutzenden auf dem Gerät, und versuchen Sie es noch mal. Wenn dies nicht funktioniert, können Sie die Schnelle Bereitstellung deaktivieren.
+Die Schnelle Bereitstellung kann auf den Visual Studio-Projekteigenschaftenseiten deaktiviert werden oder die Projektdatei in einem Text-Editor bearbeiten und die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR festlegen.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Fehler beim Befehl „run-as“ mit „{0}“.
+Die Schnelle Bereitstellung wird auf diesem Gerät derzeit nicht unterstützt.
+Melden Sie ein Problem mit der genauen Fehlermeldung mithilfe des Menüelements „Hilfe->Feedback senden->Ein Problem melden“ in Visual Studio
+oder „Hilfe->Ein Problem melden“ in Visual Studio für Mac.
+Legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Fehler beim Bereitstellen von „{0}“ mit „{1}: {2}“.
+Dies ist in der Regel auf einen Fehler in „adb“ zurückzuführen, wenn die Dateidaten an das Gerät gesendet werden.
+Die normale Ursache hierfür ist ein USB-Kabel, das lose oder von schlechter Qualität ist. Versuchen Sie es mit einem anderen Kabel.
+Versuchen Sie alternativ, das WLAN-Debuggen zu verwenden. Dies kann für bestimmte Geräte zuverlässiger als das USB-Debuggen sein.
+Wenn all dies fehlschlägt, legen Sie die MSBuild-Eigenschaft „EmbedAssembliesIntoApk“ auf WAHR fest, um die Schnelle Bereitstellung auf den Visual Studio-Projekteigenschaftenseiten zu deaktivieren, oder bearbeiten Sie die Projektdatei in einem Text-Editor.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Debugger wird auf {0} gestartet:{1}
+Starten Sie „sdb“, und führen Sie dann die folgende Befehls-
+-
+ Verbindung {0} {1}
+ aus.
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.es.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.es.resx
new file mode 100644
index 00000000000..8bef707e01b
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.es.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb no se está ejecutando. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ El nombre de destino adb “{0}” no es válido. Los nombres de destino deben empezar por “-d”, “-e” o “-s”.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ No hay ningún dispositivo disponible.
+
+
+ El dispositivo seleccionado no se está ejecutando.
+
+
+ No se pudo recuperar la ABI de Android para el dispositivo o emulador adjunto “{0}”. Vuelva a conectar el dispositivo o reinicie el emulador e inténtelo de nuevo.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ No se pueden copiar las herramientas de implementación rápida en "{0}/{1}" en el dispositivo de destino.
+Es posible que este dispositivo no sea compatible con la implementación rápida.
+Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Error al implementar '{0}' mediante '{1}: {2}'.
+Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ La propiedad del sistema Android "log.redirect-stdio" se establece en "true" en el emulador o dispositivo de destino.
+Para habilitar la compatibilidad con la implementación rápida, establezca la propiedad en "false" o reinicie el dispositivo o emulador para borrar el valor.
+
+
+ Error al implementar '{0}'.
+Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Lo siento. La implementación rápida solo se admite en dispositivos que ejecutan Android 5.0 (nivel de API 21) o superior.
+Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.
+
+
+ La herramienta “ejecutar como” se ha deshabilitado en este dispositivo. Habilítela activando las opciones de desarrollador en el dispositivo o estableciendo “ro.boot.disable_runas” en “false”.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ El paquete no se instaló. Compruebe que no lo tiene instalado en ningún otro usuario.
+Si el paquete aparece en el dispositivo, intenta desinstalarlo manualmente e inténtalo de nuevo.
+Debería poder desinstalar la aplicación a través de la aplicación Configuración en el dispositivo.
+ The following are literal names and should not be translated:
+
+
+
+ El fabricante deshabilitó la herramienta "run-as" requerida por el sistema de implementación rápida en este dispositivo.
+Deshabilite la implementación rápida en las páginas de propiedades del proyecto Visual Studio o edite el archivo de proyecto en un editor de texto y establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true".
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ La aplicación no tiene el atributo "android:debuggable" establecido en el AndroidManifest.xml.
+Esto es necesario para que la implementación rápida funcione. Normalmente, esta opción está habilitada de forma predeterminada por
+el sistema de compilación de .NET para Android para compilaciones de depuración. Compruebe que no tiene este atributo
+se establece en el elemento "application" de la "AndroidManifest.xml".
+Si tiene una clase que deriva de "Android.App.Application" y usa "[Application]", asegúrese de que el
+La propiedad 'Debuggable' no está establecida en absoluto, ya que invalidará el valor de las compilaciones de depuración.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ El paquete es una aplicación del “sistema”. Se trata de aplicaciones que se instalan en
+ el usuario "system" en un dispositivo. Estos tipos de aplicaciones no pueden usar "run-as".
+ El sistema de implementación rápida debería haber controlado automáticamente este error en particular
+ y usó una ruta de instalación de copia de seguridad. Sin embargo, si ve este error, archive
+ un problema con el mensaje de error exacto mediante el elemento de menú "Help->Send Feedback->Report a Problem" en Visual Studio
+ o "Help->Report a Problem" en Visual Studio para Mac. Si es posible, adjunte una compilación de diagnóstico completa
+ inicie sesión en el informe de comentarios, ya que esto nos ayudará a diagnosticar el problema.
+ The following are literal names and should not be translated:
+
+
+
+ Error del comando "run-as" con "{0}".
+La instalación actual del paquete está dañada. Desinstale manualmente el
+paquete de todos los usuarios en el dispositivo e inténtelo de nuevo. Si esto no funciona, puede deshabilitar la implementación rápida.
+La implementación rápida se puede deshabilitar en las páginas de propiedades del proyecto Visual Studio o editar el archivo de proyecto en un editor de texto y establecer la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true".
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Error del comando "run-as" con "{0}".
+La implementación rápida no se admite actualmente en este dispositivo.
+Presente un problema con el mensaje de error exacto mediante el elemento de menú "Help->Send Feedback->Report a Problem" en Visual Studio
+o "Help->Report a Problem" en Visual Studio para Mac.
+Establezca la propiedad "EmbedAssembliesIntoApk" de MSBuild en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio, o bien edite el archivo del proyecto en un editor de texto.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Error al implementar '{0}' con '{1}: {2}'.
+Esto suele deberse a un error en "adb" cuando los datos del archivo se envían al dispositivo.
+La causa normal de esto es un cable USB flexible o de baja calidad. Pruebe con otro cable.
+Como alternativa, pruebe a usar la depuración Wi-Fi, esto puede ser más confiable que la depuración USB para determinados dispositivos.
+Si se produce un error en todo esto, establezca la propiedad MSBuild "EmbedAssembliesIntoApk" en "true" para deshabilitar la implementación rápida en las páginas de propiedades del proyecto de Visual Studio o edite el archivo de proyecto en un editor de texto.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Iniciando depurador en {0}:{1}
+Inicie sdb y ejecute el siguiente comando
+ conectar {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.fr.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.fr.resx
new file mode 100644
index 00000000000..0fb87334572
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.fr.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb n’est pas en cours d’exécution. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Nom de cible adb non valide « {0} ». Les noms cibles doivent commencer par `-d`, `-e`, ou `-s`.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Aucun appareil disponible.
+
+
+ L’appareil sélectionné n’est pas en cours d’exécution.
+
+
+ Impossible de récupérer l’ABI Android pour l’appareil ou l’émulateur attaché `{0}`. Reconnectez l’appareil ou redémarrez l’émulateur, puis réessayez.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Impossible de copier les outils de déploiement rapide vers « {0}/{1} » sur l’appareil cible.
+Cet appareil n’est peut-être pas compatible avec le déploiement rapide.
+Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Erreur lors du déploiement de « {0} » en utilisant « {1} : {2} ».
+Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ La propriété système Android « log.redirect-stdio » a la valeur « true » sur l’appareil ou l’émulateur cible.
+Pour activer la compatibilité avec le déploiement rapide, définissez la propriété sur « false » ou redémarrez l’appareil ou l’émulateur pour effacer la valeur.
+
+
+ Erreur de déploiement « {0} ».
+Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Désolé. Le déploiement rapide est uniquement pris en charge sur les appareils exécutant Android 5.0 (niveau d’API 21) ou supérieur.
+Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.
+
+
+ L’outil d’identification a été désactivé sur cet appareil. Activez-le en activant les options de développeur sur l’appareil ou en définissant « ro.boot.disable_runas » sur « false ».
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Le package n’a pas été installé. Vérifiez qu’il n’est pas installé sous un(e) autre utilisateur(-trice).
+Si le package s’affiche sur l’appareil, essayez de le désinstaller manuellement, puis réessayez.
+Vous devez être en mesure de désinstaller l’application via l’application Paramètres sur l’appareil.
+ The following are literal names and should not be translated:
+
+
+
+ L’outil d’identification requis par le système de déploiement rapide a été désactivé sur cet appareil par le fabricant.
+Veuillez désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte et définir la propriété MSBuild « EmbedAssembliesIntoApk » à « true ».
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ L’application n’a pas l’attribut « android:debuggable » défini dans le AndroidManifest.xml.
+Cela est nécessaire pour que le déploiement rapide fonctionne. Cette option est normalement activée par défaut par
+le système de build .NET pour Android pour les builds de débogage. Vérifiez que vous n’avez pas cet attribut
+défini sur l’élément « application » dans votre « AndroidManifest.xml ».
+Si vous avez une classe qui dérive de « Android.App.Application » et qui utilise « [Application] », assurez-vous que le
+La propriété « Debuggable » n’est pas définie du tout, car elle remplace la valeur pour les builds de débogage.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Le package est une application « system ». Il s’agit des applications qui s’installent sous
+ l’utilisateur « système » sur un appareil. Ces types d’applications ne peuvent pas utiliser « run-as ».
+ Le système de déploiement rapide aurait dû gérer cette erreur particulière automatiquement
+ et utilisé un chemin d’installation de sauvegarde. Toutefois, si vous voyez cette erreur, veuillez
+ un problème lié au message d’erreur exact à l’aide de l’élément de menu « Help->Send Feedback->Report a Problem » dans Visual Studio
+ ou « Help->Reporter un problème » dans Visual Studio pour Mac. Si possible, attachez une build de diagnostic complète
+ connectez-vous au rapport de commentaires, car cela nous aidera à diagnostiquer le problème.
+ The following are literal names and should not be translated:
+
+
+
+ La commande « run-as » a échoué avec « {0} ».
+L’installation du package est actuellement endommagée. Désinstallez manuellement le
+package de tous les utilisateurs sur l’appareil et réessayez. Si cela ne fonctionne pas, vous pouvez désactiver le déploiement rapide.
+Fast Deployment peut être désactivé dans les pages de propriétés du projet Visual Studio ou éditer le fichier du projet dans un éditeur de texte et définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true ».
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ La commande « run-as » a échoué avec « {0} ».
+Le déploiement rapide n’est actuellement pas pris en charge sur cet appareil.
+Veuillez porter un problème lié au message d’erreur exact à l’aide de l’élément de menu « Help->Send Feedback->Report a Problem » dans Visual Studio
+ou « Help->Reporter un problème » dans Visual Studio pour Mac.
+Veuillez définir la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver le déploiement rapide dans les pages de propriétés du projet Visual Studio, ou modifiez le fichier projet dans un éditeur de texte.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Erreur lors du déploiement de « {0} » en utilisant « {1} : {2} ».
+Cela est généralement dû à une erreur dans « adb » lorsque les données de fichier sont envoyées à l’appareil.
+La cause normale de cette erreur est un câble USB faible ou de faible qualité. Veuillez essayer un autre câble.
+Vous pouvez également essayer d’utiliser le débogage Wifi, ce qui peut être plus fiable que le débogage USB pour certains appareils.
+Si tout cela échoue, définissez la propriété MSBuild « EmbedAssembliesIntoApk » sur « true » pour désactiver Fast Deployment dans les pages de propriétés du projet Visual Studio, ou éditez le fichier du projet dans un éditeur de texte.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Démarrage du débogueur sur {0} :{1}
+Lancez sdb puis exécutez la commande suivante
+ Se connecter {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.it.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.it.resx
new file mode 100644
index 00000000000..ccfa3324de3
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.it.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb non è in esecuzione. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Il nome di destinazione adb '{0}' non è valido. I nomi di destinazione devono iniziare con '-d', '-e' o '-s'.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Nessun dispositivo disponibile.
+
+
+ Il dispositivo selezionato non è in esecuzione.
+
+
+ Non è stato possibile recuperare l'ABI Android per il dispositivo o l'emulatore collegato {0}. Riconnettere il dispositivo o riavviare l'emulatore e riprovare.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Non è possibile copiare gli strumenti di distribuzione rapida in '{0}/{1}' nel dispositivo di destinazione.
+Questo dispositivo potrebbe non essere compatibile con la distribuzione rapida.
+Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Errore durante la distribuzione di '{0}' con '{1}: {2}'.
+Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ La proprietà di sistema Android 'log.redirect-stdio' è impostata su 'true' nell'emulatore o nel dispositivo di destinazione.
+Per abilitare la compatibilità con la distribuzione rapida, impostare la proprietà su 'false' o riavviare il dispositivo o l'emulatore per cancellare il valore.
+
+
+ Errore durante la distribuzione di '{0}'.
+Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Siamo spiacenti. La distribuzione rapida è supportata solo nei dispositivi che eseguono Android 5.0 (livello API 21) o versione successiva.
+Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+
+
+ Lo strumento 'run-as' è stato disabilitato in questo dispositivo. Abilitarlo attivando le opzioni per sviluppatori sul dispositivo o impostando 'ro.boot.disable_runas' su 'false'.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Il pacchetto non è stato installato. Verificare che non sia installato per un altro utente.
+Se il pacchetto viene visualizzato nel dispositivo, provare a disinstallarlo manualmente, quindi riprovare.
+Dovrebbe essere possibile disinstallare l'app tramite l'app Impostazioni nel dispositivo.
+ The following are literal names and should not be translated:
+
+
+
+ Lo strumento "run-as" richiesto dal sistema di distribuzione rapida è stato disabilitato in questo dispositivo dal produttore.
+Disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo e impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true'.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ L'applicazione non dispone dell'attributo 'android:debuggable' impostato in AndroidManifest.xml.
+Questo è necessario per il funzionamento della distribuzione rapida. Questa funzionalità è in genere abilitata per impostazione predefinita dal
+sistema di compilazione .NET per le compilazioni di debug. Verificare che questo attributo non sia impostato
+sull'elemento 'application' nel file 'AndroidManifest.xml'.
+Se si dispone di una classe che deriva da 'Android.App.Application' e si usa '[Application]' assicurarsi che
+La proprietà 'Debuggable' non sia impostata perché sostituirà il valore per le compilazioni di debug.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Il pacchetto è un'applicazione 'system'. Si tratta di applicazioni che si installano in
+ l'utente 'system' in un dispositivo. Questi tipi di applicazioni non possono usare 'run-as'.
+ Il sistema di distribuzione rapida dovrebbe aver gestito automaticamente questo particolare errore
+ e usato un percorso di installazione di backup. Tuttavia, se viene visualizzato questo errore, segnalare
+ un problema con il messaggio di errore esatto usando la voce di menu 'Guida->Invia Feedback->Segnala un problema' in Visual Studio
+ o 'Guida->Segnala un problema' in Visual Studio per Mac. Se possibile, allegare un log di compilazione diagnostica completa
+ il report di feedback, perché questo aiuterà a diagnosticare il problema.
+ The following are literal names and should not be translated:
+
+
+
+ Il comando 'run-as' non è riuscito con errore '{0}'.
+L'installazione corrente del pacchetto è danneggiata. Disinstallare manualmente il pacchetto
+da tutti gli utenti nel dispositivo e riprovare. Se non funziona, è possibile disabilitare la distribuzione rapida.
+La distribuzione rapida può essere disabilitata nelle pagine delle proprietà del progetto Visual Studio o modificando il file di progetto in un editor di testo e impostando la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true'.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Il comando 'run-as' non è riuscito con errore '{0}'.
+La distribuzione rapida non è attualmente supportata in questo dispositivo.
+Segnalare un problema con il messaggio di errore esatto usando la voce di menu "Guida->Invia feedback->Segnala un problema" in Visual Studio
+o 'Guida->Segnala un problema' in Visual Studio per Mac.
+Impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Errore durante la distribuzione di '{0}' con '{1}: {2}'.
+Ciò è in genere dovuto a un errore in 'adb' quando i dati del file vengono inviati al dispositivo.
+La causa di solito è un cavo USB allentato o di bassa qualità. Provare un cavo diverso.
+In alternativa, provare a usare il debug Wi-Fi, che può essere più affidabile del debug USB per determinati dispositivi.
+Se il problema persiste, impostare la proprietà MSBuild 'EmbedAssembliesIntoApk' su 'true' per disabilitare la distribuzione rapida nelle pagine delle proprietà del progetto Visual Studio o modificare il file di progetto in un editor di testo.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Avvio del debugger in {0}:{1}
+Avviare sdb, quindi eseguire il comando seguente
+ connetti {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ja.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ja.resx
new file mode 100644
index 00000000000..7b8e627289f
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ja.resx
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb が実行されていません。{0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ adb ターゲット名 '{0}' が無効です。ターゲット名は、'-d'、'-e'、または '-s' で始まる必要があります。
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ 使用可能なデバイスがありません。
+
+
+ 選択したデバイスは実行されていません。
+
+
+ アタッチされたデバイスまたはエミュレーターの Android ABI `{0}` を取得できませんでした。デバイスを再接続するか、エミュレーターを再起動してから、もう一度お試しください。
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ 高速展開ツールをターゲット デバイスの '{0}/{1}' にコピーできません。
+このデバイスは高速展開と互換性がない可能性があります。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ '{1}:{2}' を使用して '{0}' を展開中にエラーが発生しました。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ ターゲット デバイスまたはエミュレーターで、'log.redirect-stdio' Android システム プロパティが 'true' に設定されています。
+高速展開との互換性を有効にするには、プロパティを 'false' に設定するか、デバイスまたはエミュレーターを再起動して値をクリアします。
+
+
+ '{0}' の展開中にエラーが発生しました。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ 申し訳ありません。高速デプロイは、Android 5.0 (API レベル 21) 以上を実行しているデバイスでのみサポートされます。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+
+
+ このデバイスで 'run-as' ツールが無効になっています。デバイスの開発者オプションをアクティブ化するか、'ro.boot.disable_runas' を 'false' に設定して有効にします。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ パッケージはインストールされませんでした。他のユーザーの下にインストールされていないか確認してください。
+パッケージがデバイスに表示される場合は、手動でアンインストールしてから、もう一度お試しください。
+デバイスの設定アプリを使用してアプリをアンインストールできます。
+ The following are literal names and should not be translated:
+
+
+
+ 高速展開システムに必要な 'run-as' ツールは、製造元によってこのデバイスで無効になっています。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ アプリケーションの AndroidManifest.xml に 'android:debuggable' 属性が設定されていません。
+これは、高速展開を機能させるために必要です。これは通常、デバッグ ビルドの .NET for Android ビルド
+システムにより既定で有効化されます。'AndroidManifest.xml' の 'application' 要素に
+この属性が設定されていないことをご確認ください。
+'Android.App.Application' から派生し、'[Application]' を使用しているクラスがある場合は、
+'Debuggable' プロパティは、デバッグ ビルドの値をオーバーライドするため、まったく設定されていません。
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ パッケージは 'system' アプリケーションです。これらは、デバイス上の 'system' ユーザー
+ の下にインストールされるアプリケーションです。これらの種類のアプリケーションでは、'run-as' を使用できません。
+ 高速展開システムは、この特定のエラーを自動的に処理し、
+ バックアップのインストールパスを使用すべきでした。ただし、このエラーが表示される場合は、
+ Visual Studio で [ヘルプ] -> [フィードバックを送信] -> [問題を報告] メニュー項目を使用するか
+ または Visual Studio for Mac で [ヘルプ] -> [問題を報告] を使用して実際のエラー メッセージを付けて問題を申請してください。可能ならば、完全な診断ビルド
+ ログをフィードバック レポートに添付してください。これにより Microsoft が問題を診断するのに役立ちます。
+ The following are literal names and should not be translated:
+
+
+
+ 'run-as' コマンドが '{0}' で失敗しました。
+現在破損しているパッケージのインストール。デバイス上のすべてのユーザーから
+パッケージを手動でパッケージをアンインストールし、もう一度やり直してください。問題が解決しない場合は、高速展開を無効にできます。
+高速配置は、Visual Studio プロジェクトのプロパティ ページで無効にしたり、テキスト エディターでプロジェクト ファイルを編集したり、'EmbedAssembliesIntoのまま' MSBuild プロパティを 'true' に設定したりできます。
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ 'run-as' コマンドが '{0}' で失敗しました。
+このデバイスでは、高速展開は現在サポートされていません。
+Visual Studio で [ヘルプ] -> [フィードバックを送信] -> [問題を報告] メニュー項目を使用するか
+または Visual Studio for Mac で [ヘルプ] -> [問題を報告] を使用して実際のエラー メッセージを付けて問題を申請してください。
+'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ '{1}:{2}' を使用して ' {0}' を展開中にエラーが発生しました。
+これは通常、ファイル データがデバイスに送信されるときに 'adb' でエラーが発生したことが原因です。
+この問題の通常の原因は、緩い USB ケーブルまたは低品質の USB ケーブルです。別のケーブルをお試しください。
+または、Wifi デバッグを使用してみてください。これは、特定のデバイスの USB デバッグよりも信頼性が高い可能性があります。
+そのすべてが失敗する場合は、'EmbedAssembliesIntoApk' MSBuild プロパティを 'true' に設定して、Visual Studio プロジェクト プロパティ ページで高速展開を無効にするか、テキスト エディターでプロジェクト ファイルを編集してください。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ {0}:{1}
+ でデバッガーを起動しています
+sdb を起動し、次のコマンドを実行し
+ {0} {1} を接続します
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ko.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ko.resx
new file mode 100644
index 00000000000..eff4ff345a6
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ko.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb가 실행되고 있지 않습니다. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ 잘못된 adb 대상 이름 '{0}'입니다. 대상 이름은 '-d', '-e' 또는 '-s'로 시작해야 합니다.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ 사용 가능한 디바이스가 없습니다.
+
+
+ 선택한 디바이스가 실행되고 있지 않습니다.
+
+
+ 연결된 디바이스 또는 에뮬레이터 `{0}`에 대한 Android ABI를 검색할 수 없습니다. 디바이스를 다시 연결하거나 에뮬레이터를 다시 시작한 후 다시 시도하세요.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ 대상 디바이스의 '{0}/{1}'에 빠른 배포 도구를 복사할 수 없습니다.
+이 디바이스는 빠른 배포와 호환되지 않을 수 있습니다.
+'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ ‘{1}: {2}’을(를) 사용하여 '{0}'을(를) 배포하는 동안 오류가 발생했습니다.
+'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ 대상 디바이스 또는 에뮬레이터에서 'log.redirect-stdio' Android 시스템 속성이 'true'로 설정됩니다.
+빠른 배포와의 호환성을 활성화하려면 속성을 'false'로 설정하거나 디바이스 또는 에뮬레이터를 다시 부팅하여 값을 지웁니다.
+
+
+ '{0}'을(를) 배포하는 동안 오류가 발생했습니다.
+'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ 죄송합니다. 빠른 배포는 Android 5.0(API 수준 21) 이상을 실행하는 디바이스에서만 지원됩니다.
+'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+
+
+ 이 디바이스에서 'run-as' 도구를 사용할 수 없습니다. 디바이스에서 개발자 옵션을 활성화하거나 'ro.boot.disable_runas'를 'false'로 설정하여 사용하도록 설정합니다.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ 패키지가 설치되지 않았습니다. 다른 사용자 아래에 설치되어 있지 않은지 확인하세요.
+패키지가 디바이스에 표시되는 경우 수동으로 제거한 후 다시 시도하세요.
+디바이스에서 설정 앱을 통해 앱을 제거할 수 있어야 합니다.
+ The following are literal names and should not be translated:
+
+
+
+ 제조업체에서 빠른 배포 시스템에 필요한 'run-as' 도구를 이 디바이스에서 비활성화했습니다.
+Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 비활성화하거나 텍스트 편집기에서 프로젝트 파일을 편집하고 'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하세요.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ 애플리케이션에 AndroidManifest.xml에 설정된 'android:debuggable' 특성이 없습니다.
+빠른 배포가 작동하려면 이 특성이 필요합니다. 이는 일반적으로 디버그 빌드를 위한 Android 빌드
+시스템용 .NET에 의해 기본적으로 활성화되어 있습니다. 'AndroidManifest.xml'의 'application' 요소에
+이 특성이 설정되어 있는지 확인하세요.
+'Android.App.Application'에서 파생된 클래스가 있고 '[Application]'을 사용하는 경우
+'Debuggable' 속성이 전혀 설정되지 않았는지 확인하세요. 이는 디버그 빌드에 대한 값을 재정의합니다.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ 패키지는 'system' 애플리케이션입니다. 이러한 애플리케이션은 디바이스의
+ 'system' 사용자로 설치됩니다. 이러한 유형의 애플리케이션은 'run-as'를 사용할 수 없습니다.
+ 빠른 배포 시스템에서는 이 특정 오류를 자동으로 처리하고
+ 백업 설치 경로를 사용했어야 합니다. 그러나 이 오류가 표시되면
+ Visual Studio의 '도움말->피드백 보내기->문제 보고' 메뉴 항목 또는 Mac용 Visual Studio의 '도움말->문제 보고'를 사용하여
+ 정확한 오류 메시지와 함께 문제를 제출하세요. 가능한 경우 문제를 진단하는 데 도움이 되므로
+ 전체 진단 빌드 로그를 피드백 보고서에 첨부하세요.
+ The following are literal names and should not be translated:
+
+
+
+ 'run-as' 명령이 '{0}'(으)로 실패했습니다.
+패키지의 현재 설치가 손상되었습니다. 디바이스의 모든 사용자로부터 패키지를
+수동으로 제거하고 다시 시도하세요. 작동하지 않으면 빠른 배포를 비활성화할 수 있습니다.
+빠른 배포는 Visual Studio 프로젝트 속성 페이지에서 비활성화하거나 텍스트 편집기에서 프로젝트 파일을 편집하고 'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정할 수 있습니다.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ 'run-as' 명령이 '{0}'(으)로 실패했습니다.
+빠른 배포는 현재 이 디바이스에서 지원되지 않습니다.
+Visual Studio의 '도움말->피드백 보내기->문제 보고' 메뉴 항목 또는 Mac용 Visual Studio의 '도움말->문제 보고'를 사용하여
+정확한 오류 메시지와 함께 문제를 제출하세요.
+'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ ‘{1}: {2}’을(를) 사용하여 '{0}'을(를) 배포하는 동안 오류가 발생했습니다.
+이는 일반적으로 파일 데이터가 디바이스로 전송될 때 'adb'의 오류 때문입니다.
+일반적인 원인은 느리거나 품질이 낮은 USB 케이블입니다. 다른 케이블을 사용해 보세요.
+또는 Wifi 디버깅을 사용해 보세요. 이는 특정 디바이스에 대한 USB 디버깅보다 더 안정적일 수 있습니다.
+이 모든 작업이 실패하면 'EmbedAssembliesIntoApk' MSBuild 속성을 'true'로 설정하여 Visual Studio 프로젝트 속성 페이지에서 빠른 배포를 사용하지 않도록 설정하거나 텍스트 편집기에서 프로젝트 파일을 편집하세요.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ {0}에서 디버거를 시작하는 중:{1}
+sdb를 시작한 다음, 다음 명령을 실행합니다.
+ connect {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pl.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pl.resx
new file mode 100644
index 00000000000..47bba6316f2
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pl.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Narzędzie adb nie jest uruchomione. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Nieprawidłowa nazwa elementu docelowego adb „{0}”. Nazwy obiektów docelowych muszą zaczynać się od `-d`, `-e`, or `-s`.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Brak dostępnego urządzenia.
+
+
+ Wybrane urządzenie nie jest uruchomione.
+
+
+ Nie można pobrać interfejsu ABI systemu Android dla dołączonego urządzenia lub emulatora `{0}`. Podłącz ponownie urządzenie lub uruchom ponownie emulator i spróbuj ponownie.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Nie można skopiować narzędzi szybkiego wdrażania do folderu „{0}/{1}” na urządzeniu docelowym.
+To urządzenie może nie być zgodne z szybkim wdrażaniem.
+Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Błąd podczas wdrażania elementu „{0}” przy użyciu elementu „{1}: {2}„.
+Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Właściwość systemu Android „log.redirect-stdio” jest ustawiona na wartość „true” na urządzeniu docelowym lub emulatorze.
+Aby włączyć zgodność z szybkim wdrażaniem, ustaw właściwość na wartość „false” lub uruchom ponownie urządzenie lub emulator, aby wyczyścić wartość.
+
+
+ Błąd podczas wdrażania elementu „{0}”.
+Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Przepraszamy. Szybkie wdrażanie jest obsługiwane tylko na urządzeniach z systemem Android 5.0 (poziom 21 interfejsu API) lub nowszym.
+Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.
+
+
+ Narzędzie „run-as” zostało wyłączone na tym urządzeniu. Włącz je, aktywując opcje dewelopera na urządzeniu lub ustawiając „ro.boot.disable_runas na wartość „false”.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Pakiet nie został zainstalowany. Sprawdź, czy nie masz zainstalowanej aplikacji pod żadnym innym użytkownikiem.
+Jeśli pakiet jest wyświetlany na urządzeniu, spróbuj odinstalować go ręcznie, a następnie spróbuj ponownie.
+Powinno być możliwe odinstalowanie aplikacji za pomocą aplikacji Ustawienia na urządzeniu.
+ The following are literal names and should not be translated:
+
+
+
+ Narzędzie „Run-as” wymagane przez system szybkiego wdrażania zostało wyłączone na tym urządzeniu przez producenta.
+Wyłącz szybkie wdrażanie na stronach właściwości projektu programu Visual Studio lub edytuj plik projektu w edytorze tekstów i ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ Aplikacja nie ma atrybutu „android:debuggable” ustawionego w AndroidManifest.xml.
+Jest to wymagane, aby szybkie wdrażanie działało. Ta opcja jest domyślnie włączona przez
+platformę .NET dla systemu Android na potrzeby kompilacji debugowania. Sprawdź, czy nie masz tego atrybutu
+ustawionego w elemencie „application" w elemencie „AndroidManifest.xml”.
+Jeśli masz klasę pochodzącą od elementu „Android.App.Application” i używasz „[Application]”, upewnij się, że
+Właściwość „Debuggable” nie jest w ogóle ustawiona, ponieważ zastąpi wartość kompilacji debugowania.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Pakiet jest aplikacją „systemową”. Są to aplikacje instalowane w obszarze
+ użytkownika „systemowego” na urządzeniu. Tego typu aplikacje nie mogą używać polecenia „run-as”.
+ System szybkiego wdrażania powinien automatycznie obsłużyć ten konkretny błąd
+ i użyć ścieżki instalacji kopii zapasowej. Jeśli jednak widzisz ten błąd, zgłoś
+ problem z dokładnym komunikatem o błędzie przy użyciu elementu menu „Pomoc->Prześlij opinię->Zgłoś problem” w programie Visual Studio
+ lub „Pomoc->Zgłoś problem” w programie Visual Studio dla komputerów Mac. Jeśli to możliwe, dołącz dziennik kompilacji
+ pełnej diagnostyki do raportu opinii, ponieważ pomoże nam to zdiagnozować problem.
+ The following are literal names and should not be translated:
+
+
+
+ Wykonanie polecenia „run-as” nie powiodło się z „{0}”.
+Bieżąca instalacja pakietu jest uszkodzona. Ręcznie odinstaluj
+pakiet ze wszystkich użytkowników na urządzeniu i spróbuj ponownie. Jeśli to nie zadziała, możesz wyłączyć szybkie wdrażanie.
+Szybkie wdrażanie można wyłączyć na stronach właściwości projektu programu Visual Studio lub edytować plik projektu w edytorze tekstów i ustawić właściwość „EmbedAssembliesIntoApk” programu MSBuild na wartość „true”.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Wykonanie polecenia „run-as” nie powiodło się z „{0}”.
+Szybkie wdrażanie nie jest obecnie obsługiwane na tym urządzeniu.
+Zgłoś problem z dokładnym komunikatem o błędzie, używając elementu menu „Pomoc-> Prześlij opinię->Zgłoś problem” w programie Visual Studio
+lub „Pomoc->Zgłoś problem” w programie Visual Studio dla komputerów Mac.
+Ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio, lub edytuj plik projektu w edytorze tekstów.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Błąd podczas wdrażania elementu „{0}” przy użyciu elementu „{1}: {2}”.
+Zwykle jest to spowodowane błędem w pliku „adb”, gdy dane pliku są wysyłane do urządzenia.
+Normalną przyczyną takiego działania jest luźny lub niskiej jakości kabel USB. Spróbuj użyć innego kabla.
+Możesz też spróbować użyć debugowania sieci Wi-Fi, ponieważ może to być bardziej niezawodne niż debugowanie USB dla niektórych urządzeń.
+Jeśli to wszystko się nie powiedzie, ustaw właściwość MSBuild „EmbedAssembliesIntoApk” na wartość „true”, aby wyłączyć szybkie wdrażanie na stronach właściwości projektu programu Visual Studio lub edytować plik projektu w edytorze tekstów.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Uruchamianie debugera w {0}:{1}
+Uruchom bazę SDB, a następnie uruchom następujące polecenie
+ połącz {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pt-BR.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pt-BR.resx
new file mode 100644
index 00000000000..fa96dcde4e6
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.pt-BR.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ o adb não está em execução. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ O nome '{0}' de destino do adb é inválido. Os nomes de destino devem iniciar com `-d`, `-e` ou `-s`.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Nenhum dispositivo disponível.
+
+
+ O dispositivo selecionado não está em execução.
+
+
+ Não foi possível recuperar a ABI do Android para o dispositivo ou emulador anexado `{0}`. Reconecte o dispositivo ou reinicie o emulador e tente novamente.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Não é possível copiar as ferramentas de Implantação Rápida para "{0}/{1}" no dispositivo de destino.
+Este dispositivo pode não ser compatível com a Implantação Rápida.
+Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Erro ao implantar "{0}" usando "{1}: {2}".
+Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ A propriedade do sistema Android "log.redirect-stdio" está definida como "true" no dispositivo de destino ou no emulador.
+Para habilitar a compatibilidade com a Implantação Rápida, defina a propriedade como "false" ou reinicie o dispositivo ou o emulador para limpar o valor.
+
+
+ Erro ao implantar "{0}".
+Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Lamentamos. A Implantação Rápida só tem suporte em dispositivos Android 5.0 (nível de API 21) ou superior.
+Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+
+
+ A ferramenta 'executar como' foi desabilitada neste dispositivo. Habilite-a ativando as opções de desenvolvedor no dispositivo ou definindo `ro.boot.disable_runas` como `false`.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ O pacote não foi instalado. Verifique se ele não está instalado em outro usuário.
+Se o pacote aparecer no dispositivo, tente desinstalá-lo manualmente e tente novamente.
+Você deve conseguir desinstalar o aplicativo por meio do aplicativo Configurações no dispositivo.
+ The following are literal names and should not be translated:
+
+
+
+ A ferramenta "run-as" exigida pelo sistema de Implantação Rápida foi desabilitada neste dispositivo pelo fabricante.
+Desabilite a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto e defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true".
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ O aplicativo não tem o atributo "android:debuggable" definido no AndroidManifest.xml.
+Isso é necessário para que a Implantação Rápida funcione. Normalmente, isso é habilitado por padrão por
+o sistema de compilação do .NET para Android para compilações de Depuração. Verifique se você não tem este atributo
+definido no elemento "application" em seu "AndroidManifest.xml".
+Se você tiver uma classe derivada de "Android.App.Application" e estiver usando o "[Application]", verifique se a propriedade "Debuggable"
+não está definida, pois substituirá o valor de compilações de depuração.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ O pacote é um aplicativo "system". Esses são os aplicativos instalados no
+ usuário "system" em um dispositivo. Esses tipos de aplicativos não podem usar "run-as".
+ O sistema de Implantação Rápida deve ter tratado esse erro específico automaticamente
+ e usado um caminho de instalação de backup. No entanto, se você estiver vendo esse erro, registre
+ um problema com a mensagem de erro exata usando o item de menu "Ajuda->Enviar comentários->Relatar um Problema" no Visual Studio
+ ou "Ajuda->Relatar um problema" no Visual Studio para Mac. Se possível, anexe um log de compilação de diagnóstico completo
+ ao relatório de comentários, pois isso nos ajudará a diagnosticar o problema.
+ The following are literal names and should not be translated:
+
+
+
+ O comando "run-as" falhou com "{0}".
+A instalação atual do pacote está corrompida. Desinstale manualmente o pacote
+de todos os usuários no dispositivo e tente novamente. Se isso não funcionar, você poderá desabilitar a Implantação Rápida.
+A Implantação Rápida pode ser desabilitada nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto e defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true".
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ O comando "run-as" falhou com "{0}".
+No momento, não há suporte para a Implantação Rápida neste dispositivo.
+Registre um problema com a mensagem de erro exata usando o item de menu "Ajuda->Enviar comentários->Relatar um Problema" no Visual Studio
+ou "Ajuda->Relatar um problema" no Visual Studio para Mac.
+Defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Erro ao implantar "{0}" usando "{1}: {2}".
+Isso geralmente ocorre devido a um erro em `adb` quando os dados do arquivo são enviados para o dispositivo.
+A causa normal para isso é um cabo USB solto ou de baixa qualidade. Tente um cabo diferente.
+Como alternativa, tente usar a Depuração por Wi-Fi, isso pode ser mais confiável do que a depuração por USB para determinados dispositivos.
+Se tudo falhar, defina a propriedade MSBuild "EmbedAssembliesIntoApk" como "true" para desabilitar a Implantação Rápida nas páginas de propriedades do projeto do Visual Studio ou edite o arquivo do projeto em um editor de texto.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Iniciando o depurador em {0}:{1}
+Inicie o sdb e depois execute o seguinte comando
+ conectar {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.resx
new file mode 100644
index 00000000000..f4c6ea5ca2e
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb is not running. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Invalid adb target name '{0}'. Target names must start with `-d`, `-e`, or `-s`.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ No available device.
+
+
+ Selected device is not running.
+
+
+ Could not retrieve the Android ABI for the attached device or emulator `{0}`. Please reconnect the device or restart the emulator, and try again.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Unable to copy Fast Deployment tools to '{0}/{1}' on the target device.
+This device might not be compatible with Fast Deployment.
+Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Error deploying '{0}' using '{1}: {2}'.
+Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ The 'log.redirect-stdio' Android system property is set to 'true' on the target device or emulator.
+To enable compatibility with Fast Deployment, set the property to 'false' or reboot the device or emulator to clear the value.
+
+
+ Error deploying '{0}'.
+Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Sorry. Fast Deployment is only supported on devices running Android 5.0 (API level 21) or higher.
+Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+
+
+ The 'run-as' tool has been disabled on this device. Either enable it by activating the developer options on the device or by setting `ro.boot.disable_runas` to `false`.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ The package was not installed. Please check you do not have it installed under any other user.
+If the package does show up on the device, try manually uninstalling it then try again.
+You should be able to uninstall the app via the Settings app on the device.
+ The following are literal names and should not be translated:
+
+
+
+ The 'run-as' tool required by the Fast Deployment system has been disabled on this device by the manufacturer.
+Please disable Fast Deployment in the Visual Studio project property pages or edit the project file in a text editor and set the 'EmbedAssembliesIntoApk' MSBuild property to 'true'.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ The application does not have the 'android:debuggable' attribute set in the AndroidManifest.xml.
+This is required in order for Fast Deployment to work. This is normally enabled by default by
+the .NET for Android build system for Debug builds. Please check that you to not have this attribute
+set on the 'application' element in your 'AndroidManifest.xml'.
+If you have a class that derives from 'Android.App.Application' and are using the '[Application]' make sure the
+'Debuggable' property is not set at all as it will override the value for debug builds.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ The package is a 'system' application. These are applications which install under
+ the 'system' user on a device. These types of applications cannot use 'run-as'.
+ The Fast Deployment system should have handled this particular error automatically
+ and used a backup installation path. However if you are seeing this error please file
+ an issue with the exact error message using the 'Help->Send Feedback->Report a Problem' menu item in Visual Studio
+ or 'Help->Report a Problem' in Visual Studio for Mac. If possible attach a full diagnostic build
+ log to the feedback report as this will help us diagnose the issue.
+ The following are literal names and should not be translated:
+
+
+
+ The 'run-as' command failed with '{0}'.
+The currently installation of the package in corrupt. Please manually uninstall the
+package from all the users on device and try again. If that does not work you can disable Fast Deployment.
+Fast Deployment can be disabled in the Visual Studio project property pages or edit the project file in a text editor and set the 'EmbedAssembliesIntoApk' MSBuild property to 'true'.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ The 'run-as' command failed with '{0}'.
+Fast Deployment is not currently supported on this device.
+Please file an issue with the exact error message using the 'Help->Send Feedback->Report a Problem' menu item in Visual Studio
+or 'Help->Report a Problem' in Visual Studio for Mac.
+Please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Error deploying '{0}' using '{1}: {2}'.
+This is usually due to an error in `adb` when the file data is sent over to the device.
+The normal cause for this is a loose or low quality USB cable. Please try a different cable.
+Alternatively try using Wifi Debugging, this can be more reliable than USB debugging for certain devices.
+If all of that fails please set the 'EmbedAssembliesIntoApk' MSBuild property to 'true' to disable Fast Deployment in the Visual Studio project property pages, or edit the project file in a text editor.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Starting Debugger on {0}:{1}
+Start sdb then run the following command
+ connect {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ru.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ru.resx
new file mode 100644
index 00000000000..a7e76696433
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.ru.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb не запущен. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Недопустимое имя целевого объекта ADB "{0}". Имена целевых объектов должны начинаться с "-d", "-e" или "-s".
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Нет доступного устройства.
+
+
+ Выбранное устройство не запущено.
+
+
+ Не удалось получить Android ABI для подключенного устройства или эмулятора "{0}". Подключите устройство повторно или перезапустите эмулятор и повторите попытку.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Невозможно скопировать инструменты быстрого развертывания в " {0} / {1} " на целевом устройстве.
+Это устройство может быть несовместимо с функцией быстрого развертывания.
+Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ Ошибка развертывания " {0} " с использованием "{1} : {2} ".
+Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Системное свойство Android "log.redirect-stdio" установлено в значение "true" на целевом устройстве или эмуляторе.
+Чтобы включить совместимость с быстрым развертыванием, установите для свойства значение "false" или перезагрузите устройство или эмулятор, чтобы очистить значение.
+
+
+ Ошибка развертывания ' {0} '.
+Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Приносим свои извинения. Быстрое развертывание поддерживается только на устройствах под управлением Android 5.0 (уровень API 21) или выше.
+Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+
+
+ Средство запуска от имени отключено на этом устройстве. Включите его, активировав параметры разработчика на устройстве или установив для ro.boot.disable_runas значение ЛОЖЬ.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Пакет не был установлен. Проверьте, не установлен ли он под другим пользователем.
+Если пакет отображается на устройстве, попробуйте удалить его вручную, а затем повторите попытку.
+Вы можете удалить приложение через приложение "Настройки" на устройстве.
+ The following are literal names and should not be translated:
+
+
+
+ Инструмент "запустить как", необходимый для системы быстрого развертывания, был отключен на этом устройстве производителем.
+Отключите быстрое развертывание на страницах свойств проекта Visual Studio или отредактируйте файл проекта в текстовом редакторе и установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true".
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ В AndroidManifest.xml для приложения не установлен атрибут "android:debuggable".
+Это необходимо для работы функции быстрого развертывания. Обычно эта функция включена по умолчанию
+в системе сборки .NET для Android для отладочных сборок. Убедитесь, что этот атрибут не установлен
+для элемента "application" в файле "AndroidManifest.xml".
+Если у вас есть класс, производный от "Android.App.Application", и вы используете "[Application]", убедитесь, что
+Свойство "Debuggable" вообще не задано, так как оно переопределит значение для отладочных сборок.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Пакет представляет собой "системное" приложение. Это приложения, которые устанавливаются на
+ устройстве под учетной записью "системного" пользователя. Приложения такого типа не могут использовать функцию "запуск от имени".
+ Система быстрого развертывания должна была автоматически обработать эту конкретную ошибку
+ и использовать резервный путь установки. Однако если вы видите эту ошибку,
+ сообщите о проблеме, указав точное сообщение об ошибке, используя пункт меню "Справка->Отправить отзыв->Сообщить о проблеме" в Visual Studio.
+ или "Справка->Сообщить о проблеме" в Visual Studio для Mac. Если возможно, прикрепите к отзыву
+ полный журнал диагностической сборки, так как это поможет нам диагностировать проблему.
+ The following are literal names and should not be translated:
+
+
+
+ Команда "запустить как" не выполнена с " {0} ".
+Текущая установка пакета повреждена. Вручную удалите
+пакет от всех пользователей на устройстве и повторите попытку. Если это не сработает, вы можете отключить быстрое развертывание.
+Быстрое развертывание можно отключить на страницах свойств проекта Visual Studio или отредактировать файл проекта в текстовом редакторе и установить для свойства MSBuild "EmbedAssembliesIntoApk" значение "true".
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Команда "запустить как" не выполнена с " {0} ".
+Быстрое развертывание в настоящее время не поддерживается на этом устройстве.
+Отправьте сообщение об ошибке с точным текстом сообщения об ошибке, используя пункт меню "Справка->Отправить отзыв->Сообщить о проблеме" в Visual Studio
+или "Справка->Сообщить о проблеме" в Visual Studio для Mac.
+Установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ Ошибка развертывания " {0} " с использованием " {1}" : "{2} ".
+Обычно это происходит из-за ошибки в `adb` при отправке данных файла на устройство.
+Обычной причиной этого является неплотно подключенный или некачественный USB-кабель. Попробуйте использовать другой кабель.
+В качестве альтернативы попробуйте использовать отладку по Wi-Fi, для некоторых устройств это может быть более надежно, чем отладка по USB.
+Если все это не помогло, установите для свойства MSBuild "EmbedAssembliesIntoApk" значение "true", чтобы отключить быстрое развертывание на страницах свойств проекта Visual Studio, или отредактируйте файл проекта в текстовом редакторе.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ Запуск отладчика на {0} : {1}
+Запустите sdb, затем выполните следующую команду
+ подключить {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.tr.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.tr.resx
new file mode 100644
index 00000000000..1ac47a03b85
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.tr.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb çalışmıyor. {0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ Geçersiz adb hedef adı '{0}'. Hedef adları '-d', '-e' veya '-s' ile başlamalıdır.
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ Kullanılabilir cihaz yok.
+
+
+ Seçili cihaz çalışmıyor.
+
+
+ İliştirilmiş cihaz veya `{0}` öykünücüsü için Android ABI alınamadı. Lütfen cihazı yeniden bağlayın veya öykünücüyü yeniden başlatıp tekrar deneyin.
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ Hızlı Dağıtım araçları hedef cihazda “{0}/{1}” hedefine kopyalanamıyor.
+Bu cihaz Hızlı Dağıtım ile uyumlu olmayabilir.
+Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ “{1}: {2}” kullanılarak “{0}” dağıtılırken hata oluştu.
+Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ “log.redirect-stdio” Android sistem özelliği hedef cihazda veya emülatörde “true” olarak ayarlanmış.
+Hızlı Dağıtım ile uyumluluğu etkinleştirmek için özelliği “false” olarak ayarlayın veya değeri temizlemek için cihazı ya da emülatörü yeniden başlatın.
+
+
+ “{0}” dağıtılırken hata oluştu.
+Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ Üzgünüz. Hızlı Dağıtım yalnızca Android 5.0 (API düzeyi 21) veya üzerini çalıştıran cihazlarda desteklenir.
+Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+
+
+ 'farklı çalıştır' aracı bu cihazda devre dışı bırakıldı. Cihazda geliştirici seçeneklerini etkinleştirerek veya 'ro.boot.disable_runas' değerini 'false' olarak ayarlayarak etkinleştirin.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ Paket yüklenmedi. Lütfen başka bir kullanıcı altında yüklü olmadığından emin olun.
+Paket cihazda görünüyorsa el ile kaldırıp yeniden başlatmayı deneyin.
+Uygulamayı cihazdaki Ayarlar uygulaması aracılığıyla kaldırabilirsiniz.
+ The following are literal names and should not be translated:
+
+
+
+ Hızlı Dağıtım sistemi için gereken “run-as” aracı üretici tarafından bu cihazda devre dışı bırakıldı.
+Visual Studio proje özelliği sayfalarında Hızlı Dağıtımı devre dışı bırakın veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ AndroidManifest.xml dosyasında uygulamanın “android:debuggable” özniteliği ayarlanmamış.
+Hızlı Dağıtımın çalışması için bu gereklidir. Bu, normalde Hata ayıklama derlemelerine yönelik olarak Android derleme sistemi için
+.NET tarafından varsayılan değer olarak ayarlanır. Lütfen bu özniteliğin
+“AndroidManifest.xml” içindeki “application” öğesinde ayarlanmadığından emin olun.
+“Android.App.Application” öğesinden türeyen ve “[Application]” kullanan bir sınıfa sahipseniz
+hata ayıklama derlemeleri için değeri geçersiz kılacağından “Debuggable” özelliğinin ayarlanmadığından emin olun.
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ Paket bir “sistem” uygulamasıdır. Bunlar cihaz üzerinde “sistem” kullanıcısı altında
+ yüklenen uygulamalardır. Bu tür uygulamalar “run-as” komutunu kullanamaz.
+ Hızlı Dağıtım sistemi bu hatayı otomatik olarak işlemeli
+ ve bir yedekleme yükleme yolu kullanmalıydı. Ancak bu hatayı görüyorsanız lütfen
+ Visual Studio’da “Yardım-> Geri Bildirim->Sorun Bildir” veya Mac için Visual Studio’da “Yardım->Sorun Bildir” menü öğesini
+ kullanarak tam hata iletisini içeren bir sorun bildirin. Mümkünse sorunun tanılanmasına yardımcı olması için
+ rapora tam tanılama derleme günlüğünü ekleyin.
+ The following are literal names and should not be translated:
+
+
+
+ “run-as” komutu “{0}” hatasıyla başarısız oldu.
+Paketin geçerli yüklemesi bozuk. Lütfen paketi cihazdaki tüm kullanıcılardan el ile kaldırıp
+yeniden deneyin. Bu işe yaramazsa Hızlı Dağıtım'ı devre dışı bırakabilirsiniz.
+Hızlı Dağıtım Visual Studio proje özelliği sayfalarında devre dışı bırakılabilir veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayabilirsiniz.
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ “run-as” komutu “{0}” hatasıyla başarısız oldu.
+Hızlı Dağıtım şu anda bu cihazda desteklenmiyor.
+Visual Studio’da “Yardım-> Geri Bildirim Gönder->Sorun Bildir” veya Mac için Visual Studio’da “Yardım->Sorun Bildir” menü öğesini
+kullanarak tam hata iletisini içeren bir sorun bildirin.
+Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ “{1}: {2}” kullanılarak “{0}” dağıtılırken hata oluştu.
+Bunun nedeni genellikle dosya verileri cihaza gönderildiğinde gerçekleşen “adb” içindeki bir hatadır.
+Bunun normal nedeni, gevşek veya düşük kaliteli bir USB kablosudur. Lütfen farklı bir kablo deneyin.
+Alternatif olarak Wi-Fi Hata Ayıklamasını kullanmayı deneyin. Bu, belirli cihazlar için USB hata ayıklamasından daha güvenilir olabilir.
+Bunların tamamı başarısız olursa Hızlı Dağıtımı devre dışı bırakmak için lütfen Visual Studio proje özelliği sayfalarında veya proje dosyasını bir metin düzenleyicisinde düzenleyerek “EmbedAssembliesIntoApk” MSBuild özelliğini “true” olarak ayarlayın.
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ {0}:{1} üzerinde Hata Ayıklayıcısı başlatılıyor
+Sdb’yi başlatın, ardından şu komutu çalıştırın:
+ connect {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hans.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hans.resx
new file mode 100644
index 00000000000..49bd715de19
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hans.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb 未运行。{0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ 无效的 adb 目标名称 "{0}"。目标名称必须以 "-d"、"-e" 或 "-s" 开头。
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ 没有可用的设备。
+
+
+ 所选设备未运行。
+
+
+ 无法检索附加设备或仿真器“{0}”的 Android ABI。请重新连接设备或重新启动仿真器,然后重试。
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ 无法将快速部署工具复制到目标设备上的“{0}/{1}”。
+此设备可能与快速部署不兼容。
+请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ 使用“{1}”部署“{0}”时出错: “{2}”。
+请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ 在目标设备或模拟器上,Android 系统属性“log.redirect-stdio”设置为“true”。
+为实现与快速部署的兼容性,请将该属性设置为“false”,或者重启设备或模拟器以清除该值。
+
+
+ 部署“{0}”时出错。
+请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ 抱歉。快速部署仅在运行 Android 5.0 (API 级别 21)或更高版本的设备上受支持。
+请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+
+
+ 此设备已禁用 "run-as" 工具。请激活设备上的开发人员选项或将 "ro.boot.disable_runas" 设置为 "false" 来启用它。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ 未安装包。请检查你是否未以任何其他用户的身份安装该包。
+如果该包确实出现在设备上,请尝试将其手动卸载,然后重试。
+应该可以通过设备上的“设置”应用卸载该应用。
+ The following are literal names and should not be translated:
+
+
+
+ 制造商已在此设备上禁用快速部署系统所需的“run-as”工具。
+请在 Visual Studio 项目属性页中禁用快速部署,或者在文本编辑器中编辑项目文件,并将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ 应用程序未在 AndroidManifest.xml 中设置“android: debuggable”属性。
+必须设置它才能使快速部署正常工作。通常,.NET for Android 生成系统
+在调试生成时默认启用此属性。请检查你是否未在“AndroidManifest.xml”的
+“application”元素上设置此属性。
+如果你有一个派生自“Android.App.Application”的类,并且正在使用“[Application]”,请确保
+未设置“Debuggable”属性,因为它会覆盖调试生成的值。
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ 该包是一个“系统”应用程序。这些是安装在设备上
+ “系统”用户下的应用程序。这类应用程序不能使用“run-as”。
+ 快速部署系统本应自动处理此特定错误
+ 并使用备用安装路径。但是,如果看到此错误,请使用
+ Visual Studio 中的“帮助”->“发送反馈”->“报告问题”菜单项
+ 或 Visual Studio for Mac 中的“帮助”->“报告问题”,提交包含确切错误消息的问题反馈。如果可能,请在反馈报告中附上完整的诊断生成
+ 日志,因为这将有助于我们诊断问题。
+ The following are literal names and should not be translated:
+
+
+
+ “run-as”命令失败,出现“{0}”。
+当前安装的包已损坏。请为设备上的所有用户
+手动卸载包,然后重试。如果此方法不起作用,可以禁用快速部署。
+可以在 Visual Studio 项目属性页中禁用快速部署,或者在文本编辑器中编辑项目文件,并将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”。
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ “run-as”命令失败,出现“{0}”。
+此设备当前不支持快速部署。
+请使用 Visual Studio 中的“帮助 -> 发送反馈 -> 报告问题”菜单项
+或 Visual Studio for Mac 中的“帮助”->“报告问题”,提交包含确切错误消息的问题反馈。
+请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ 使用“{1}”部署“{0}”时出错: “{2}”。
+这通常是由于将文件数据发送到设备时,“adb”出错导致的。
+造成这种情况的常见原因是 USB 电缆松动或质量低劣。请尝试更换电缆。
+或者尝试使用 Wi-Fi 调试,对于某些设备,这可能比 USB 调试更可靠。
+如果所有这些方法都无效,请将“EmbedAssembliesIntoApk”MSBuild 属性设置为“true”,以在 Visual Studio 项目属性页中禁用快速部署,或在文本编辑器中编辑项目文件。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ 在“{0}”上启动调试器: {1}
+启动 sdb,然后运行以下命令
+ connect {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hant.resx b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hant.resx
new file mode 100644
index 00000000000..76b43a32253
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Properties/Resources.zh-Hant.resx
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ adb 未執行。{0}
+ The following are literal names and should not be translated: adb
+{0} - further detailed error message
+
+
+ 不正確 adb 目標名稱 '{0}'。目標名稱必須以 '-d'、'-e' 或 '-s' 開頭。
+ The following are literal names and should not be translated: adb, `-d`, `-e`, `-s`
+{0} - the target name the user supplied
+
+
+ 沒有可用的裝置。
+
+
+ 選取的裝置未執行。
+
+
+ 無法為已連結的裝置或模擬器 `{0}` 擷取 Android ABI。請重新連接裝置或重新啟動模擬器,然後再試一次。
+ The following are literal names and should not be translated: ABI
+ABI - is an acronym for Application Binary Interface.
+{0} - the target name the user supplied
+
+
+
+ 無法將 [快速部署] 工具複製到目標裝置上的 '{0}/{1}'。
+此裝置可能與 [快速部署] 不相容。
+請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+ The following are literal names and should not be translated:
+{0} - A device path
+{1} - A filename
+
+
+ 使用 '{1}: {2}' 部署 '{0}' 時發生錯誤。
+請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ 目標裝置或模擬器上的 'log.redirect-stdio' Android 系統屬性設定為 'true'。
+若要啟用與 [快速部署] 的相容性,請將屬性設定為 'false' 或重新啟動裝置或模擬器以清除值。
+
+
+ 部署 '{0}'時發生錯誤。
+請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+ The following are literal names and should not be translated:
+{0} - A filename
+
+
+ 抱歉。只有運行 Android 5.0 (API 層級 21) 或更高版本的裝置才支援 [快速部署]。
+請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+
+
+ 此裝置上的 'run-as' 工具已停用。啟用裝置上的開發人員選項,或將 'ro.boot.disable_runas' 設為 'false' 以啟用此功能。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+'ro.boot.disable_runas' - the android property which disables the `run-as` tool.
+
+
+
+ 未安裝套件。請檢查您並未在任何其他使用者下安裝此套件。
+如果套件確實顯示在裝置上,請嘗試手動解除安裝,然後再試一次。
+您應該可以透過裝置上的 [設定] 應用程式解除安裝應用程式。
+ The following are literal names and should not be translated:
+
+
+
+ 製造商已停用此裝置上的 [快速部署] 系統所需的 'run-as' 工具。
+請停用 Visual Studio 專案屬性頁面中的 [快速部署],或在文字編輯器中編輯專案檔案,並將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true'。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+
+
+
+ 應用程式未在 AndroidManifest.xml 中設定 'android: debuggable' 屬性。
+必須設定屬性,[快速部署] 才能運作。此功能通常是由 .NET for Android 的建置系統
+為 [偵錯] 組建預設啟用的功能。請檢查您的 'AndroidManifest.xml' 中的 'application' 元素
+是否未設定該屬性。
+如果您有衍生自 'Android.App.Application' 的類別,並使用了 '[Application]' 屬性,請確認
+系統未設定 'Debuggable' 屬性,因為這將會覆寫偵錯組建的值。
+
+ The following are literal names and should not be translated:
+AndroidManifest.xml - A xml file
+application - A xml element within a xml file.
+Application - A code attribute.
+Debuggable - A code property
+android:debuggable - An attribute in a xml file.
+
+
+
+ 封裝是 'system' 應用程式。這些是在裝置上以 'system' 使用者身份
+ 安裝的應用程式。這些類型的應用程式無法使用 'run-as'。
+ [快速部署] 系統應該會自動處理這個特定錯誤
+ 並使用備份安裝路徑。不過,如果您看到此錯誤,請使用
+ Visual Studio 中的 '說明->傳送意見反應->回報問題' 功能表項目,或在 Visual Studio for Mac 中的
+ '說明->回報問題' 中提交包含完整錯誤訊息的問題報告。可能的話,請附加完整的診斷組建
+ 記錄到意見反應報告,以協助我們診斷問題。
+ The following are literal names and should not be translated:
+
+
+
+ 'run-as' 命令失敗,錯誤為 '{0}'。
+套件目前的安裝已損毀。請手動在所有使用者的裝置上
+解除安裝套件,然後再試一次。如果這樣沒有用,您可以停用 [快速部署]。
+您可以停用 Visual Studio 專案屬性頁面中的 [快速部署],或在文字編輯器中編輯專案檔案,並將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true'。
+
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ 'run-as' 命令失敗,錯誤為 '{0}'。
+此裝置目前不支援 [快速部署]。
+請在 Visual Studio 中的 '說明->傳送意見反應->回報問題' 功能表項目,或在 Visual Studio for Mac 中的
+'說明->回報問題' 中提交包含完整錯誤訊息的問題報告。
+請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+ The following are literal names and should not be translated:
+'run-as' - a native android tool
+{0} - The error message raised by the program.
+
+
+
+ 使用 '{1}: {2}' 部署 '{0}' 時發生錯誤。
+這通常是由傳送檔案資料至裝置時在 `adb` 中發生的錯誤所導致。
+此錯誤的常見原因是鬆動或品質較差的 USB 纜線。請嘗試其他纜線。
+或者,請嘗試使用 Wifi 偵錯程式,這比特定裝置上的 USB 偵錯程式更可靠。
+如果這些方式都失敗,請將 'EmbedAssembliesIntoApk' MSBuild 屬性設定為 'true',以停用 Visual Studio 專案屬性頁面中的快速部署,或在文字編輯器中編輯專案檔案。
+The following are literal names and should not be translated:
+{0} - A filename
+{1} - The tool that was used to deploy the file.
+{2} - The actual error that occured.
+
+
+ 正在啟動 {0} 上的偵錯工具:{1}
+啟動 sdb,然後執行下列命令
+ 連線 {0} {1}
+
+ The following are literal names and should not be translated:
+{0} - An ip address of a computer.
+{1} - An interger value describing the port to use.
+
+
+
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/Adb.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/Adb.cs
new file mode 100644
index 00000000000..3b97f742aec
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/Adb.cs
@@ -0,0 +1,89 @@
+// Copyright (C) 2015 Xamarin, Inc. All rights reserved.
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using System.Xml.Linq;
+using Microsoft.Build.Utilities;
+using Microsoft.Build.Framework;
+using System.Text.RegularExpressions;
+using Xamarin.AndroidTools;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Android.Build.Tasks;
+
+namespace Xamarin.Android.Tasks
+{
+ public class Adb : AndroidRunToolTask {
+ public override string TaskPrefix => "ADB";
+
+ [Required]
+ public string Command { get; set; }
+
+ public string Filter { get; set; }
+
+ public string Capture { get; set; }
+
+ [Output]
+ public string Output { get; set; }
+
+ Regex filter = null;
+ StringBuilder sb = new StringBuilder ();
+
+ protected override string DefaultErrorCode => "ADB0000";
+
+ public override bool RunTask ()
+ {
+ if (!string.IsNullOrWhiteSpace (Filter))
+ filter = new Regex (Filter);
+ base.Execute ();
+ Output = sb.ToString().Trim ();
+ return !Log.HasLoggedErrors;
+ }
+
+ protected override void LogEventsFromTextOutput (string singleLine, MessageImportance messageImportance)
+ {
+ if (filter == null) {
+ base.LogEventsFromTextOutput (singleLine, messageImportance);
+ sb.AppendLine (singleLine);
+ return;
+ }
+ var matches = filter.Matches (singleLine.Trim ());
+ foreach (Match match in matches) {
+ if (!string.IsNullOrWhiteSpace (Capture)) {
+ sb.AppendLine (match.Groups [Capture].ToString ());
+ } else {
+ foreach (Group grp in match.Groups) {
+ sb.AppendLine (grp.Value);
+ }
+ }
+ }
+ }
+
+ protected virtual CommandLineBuilder CreateCommandLine()
+ {
+ var cmd = new CommandLineBuilder ();
+ cmd.AppendSwitch (Command);
+ return cmd;
+ }
+
+ protected override string GenerateCommandLineCommands ()
+ {
+ var cmd = CreateCommandLine ();
+ return cmd.ToString ();
+ }
+
+ protected override string GenerateFullPathToTool ()
+ {
+ return Path.Combine (ToolPath, ToolExe);
+ }
+
+ protected override string ToolName
+ {
+ get { return IsWindows ? "adb.exe" : "adb"; }
+ }
+ }
+}
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/DetectIfAppWasUninstalled.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/DetectIfAppWasUninstalled.cs
new file mode 100644
index 00000000000..1bb2bce2d92
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/DetectIfAppWasUninstalled.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Mono.AndroidTools;
+using Microsoft.Android.Build.Tasks;
+
+namespace Xamarin.Android.Tasks {
+ public class DetectIfAppWasUninstalled : AndroidTask, ICancelableTask {
+
+ CancellationTokenSource tcs = new CancellationTokenSource ();
+ public override string TaskPrefix => "DIAWI";
+
+ public string AdbTarget { get; set; }
+
+ [Required]
+ public string PackageName { get; set; }
+
+ [Required]
+ public string UploadFlagFile { get; set; }
+
+ public string UserID { get; set; }
+
+ public CancellationToken Token { get { return tcs.Token; } }
+
+ internal const string GetPackagesAsyncKey = nameof (DetectIfAppWasUninstalled) + ".QueryPackages";
+
+ public void Cancel ()
+ {
+ tcs.Cancel ();
+ }
+
+ public override bool RunTask()
+ {
+ // kick off a background task to check the device via adb.
+ // and exit the task immediately. The background task will
+ // continue to run. We need to get the device on the main
+ // thread here, otherwise GetRegisteredTaskObject returns
+ // null.
+ var device = AndroidHelper.ParseTarget (AdbTarget, Log, logErrors: false, engine4: BuildEngine4);
+ if (device == null) {
+ Log.LogDebugMessage ($"No device found: {nameof (AdbTarget)}=\"{AdbTarget}\"");
+ return true;
+ }
+ Log.LogDebugMessage ($"Found device: {device.ID}");
+ var flagFilePath = Path.GetFullPath (UploadFlagFile);
+ var task = QueryPackages (device, flagFilePath);
+ BuildEngine4.RegisterTaskObjectAssemblyLocal (
+ ProjectSpecificTaskObjectKey (GetPackagesAsyncKey),
+ task,
+ RegisteredTaskObjectLifetime.Build,
+ allowEarlyCollection: false);
+ return !Log.HasLoggedErrors;
+ }
+
+
+ async System.Threading.Tasks.Task> QueryPackages (AndroidDevice device, string uploadFlagFileFullPath)
+ {
+ // DO NOT use the Log.XXXX methods in this method.
+ // Because this is running on a background thread they will
+ // end up locking the UI in VS.
+ try {
+ var pmPackages = new PmListPackagesCommand () {
+ RequireVersions = false,
+ User = UserID,
+ };
+ var packages = await device.GetPackages (pmPackages, tcs.Token);
+ if (!packages.Any (x => string.Compare (x.Name, PackageName, StringComparison.OrdinalIgnoreCase) == 0)) {
+ File.Delete (uploadFlagFileFullPath);
+ }
+ return packages;
+ } catch (Exception ex) {
+ System.Diagnostics.Debug.WriteLine ($"DetectIfAppWasUninstalled failed with {ex}");
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs
new file mode 100644
index 00000000000..25a13e48e81
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs
@@ -0,0 +1,1251 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Buffers;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Threading;
+using System.Threading.Tasks;
+
+using Microsoft.Android.Build.Tasks;
+using Mono.AndroidTools;
+using Xamarin.Android.Build.Debugging.Tasks.Properties;
+
+using K4os.Compression.LZ4;
+
+using Microsoft.Build.Framework;
+
+namespace Xamarin.Android.Tasks
+{
+ public class FastDeploy : AsyncTask
+ {
+ const string XAToolsTempPath = "/data/local/tmp/.xatools";
+ const string OverridePath = "files/.__override__";
+ const string ToolsPath = "files/.__tools__";
+ const int MAX_COMMAND = 4096;
+ const int ADB_COMMAND_PADDING = 100;
+
+ public override string TaskPrefix => "FD";
+
+ public string AdbTarget { get; set; }
+ public string UploadFlagFile { get; set; }
+ public bool EmbedAssembliesIntoApk { get; set; }
+ public bool ReInstall { get; set; } = false;
+
+ [Required]
+ public string PackageName { get; set; }
+
+ public string PackageFile { get; set; }
+
+ public string PrimaryCpuAbi { get; set; }
+ public string ToolsAbi { get; set; }
+
+ public ITaskItem [] FastDevFiles { get; set; }
+
+ public bool PreserveUserData { get; set; } = true;
+
+ [Required]
+ public string FastDevToolPath { get; set; }
+
+ public string FastDevTool { get; set; } = "xamarin.sync";
+ public string FastDevFindTool { get; set; } = "xamarin.find";
+ public string FastDevStatTool { get; set; } = "xamarin.stat";
+ public string FastDevCpTool { get; set; } = "xamarin.cp";
+
+ [Required]
+ public string ToolVersion { get; set; }
+
+ public bool DiagnosticLogging { get; set; } = false;
+
+ public bool UsingAndroidNETSdk { get; set; }
+
+ public string UserID { get; set; }
+
+ public bool IsTestOnly { get; set; }
+
+ [Required]
+ public string IntermediateOutputPath { get; set; }
+ public ITaskItem[] EnvironmentFiles { get; set; }
+
+ AndroidDevice Device;
+ DateTime lastUpload = DateTime.MinValue;
+
+ internal class PackageInfo {
+ string internalPath = null;
+ public string InternalPath {
+ get { return internalPath; }
+ set {
+ internalPath = value?.Trim () ?? null;
+ }
+ }
+
+ public string ToolVersion { get; set; }
+ public int? BlockSize { get; set; }
+ public bool SupportsFastDev { get; set; } = true;
+ public bool IsSystemApplication { get; set; } = false;
+ public bool AdbIsRoot { get; set; } = false;
+ public string UserId { get; set; } = null;
+ public string PackageName { get; set; } = null;
+ public bool DiagnosticLogging { get; set; } = false;
+ public Action LogDebugMessage;
+
+ }
+
+ private class DiagnosticData {
+ [JsonPropertyName ("Task")]
+ public string Task { get; set; } = nameof (FastDeploy);
+ [JsonPropertyName ("Properties")]
+ public Dictionary Properties { get; set; } = new Dictionary() {
+ { "target.prop.ro.product.build.version.sdk", "" },
+ { "target.prop.ro.product.cpu.abilist", "" },
+ { "target.prop.ro.product.manufacturer", "" },
+ { "target.prop.ro.product.model", "" },
+ { "target.prop.ro.product.cpu.abi", ""},
+ { "deploy.error.code", ""},
+ { "deploy.tool", "xamarin.sync" },
+ { "deploy.result", "Success" },
+ { "deploy.supports.fastdev", "True" },
+ { "deploy.systemapp", "False" },
+ { "deploy.duration.ms", "0" },
+ { "pii.deploy.error", "" },
+ { "pii.deploy.file", "" },
+ };
+
+ internal void SetProperty (string key, bool? value)
+ {
+ Properties[key] = value?.ToString () ?? "False";
+ }
+
+ internal void SetProperty (string key, int? value)
+ {
+ Properties[key] = value?.ToString () ?? "-1";
+ }
+
+ internal void SetProperty (string key, long? value)
+ {
+ Properties[key] = value?.ToString () ?? "-1";
+ }
+
+ internal void SetProperty (string key, string value)
+ {
+ Properties[key] = value ?? "unknown";
+ }
+ }
+
+ PackageInfo packageInfo;
+ Stopwatch stopWatch = new Stopwatch ();
+
+ Queue diagnosticLogs = new Queue ();
+
+ DiagnosticData diagnosticData = new DiagnosticData ();
+
+ protected string ToolsFullPath {
+ get { return packageInfo.IsSystemApplication ? $"{packageInfo.InternalPath}/{ToolsPath}" : ToolsPath; }
+ }
+
+ protected string OverrideFullPath {
+ get { return packageInfo.IsSystemApplication ? $"{packageInfo.InternalPath}/{OverridePath}" : OverridePath; }
+ }
+
+ void StartTiming ()
+ {
+ stopWatch.Restart ();
+ }
+
+ long GetElapsedTimeAndRestart ()
+ {
+ stopWatch.Stop ();
+ long elapsedTime = stopWatch.ElapsedMilliseconds;
+ stopWatch.Restart ();
+ return elapsedTime;
+ }
+
+ void DebugHandler (string task, string message)
+ {
+ LogDiagnostic ($"DEBUG {task} {message} [{GetElapsedTimeAndRestart ()}ms]");
+ }
+
+ void LogDebugMessageWithTiming (string message)
+ {
+ LogDiagnostic ($"{message} [{GetElapsedTimeAndRestart ()}ms]");
+ }
+
+ void LogDiagnostic (string message)
+ {
+ if (DiagnosticLogging) {
+ LogDebugMessage (message);
+ return;
+ }
+ diagnosticLogs.Enqueue (message);
+ }
+
+ void PrintDiagnostics ()
+ {
+ while (diagnosticLogs.Count > 0) {
+ LogMessage (diagnosticLogs.Dequeue ());
+ }
+ LogMessage ($"{diagnosticData.Task}");
+ foreach (var t in diagnosticData.Properties) {
+ LogMessage ($"\t{t.Key}: {t.Value}");
+ }
+ }
+
+ void LogDiagnosticDataError (string errorCode, string error, string file = "")
+ {
+ diagnosticData.SetProperty ("deploy.result", "Failed");
+ if (!string.IsNullOrEmpty (file))
+ diagnosticData.SetProperty ("pii.deploy.file", file);
+ diagnosticData.SetProperty ("pii.deploy.error", error);
+ diagnosticData.SetProperty ("deploy.error.code", errorCode);
+ }
+
+ void SaveDiagnosticData (long ms)
+ {
+ JsonSerializerOptions options = new JsonSerializerOptions {
+ WriteIndented = true
+ };
+ diagnosticData.SetProperty ("deploy.duration.ms", ms);
+ string newPath = Path.Combine(IntermediateOutputPath, "diagnostics", "fastdeploy.json");
+ File.WriteAllText (newPath, JsonSerializer.Serialize (diagnosticData, options));
+ }
+
+ public override bool Execute ()
+ {
+ Device = AndroidHelper.ParseTarget (AdbTarget, LogMessage, LogCodedError, logErrors: true, engine4: BuildEngine4);
+ if (Device == null) {
+ PrintDiagnostics ();
+ return false;
+ }
+ LogMessage ($"Found device: {Device.ID}");
+
+ if (string.IsNullOrEmpty (PrimaryCpuAbi) && !EmbedAssembliesIntoApk) {
+ PrintDiagnostics ();
+ LogCodedError ("XA0010", Resources.XA0010_NoAbi, Device.ID);
+ return false;
+ }
+
+ var lifetime = RegisteredTaskObjectLifetime.AppDomain;
+ var key = ProjectSpecificTaskObjectKey ($"{Device.ID}_{PackageName}");
+ if (!File.Exists (UploadFlagFile)) {
+ packageInfo = new PackageInfo ();
+ } else {
+ packageInfo = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal(key, lifetime) ?? new PackageInfo ();
+ }
+ packageInfo.DiagnosticLogging = DiagnosticLogging;
+ packageInfo.LogDebugMessage = LogDiagnostic;
+ AndroidLogger.Debug += DebugHandler;
+ try {
+ var flagFilePath = GetFullPath (UploadFlagFile);
+ lastUpload = File.GetLastWriteTimeUtc (flagFilePath);
+ LogDiagnostic ($"LastWriteTime of `{flagFilePath}`: {lastUpload}");
+ StartTiming ();
+ return base.Execute ();
+ } finally {
+ BuildEngine4.RegisterTaskObjectAssemblyLocal (key, packageInfo, lifetime, allowEarlyCollection: false);
+ stopWatch.Stop ();
+ AndroidLogger.Debug -= DebugHandler;
+ }
+ }
+
+ public async override Task RunTaskAsync ()
+ {
+ var sw = new Stopwatch ();
+ sw.Restart ();
+ try {
+ await RunInstall ();
+ } catch {
+ PrintDiagnostics ();
+ throw;
+ } finally {
+ sw.Stop();
+ SaveDiagnosticData (sw.ElapsedMilliseconds);
+ }
+ }
+
+ public async Task RunInstall ()
+ {
+ await Device.EnsureProperties (CancellationToken).ConfigureAwait (false);
+
+ diagnosticData.SetProperty ("target.prop.ro.product.build.version.sdk", Device.Properties?.BuildVersionSdk);
+ diagnosticData.SetProperty ("target.prop.ro.product.cpu.abilist", string.Join (";", Device.Properties?.ProductCpuAbiList ?? Array.Empty ()));
+ diagnosticData.SetProperty ("target.prop.ro.product.cpu.abi", PrimaryCpuAbi);
+ diagnosticData.SetProperty ("target.prop.ro.product.manufacturer", Device.Properties?.ProductManufacturer);
+ diagnosticData.SetProperty ("target.prop.ro.product.model", Device.Properties?.ProductModel);
+
+ string redirectStdio = Device.Properties.Get ("log.redirect-stdio");
+ if (redirectStdio != null && string.Equals ("true", redirectStdio.Trim (), StringComparison.OrdinalIgnoreCase)) {
+ LogDiagnosticDataError ("XA0128", Resources.XA0128_RedirectStdioIsEnabled);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0128", Resources.XA0128_RedirectStdioIsEnabled);
+ return;
+ }
+
+ string runAsDisabled = Device.Properties.Get ("ro.boot.disable_runas");
+ if (runAsDisabled != null && string.Equals ("true", runAsDisabled.Trim (), StringComparison.OrdinalIgnoreCase)) {
+ LogDiagnosticDataError ("XA0131", Resources.XA0131_DeveloperModeNotEnabled);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0131", Resources.XA0131_DeveloperModeNotEnabled);
+ return;
+ }
+
+ await CheckAppInstalledAndDebuggable (PackageName);
+
+ if (EmbedAssembliesIntoApk) {
+ // we need to remove the .__override__ directory BEFORE we uninstall the debug apk.
+ // this is because run-as does NOT work on release apps.
+ await RemoveOverrideDirectory();
+ }
+
+ if (ReInstall && !string.IsNullOrEmpty (PackageFile)) {
+ await Device.UninstallPackage (PackageName, PreserveUserData, CancellationToken);
+ }
+ if (!string.IsNullOrEmpty (PackageFile) &&
+ (packageInfo.InternalPath.IndexOf ("unknown", StringComparison.OrdinalIgnoreCase) >= 0 || ReInstall || IsPackageFileOutOfDate ())) {
+ try {
+ await InstallPackage (!(packageInfo.InternalPath.IndexOf ("unknown", StringComparison.OrdinalIgnoreCase) >= 0));
+ } catch (Exception ex) {
+ LogDiagnosticDataError (GetErrorCode (ex), ex.ToString ());
+ PrintDiagnostics ();
+ LogCodedError (GetErrorCode (ex), ex.ToString ());
+ return;
+ }
+ if (!EmbedAssembliesIntoApk && packageInfo.InternalPath.IndexOf ("unknown", StringComparison.OrdinalIgnoreCase) >= 0) {
+ packageInfo.InternalPath = null;
+ await CheckAppInstalledAndDebuggable (PackageName);
+ if (RaiseRunAsError (packageInfo.InternalPath)) {
+ return;
+ }
+ }
+ }
+
+ if (EmbedAssembliesIntoApk)
+ return;
+
+ if (!await InstallFastDevTools (ToolsFullPath)) {
+ return;
+ }
+
+ if (FastDevFiles?.Any () ?? false) {
+ await TerminateApp ();
+ await DeployFastDevFiles (ToolsFullPath, OverrideFullPath);
+ }
+
+ return;
+ }
+
+ bool IsPackageFileOutOfDate ()
+ {
+ var packageFile = GetFullPath (PackageFile);
+ var lastPackage = File.GetLastWriteTimeUtc (packageFile);
+ LogDiagnostic ($"LastWriteTime of `{packageFile}`: {lastPackage}");
+ return lastUpload < lastPackage;
+ }
+
+ int CompressLZ4 (ref byte [] data, int len, ref byte [] outBuffer, LZ4Level lZ4Level = LZ4Level.L00_FAST)
+ {
+ int compressedLength = LZ4Codec.Encode (data, 0, len, outBuffer, 0, outBuffer.Length, lZ4Level);
+ if (compressedLength < 0 || compressedLength >= outBuffer.Length) {
+ if (DiagnosticLogging)
+ LogDebugMessage ($"Sending Data Uncompressed.");
+ compressedLength = outBuffer.Length;
+ data.CopyTo (outBuffer, 0);
+ }
+ return compressedLength;
+ }
+
+ async Task CheckAppInstalledAndDebuggable (string packageName)
+ {
+ packageInfo.UserId = UserID;
+ packageInfo.PackageName = packageName;
+ await EnsureUserIsRunning ();
+ packageInfo.InternalPath = packageInfo.InternalPath ?? await Device.RunAs (packageInfo, "pwd");
+ if (packageInfo.InternalPath.IndexOf ("Permission denied", StringComparison.OrdinalIgnoreCase) >= 0) {
+ packageInfo.InternalPath = await Device.RunAs (packageInfo, "readlink", "-f", ".");
+ }
+ if (packageInfo.InternalPath.IndexOf ("not an application", StringComparison.OrdinalIgnoreCase) >= 0) {
+ LogDiagnostic ($"Package {packageInfo.PackageName} is a system application.");
+ packageInfo.IsSystemApplication = true;
+ diagnosticData.SetProperty ("deploy.systemapp", value:true);
+ string whoami = await Device.RunShellCommand ("whoami");
+ packageInfo.AdbIsRoot = whoami.Trim () == "root";
+ LogDiagnostic ($"using {(packageInfo.AdbIsRoot ? "root" : $"su {packageInfo.UserId}")} to install fast deployment files. ");
+ packageInfo.InternalPath = $"/data/user/{(packageInfo.UserId ?? "0")}/{packageInfo.PackageName}";
+ return;
+ }
+ if (packageInfo.InternalPath.IndexOf ("not debuggable", StringComparison.OrdinalIgnoreCase) >= 0) {
+ // current install is not debuggable, so lets uninstall it
+ LogDiagnostic ($"Package {packageInfo.PackageName} was not debuggable. Forcing ReInstall");
+ ReInstall = true;
+ return;
+ }
+ if (packageInfo.InternalPath.IndexOf ("unknown", StringComparison.OrdinalIgnoreCase) >= 0) {
+ LogDiagnostic ($"Package {packageInfo.PackageName} was not installed.");
+ return;
+ }
+ if (packageInfo.InternalPath.IndexOf ("Permission denied", StringComparison.OrdinalIgnoreCase) >= 0) {
+ // run-as is probably not supported.
+ LogDiagnostic ("run-as not supported on this device.");
+ packageInfo.SupportsFastDev = false;
+ diagnosticData.SetProperty ("deploy.supports.fastdev", value: false);
+ }
+ return;
+ }
+
+ ///
+ /// Ensures the secondary Android user targeted by this deployment is in the
+ /// 'running' state before any run-as query is issued against it.
+ ///
+ ///
+ /// pm install --user N <apk> registers the package but does
+ /// not materialize the per-user data directory /data/user/N/<pkg>;
+ /// that directory is only created once user N is brought to the running
+ /// state. Until then, every run-as <pkg> --user N invocation fails
+ /// with run-as: couldn't stat /data/user/N/<pkg>: No such file or
+ /// directory and raises XA0137. See
+ /// https://github.com/dotnet/android/issues/7821.
+ /// Empirical measurement on an arm64 API-34 emulator (N=50) showed that
+ /// without this step, 52% of installs fail run-as at t=0 and 30%
+ /// never recover even after 30 seconds of polling — i.e. polling alone is not
+ /// sufficient. am start-user -w N succeeds in 100/100 attempts within
+ /// ~134 ms median (max 363 ms), is idempotent, and is a cheap no-op when the
+ /// user is already running. The primary user (id 0) never requires this step,
+ /// so skip it to avoid any cost in the common case.
+ ///
+ async Task EnsureUserIsRunning ()
+ {
+ var userId = (UserID ?? string.Empty).Trim ();
+ if (userId.Length == 0 || (int.TryParse (userId, out var id) && id == 0)) {
+ return;
+ }
+ LogDiagnostic ($"Ensuring Android user {userId} is in the 'running' state before run-as queries.");
+ string output = await Device.RunShellCommand (CancellationToken, "am", "start-user", "-w", userId);
+ // `am start-user -w` normally prints `Success: user started`. Surface any
+ // output (success or failure, e.g. `Error: could not start user`) at the
+ // diagnostic level so build logs make the cause obvious if the subsequent
+ // `run-as` query fails. Do not attempt to interpret the output here: the
+ // existing run-as error path raises XA0137 deterministically on failure,
+ // and parsing `am`'s output for error markers risks false positives.
+ LogDiagnostic ($"'am start-user -w {userId}' returned: {(string.IsNullOrWhiteSpace (output) ? "" : output.Trim ())}");
+ }
+
+ protected async Task RemoveOverrideDirectory () {
+ // remote //.__override__ directory has files in it.
+ // We can do that by using out tool stat.
+ string overrideExists = await Device.RunAs (packageInfo, $"{ToolsFullPath}/{FastDevStatTool}", OverrideFullPath);
+ if (!(overrideExists.IndexOf ("error:", StringComparison.OrdinalIgnoreCase) >= 0) &&
+ !(overrideExists.IndexOf ("package not debuggable", StringComparison.OrdinalIgnoreCase) >= 0)) {
+ await Device.RunAs (packageInfo, "rm", "-Rf", OverrideFullPath);
+ }
+ }
+
+ protected async Task TerminateApp ()
+ {
+ var pid = await Device.GetProcessId (PackageName, CancellationToken);
+ if (pid == 0) {
+ LogDebugMessage ($"{PackageName} was not running, skipping kill");
+ return;
+ }
+ LogDebugMessage ($"Terminating {PackageName}...");
+ await Device.KillProcessAndWaitForExit (PackageName, CancellationToken);
+ LogDebugMessageWithTiming ($"{PackageName} Terminated.");
+ }
+
+ protected async Task InstallPackage (bool installed = true)
+ {
+ LogDebugMessage ($"Installing Package {PackageName}");
+ try {
+ await Device.PushAndInstallPackageAsync (new PushAndInstallCommand {
+ ApkFile = PackageFile,
+ PackageName = PackageName,
+ ReInstall = ReInstall,
+ User = UserID,
+ TestOnly = IsTestOnly,
+ }, token: CancellationToken);
+ LogDebugMessageWithTiming ($"Installed Package {PackageName}.");
+ } catch (Exception exception) {
+ var ex = exception;
+ if (exception is AggregateException aex) {
+ ex = aex.Flatten ().InnerException;
+ }
+ if (!await ShouldThrowIfPackageInstallFailed (ex as PackageAlreadyExistsException)) {
+ LogDebugMessageWithTiming ($"Installed Package {PackageName}.");
+ return;
+ }
+ throw;
+ }
+ return;
+ }
+
+ async Task ShouldThrowIfPackageInstallFailed (PackageAlreadyExistsException e)
+ {
+ if (e == null)
+ return true;
+
+ int s = (e.PackageFile ?? "").LastIndexOf ('/');
+ string apkBasename = s >= 0 ? e.PackageFile.Substring (s+1) : e.PackageFile;
+
+ // If the runtime already exists, ignore the error
+ // Sometimes android doesn't report it's installed when it is :/
+ if (apkBasename != Path.GetFileName (PackageFile))
+ return false;
+
+ // Oops; things have gotten wedged (stale/interrupted install?)
+ // The file we tried to upload already exists on the device!
+ // Delete and try again.
+ LogDebugMessage (string.Format ("Package '{0}' already exists. Retrying...", PackageName));
+ try {
+ // NOTE We NEED to delete the cache data too other wise the install will fail.
+ await Device.DeleteFile (e.PackageFile, true, CancellationToken);
+ } catch {
+ // Ebil, yes, but...
+ }
+ bool preserveData = !(e is RequiresUninstallException);
+ LogDebugMessage (string.Format ("Forcing complete uninstall of '{0}'... Preserving Data: {1}", PackageName, preserveData));
+ var uninstallCommand = new PmUninstallCommand() { PackageName = PackageName, User = UserID, PreserveData = preserveData };
+ await Device.UninstallPackage (uninstallCommand, cancellationToken: CancellationToken);
+ LogDebugMessage (string.Format ("Installing '{0}'...", PackageName));
+ await Device.PushAndInstallPackageAsync (new PushAndInstallCommand {
+ ApkFile = PackageFile,
+ PackageName = PackageName,
+ ReInstall = false,
+ User = UserID
+ },token: CancellationToken);
+ return false;
+ }
+
+ protected async Task InstallFastDevTools (string toolPath)
+ {
+ if (string.Compare (packageInfo.ToolVersion ?? string.Empty, ToolVersion, StringComparison.OrdinalIgnoreCase) == 0) {
+ LogDebugMessage ($"FastDev Tools already installed for the app. {packageInfo.ToolVersion}");
+ return true;
+ }
+
+ string output = await Device.RunAs (packageInfo, "cat", $"{toolPath}/version");
+ if (string.Compare (output.Trim (), ToolVersion, StringComparison.OrdinalIgnoreCase) == 0) {
+ LogDebugMessage ($"FastDev Tools already installed for the app. {output}");
+ packageInfo.ToolVersion = ToolVersion;
+ return true;
+ }
+
+ output = await Device.RunAs (packageInfo, "mkdir", "-p", toolPath);
+ if (output.IndexOf ("run-as:", StringComparison.OrdinalIgnoreCase) >= 0 ||
+ output.IndexOf ("mkdir:", StringComparison.OrdinalIgnoreCase) >= 0) {
+ if (!RaiseRunAsError (output)) {
+ LogDiagnosticDataError ("XA0130", output);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0130", Resources.XA0130_FastDevNotSupported);
+ }
+ return false;
+ }
+ // we have to do this as a normal shell command since running
+ // mkdir under `run-as` will result in a `permission-denied` error.
+ output = await Device.RunShellCommand ("mkdir", "-p", XAToolsTempPath);
+ if (output.IndexOf ("mkdir:", StringComparison.OrdinalIgnoreCase) >= 0) {
+ if (!RaiseRunAsError (output)) {
+ LogDiagnosticDataError ("XA0130", output);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0130", Resources.XA0130_FastDevNotSupported);
+ }
+ return false;
+ }
+
+ string toolAbi = string.IsNullOrEmpty (ToolsAbi) ? PrimaryCpuAbi : ToolsAbi;
+ var tools = new [] { FastDevFindTool, FastDevTool, FastDevStatTool, FastDevCpTool };
+ foreach (var tool in tools) {
+ LogDebugMessage ($"Installing FastDev Tool {toolPath}/{tool} for {toolAbi}");
+ if (!await PushFileToDevice (Device, PackageName, toolPath, Path.Combine (FastDevToolPath, toolAbi, tool), $"{toolPath}/{tool}", CancellationToken)) {
+ LogDiagnosticDataError ("XA0126", Resources.XA0126_UnableToCopyFastDevTools);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0126", Resources.XA0126_UnableToCopyFastDevTools, toolPath, tool);
+ return false;
+ }
+ }
+ LogDebugMessage ($"Setting FastDev Tools Permissions");
+ await Device.RunAs (packageInfo, "chmod", "700", $"{toolPath}/{FastDevTool}", $"{toolPath}/{FastDevFindTool}", $"{toolPath}/{FastDevStatTool}", $"{toolPath}/{FastDevCpTool}");
+ LogDebugMessage ($"Installing FastDev Tools to {toolPath}/version");
+ await PushFileTextToDevice (Device, PackageName, ToolVersion, Encoding.ASCII, $"{toolPath}/version", token: CancellationToken);
+ LogDebugMessage ($"Removing FastDev Tools temp directory.");
+ await Device.RunShellCommand ("rm", "-Rf", XAToolsTempPath);
+ packageInfo.ToolVersion = ToolVersion;
+ return true;
+ }
+
+ async Task PushFileToDevice (AndroidDevice device, string packageName, string toolPath, string file, string target, CancellationToken token)
+ {
+ if (!File.Exists (file)) {
+ LogDebugMessage ($"File '{file}' does not exists. Skipping.");
+ return false;
+ }
+ using (var fs = File.OpenRead (file)) {
+ if (!await PushStreamToDevice (device, packageName, toolPath, fs, target, DateTime.UtcNow, token: token)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ async Task PushFileTextToDevice (AndroidDevice device, string packageName, string fileContents, Encoding encoding, string target, CancellationToken token)
+ {
+ using (var ms = new MemoryStream ()) {
+ using (var sw1 = new StreamWriter (ms, encoding, 1024, leaveOpen: true)) {
+ sw1.WriteLine (fileContents);
+ sw1.Flush ();
+ }
+ ms.Position = 0;
+ if (!await PushStreamToDevice (device, packageName, null, ms, target, DateTime.UtcNow, token: token)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ async Task PushStreamToDeviceWithTool (AndroidDevice device, string packageName, string toolPath, Stream stream, string target, DateTimeOffset modifiedDateTime, CancellationToken token = default (CancellationToken))
+ {
+ string targetFile = Path.GetFileName (target);
+ try {
+ long wrote = await device.Push (stream, $"{XAToolsTempPath}/{targetFile}", cancellationToken: token);
+ LogDiagnostic ($"Pushed {wrote} to {XAToolsTempPath}/{targetFile}");
+ string r = await device.RunAs (packageInfo, $"{toolPath}/{FastDevCpTool}", $"{XAToolsTempPath}/{targetFile}", target, $"{modifiedDateTime.ToUnixTimeMilliseconds ()}");
+ if (r.IndexOf ("run-as:", StringComparison.OrdinalIgnoreCase) >= 0) {
+ TryGetRunAsErrorCode (r, out var err);
+ LogDiagnosticDataError (err.code, r, targetFile);
+ return false;
+ }
+ LogDiagnostic ($"moved {XAToolsTempPath}/{targetFile} to {target}");
+ LogDebugMessageWithTiming ($"Installed {target}.");
+ } catch (Exception ex) {
+ LogDebugMessageWithTiming ($"Failed to push {targetFile} to {target}. {ex}.");
+ LogDiagnosticDataError(GetErrorCode (ex),ex.ToString (), targetFile);
+ return false;
+ }
+ return true;
+ }
+
+ async Task PushStreamToDevice (AndroidDevice device, string packageName, string toolPath, Stream stream, string target, DateTimeOffset modifiedDateTime, CancellationToken token = default (CancellationToken))
+ {
+ string targetFile = Path.GetFileName (target);
+ try {
+ long wrote = await device.Push (stream, $"{XAToolsTempPath}/{targetFile}", cancellationToken: token);
+ LogDiagnostic ($"Pushed {wrote} to {XAToolsTempPath}/{targetFile}");
+ string r = await device.RunAs (packageInfo, "cp", $"{XAToolsTempPath}/{targetFile}", target);
+ if (r.IndexOf ("run-as:", StringComparison.OrdinalIgnoreCase) >= 0) {
+ TryGetRunAsErrorCode (r, out var err);
+ LogDiagnosticDataError (err.code, r, targetFile);
+ return false;
+ }
+ LogDiagnostic ($"moved {XAToolsTempPath}/{targetFile} to {target}");
+ await device.RunAs (packageInfo, "touch", "-t", $"{modifiedDateTime.ToString ("yyyyMMdd.HHmmss")}", target);
+ LogDebugMessageWithTiming ($"Installed {target}.");
+ } catch (Exception ex) {
+ LogDiagnosticDataError (GetErrorCode (ex),ex.ToString ());
+ LogDebugMessageWithTiming ($"Failed to push {targetFile} to {target}. {ex}.");
+ return false;
+ }
+ return true;
+ }
+
+ string GetTargetPath (ITaskItem file)
+ {
+ string targetPath = file.GetMetadata ("TargetPath");
+ if (string.IsNullOrEmpty (targetPath)) {
+ // fallback to DestinationSubPath
+ LogDiagnostic ($"'TargetPath' meta data not found on '{file.ItemSpec}'. Falling back to'DestinationSubPath'");
+ targetPath = file.GetMetadata ("DestinationSubPath");
+ }
+ return targetPath;
+ }
+
+ protected async Task DeployFastDevFiles (string toolPath, string overridePath)
+ {
+ // get the optimal blocksize from the device. This will help speed up transfer and disk writes.
+ LZ4Level lz4level = LZ4Level.L03_HC;
+
+ LogDiagnostic ("Calculating subdirectories");
+ HashSet directories = new HashSet ();
+ directories.Add (overridePath);
+ foreach (var file in FastDevFiles) {
+ string targetPath = GetTargetPath (file);
+ if (!string.IsNullOrEmpty (targetPath)) {
+ string dirName = Path.GetDirectoryName (targetPath).Replace ("\\", "/");
+ if (!string.IsNullOrEmpty (dirName)) {
+ directories.Add ($"{overridePath}/{dirName}");
+ LogDiagnostic ($"{targetPath} => {overridePath}/{dirName}");
+ }
+ }
+ }
+ int length = ADB_COMMAND_PADDING + PackageName.Length;
+ List args = new List(directories.Count + 2);
+ args.Add ("mkdir");
+ args.Add ("-p");
+ foreach (var dir in directories) {
+ int newLength = dir.Length + 3;
+ if ((length + newLength) >= MAX_COMMAND) {
+ await Device.RunAs (packageInfo, args);
+ length = ADB_COMMAND_PADDING + PackageName.Length;
+ args.Clear ();
+ args.Add ("mkdir");
+ args.Add ("-p");
+ }
+ length += newLength;
+ args.Add (dir);
+ }
+ await Device.RunAs (packageInfo, args);
+
+ string filelist = await Device.RunAs (packageInfo, $"{toolPath}/{FastDevFindTool}", DiagnosticLogging ? "-vd" : "-v", overridePath);
+ LogDiagnostic ($"{FastDevFindTool}: {filelist}");
+ string [] files = Array.Empty ();
+ if (!(filelist.IndexOf ("error:", StringComparison.OrdinalIgnoreCase) >= 0)) {
+ files = filelist.Split (new char [] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
+ }
+ Dictionary fileData = new Dictionary ();
+ foreach (var file in files) { // file size mtime
+ if (file.IndexOf ("\t") == -1) {
+ LogDebugMessage ($"{FastDevFindTool}: Ignoring line '{file}'. Line is incorrectly formatted.");
+ continue;
+ }
+ var entires = file.Split (new char [] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
+ if (entires.Length != 3) {
+ LogDebugMessage ($"{FastDevFindTool}: Ignoring line {file}. Input does not have 3 items.");
+ continue;
+ }
+ if (long.TryParse (entires [1].Trim (), out long fsize) && long.TryParse (entires [2].Trim (), out long mtime)) {
+ DateTimeOffset offset;
+ try {
+ offset = DateTimeOffset.FromUnixTimeMilliseconds (mtime);
+ } catch (ArgumentOutOfRangeException) {
+ offset = DateTimeOffset.MinValue;
+ }
+ fileData.Add (entires [0].Replace ("./", "").Trim (), (size: fsize, mtime: offset));
+ } else {
+ LogDebugMessage ($"Failed to parse values for line {file}. Ignoring.");
+ }
+ }
+ // remove known directories s they don't get deleted.
+ fileData.Remove ("links");
+
+ foreach (var file in FastDevFiles) {
+ if (!File.Exists (file.ItemSpec)) {
+ LogDebugMessage ($"File '{file.ItemSpec}' does not exists. Skipping.");
+ continue;
+ }
+ StartTiming ();
+ if (Path.GetExtension (file.ItemSpec) == ".so") {
+ string abi = AndroidRidAbiHelper.GetNativeLibraryAbi (file);
+ if (abi != PrimaryCpuAbi) {
+ LogDebugMessageWithTiming ($"NotifySync SkipCopyFile {file.ItemSpec} abi not suitable for this device.");
+ continue;
+ }
+ }
+ string targetPath = GetTargetPath (file);
+ if (!string.IsNullOrEmpty (targetPath)) {
+ targetPath = $"{targetPath}".Replace ("\\", "/");
+ } else {
+ targetPath = $"{Path.GetFileName (file.ItemSpec)}";
+ }
+ string filename = Path.GetFileName (file.ItemSpec);
+ var fi = new FileInfo (file.ItemSpec);
+ bool modified = true;
+ DateTimeOffset modifiedDateTime = File.GetLastWriteTimeUtc (file.ItemSpec);
+ DateTimeOffset remoteDateTime = DateTimeOffset.MinValue;
+ if (fileData.ContainsKey (targetPath)) {
+ remoteDateTime = fileData [targetPath].mtime;
+ modified = remoteDateTime.ToUnixTimeMilliseconds () < modifiedDateTime.ToUnixTimeMilliseconds () || fi.Length != fileData [targetPath].size;
+ }
+ if (!modified) {
+ LogDebugMessageWithTiming ($"NotifySync SkipCopyFile {file.ItemSpec}=>{targetPath} file is up to date.");
+ fileData.Remove (targetPath);
+ continue;
+ }
+ if (!await DeployFileWithFastDevTool (file, toolPath, overridePath, lz4level, modifiedDateTime)) {
+ diagnosticData.SetProperty ("deploy.result", "Failed");
+ return;
+ }
+ LogDebugMessageWithTiming ($"NotifySync CopyFile {file.ItemSpec}.");
+ LogDiagnostic ($"Local Modified Time '{modifiedDateTime.ToUnixTimeMilliseconds ()}' is newer than '{remoteDateTime.ToUnixTimeMilliseconds ()}'.");
+ fileData.Remove (targetPath);
+ }
+ if (EnvironmentFiles?.Length > 0) {
+ string targetPath = $"{PrimaryCpuAbi}/environment";
+ DateTimeOffset remoteDateTime = DateTimeOffset.MinValue;
+ if (fileData.ContainsKey (targetPath)) {
+ remoteDateTime = fileData [targetPath].mtime;
+ }
+ await DeployEnvironmentFiles (EnvironmentFiles, toolPath, overridePath, targetPath, remoteDateTime);
+ fileData.Remove (targetPath);
+ }
+ foreach (var file in fileData.Keys) {
+ // we need to remove unknown files from the .__override__ path
+ string targetFile = $"{file.Replace ("./", "")}";
+ LogDebugMessage ($"Remove redundant file {OverrideFullPath}/{targetFile}");
+ await Device.RunAs (packageInfo, "rm", "-Rf", $"{OverrideFullPath}/{targetFile}");
+ }
+ // clean up the temp folder if we are not using the xamarin.sync tool
+ if (!packageInfo.SupportsFastDev)
+ await Device.RunShellCommand ("rm", "-Rf", XAToolsTempPath);
+ return;
+ }
+
+ async Task DeployFileWithFastDevTool (ITaskItem file, string toolPath, string overridePath, LZ4Level lz4level, DateTimeOffset modifiedDateTime)
+ {
+
+ using (var fs = File.OpenRead (file.ItemSpec)) {
+ string destination = overridePath;
+ // This bit handles subdirectories.
+ int bufferSize = LZ4Codec.MaximumOutputSize (fs.Length > int.MaxValue ? int.MaxValue : (int)fs.Length);
+ string targetPath = GetTargetPath (file);
+ if (!string.IsNullOrEmpty (targetPath)) {
+ destination += $"/{targetPath}".Replace ("\\", "/");
+ } else {
+ destination += $"/{Path.GetFileName (file.ItemSpec)}";
+ }
+ if (packageInfo.SupportsFastDev) {
+ byte [] buffer = ArrayPool.Shared.Rent (bufferSize);
+ byte [] compressed = ArrayPool.Shared.Rent (bufferSize);
+ try {
+ List args = DeviceExt.BuildArgs (DeviceExt.RunAsCommand, packageInfo);
+ args.AddRange (new string[] { $"{toolPath}/{FastDevTool}", $"{compressed.Length}", $"{fs.Length}", $"{destination}", $"{modifiedDateTime.ToUnixTimeMilliseconds ()}" });
+ LogDiagnostic ($"executing: {string.Join (" ", args.ToArray ())}");
+ var output = await Device.RunShellCommandStream (args.ToArray (), async (s) => {
+ int read = await fs.ReadAsync (buffer, 0, buffer.Length);
+ if (read == 0)
+ return false;
+ int compressedLength = CompressLZ4 (ref buffer, read, ref compressed, lz4level);
+ int l = IPAddress.HostToNetworkOrder (compressedLength);
+ var v = BitConverter.GetBytes (l);
+ try {
+ s.Write (v, 0, 4);
+ s.Write (compressed, 0, compressedLength);
+ } catch {
+ return false;
+ }
+ return true;
+ }, CancellationToken);
+ LogDiagnostic ($"FastDev of {file.ItemSpec} returned: {output}");
+
+ if (output.IndexOf ("error:", StringComparison.OrdinalIgnoreCase) >= 0) {
+ if (output.IndexOf ("from stdin.", StringComparison.OrdinalIgnoreCase) >= 0) {
+ LogDiagnostic ($"'{FastDevTool}' returned '{output}' when deploying '{destination}'. Falling back to backup deployment.");
+ diagnosticData.SetProperty ("pii.deploy.error", output);
+ diagnosticData.SetProperty ("pii.deploy.file", file.ItemSpec);
+ diagnosticData.SetProperty ("deploy.tool", value:"xamarin.cp");
+ // Log warning and fallback to adb push style deployment. It will be slower... but it works.
+ } else {
+ LogDiagnosticDataError ("XA0127", output, file.ItemSpec);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0127", Resources.XA0127_ErrorDeployingFile, destination, FastDevTool, output);
+ return false;
+ }
+ }
+
+ if (output.IndexOf ($"wrote [{fs.Length}]", StringComparison.OrdinalIgnoreCase) >= 0) {
+ return true;
+ }
+ // we didn't write the file as we expected so use the backup path.
+ // this can happen is the devices supports run-as but does not support
+ // reading data in from stdin. Normally on older devices.
+ // if we get here, we will just reset the stream and drop through to the
+ // backup path.
+ packageInfo.SupportsFastDev = false;
+ fs.Position = 0;
+ } catch (Exception ex) {
+ LogDiagnostic ($"Hit exception. Falling back to slow deployment for {file.ItemSpec}. {ex}");
+ diagnosticData.SetProperty ("pii.deploy.error", ex.ToString ());
+ diagnosticData.SetProperty ("deploy.tool", value:"xamarin.cp");
+ packageInfo.SupportsFastDev = false;
+ fs.Position = 0;
+ } finally {
+ ArrayPool.Shared.Return (buffer);
+ ArrayPool.Shared.Return (compressed);
+ }
+ }
+ if (!packageInfo.SupportsFastDev) {
+ if (!await PushStreamToDeviceWithTool (Device, PackageName, toolPath, fs, destination, modifiedDateTime, token: CancellationToken)) {
+ LogDiagnosticDataError ("XA0129", Resources.XA0129_ErrorDeployingFile, destination);
+ PrintDiagnostics ();
+ LogCodedError ($"XA0129", Resources.XA0129_ErrorDeployingFile, destination);
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ async Task DeployEnvironmentFiles (ITaskItem[] environments, string toolPath, string overridePath, string targetPath, DateTimeOffset remoteFileModified)
+ {
+ int maxKeyLength = 0;
+ int maxValueLength = 0;
+ DateTimeOffset newestFileDateTime = DateTimeOffset.MinValue;
+ var data = new Dictionary ();
+ foreach (ITaskItem env in environments ?? Array.Empty ()) {
+ if (!File.Exists (env.ItemSpec))
+ continue;
+ DateTimeOffset modifiedDateTime = File.GetLastWriteTimeUtc (env.ItemSpec);
+ if (modifiedDateTime > newestFileDateTime)
+ newestFileDateTime = modifiedDateTime;
+ foreach (string line in File.ReadLines (env.ItemSpec)) {
+ if (string.IsNullOrEmpty (line))
+ continue;
+ int index = line.IndexOf ('=');
+ if (index == -1) {
+ LogDebugMessage ($"Skipping invalid environment line: {line}");
+ continue;
+ }
+ var key = line.Substring (0, index);
+ var value = line.Substring (index + 1);
+ maxKeyLength = Math.Max (maxKeyLength, key.Length);
+ maxValueLength = Math.Max (maxValueLength, value.Length);
+ data [key] = value;
+ }
+ }
+
+ // Length+1 so at least one trailing \0 for the longest value
+ maxKeyLength++;
+ maxValueLength++;
+
+ if (newestFileDateTime <= remoteFileModified) {
+ LogDebugMessage ($"NotifySync SkipCopyFile @(AndroidEnvironment) files => {targetPath} file is up to date.");
+ return true;
+ }
+ var stream = new MemoryStream (); // dont use Pool as Device.Push dispose's the stream.
+ var binaryWriter = new BinaryWriter (stream, Encoding.ASCII);
+ binaryWriter.Write (Encoding.ASCII.GetBytes ("0x" + maxKeyLength.ToString ("X8") + '\0'));
+ binaryWriter.Write (Encoding.ASCII.GetBytes ("0x" + maxValueLength.ToString ("X8") + '\0'));
+ foreach (var kvp in data) {
+ binaryWriter.Write (Encoding.ASCII.GetBytes (kvp.Key.PadRight (maxKeyLength, '\0')));
+ binaryWriter.Write (Encoding.ASCII.GetBytes (kvp.Value.PadRight (maxValueLength, '\0')));
+ }
+ binaryWriter.Flush ();
+ binaryWriter.BaseStream.Position = 0;
+ await PushStreamToDeviceWithTool (Device, PackageName, toolPath, binaryWriter.BaseStream, $"{overridePath}/{targetPath}", DateTimeOffset.UtcNow, token: CancellationToken);
+ LogDebugMessageWithTiming ($"NotifySync CopyFile @(AndroidEnvironment) files.");
+ LogDiagnostic ($"Local Modified Time '{newestFileDateTime.ToUnixTimeMilliseconds ()}' is newer than '{remoteFileModified.ToUnixTimeMilliseconds ()}'.");
+ return true;
+ }
+
+ string GetErrorCode (Exception ex)
+ {
+ switch (ex) {
+#pragma warning disable CS0618
+ case IncompatibleCpuAbiExceptiopn e:
+ return "ADB0020";
+#pragma warning restore CS0618
+ case IncompatibleCpuAbiException e:
+ return "ADB0020";
+ case RequiresUninstallException e:
+ return "ADB0030";
+ case SdkNotSupportedException e:
+ return "ADB0040";
+ case PackageAlreadyExistsException e:
+ return "ADB0050";
+ case InsufficientSpaceException e:
+ return "ADB0060";
+ //NOTE: this one is a base class
+ case InstallFailedException e:
+ return "ADB0010";
+ default:
+ return GetErrorCode (ex.Message);
+ }
+ }
+
+ static readonly List<(string error, string code, string message)> runas_codes = new List<(string error, string code, string message)> () {
+ { (error: "run-as is disabled", code: "XA0131", message: Resources.XA0131_DeveloperModeNotEnabled ) },
+ { (error: "unknown", code: "XA0132", message: Resources.XA0132_PackageNotInstalled ) },
+ { (error: "Permission denied", code: "XA0133", message: Resources.XA0133_RunAsPermissionDenied ) },
+ { (error: "package not debuggable", code: "XA0134", message: Resources.XA0134_RunAsPackageNotDebuggable ) },
+ { (error: "package not an application", code: "XA0135", message: Resources.XA0135_RunAsPackageNotAndApplication ) },
+ { (error: "has corrupt installation", code: "XA0136", message: Resources.XA0136_RunAsCorruptInstallation ) },
+ { (error: "users can run this program", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "set SELinux security context", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "to package's data directory", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "couldn't stat", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "has wrong owner", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "readable or writable by others", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "not a directory", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ { (error: "run-as:", code: "XA0137", message: Resources.XA0137_RunAsOSCorrupt ) },
+ };
+
+ bool TryGetRunAsErrorCode (string error, out (string error, string code, string message) errTuple)
+ {
+ errTuple = (error: "unknown", code: "XA0132", message: error);
+ foreach (var err in runas_codes) {
+ if (error.IndexOf (err.error, StringComparison.OrdinalIgnoreCase) >= 0) {
+ errTuple = err;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool RaiseRunAsError (string error)
+ {
+ if (TryGetRunAsErrorCode (error, out var err)) {
+ LogDiagnosticDataError (err.code, err.message);
+ PrintDiagnostics ();
+ LogCodedError (err.code, err.message, error);
+ return true;
+ }
+ return false;
+ }
+
+ string GetFullPath (string dir) => Path.IsPathRooted (dir) ? dir : Path.GetFullPath (Path.Combine (WorkingDirectory, dir));
+
+ static string GetErrorCode (string message)
+ {
+ foreach (var errorCode in error_codes)
+ if (message.IndexOf (errorCode.message, StringComparison.OrdinalIgnoreCase) >= 0)
+ return errorCode.code;
+
+ return "ADB1000";
+ }
+
+ static readonly List<(string code, string message)> error_codes = new List<(string code , string message)> () {
+ { (code: "ADB0010", message: nameof (InstallFailedException)) },
+#pragma warning disable CS0618
+ { (code: "ADB0020", message: nameof (IncompatibleCpuAbiExceptiopn)) },
+#pragma warning restore CS0618
+ { (code: "ADB0020", message: nameof (IncompatibleCpuAbiException)) },
+ { (code: "ADB0030", message: nameof (RequiresUninstallException)) },
+ { (code: "ADB0040", message: nameof (SdkNotSupportedException)) },
+ { (code: "ADB0050", message: nameof (PackageAlreadyExistsException)) },
+ { (code: "ADB0060", message: nameof (InsufficientSpaceException)) },
+ { (code: "ADB1001", message: "failed to create session") },
+ { (code: "ADB1002", message: "failed to finalize session") },
+ { (code: "ADB1003", message: "product directory not specified; set $ANDROID_PRODUCT_OUT") },
+ { (code: "ADB1004", message: "server didn't ACK") },
+ { (code: "ADB1005", message: "server killed by remote request") },
+ { (code: "ADB1006", message: "timed out waiting for threads to finish reading from ADB server") },
+ { (code: "ADB1007", message: "usage:") },
+ { (code: "ADB1008", message: "bulkIn endpoint not assigned") },
+ { (code: "ADB1009", message: "bulkOut endpoint not assigned") },
+ { (code: "ADB1010", message: "cannot start server on remote host") },
+ { (code: "ADB1011", message: "cap_clear_flag(INHERITABLE) failed") },
+ { (code: "ADB1012", message: "cap_clear_flag(PEMITTED) failed") },
+ { (code: "ADB1013", message: "cap_set_proc() failed") },
+ { (code: "ADB1014", message: "Client not connected") },
+ { (code: "ADB1015", message: "Could not find device interface") },
+ { (code: "ADB1016", message: "Could not set SELinux context") },
+ { (code: "ADB1017", message: "Could not start mdnsd") },
+ { (code: "ADB1018", message: "could not start server") },
+ { (code: "ADB1019", message: "couldn't allocate StdinReadArgs object") },
+ { (code: "ADB1020", message: "couldn't create USB matching dictionary") },
+ { (code: "ADB1021", message: "daemon started successfully") },
+ { (code: "ADB1022", message: "daemon still not running") },
+ { (code: "ADB1023", message: "error: no emulator detected") },
+ { (code: "ADB1024", message: "error: shell command too long") },
+ { (code: "ADB1025", message: "Failed to allocate key") },
+ { (code: "ADB1026", message: "failed to allocate memory for ShellProtocol object") },
+ { (code: "ADB1027", message: "failed to allocate new subprocess") },
+ { (code: "ADB1028", message: "Failed to convert to public key") },
+ { (code: "ADB1029", message: "failed to create pipe to report error") },
+ { (code: "ADB1030", message: "failed to create run queue notify socketpair") },
+ { (code: "ADB1031", message: "failed to empty run queue notify fd") },
+ { (code: "ADB1032", message: "failed to encode RSA public key") },
+ { (code: "ADB1033", message: "Failed to generate new key") },
+ { (code: "ADB1034", message: "failed to get matching services") },
+ { (code: "ADB1035", message: "failed to get user home directory") },
+ { (code: "ADB1036", message: "Failed to get user key") },
+ { (code: "ADB1037", message: "failed to make run queue notify socket nonblocking") },
+ { (code: "ADB1038", message: "Failed to read key") },
+ { (code: "ADB1039", message: "failed to register libusb hotplug callback") },
+ { (code: "ADB1040", message: "failed to start daemon") },
+ { (code: "ADB1041", message: "failed to write to run queue notify fd") },
+ { (code: "ADB1042", message: "Key must be a null-terminated string") },
+ { (code: "ADB1043", message: "Pipe stalled, clearing stall") },
+ { (code: "ADB1044", message: "Public key too large to base64 encode") },
+ { (code: "ADB1045", message: "reply fd for adb server to client communication not specified") },
+ { (code: "ADB1046", message: "run queue notify fd was closed") },
+ { (code: "ADB1047", message: "Unable to get interface class, subclass and protocol") },
+ { (code: "ADB1048", message: "usb_read interface was null") },
+ { (code: "ADB1049", message: "usb_write interface was null") },
+ { (code: "ADB1050", message: "cannot fit pipe handle value into 32-bits") },
+ { (code: "ADB1051", message: "connect error for create") },
+ { (code: "ADB1052", message: "connect error for finalize") },
+ { (code: "ADB1053", message: "connect error for write") },
+ { (code: "ADB1054", message: "could not open adb service") },
+ { (code: "ADB1055", message: "couldn't parse 'wait-for' command") },
+ { (code: "ADB1056", message: "CreateFileW 'nul' failed") },
+ { (code: "ADB1057", message: "only wrote") },
+ { (code: "ADB1058", message: "error response") },
+ { (code: "ADB1059", message: "failed to install") },
+ { (code: "ADB1060", message: "failed to read block") },
+ { (code: "ADB1061", message: "failed to write data") },
+ { (code: "ADB1062", message: "invalid reply fd") },
+ { (code: "ADB1063", message: "pre-KitKat sideload connection failed") },
+ { (code: "ADB1064", message: "doesn't match this client") },
+ { (code: "ADB1065", message: "sideload connection failed") },
+ { (code: "ADB1066", message: "unable to connect for backup") },
+ { (code: "ADB1067", message: "unable to connect for restore") },
+ { (code: "ADB1068", message: "unable to connect for") },
+ { (code: "ADB1069", message: "unexpected output length for") },
+ { (code: "ADB1070", message: "expected 'any', 'local', or 'usb'") },
+ { (code: "ADB1071", message: "attempted to close unregistered usb_handle for") },
+ { (code: "ADB1072", message: "attempted to reinitialize adb_server_socket_spec") },
+ { (code: "ADB1073", message: "cannot connect to daemon at") },
+ { (code: "ADB1074", message: "Cannot mkdir") },
+ { (code: "ADB1075", message: "Connection banner is too long") },
+ { (code: "ADB1076", message: "Could not clear pipe stall both ends") },
+ { (code: "ADB1077", message: "Could not install smartsocket listener") },
+ { (code: "ADB1078", message: "Could not open interface") },
+ { (code: "ADB1079", message: "Could not register mDNS service") },
+ { (code: "ADB1080", message: "Couldn't create a device interface") },
+ { (code: "ADB1081", message: "Couldn't grab device from interface") },
+ { (code: "ADB1082", message: "Couldn't query the interface") },
+ { (code: "ADB1083", message: "daemon not running; starting now at") },
+ { (code: "ADB1084", message: "destroying fde not created by fdevent_create") },
+ { (code: "ADB1085", message: "Encountered mDNS registration error") },
+ { (code: "ADB1086", message: "not implemented on Win32") },
+ { (code: "ADB1087", message: "could not connect to TCP port") },
+ { (code: "ADB1088", message: "no emulator connected") },
+ { (code: "ADB1089", message: "only supports allocating a pty") },
+ { (code: "ADB1090", message: "failed to connect to socket") },
+ { (code: "ADB1091", message: "failed to convert errno") },
+ { (code: "ADB1092", message: "failed to initialize libusb") },
+ { (code: "ADB1093", message: "Failed to parse key") },
+ { (code: "ADB1094", message: "failed to set non-blocking mode for fd") },
+ { (code: "ADB1095", message: "failed to start subprocess management thread") },
+ { (code: "ADB1096", message: "failed to start subprocess") },
+ { (code: "ADB1097", message: "FindDeviceInterface - could not get pipe properties") },
+ { (code: "ADB1098", message: "Invalid base64 key") },
+ { (code: "ADB1099", message: "Key too long") },
+ { (code: "ADB1100", message: "No ':' found in shell service arguments") },
+ { (code: "ADB1101", message: "observed inotify event for unmonitored path") },
+ { (code: "ADB1102", message: "packet data length doesn't match payload") },
+ { (code: "ADB1103", message: "Unable to create a device plug-in") },
+ { (code: "ADB1104", message: "Unable to create an interface plug-in") },
+ { (code: "ADB1105", message: "Unable to get number of endpoints") },
+ { (code: "ADB1106", message: "unexpected type for") },
+ { (code: "ADB1107", message: "Unknown socket type") },
+ { (code: "ADB1108", message: "Unknown trace flag") },
+ { (code: "ADB1109", message: "usb_read failed with status") },
+ { (code: "ADB1110", message: "usb_write failed with status") },
+ { (code: "ADB1111", message: "adb_socket_accept: failed to allocate accepted socket") },
+ { (code: "ADB1112", message: "cannot create service socket pair") },
+ { (code: "ADB1113", message: "cannot create socket pair") },
+ { (code: "ADB1114", message: "Error generating token") },
+ { (code: "ADB1115", message: "Error getting user key filename") },
+ { (code: "ADB1116", message: "Failed to accept") },
+ { (code: "ADB1117", message: "failed to create inotify fd") },
+ { (code: "ADB1118", message: "Failed to get adbd socket") },
+ { (code: "ADB1119", message: "failed to shutdown writes to FD") },
+ { (code: "ADB1120", message: "Failed to write PK") },
+ { (code: "ADB1121", message: "failed to write the exit code packet") },
+ { (code: "ADB1122", message: "read of inotify event failed") },
+ { (code: "ADB1123", message: "remote usb: 1 - write terminated") },
+ { (code: "ADB1124", message: "remote usb: 2 - write terminated") },
+ { (code: "ADB1125", message: "remote usb: read terminated (message)") },
+ { (code: "ADB1126", message: "remote usb: terminated (data)") },
+ { (code: "ADB1127", message: "select failed, closing subprocess pipes") },
+ { (code: "ADB1128", message: "backup unable to create file") },
+ { (code: "ADB1129", message: "cannot create thread") },
+ { (code: "ADB1130", message: "cannot get executable path") },
+ { (code: "ADB1131", message: "cannot make handle") },
+ { (code: "ADB1132", message: "CreatePipe failed") },
+ { (code: "ADB1133", message: "CreateProcessW failed") },
+ { (code: "ADB1134", message: "error while reading for") },
+ { (code: "ADB1135", message: "execl returned") },
+ { (code: "ADB1136", message: "failed to duplicate file descriptor for") },
+ { (code: "ADB1137", message: "failed to get file descriptor for") },
+ { (code: "ADB1138", message: "failed to open duplicate stream for") },
+ { (code: "ADB1139", message: "failed to open file") },
+ { (code: "ADB1140", message: "failed to read command") },
+ { (code: "ADB1141", message: "failed to read data from") },
+ { (code: "ADB1142", message: "failed to read from") },
+ { (code: "ADB1143", message: "failed to read package block") },
+ { (code: "ADB1144", message: "failed to seek to package block") },
+ { (code: "ADB1145", message: "failed to set binary mode for duplicate of") },
+ { (code: "ADB1146", message: "failed to stat file") },
+ { (code: "ADB1147", message: "failed to stat") },
+ { (code: "ADB1148", message: "failed to unbuffer") },
+ { (code: "ADB1149", message: "adb_socket_accept: accept on fd") },
+ { (code: "ADB1150", message: "unable to open file") },
+ { (code: "ADB1151", message: "unexpected result waiting for threads") },
+ { (code: "ADB1152", message: "aio: got error event on") },
+ { (code: "ADB1153", message: "aio: got error submitting") },
+ { (code: "ADB1154", message: "aio: got error waiting") },
+ { (code: "ADB1155", message: "cannot open bulk-in endpoint") },
+ { (code: "ADB1156", message: "cannot open bulk-out endpoint") },
+ { (code: "ADB1157", message: "cannot open control endpoint") },
+ { (code: "ADB1158", message: "Can't load") },
+ { (code: "ADB1159", message: "could not read ok from ADB Server") },
+ { (code: "ADB1160", message: "couldn't allocate state_info") },
+ { (code: "ADB1161", message: "Couldn't read") },
+ { (code: "ADB1162", message: "cannot write to emulator") },
+ { (code: "ADB1163", message: "error reading output FD") },
+ { (code: "ADB1164", message: "error reading protocol FD") },
+ { (code: "ADB1165", message: "error reading stdin FD") },
+ { (code: "ADB1166", message: "write failure during connection") },
+ { (code: "ADB1167", message: "failed to fcntl(F_GETFL) for fd") },
+ { (code: "ADB1168", message: "failed to fcntl(F_SETFL) for fd") },
+ { (code: "ADB1169", message: "failed to inotify_add_watch on path") },
+ { (code: "ADB1170", message: "Failed to listen on") },
+ { (code: "ADB1171", message: "failed to open directory") },
+ { (code: "ADB1172", message: "Failed to write public key to") },
+ { (code: "ADB1173", message: "failure closing FD") },
+ { (code: "ADB1174", message: "pipe failed in launch_server") },
+ { (code: "ADB1175", message: "poll() }, ret =") },
+ { (code: "ADB1176", message: "remote usb: read overflow") },
+ { (code: "ADB1177", message: "received framework auth socket connection again") },
+ { (code: "ADB1178", message: "failed to claim adb interface for device") },
+ { (code: "ADB1179", message: "failed to clear halt on device") },
+ { (code: "ADB1180", message: "failed to get active config descriptor for device at") },
+ { (code: "ADB1181", message: "failed to get device descriptor for device at") },
+ { (code: "ADB1182", message: "failed to get serial from device at") },
+ { (code: "ADB1183", message: "failed to open usb device at") },
+ { (code: "ADB1184", message: "failed to set interface alt setting for device") },
+ { (code: "ADB1185", message: "failed to submit zero-length write") },
+ { (code: "ADB1186", message: "failed to submit") },
+ { (code: "ADB1187", message: "Ignoring unknown shell service argument") },
+ { (code: "ADB1188", message: "transfer failed:") },
+ { (code: "ADB1189", message: "received empty serial from device at") },
+ { (code: "ADB1190", message: "refusing to recurse into directory") },
+ { (code: "ADB1191", message: "unmonitored event for") },
+ { (code: "ADB1192", message: "Failed to open") },
+ { (code: "ADB1193", message: "failed to write") },
+ };
+ }
+
+ internal static class DeviceExt
+ {
+ internal static string RunAsCommand = "run-as";
+
+ internal static List BuildArgs(string command, FastDeploy.PackageInfo packageInfo)
+ {
+ List args = new List ();
+ if (packageInfo.IsSystemApplication) {
+ if (!packageInfo.AdbIsRoot) {
+ args.Add ("su");
+ args.Add (packageInfo.UserId ?? "0");
+ }
+ return args;
+ }
+ args.Add (RunAsCommand);
+ args.Add (packageInfo.PackageName);
+ if (!string.IsNullOrEmpty (packageInfo.UserId)) {
+ args.Add("--user");
+ args.Add(packageInfo.UserId);
+ }
+ return args;
+ }
+
+ internal static async Task RunAs (this AndroidDevice Device, FastDeploy.PackageInfo packageInfo, IEnumerable arguments)
+ {
+ string [] args = arguments.ToArray ();
+ string result = await Device.RunAs (packageInfo, args);
+ packageInfo.LogDebugMessage ($"{args[0]} returned: {result}");
+ return result;
+ }
+
+ internal static async Task RunAs (this AndroidDevice Device, FastDeploy.PackageInfo packageInfo, params string [] arguments)
+ {
+ List args = BuildArgs(RunAsCommand, packageInfo);
+ args.AddRange (arguments);
+ string result = await Device.RunShellCommand (args.ToArray ());
+ packageInfo.LogDebugMessage ($"{arguments[0]} returned: {result}");
+ return result;
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GenerateGdbEnvironment.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GenerateGdbEnvironment.cs
new file mode 100644
index 00000000000..b31ed405454
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GenerateGdbEnvironment.cs
@@ -0,0 +1,41 @@
+using System;
+using System.IO;
+using System.Linq;
+
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+namespace Xamarin.Android.Tasks
+{
+ public class GenerateGdbEnvironment : Task {
+
+ [Required]
+ public string OutputFile { get; set; }
+ public string GdbSymbolsPath { get; set; }
+ public int GdbTargetPort { get; set; }
+
+ public override bool Execute ()
+ {
+ using (var o = File.CreateText (OutputFile)) {
+ o.NewLine = "\n";
+
+ var symbolsPath = FixupPath (GdbSymbolsPath);
+
+ o.WriteLine ("set solib-search-path {0}", FixupPath (GdbSymbolsPath));
+ o.WriteLine ("file {0}", FixupPath (Path.Combine (GdbSymbolsPath, "app_process")));
+ o.WriteLine ("target remote :{0}", GdbTargetPort);
+ o.WriteLine ("handle SIGXCPU SIG33 SIG35 SIGPWR SIGTTIN SIGTTOU SIGSYS nostop noprint");
+ }
+
+ return true;
+ }
+
+ static string FixupPath (string path)
+ {
+ if (string.IsNullOrEmpty (path))
+ return path;
+ return Path.GetFullPath (path).Replace ('\\', '/');
+ }
+ }
+}
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetGdbSymbols.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetGdbSymbols.cs
new file mode 100644
index 00000000000..c84b27b1f78
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetGdbSymbols.cs
@@ -0,0 +1,66 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using Xamarin.Tools.Zip;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Xamarin.AndroidTools;
+using Microsoft.Android.Build.Tasks;
+
+
+namespace Xamarin.Android.Tasks
+{
+ public class GetGdbSymbols : AndroidTask
+ {
+ public override string TaskPrefix => "GGDB";
+
+ public string AdbTarget { get; set; }
+
+ [Required]
+ public string GdbSymbolsPath { get; set;}
+
+ [Required]
+ public string Package { get; set; }
+
+ [Required]
+ public string OutputPath { get; set; }
+
+ [Required]
+ public string PrimaryCpuAbi {get; set; }
+
+ public GetGdbSymbols ()
+ {
+ AdbTarget = null;
+ }
+
+ public override bool RunTask ()
+ {
+ var device = AndroidHelper.ParseTarget (AdbTarget, Log, logErrors: true, engine4: BuildEngine4);
+ if (device == null) {
+ return false;
+ }
+ device.EnsureProperties (CancellationToken.None).Wait ();
+ var arch = PrimaryCpuAbi;
+ Log.LogDebugMessage ("Device Abi {0}", arch);
+
+ var apk = string.Format ("{0}{1}-Signed.apk", OutputPath, Package);
+ ExtractFilesFromPath (apk, string.Format ("lib/{0}/", arch));
+
+ return !Log.HasLoggedErrors;
+ }
+
+ void ExtractFilesFromPath(string apk, string path)
+ {
+ using (var zip = ZipArchive.Open (apk, FileMode.Open)) {
+ foreach (var e in zip.Where (x => x.FullName.StartsWith (path, StringComparison.OrdinalIgnoreCase))) {
+ Log.LogDebugMessage ("Extracting {0} from {1}", e.FullName, apk);
+ using (var fs = new FileStream (Path.Combine (GdbSymbolsPath, Path.GetFileName (e.FullName)), FileMode.OpenOrCreate)) {
+ e.Extract (fs);
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetPrimaryCpuAbi.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetPrimaryCpuAbi.cs
new file mode 100644
index 00000000000..c5129091d4b
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/GetPrimaryCpuAbi.cs
@@ -0,0 +1,219 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Xml.Linq;
+using System.Text.RegularExpressions;
+using Microsoft.Build.Framework;
+using Microsoft.Android.Build.Tasks;
+using Mono.AndroidTools;
+using AndroidLogger = Mono.AndroidTools.AndroidLogger;
+
+namespace Xamarin.Android.Tasks
+{
+ public class GetPrimaryCpuAbi : AsyncTask
+ {
+ static readonly Dictionary UnameAbiMapping = new Dictionary {
+ { "x86", "x86" },
+ { "x86_64", "x86_64" },
+ { "armeabi-v7a", "armeabi-v7a" },
+ { "arm64-v8a", "arm64-v8a" },
+ { "i386", "x86" },
+ { "i686", "x86" },
+ { "aarch64", "arm64-v8a" },
+ { "arm", "armeabi-v7a" },
+ };
+
+ public override string TaskPrefix => "GCPU";
+
+ public string AdbTarget { get; set; }
+ ///
+ /// IDEs set $(AdbTargetArchitecture) when an emulator is closed, as a performance optimization.
+ ///
+ public string AdbTargetArchitecture { get; set; }
+ public string AdbOptions { get ;set; }
+ public string AndroidPackage { get; set; }
+ public string DevicePropertyCache { get; set; }
+ public string [] RuntimeIdentifiers { get; set; }
+
+ [Output]
+ public bool FoundDevices { get; set; }
+ [Output]
+ public string ResultingAbi { get; set; }
+ [Output]
+ public string ToolsAbi { get; set; }
+ [Output]
+ public string RuntimeIdentifier { get; set; }
+ [Output]
+ public int SdkVersion { get; set; }
+
+ AndroidDevice device;
+
+ public override bool Execute ()
+ {
+ if (!string.IsNullOrEmpty (AdbTargetArchitecture)) {
+ LogDebugMessage ($"Using $(AdbTargetArchitecture): {AdbTargetArchitecture}");
+ ResultingAbi = AdbTargetArchitecture;
+ RuntimeIdentifier = GetRuntimeIdentifier ();
+ LogOutputs ();
+ return true;
+ }
+
+ device = AndroidHelper.ParseTarget (AdbTarget, LogDebugMessage, LogCodedError, logErrors: false, engine4: BuildEngine4);
+ if (device == null) {
+ LogDebugMessage ($"No device found: {nameof (AdbTarget)}=\"{AdbTarget}\"");
+ // don't stop the build if we don't have a device.
+ return true;
+ }
+
+ LogDebugMessage ($"Found device: {device.ID}");
+ FoundDevices = true;
+
+ AndroidLogger.Error += DebugHandler;
+ AndroidLogger.Warning += DebugHandler;
+ AndroidLogger.Info += DebugHandler;
+ AndroidLogger.Debug += DebugHandler;
+ try {
+ bool result = base.Execute ();
+ return result;
+ } finally {
+ AndroidLogger.Error += DebugHandler;
+ AndroidLogger.Warning += DebugHandler;
+ AndroidLogger.Info += DebugHandler;
+ AndroidLogger.Debug -= DebugHandler;
+ }
+ }
+
+ public async override System.Threading.Tasks.Task RunTaskAsync ()
+ {
+ int sdkver = 0;
+
+ XDocument doc = null;
+ if (File.Exists (DevicePropertyCache)) {
+ LogDebugMessage ($"Using cached properties: {DevicePropertyCache}");
+ doc = XDocument.Load (DevicePropertyCache);
+ if (DeviceCache.TryGet (doc, device.ID, device.LongOutput, out var cachedAbi, out var cachedToolsAbi, out var cachedSdkVersion, Log)) {
+ ResultingAbi = cachedAbi;
+ ToolsAbi = cachedToolsAbi;
+ SdkVersion = cachedSdkVersion;
+ RuntimeIdentifier = GetRuntimeIdentifier ();
+ LogOutputs ();
+ return;
+ }
+ LogDebugMessage ($"Cache miss or stale for device {device.ID}. Refreshing.");
+ } else {
+ LogDebugMessage ($"Cached properties did not exist: {DevicePropertyCache}");
+ }
+
+ try {
+ await device.EnsureProperties (CancellationToken);
+ } catch (Exception ex) {
+ LogDebugMessage (ex.ToString ());
+ return;
+ }
+
+ sdkver = device.Properties.BuildVersionSdk;
+ if (sdkver <= 0) {
+ LogDebugMessage ($"device.Properties.BuildVersionSdk is {sdkver}. Forcing PropertyRefresh.");
+ await device.RefreshProperties (CancellationToken);
+ sdkver = device.Properties.BuildVersionSdk;
+ }
+
+ if (sdkver >= 21) {
+ string command = "getprop ro.product.cpu.abilist64";
+ string commandResult = await device.RunShellCommand (command, CancellationToken);
+ LogDebugMessage ($"{command} {commandResult}");
+ string[] abis = commandResult.Split (new [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ if (abis.Length > 0) {
+ ResultingAbi = abis [0].Trim ();
+ }
+ }
+
+ if (string.IsNullOrEmpty (ResultingAbi)) {
+ if (string.IsNullOrEmpty (device.Properties.ProductCpuAbi)) {
+ LogDebugMessage ("device.Properties.ProductCpuAbi is null. Forcing PropertyRefresh.");
+ await device.RefreshProperties (CancellationToken);
+ }
+ ResultingAbi = device.Properties.ProductCpuAbi ?? device.Properties.ProductCpuAbi2;
+ }
+ if (string.IsNullOrEmpty (ResultingAbi) && device.IsEmulator) {
+ string command = "uname -m";
+ string commandResult = await device.RunShellCommand (command, CancellationToken);
+ LogDebugMessage ($"{command} {commandResult}");
+ if (!commandResult.Contains ("adb:")) {
+ string abi = commandResult.Trim ();
+ if (!UnameAbiMapping.ContainsKey (abi)) {
+ LogDebugMessage ($"Unexpected Abi returned from `uname -m` {abi}. Ignoring result.");
+ } else {
+ ResultingAbi = UnameAbiMapping [abi];
+ }
+ }
+ }
+ if (string.IsNullOrEmpty (ResultingAbi) && !string.IsNullOrEmpty (AndroidPackage)) {
+ LogDebugMessage ($"Falling back to pm dump {AndroidPackage}.");
+ ResultingAbi = await GetAbiFromPmDump (device);
+ }
+ RuntimeIdentifier = GetRuntimeIdentifier ();
+ SdkVersion = sdkver;
+ LogOutputs ();
+
+ doc = DeviceCache.Update (doc, device.ID, ResultingAbi, ToolsAbi, SdkVersion, device.LongOutput);
+ if (doc.SaveIfChanged (DevicePropertyCache)) {
+ LogDebugMessage ($"Saving: {DevicePropertyCache}");
+ }
+ }
+ void DebugHandler (string task, string message)
+ {
+ LogDebugMessage ($"DEBUG {task} {message}.");
+ }
+
+ void LogOutputs ()
+ {
+ LogDebugMessage ($" {nameof (ResultingAbi)}: {ResultingAbi}");
+ LogDebugMessage ($" {nameof (ToolsAbi)}: {ToolsAbi}");
+ LogDebugMessage ($" {nameof (RuntimeIdentifier)}: {RuntimeIdentifier}");
+ LogDebugMessage ($" {nameof (SdkVersion)}: {SdkVersion}");
+ }
+
+ async System.Threading.Tasks.Task GetAbiFromPmDump (AndroidDevice device)
+ {
+ var rex = new Regex ("primaryCpuAbi=(?([A-Za-z0-9_-])*)");
+ string command = "pm dump packages | grep primaryCpuAbi | grep -v '=null' | sort | uniq -c";
+ string result = await device.RunShellCommand (command, CancellationToken);
+ result = result.Trim ();
+ LogDebugMessage ($"{command}: {result}");
+ SortedDictionary abis = new SortedDictionary ();
+ foreach (var line in result.Split ('\n')) {
+ string[] items = line.Split (new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
+ if (items.Length != 2)
+ continue;
+ int count;
+ if (!int.TryParse (items[0], out count))
+ continue;
+ string abi = rex.Match (items[1]).Groups ["abi"].ToString ();
+ if (string.IsNullOrEmpty (abi))
+ continue;
+ abis.Add (count, abi);
+ }
+ if (abis.Count == 0)
+ return string.Empty;
+
+ return abis.Last ().Value;
+ }
+
+ string GetRuntimeIdentifier ()
+ {
+ if (string.IsNullOrEmpty (ResultingAbi)) {
+ return null;
+ }
+ if (RuntimeIdentifiers != null) {
+ foreach (var rid in RuntimeIdentifiers) {
+ if (AndroidRidAbiHelper.RuntimeIdentifierToAbi (rid) == ResultingAbi) {
+ return rid;
+ }
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/MoveSubfolder.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/MoveSubfolder.cs
new file mode 100644
index 00000000000..b3045c62c6e
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/MoveSubfolder.cs
@@ -0,0 +1,68 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Microsoft.Android.Build.Tasks;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Tasks;
+using Microsoft.Build.Utilities;
+
+namespace Xamarin.Android.Tasks
+{
+ ///
+ /// Extends the task, so we can preserve directory structure of an unknown subfolder.
+ /// It fills out the SourceFiles & DestinationFiles properties, clears DestinationFolder, and calls the base task.
+ ///
+ public class MoveSubfolder : Move
+ {
+ [Required]
+ public string SourceFolder { get; set; }
+
+ ///
+ /// An optional path inside the unknown subfolder
+ ///
+ public string AdditionalPath { get; set; }
+
+ ///
+ /// This is only needed to remove [Required]
+ ///
+ public new ITaskItem [] SourceFiles {
+ get => base.SourceFiles;
+ set => base.SourceFiles = value;
+ }
+
+ public override bool Execute ()
+ {
+ // If we encounter unexpected input, we can just call base.Execute();
+ if (DestinationFolder == null) {
+ Log.LogDebugMessage ("DestinationFolder is null.");
+ return base.Execute ();
+ }
+
+ var directories = Directory.GetDirectories (SourceFolder);
+ if (directories.Length == 0) {
+ Log.LogDebugMessage ("No subdirectories found.");
+ return !Log.HasLoggedErrors;
+ }
+
+ // Full path to an unknown subfolder
+ var subfolder = Path.GetFullPath (directories.First ());
+ if (!string.IsNullOrEmpty (AdditionalPath)) {
+ subfolder = Path.Combine (subfolder, AdditionalPath);
+ }
+ subfolder = subfolder.TrimEnd (Path.DirectorySeparatorChar); // trim off trailing / if present
+ Log.LogDebugMessage ($"Copying from: {subfolder}");
+
+ var sourceFiles = new List ();
+ var destinationFiles = new List ();
+ foreach (var file in Directory.GetFiles (subfolder, "*", SearchOption.AllDirectories)) {
+ var relativePath = file.Substring (subfolder.Length + 1);
+ sourceFiles.Add (new TaskItem (file));
+ destinationFiles.Add (new TaskItem (Path.Combine (DestinationFolder.ItemSpec, relativePath)));
+ }
+ DestinationFolder = null;
+ DestinationFiles = destinationFiles.ToArray ();
+ SourceFiles = sourceFiles.ToArray ();
+ return base.Execute ();
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/ResolveXamarinAndroidTools.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/ResolveXamarinAndroidTools.cs
new file mode 100644
index 00000000000..460d054b490
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/ResolveXamarinAndroidTools.cs
@@ -0,0 +1,143 @@
+using System;
+using System.IO;
+using System.Runtime.CompilerServices;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Mono.AndroidTools;
+using AT = Xamarin.AndroidTools;
+using Microsoft.Android.Build.Tasks;
+
+namespace Xamarin.Android.Tasks
+{
+ ///
+ /// This task sets static variables on Xamarin.AndroidTools.AndroidSdk and MonoDroidSdk
+ ///
+ public class ResolveXamarinAndroidTools : Task
+ {
+ public string AndroidNdkPath { get; set; }
+
+ public string AndroidSdkPath { get; set; }
+
+ public string JavaSdkPath { get; set; }
+
+ [Required]
+ public string MonoAndroidToolsPath { get; set; }
+
+ [Required]
+ public string MonoAndroidBinDirectory { get; set; }
+
+ [Required]
+ public string [] ReferenceAssemblyPaths { get; set; }
+
+ const string AndroidSdkKey = nameof (ResolveXamarinAndroidTools) + ".Xamarin.AndroidTools." + nameof (AT.AndroidSdk);
+ const string MonoDroidSdkKey = nameof (ResolveXamarinAndroidTools) + ".Xamarin.AndroidTools." + nameof (AT.MonoDroidSdk);
+ const RegisteredTaskObjectLifetime lifetime = RegisteredTaskObjectLifetime.AppDomain;
+
+ static ResolveXamarinAndroidTools () => AppContext.SetSwitch (AT.AndroidSdk.AutoRefreshSwitch, false);
+
+ public override bool Execute ()
+ {
+ AndroidLogger.Error += ErrorHandler;
+ AndroidLogger.Warning += WarningHandler;
+ AndroidLogger.Info += InfoHandler;
+ AndroidLogger.Debug += DebugHandler;
+ try {
+ return RunTask ();
+ } finally {
+ AndroidLogger.Error -= ErrorHandler;
+ AndroidLogger.Warning -= WarningHandler;
+ AndroidLogger.Info -= InfoHandler;
+ AndroidLogger.Debug -= DebugHandler;
+ }
+ }
+
+ bool RunTask ()
+ {
+ var engine = BuildEngine4;
+ var androidPaths = engine.GetRegisteredTaskObjectAssemblyLocal (AndroidSdkKey, lifetime);
+
+ if (androidPaths == null || androidPaths.HasChanged (this)) {
+ AT.AndroidSdk.Refresh (AndroidSdkPath, AndroidNdkPath, JavaSdkPath);
+ if (!Log.HasLoggedErrors) {
+ engine.RegisterTaskObjectAssemblyLocal (AndroidSdkKey, new AndroidSdkPaths (this), lifetime, allowEarlyCollection: false);
+ }
+ } else {
+ Log.LogDebugMessage (" Using cached AndroidSdk values");
+ }
+ Log.LogDebugMessage (" Found AndroidSdk at {0}", AT.AndroidSdk.AndroidSdkPath);
+ Log.LogDebugMessage (" Found AndroidNdk at {0}", AT.AndroidSdk.AndroidNdkPath);
+ Log.LogDebugMessage (" Found AndroidTools at {0}", string.Join (",", AT.AndroidSdk.GetCommandLineToolsPaths ()));
+
+ var frameworkDirectory = ReferenceAssemblyPaths [0].TrimEnd (Path.DirectorySeparatorChar);
+ var monodroidPaths = engine.GetRegisteredTaskObjectAssemblyLocal (MonoDroidSdkKey, lifetime);
+ if (monodroidPaths == null || monodroidPaths.HasChanged (this, frameworkDirectory)) {
+ AT.MonoDroidSdk.Refresh (MonoAndroidToolsPath, MonoAndroidBinDirectory, frameworkDirectory);
+ if (!Log.HasLoggedErrors) {
+ engine.RegisterTaskObjectAssemblyLocal (MonoDroidSdkKey, new MonoDroidPaths (this, frameworkDirectory), lifetime, allowEarlyCollection: false);
+ }
+ } else {
+ Log.LogDebugMessage (" Using cached MonoDroidSdk values");
+ }
+ Log.LogDebugMessage (" Found RuntimePath at {0}", AT.MonoDroidSdk.RuntimePath);
+ Log.LogDebugMessage (" Found FrameworkPath at {0}", AT.MonoDroidSdk.FrameworkPath);
+
+ return !Log.HasLoggedErrors;
+ }
+
+ class AndroidSdkPaths
+ {
+ public AndroidSdkPaths (ResolveXamarinAndroidTools task)
+ {
+ AndroidSdkPath = task.AndroidSdkPath;
+ AndroidNdkPath = task.AndroidNdkPath;
+ JavaSdkPath = task.JavaSdkPath;
+ }
+
+ public bool HasChanged (ResolveXamarinAndroidTools task)
+ {
+ return AndroidSdkPath != task.AndroidSdkPath || AndroidNdkPath != task.AndroidNdkPath || JavaSdkPath != task.JavaSdkPath;
+ }
+
+ public string AndroidSdkPath { get; private set; }
+ public string AndroidNdkPath { get; private set; }
+ public string JavaSdkPath { get; private set; }
+ }
+
+ class MonoDroidPaths
+ {
+ public MonoDroidPaths (ResolveXamarinAndroidTools task, string frameworkDirectory)
+ {
+ MonoAndroidToolsPath = task.MonoAndroidToolsPath;
+ FrameworkDirectory = frameworkDirectory;
+ }
+
+ public bool HasChanged (ResolveXamarinAndroidTools task, string frameworkDirectory)
+ {
+ return MonoAndroidToolsPath != task.MonoAndroidToolsPath || FrameworkDirectory != frameworkDirectory;
+ }
+
+ public string MonoAndroidToolsPath { get; private set; }
+ public string FrameworkDirectory { get; private set; }
+ }
+
+ void ErrorHandler (string task, string message)
+ {
+ Log.LogCodedError ("XA5300", $"{task} {message}");
+ }
+
+ void WarningHandler (string task, string message)
+ {
+ Log.LogCodedWarning ("XA5300", $"{task} {message}");
+ }
+
+ void DebugHandler (string task, string message)
+ {
+ Log.LogDebugMessage ($"DEBUG {task} {message}");
+ }
+
+ void InfoHandler (string task, string message)
+ {
+ Log.LogMessage ($"{task} {message}");
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunActivity.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunActivity.cs
new file mode 100644
index 00000000000..b4348951ab3
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunActivity.cs
@@ -0,0 +1,113 @@
+//
+// RunActivity.cs
+//
+// Author:
+// Jonathan Pryor
+//
+// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.IO;
+using System.Xml;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Mono.AndroidTools;
+using Microsoft.Android.Build.Tasks;
+using Xamarin.AndroidTools;
+using Xamarin.AndroidTools.Debugging;
+using Xamarin.Android.Build.Debugging.Tasks.Properties;
+
+namespace Xamarin.Android.Tasks
+{
+ public class RunActivity : AsyncTask
+ {
+ public override string TaskPrefix => "RUNA";
+
+ [Required]
+ public string PackageName { get; set; }
+
+ [Required]
+ public string ActivityName { get; set; }
+
+ public string AdbTarget { get; set; }
+
+ public bool AttachDebugger { get; set; }
+
+ public bool Server { get; set; }
+
+ public string Port { get; set; }
+
+ public int UserID { get; set; } = 0;
+
+ public bool ForceStop { get; set; } = true;
+
+ ///
+ /// Gets or sets a value indicating whether Java debugging is allowed. Defaults to true, but will be available to be toggled off via -p:_AndroidAllowJavaDebugging=false.
+ ///
+ public bool AllowJavaDebugging { get; set; } = true;
+
+ AndroidDevice Device;
+
+ public RunActivity ()
+ {
+ Port = "10000";
+ }
+
+ public override bool Execute ()
+ {
+ Device = AndroidHelper.ParseTarget (AdbTarget, LogMessage, LogCodedError, logErrors: true, engine4: BuildEngine4);
+ if (Device == null) {
+ return false;
+ }
+ LogMessage ($"Found device: {Device.ID}");
+ return base.Execute ();
+ }
+
+ public async override System.Threading.Tasks.Task RunTaskAsync ()
+ {
+ LogDebugMessage ($" ActivityName: {ActivityName}");
+
+ var amStartCommand = new AmStartCommand (PackageName, ActivityName);
+ amStartCommand.ForceStop = ForceStop;
+ amStartCommand.EnableDebugging = false;
+ amStartCommand.User = UserID.ToString ();
+
+ amStartCommand.Action = amStartCommand.Action ?? "android.intent.action.MAIN";
+ amStartCommand.Categories = amStartCommand.Categories ?? new[] { "android.intent.category.LAUNCHER" };
+
+ var startConfiguration = new ExecutionConfiguration (PackageName, amStartCommand);
+ startConfiguration.AllowJavaDebugging = AllowJavaDebugging;
+ startConfiguration.LogWiter = (s) => LogDebugMessage (s);
+
+ if (AttachDebugger) {
+ var port = int.Parse (Port);
+ var ipAddress = Server ? System.Net.IPAddress.Loopback : System.Net.IPAddress.Parse("10.0.2.2");
+ startConfiguration.Debugger.Address = ipAddress;
+ startConfiguration.Debugger.SdbPort = port;
+ startConfiguration.Debugger.StdoutPort = -1;
+ startConfiguration.Debugger.Server = Server;
+ LogMessage (string.Format (Resources.StartDebugger_ipAddress_port, ipAddress, port), MessageImportance.High);
+ await Device.StartWithDebuggingAsync (startConfiguration, CancellationToken);
+ } else {
+ await Device.StartWithoutDebuggingAsync (startConfiguration, CancellationToken);
+ }
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunTests.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunTests.cs
new file mode 100644
index 00000000000..03fe26b90a1
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunTests.cs
@@ -0,0 +1,38 @@
+using System;
+using System.IO;
+using Microsoft.Build.Utilities;
+using Microsoft.Build.Framework;
+
+using Xamarin.AndroidTools;
+
+namespace Xamarin.Android.Tasks
+{
+ public class RunTests : ToolTask
+ {
+ public string AdbTarget { get; set; }
+
+ public string AdbOptions { get; set; }
+ [Required]
+ public string AndroidPackage { get; set; }
+
+ [Required]
+ public string TargetTestActivity { get; set; }
+
+ protected override string ToolName {
+ get { return OS.IsWindows ? "adb.exe" : "adb"; }
+ }
+
+ protected override string GenerateFullPathToTool ()
+ {
+ return Path.Combine (ToolPath, ToolExe);
+ }
+
+ protected override string GenerateCommandLineCommands ()
+ {
+ // If we supported full MSBuild 4.0 expression syntax for [Class] and property access, we could write this...
+ //
+ return string.Format ("{0} {1} shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER --ez automated true -n {2}/{3}",
+ AdbTarget, AdbOptions, AndroidPackage, TargetTestActivity);
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/WaitForAppDetection.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/WaitForAppDetection.cs
new file mode 100644
index 00000000000..b4a4f11629a
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/WaitForAppDetection.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Mono.AndroidTools;
+using Microsoft.Android.Build.Tasks;
+
+namespace Xamarin.Android.Tasks {
+ public class WaitForAppDetection : AsyncTask
+ {
+ public override string TaskPrefix => "WFAD";
+
+ System.Threading.Tasks.Task> getPackagesAsync;
+
+ public override bool Execute ()
+ {
+ var key = ProjectSpecificTaskObjectKey (DetectIfAppWasUninstalled.GetPackagesAsyncKey);
+ getPackagesAsync = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal>> (key, RegisteredTaskObjectLifetime.Build);
+ return base.Execute ();
+ }
+
+ public async override System.Threading.Tasks.Task RunTaskAsync ()
+ {
+ LogDebugMessage ("Waiting for DetectIfAppWasUninstalled...");
+ if (getPackagesAsync == null)
+ return;
+ await getPackagesAsync;
+ LogDebugMessage ("DetectIfAppWasUninstalled Completed.");
+ return;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/AndroidHelper.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/AndroidHelper.cs
new file mode 100644
index 00000000000..a1319037a06
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/AndroidHelper.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Linq;
+using Mono.AndroidTools;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Xamarin.Android.Build.Debugging.Tasks.Properties;
+using Microsoft.Android.Build.Tasks;
+
+namespace Xamarin.Android.Tasks
+{
+ public class AndroidHelper
+ {
+ const string DefaultErrorCode = "XA0010";
+ const RegisteredTaskObjectLifetime Lifetime = RegisteredTaskObjectLifetime.Build;
+ static readonly object NullDevice = new object ();
+
+ static Tuple GetKey (string target) =>
+ new Tuple ($"{nameof (AndroidHelper)}_AndroidDevice", target ?? "");
+
+ ///
+ /// Stores the AndroidDevice with a lifetime for the current build
+ ///
+ static void RegisterDevice (IBuildEngine4 engine, string target, AndroidDevice device)
+ {
+ var key = GetKey (target);
+ engine?.RegisterTaskObjectAssemblyLocal (key, device ?? NullDevice, Lifetime, allowEarlyCollection: false);
+ }
+
+ ///
+ /// Gets a cached AndroidDevice cached from the current build
+ ///
+ static object GetRegisteredDevice (IBuildEngine4 engine, string target)
+ {
+ var key = GetKey (target);
+ return engine?.GetRegisteredTaskObjectAssemblyLocal (key, Lifetime);
+ }
+
+ public static AndroidDevice ParseTarget (string target, TaskLoggingHelper log, bool logErrors = true, IBuildEngine4 engine4 = null) =>
+ ParseTarget (target, m => log.LogDebugMessage (m), (c, m) => log.LogCodedError (c, m), logErrors, engine4);
+
+ public static AndroidDevice ParseTarget (string target, Action logMessage, Action logError, bool logErrors = true, IBuildEngine4 engine4 = null)
+ {
+ try {
+ var device = GetRegisteredDevice (engine4, target);
+ if (device != null) {
+ logMessage ("Using cached value from RegisterTaskObject");
+ if (device == NullDevice) {
+ NoDeviceFound (target, logError, logErrors, engine4);
+ }
+ return device as AndroidDevice;
+ }
+ var t = AdbServer.Default.GetDevices ();
+ if (string.IsNullOrEmpty (target)) {
+ var e = t.Result.FirstOrDefault ();
+ if (e != null) {
+ // Register for a blank target and -s
+ RegisterDevice (engine4, target, e);
+ RegisterDevice (engine4, $"-s {e.ID}", e);
+ return e;
+ } else {
+ NoDeviceFound (target, logError, logErrors, engine4);
+ return null;
+ }
+ } else if (target.StartsWith ("-e")) {
+ var e = t.Result.Where (x => x.IsEmulator).FirstOrDefault ();
+ if (e != null) {
+ RegisterDevice (engine4, target, e);
+ return e;
+ } else {
+ NoDeviceFound (target, logError, logErrors, engine4);
+ return null;
+ }
+ } else if (target.StartsWith ("-d")) {
+ var e = t.Result.Where (x => !x.IsEmulator).FirstOrDefault ();
+ if (e != null) {
+ RegisterDevice (engine4, target, e);
+ return e;
+ } else {
+ NoDeviceFound (target, logError, logErrors, engine4);
+ return null;
+ }
+ } else if (target.StartsWith ("-s")) {
+ string deviceId = target.Substring (2).Trim ();
+ var e = t.Result.Where (x => deviceId == x.ID).FirstOrDefault ();
+ if (e != null) {
+ RegisterDevice (engine4, target, e);
+ return e;
+ } else {
+ NoDeviceFound (target, logError, logErrors, engine4);
+ return null;
+ }
+ }
+ if (logErrors)
+ logError (DefaultErrorCode, string.Format (Resources.XA0010_AdbTarget, target));
+ } catch (Exception ex) {
+ // Register that no device was found for the current build
+ RegisterDevice (engine4, target, null);
+
+ if (logErrors) {
+ logError (DefaultErrorCode, string.Format (Resources.XA0010_Adb, ex));
+ } else {
+ logMessage (string.Format (Resources.XA0010_Adb, ex));
+ }
+ }
+ return null;
+ }
+
+ static void NoDeviceFound (string target, Action logError, bool logErrors, IBuildEngine4 engine4)
+ {
+ // Register that no device was found for the current build
+ RegisterDevice (engine4, target, null);
+
+ if (logErrors) {
+ if (string.IsNullOrEmpty (target)) {
+ logError (DefaultErrorCode, Resources.XA0010_NoDevice);
+ } else {
+ logError (DefaultErrorCode, Resources.XA0010_Selected);
+ }
+ }
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/DeviceCache.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/DeviceCache.cs
new file mode 100644
index 00000000000..066280b3281
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Utilities/DeviceCache.cs
@@ -0,0 +1,97 @@
+using System.Linq;
+using System.Xml.Linq;
+using Microsoft.Build.Utilities;
+
+namespace Xamarin.Android.Tasks
+{
+ ///
+ /// Helper class for managing the device property cache XML file.
+ ///
+ public static class DeviceCache
+ {
+ ///
+ /// Updates or adds a device entry in the cache document.
+ ///
+ /// The XDocument to update, or null to create a new one.
+ /// The device ID.
+ /// The device's ABI.
+ /// The tools ABI.
+ /// The SDK version.
+ /// The long output string from adb.
+ /// The updated or newly created XDocument.
+ public static XDocument Update (XDocument doc, string deviceId, string resultingAbi, string toolsAbi, int sdkVersion, string longOutput)
+ {
+ XElement devices;
+ if (doc == null) {
+ devices = new XElement ("Devices");
+ doc = new XDocument (
+ new XDeclaration ("1.0", "UTF-8", null),
+ devices);
+ }
+ else {
+ devices = doc.Element ("Devices");
+ }
+
+ var deviceElement = devices
+ .Elements ("Device")
+ .FirstOrDefault (a => a.Attribute ("id")?.Value == deviceId)
+ ??
+ new XElement ("Device", new XAttribute ("id", deviceId));
+
+ if (deviceElement.Parent == null) {
+ devices.Add (deviceElement);
+ }
+
+ deviceElement.SetElementValue ("ResultingAbi", resultingAbi);
+ deviceElement.SetElementValue ("ToolsAbi", toolsAbi);
+ deviceElement.SetElementValue ("SdkVersion", sdkVersion);
+ deviceElement.SetElementValue ("LongOutput", longOutput);
+
+ return doc;
+ }
+
+ ///
+ /// Tries to get cached device properties from the document.
+ ///
+ /// The XDocument to search.
+ /// The device ID to look up.
+ /// The expected long output to validate the cache entry.
+ /// The cached ABI if found and valid.
+ /// The cached tools ABI if found and valid.
+ /// The cached SDK version if found and valid.
+ /// Optional logger for debug messages.
+ /// True if a valid cache entry was found, false otherwise.
+ public static bool TryGet (XDocument doc, string deviceId, string longOutput, out string resultingAbi, out string toolsAbi, out int sdkVersion, TaskLoggingHelper log = null)
+ {
+ resultingAbi = null;
+ toolsAbi = null;
+ sdkVersion = 0;
+
+ if (doc == null)
+ return false;
+
+ var element = doc.Elements ("Devices").Elements ("Device")
+ .FirstOrDefault (a => a.Attribute ("id")?.Value == deviceId);
+
+ if (element == null)
+ return false;
+
+ string cachedLongOutput = element.Element ("LongOutput")?.Value ?? string.Empty;
+ if (string.Compare (cachedLongOutput, longOutput, System.StringComparison.OrdinalIgnoreCase) != 0) {
+ // The device LongOutput changed. So lets find the device again.
+ // This can happen if the emulator is different but has the same id or
+ // if the device changed usb ports.
+ log?.LogMessage ($"Device LongOutput has changed. Cached '{cachedLongOutput}' does not match current '{longOutput}'. Refreshing device cache.");
+ return false;
+ }
+
+ resultingAbi = element.Element ("ResultingAbi")?.Value;
+ toolsAbi = element.Element ("ToolsAbi")?.Value ?? string.Empty;
+
+ if (!int.TryParse (element.Element ("SdkVersion")?.Value, out sdkVersion))
+ return false;
+
+ return !string.IsNullOrEmpty (resultingAbi);
+ }
+ }
+}
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Build.Debugging.Tasks.csproj b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Build.Debugging.Tasks.csproj
new file mode 100644
index 00000000000..104bd324ea9
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Build.Debugging.Tasks.csproj
@@ -0,0 +1,84 @@
+
+
+
+
+ $(NoWarn);CA1305
+
+
+
+ 12
+ netstandard2.0
+ true
+ $(DefineConstants);MSBUILD
+ $(MicrosoftAndroidSdkOutDir)
+ false
+ true
+ false
+ product.snk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+ PublicResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+ $(ProductVersion).$(PackVersionCommitCount)
+
+
+
+
+
+
+
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.props b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.props
new file mode 100644
index 00000000000..d976a9c31d5
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.props
@@ -0,0 +1,62 @@
+
+
+
+
+ False
+ arm64-v8a;armeabi-v7a;x86
+
+ arm64-v8a;armeabi-v7a;x86;x86_64
+ 9999
+ 9999
+ $(ProjectDir)\gdb-symbols
+ True
+ $(XamarinAndroidVersion)
+ --user $(AndroidDeviceUserId)
+
+
+ <_AfterCompileDex>
+ $(_AfterCompileDex);
+ _CompileFastDevDex
+
+ <_BeforeBuildAdditionalResourcesCache>
+ $(_BeforeBuildAdditionalResourcesCache);
+ _SetupDesignTimeBuildForIntellisense
+
+ <_CompileJavaDependsOnTargets>
+ $(_CompileJavaDependsOnTargets);
+
+ <_BeforeDefineBuildTargetAbis>
+ $(_BeforeDefineBuildTargetAbis);
+
+ <_ResolveMonoAndroidSdksDependsOn>
+ $(_ResolveMonoAndroidSdksDependsOn);
+ _GetPrimaryCpuAbi
+
+ <_AfterResolveMonoAndroidSdks>
+ $(_AfterResolveMonoAndroidSdks);
+ _ResolveMonoAndroidSdks
+
+ <_BeforeCompileToDalvikWithDx>
+ $(_BeforeCompileToDalvikWithDx);
+
+ <_BeforeAddStaticResources>
+ $(_BeforeAddStaticResources);
+
+
+
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.targets b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.targets
new file mode 100644
index 00000000000..dc270a09cda
--- /dev/null
+++ b/src/Xamarin.Android.Build.Debugging.Tasks/Xamarin.Android.Common.Debugging.targets
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+ <_DevicePropertyCache>$(IntermediateOutputPath)devices.cache
+ <_UploadFlag>$(IntermediateOutputPath)upload.flag
+ <_ConfigurationCacheDirectory>$(BaseIntermediateOutputPath).cache\
+
+
+
+ <_OnResolveMonoAndroidSdks>
+ $(_OnResolveMonoAndroidSdks)
+ ;_ResolveXamarinAndroidTools
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_DexFileForFastDev Include="@(_DexFile)" />
+ <_DexFileForFastDevInput Include="@(_DexFile)" />
+ <_AndroidNativeLibraryForFastDev Include="@(AndroidNativeLibrary)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_PrimaryCpuAbi Condition="$(_PrimaryCpuAbi) == ''">@(_BuildTargetAbis)
+
+
+
+ $(_PrimaryRuntimeIdentifier)
+
+ $(_PrimaryCpuAbi)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_NdkBuildNativeLibs Include="obj\local\$(_AdbTargetAbi)\lib*.so"/>
+
+
+
+
+
+
+ 10000
+ 10000
+ False
+ True
+ <_AndroidRunForceStop Condition="'$(_AndroidRunForceStop)' == ''">True
+ <_AndroidAllowJavaDebugging Condition="'$(_AndroidAllowJavaDebugging)' == ''">True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ConfigurationCacheItems Include="$(Configuration)$(Platform)$(AdbTarget)" />
+
+
+
+
+
+
+
+
+
+
+ <_UploadInputs Include="$(ApkFileSigned)" />
+ <_UploadInputs Include="@(_ResolvedAssemblies)" />
+ <_UploadInputs Include="@(_AndroidResolvedSatellitePaths)" />
+ <_UploadInputs Include="@(_ResolvedUserAssemblies)" />
+ <_UploadInputs Include="@(_DexFile)" />
+ <_UploadInputs Include="@(AndroidNativeLibrary)" />
+ <_UploadInputs Include="@(AndroidEnvironment)" Condition=" '$(_AndroidFastDeployEnvironmentFiles)' == 'true' " />
+ <_UploadInputs Include="@(LibraryEnvironments)" Condition=" '$(_AndroidFastDeployEnvironmentFiles)' == 'true' " />
+
+
+ <_AndroidTypeMaps Include="@(_AndroidTypeMapping)" />
+
+
+
+
+
+ <_FastDevFiles Include="@(_ResolvedAssemblies)" Condition=" '%(_ResolvedAssemblies.AndroidSkipAddToPackage)' != 'True' And '%(_ResolvedAssemblies.Abi)' == '$(_PrimaryCpuAbi)' ">
+ %(_ResolvedAssemblies.DestinationSubDirectory)%(Filename)%(Extension)
+
+ <_FastDevFiles Include="@(_ResolvedUserAssemblies)" Condition=" '%(_ResolvedUserAssemblies.AndroidSkipAddToPackage)' != 'True' And '%(_ResolvedUserAssemblies.Abi)' == '$(_PrimaryCpuAbi)' ">
+ %(_ResolvedUserAssemblies.DestinationSubDirectory)%(Filename)%(Extension)
+
+ <_FastDevFiles Include="@(_AndroidResolvedSatellitePaths)" Condition=" '%(_AndroidResolvedSatellitePaths.AndroidSkipAddToPackage)' != 'True' And '%(_AndroidResolvedSatellitePaths.Abi)' == '$(_PrimaryCpuAbi)' ">
+ %(_AndroidResolvedSatellitePaths.DestinationSubDirectory)%(Filename)%(Extension)
+
+ <_FastDevFiles Include="@(_ResolvedSymbols)" Condition=" '%(_ResolvedSymbols.Abi)' == '$(_PrimaryCpuAbi)' ">
+ %(_ResolvedSymbols.DestinationSubDirectory)%(Filename)%(Extension)
+
+
+
+
+
+ <_UploadDependsOnTargets>
+ _PrepareAssemblies;
+ _GetPrimaryCpuAbi;
+ _DetectIfAppWasUninstalled;
+ _CheckForConfigurationChange;
+ _ReadAndroidManifest;
+ _GetUploadInputs;
+ _DeployAppBundle;
+ _ComputeFastDevFiles;
+
+
+
+
+
+ <_ApkToInstall Condition=" '$(AndroidPackageFormat)' != 'aab' ">$(ApkFileSigned)
+ <_ReInstall Condition=" '$(_ReInstall)' == '' ">False
+ <_AndroidIsTestOnlyPackage Condition=" '$(_AndroidIsTestOnlyPackage)' == '' ">False
+ <_FastDeploymentDiagnosticLogging Condition=" '$(_FastDeploymentDiagnosticLogging)' == '' ">False
+
+
+
+
+
+
+ <_EnvironmentFiles Include="@(AndroidEnvironment);@(LibraryEnvironments)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SignAndroidPackage;
+ _Upload
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(CleanDependsOn);
+ _CleanDebuggingCaches;
+ _CleanMultiDexFiles;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/product.snk b/src/Xamarin.Android.Build.Debugging.Tasks/product.snk
new file mode 100644
index 00000000000..8c04e53be9d
Binary files /dev/null and b/src/Xamarin.Android.Build.Debugging.Tasks/product.snk differ
diff --git a/src/Xamarin.AndroidTools/AndroidBuildToolsVersion.cs b/src/Xamarin.AndroidTools/AndroidBuildToolsVersion.cs
new file mode 100644
index 00000000000..a41498a4a21
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AndroidBuildToolsVersion.cs
@@ -0,0 +1,80 @@
+//
+// AndroidBuildToolsVersion.cs
+//
+// Author:
+// Matt Ward
+//
+// Copyright (c) 2015 Xamarin Inc. (http://xamarin.com)
+//
+
+using System;
+
+namespace Xamarin.AndroidTools
+{
+ class AndroidBuildToolsVersion : IComparable
+ {
+ public AndroidBuildToolsVersion (int major, int minor, int build, string specialVersion = "")
+ : this (new Version (major, minor, build), specialVersion)
+ {
+ }
+
+ public AndroidBuildToolsVersion (Version version, string specialVersion = "")
+ {
+ Version = version;
+ SpecialVersion = specialVersion;
+ }
+
+ public Version Version { get; private set; }
+ public string SpecialVersion { get; private set; }
+
+ public static AndroidBuildToolsVersion Parse (string input)
+ {
+ AndroidBuildToolsVersion buildToolsVersion = null;
+
+ if (TryParse (input, out buildToolsVersion))
+ return buildToolsVersion;
+
+ throw new FormatException (String.Format ("Version string '{0}' is not valid.", input));
+ }
+
+ public static bool TryParse (string input, out AndroidBuildToolsVersion result)
+ {
+ result = null;
+
+ if (String.IsNullOrEmpty (input))
+ return false;
+
+ try {
+ result = ParseInternal (input);
+ return true;
+ } catch (Exception) {
+ }
+
+ return false;
+ }
+
+ public int CompareTo (AndroidBuildToolsVersion other)
+ {
+ int result = Version.CompareTo (other.Version);
+ if (result != 0)
+ return result;
+
+ return String.Compare (SpecialVersion, other.SpecialVersion, StringComparison.OrdinalIgnoreCase);
+ }
+
+ static AndroidBuildToolsVersion ParseInternal (string input)
+ {
+ string versionText = input.Trim ();
+ string specialVersionText = "";
+
+ int index = versionText.IndexOf (' ');
+ if (index > 0) {
+ specialVersionText = versionText.Substring (index + 1).Trim ();
+ versionText = versionText.Substring (0, index);
+ }
+
+ Version version = MonoDroidSdk.ParseVersion (versionText);
+ return new AndroidBuildToolsVersion (version, specialVersionText);
+ }
+ }
+}
diff --git a/src/Xamarin.AndroidTools/AndroidSdk.cs b/src/Xamarin.AndroidTools/AndroidSdk.cs
new file mode 100644
index 00000000000..0aa9de0842e
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AndroidSdk.cs
@@ -0,0 +1,649 @@
+//
+// AndroidSdk.cs
+//
+// Authors:
+// Jonathan Pobst
+// Andreia Gaita
+// Michael Hutchinson
+//
+// Copyright 2012 Xamarin Inc. All rights reserved.
+//
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using Mono.AndroidTools;
+using Xamarin.AndroidTools.Utilities;
+
+using Xamarin.Android.Tools;
+
+using NewVersion = Xamarin.Android.Tools.AndroidVersion;
+
+namespace Xamarin.AndroidTools
+{
+ public class AndroidSdk
+ {
+ private static AndroidSdkInfo sdk;
+
+ public const string AutoRefreshSwitch = "Xamarin.AndroidTools.AndroidSdk.AutoRefresh";
+
+ static AndroidSdk ()
+ {
+ var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
+ var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
+ ExeExtensions = new string [(pathExts?.Length ?? 0) + 1];
+ if (pathExts != null) {
+ Array.Copy (pathExts, 0, ExeExtensions, 0, pathExts.Length);
+ }
+ ExeExtensions [ExeExtensions.Length - 1] = null;
+
+ // Return early if AutoRefreshSwitch is false
+ if (AppContext.TryGetSwitch (AutoRefreshSwitch, out var enabled) && !enabled) {
+ return;
+ }
+
+ // Run Refresh if AutoRefreshSwitch is not set or true
+ Refresh ();
+ }
+
+ static readonly string[] ExeExtensions;
+
+ public static void Refresh ()
+ {
+ Refresh (null, null, null);
+ }
+
+#pragma warning disable CS0618 // Type or member is obsolete
+
+ public static void Refresh (string androidSdkPath = null, string androidNdkPath = null, string javaSdkPath = null)
+ {
+ try {
+ sdk = new AndroidSdkInfo (Logger, androidSdkPath, androidNdkPath, javaSdkPath);
+
+ if (AnalyticsService.IsRegistered)
+ SendTelemetryEventAsync ();
+
+ AndroidPlatformToolsPath = Path.Combine(AndroidSdkPath, "platform-tools");
+ AndroidToolsPath = Path.Combine (AndroidSdkPath, "tools");
+ AndroidEmulatorPath = Path.Combine (AndroidSdkPath, "emulator");
+ JavaBinPath = Path.Combine (JavaSdkPath, "bin");
+
+ AdbExe = FindExecutableInDirectory ("adb", AndroidPlatformToolsPath).FirstOrDefault ();
+ AndroidExe = FindExecutableInDirectory ("android", AndroidToolsPath).FirstOrDefault ();
+ EmulatorExe = FindExecutableInDirectory ("emulator", AndroidEmulatorPath).FirstOrDefault () ?? FindExecutableInDirectory ("emulator", AndroidToolsPath).FirstOrDefault ();
+ JarsignerExe = FindExecutableInDirectory ("jarsigner", JavaBinPath).FirstOrDefault ();
+ JavaExe = FindExecutableInDirectory ("java", JavaBinPath).FirstOrDefault ();
+ JavacExe = FindExecutableInDirectory ("javac", JavaBinPath).FirstOrDefault ();
+ KeyToolExe = FindExecutableInDirectory ("keytool", JavaBinPath).FirstOrDefault ();
+ MonitorExe = FindExecutableInDirectory ("monitor", AndroidToolsPath).FirstOrDefault ();
+ }
+ catch (Exception ex) {
+ sdk = null;
+ AndroidPlatformToolsPath = AndroidToolsPath = JavaBinPath = null;
+
+ AdbExe = AndroidExe = EmulatorExe = JarsignerExe = JavacExe = KeyToolExe = MonitorExe = null;
+ if (ex is InvalidOperationException && ex.Message.Contains (" Android "))
+ AndroidLogger.LogError (Properties.Resources.XA5300_Android_SDK);
+ else if (ex is InvalidOperationException && ex.Message.Contains (" Java "))
+ AndroidLogger.LogError (Properties.Resources.XA5300_Java_SDK);
+ else
+ AndroidLogger.LogError (Properties.Resources.XA5300_AndroidSdk_Refresh_Exception, ex.ToString ());
+ }
+ }
+
+#pragma warning restore CS0618
+
+ static System.Threading.Tasks.Task SendTelemetryEventAsync()
+ {
+ return System.Threading.Tasks.Task.Run(() => {
+ var telemetryProperties = new Dictionary();
+
+ telemetryProperties["XS.Core.SDK.Android.Version"] = MonoDroidSdk.VersionString;
+
+ TrackApiLevels(telemetryProperties);
+ TrackJdkInfo(telemetryProperties);
+
+ AnalyticsService.ReportSdkVersions(telemetryProperties);
+ });
+ }
+
+ static void Logger (TraceLevel level, string value)
+ {
+ switch (level) {
+ case TraceLevel.Error:
+ AndroidLogger.LogError (null, "{0}", value);
+ break;
+ case TraceLevel.Info:
+ AndroidLogger.LogInfo (null, "{0}", value);
+ break;
+ case TraceLevel.Warning:
+ AndroidLogger.LogWarning (null, "{0}", value);
+ break;
+ case TraceLevel.Verbose:
+ default:
+ AndroidLogger.LogDebug (null, "{0}", value);
+ break;
+ }
+ }
+
+ public static bool IsInstalled {
+ get {
+ return !string.IsNullOrEmpty (AndroidSdkPath) && IsJdkInstalled;
+ }
+ }
+
+ public static bool IsJdkInstalled {
+ get {
+ return !string.IsNullOrEmpty (JavaSdkPath);
+ }
+ }
+
+ [Obsolete ("Use OS.IsWindows")]
+ public static bool IsWindows {
+ get { return OS.IsWindows; }
+ }
+
+ [Obsolete ("Use OS.IsMac")]
+ public static bool IsMac {
+ get { return OS.IsMac; }
+ }
+
+ public static string AndroidSdkPath {
+ get { return sdk?.AndroidSdkPath; }
+ }
+
+ [Obsolete]
+ public static string[] AllAndroidSdkPaths {
+ get {
+ return sdk?.AllAndroidSdkPaths ?? new string [0];
+ }
+ }
+
+ public static string AndroidNdkPath {
+ get { return sdk?.AndroidNdkPath; }
+ }
+
+ public static string AndroidNdkHostPlatform {
+ get { return sdk?.AndroidNdkHostPlatform; }
+ }
+
+ [Obsolete]
+ public static string[] AllAndroidNdkPaths {
+ get {
+ return new string [0];
+ }
+ }
+
+ public static string JavaSdkPath {
+ get { return sdk?.JavaSdkPath; }
+ }
+
+ public static string JavaBinPath {
+ get;
+ private set;
+ }
+
+ [Obsolete ("Use GetCommandLineToolsPaths().")]
+ public static string AndroidToolsPath {
+ get;
+ private set;
+ }
+
+ public static string AndroidEmulatorPath {
+ get;
+ private set;
+ }
+
+ public static string AndroidPlatformToolsPath {
+ get;
+ private set;
+ }
+
+ /// The value of the PATH environment variable to be used when running SDK executables.
+ public static string GetEnvironmentPathOverride ()
+ {
+ if (string.IsNullOrEmpty (JavaBinPath))
+ return null;
+
+ var pathEnv = Environment.GetEnvironmentVariable ("PATH");
+ if (pathEnv != null)
+ return JavaBinPath + Path.PathSeparator + pathEnv;
+
+ return JavaBinPath;
+ }
+
+ static string GetShortPathName (string path)
+ {
+ if (OS.IsWindows)
+ return KernelEx.GetShortPathName (path);
+ return path;
+ }
+
+ static IEnumerable FindExecutableInDirectory (string executable, string dir)
+ {
+ foreach (var exe in Executables (executable)) {
+ var e = Path.Combine (dir, exe);
+ if (File.Exists (e))
+ yield return e;
+ }
+ }
+
+ static IEnumerable Executables (string executable)
+ {
+ foreach (var ext in ExeExtensions) {
+ yield return Path.ChangeExtension (executable, ext);
+ }
+ }
+
+ ///
+ /// The path and executable for adb[.exe].
+ ///
+ public static string AdbExe {
+ get;
+ private set;
+ }
+
+ ///
+ /// The path and executable for android[.bat].
+ ///
+ [Obsolete ("Part of obsolete `tools` package, do not use.")]
+ public static string AndroidExe {
+ get;
+ private set;
+ }
+
+ ///
+ /// The path and executable for monitor.exe/monitor.
+ ///
+ [Obsolete ("Part of obsolete `tools` package, do not use.")]
+ public static string MonitorExe {
+ get;
+ private set;
+ }
+
+ ///
+ /// The path and executable for emulator.exe/android.
+ ///
+ public static string EmulatorExe {
+ get;
+ private set;
+ }
+
+ public static string ZipAlignExe {
+ get { return GetZipAlignPath (); }
+ }
+
+ [Obsolete ("Use ApkSignerJar. This returns a path to apksigner.jar.")]
+ public static string ApkSignerExe => GetApkSignerPath ();
+
+ public static string ApkSignerJar => GetApkSignerPath ();
+
+ public static string JarsignerExe {
+ get;
+ private set;
+ }
+
+ public static string KeyToolExe {
+ get;
+ private set;
+ }
+
+ public static string JavaExe {
+ get;
+ private set;
+ }
+
+ public static string JavacExe {
+ get;
+ private set;
+ }
+
+ ///
+ /// Gets the sdk tools version from \tools\source.properties
+ /// Returns null if the file was not found.
+ ///
+ [Obsolete ("The `tools` package is obsolete. Use " + nameof (GetCommandLineToolsVersion) + "(string)")]
+ public static string SdkToolsVersion {
+ get {
+ return GetRevisionFromSdkPackageDirectory (Path.Combine (AndroidSdkPath, "tools"));
+ }
+ }
+
+ ///
+ /// Gets the sdk platform tools version from \platform-tools\source.properties.
+ /// Returns null if the file was not found.
+ ///
+ public static string SdkPlatformToolsVersion {
+ get {
+ return GetRevisionFromSdkPackageDirectory (Path.Combine (AndroidSdkPath, "platform-tools"));
+ }
+ }
+
+ ///
+ /// Gets the sdk build tools version from \build-tools\\source.properties.
+ /// Returns null if the file was not found.
+ ///
+ public static string SdkBuildToolsVersion {
+ get {
+ if (AndroidSdkPath == null)
+ return null;
+
+ var buildToolsDir = Path.Combine (AndroidSdkPath, "build-tools");
+ if (Directory.Exists (buildToolsDir)) {
+ var toolsDirs = Directory.GetDirectories (buildToolsDir);
+
+ var versions = (from dir in toolsDirs
+ let v = GetRevisionFromSdkPackageDirectory (dir)
+ let version = ParseBuildToolsVersion (v)
+ orderby version
+ select v).ToList ();
+
+ return versions.LastOrDefault ();
+ }
+
+ return null;
+ }
+ }
+
+ ///
+ /// Gets the sdk cmdline-tools version from \cmdline-tools\\source.properties.
+ ///
+ /// The full path to the cmdline-tools\version folder.
+ /// The version of the specified cmdline-tools path, or null if the folder or file was not found.
+ public static string GetCommandLineToolsVersion (string commandLineToolsPath)
+ {
+ return GetRevisionFromSdkPackageDirectory (commandLineToolsPath);
+ }
+
+ static string GetRevisionFromSdkPackageDirectory (string sdkPackageDirectory)
+ {
+ if (!Directory.Exists (sdkPackageDirectory))
+ return null;
+
+ return SdkBuildProperties.LoadProperties (Path.Combine (sdkPackageDirectory, "source.properties")).GetPropertyValue ("Pkg.Revision=");
+ }
+
+ static void TrackJdkInfo(Dictionary telemetryProperties)
+ {
+ var props = default(JdkProperties);
+
+ try {
+ props = JdkProperties.Get(JavaSdkPath);
+ } catch (Exception ex)
+ {
+ AndroidLogger.LogError(Properties.Resources.XA5300_AndroidSdk_JdkInfo, ex.ToString ());
+ }
+
+ telemetryProperties["Xamarin.Core.SDK.Android.JDK.Vendor"] = props?.Vendor;
+ telemetryProperties["Xamarin.Core.SDK.Android.JDK.Version"] = props?.Version;
+ }
+
+ static void TrackApiLevels (Dictionary telemetryProperties)
+ {
+ List versions;
+ if (IsInstalled && MonoDroidSdk.AndroidVersions != null) {
+ versions = GetInstalledPlatformVersions (MonoDroidSdk.AndroidVersions).ToList ();
+ }
+ else {
+ versions = new List ();
+ }
+
+ telemetryProperties ["Xamarin.Core.SDK.Android.Api.Count"] = versions.Count.ToString ();
+ if (versions.Count == 0) {
+ telemetryProperties ["Xamarin.Core.SDK.Android.Api.Levels"] = string.Empty;
+ }
+ else {
+ var sb = new System.Text.StringBuilder ();
+
+ for (int i = 0; i < versions.Count; i++) {
+ sb.Append (versions [i].ApiLevel.ToString ());
+ if (versions.Count > 1 && i < versions.Count - 1) {
+ sb.Append ("|");
+ }
+ }
+
+ telemetryProperties ["Xamarin.Core.SDK.Android.Api.Levels"] = sb.ToString ();
+ }
+ }
+
+ static AndroidBuildToolsVersion ParseBuildToolsVersion (string input)
+ {
+ AndroidBuildToolsVersion version = null;
+ if (AndroidBuildToolsVersion.TryParse (input, out version))
+ return version;
+
+ return new AndroidBuildToolsVersion (0, 0, 0, input ?? "");
+ }
+
+ static string ValidatePath (string path)
+ {
+ if (String.IsNullOrEmpty (path))
+ throw new InvalidOperationException ("This property is not valid when the SDK is not installed");
+ return path;
+ }
+
+ public static void SetPreferredAndroidSdkPath (string path)
+ {
+ AndroidSdkInfo.SetPreferredAndroidSdkPath (path);
+
+ // Update everything to use new path
+ Refresh ();
+ }
+
+ public static void SetPreferredJavaSdkPath (string path)
+ {
+ AndroidSdkInfo.SetPreferredJavaSdkPath (path);
+
+ // Update everything to use new path
+ Refresh ();
+ }
+
+ public static void SetPreferredAndroidNdkPath (string path)
+ {
+ AndroidSdkInfo.SetPreferredAndroidNdkPath (path);
+
+ // Update everything to use new path
+ Refresh ();
+ }
+
+ ///
+ /// Checks that a value is the location of an Android SDK.
+ ///
+ public static bool ValidateAndroidSdkLocation (string loc)
+ {
+ return !string.IsNullOrEmpty (loc) &&
+ loc.IndexOfAny (Path.GetInvalidPathChars ()) == -1 &&
+ FindExecutableInDirectory ("adb", Path.Combine (loc, "platform-tools")).Any ();
+ }
+
+ ///
+ /// Checks that a value is the location of a Java SDK.
+ ///
+ public static bool ValidateJavaSdkLocation (string loc)
+ {
+ return !string.IsNullOrEmpty (loc) &&
+ loc.IndexOfAny (Path.GetInvalidPathChars ()) == -1 &&
+ FindExecutableInDirectory ("jarsigner", Path.Combine (loc, "bin")).Any ();
+ }
+
+ ///
+ /// Checks that a value is the location of an Android NDK.
+ ///
+ public static bool ValidateAndroidNdkLocation (string loc)
+ {
+ return !string.IsNullOrEmpty (loc) &&
+ loc.IndexOfAny (Path.GetInvalidPathChars ()) == -1 &&
+ FindExecutableInDirectory ("ndk-stack", loc).Any ();
+ }
+
+ public static string GetLatestPlatformDirectory ()
+ {
+ var platformsDir = Path.Combine (AndroidSdkPath, "platforms");
+ if (Directory.Exists (platformsDir)) {
+ var dirs =
+ from p in Directory.EnumerateDirectories (platformsDir, "android-*")
+ let version = ToInt32 (Path.GetFileName (p).Substring ("android-".Length))
+ orderby version descending
+ select new {
+ Path = p,
+ Version = version,
+ };
+ foreach (var d in dirs)
+ return d.Path;
+ }
+ throw new InvalidOperationException ("Could not find latest API level in: " + AndroidSdkPath);
+ }
+
+ static int? ToInt32 (string value)
+ {
+ int v;
+ if (int.TryParse (value, out v))
+ return v;
+ return null;
+ }
+
+ public static string GetPlatformDirectory (int apiLevel)
+ {
+ return sdk?.GetPlatformDirectory (apiLevel);
+ }
+
+ public static string GetPlatformDirectory (string osVersion)
+ {
+ return sdk?.TryGetPlatformDirectoryFromApiLevel (osVersion, MonoDroidSdk.AndroidVersions);
+ }
+
+ public static bool IsPlatformInstalled (string osVersion)
+ {
+ if (sdk == null || MonoDroidSdk.AndroidVersions == null)
+ return false;
+ var id = MonoDroidSdk.AndroidVersions.GetIdFromFrameworkVersion (osVersion);
+ return sdk.TryGetPlatformDirectoryFromApiLevel (id, MonoDroidSdk.AndroidVersions) != null;
+ }
+
+ public static bool IsPlatformInstalled (int apiLevel)
+ {
+ return apiLevel != 0 && Directory.Exists (GetPlatformDirectory (apiLevel));
+ }
+
+ [Obsolete ("Use " + nameof (GetInstalledPlatformVersions) + "(AndroidVersions)")]
+ public static IEnumerable GetInstalledPlatformVersions ()
+ {
+ var knownAndInstalledSdkLevels = AndroidVersion.KnownVersions.Where (v => IsPlatformInstalled (v.ApiLevel));
+
+ return knownAndInstalledSdkLevels.Where (version => {
+ var apiLevel = MonoDroidSdk.GetApiLevelForFrameworkVersion (version.OSVersion);
+ return MonoDroidSdk.IsSupportedFrameworkLevel (apiLevel);
+ });
+ }
+
+ public static IEnumerable GetInstalledPlatformVersions (AndroidVersions versions)
+ {
+ return sdk?.GetInstalledPlatformVersions (versions) ?? Enumerable.Empty();
+ }
+
+ static string GetZipAlignPath ()
+ {
+ var zipAlign = OS.IsWindows ? "zipalign.exe" : "zipalign";
+ foreach (var p in GetBuildToolsPaths ()) {
+ var app = Path.Combine (p, "bin", zipAlign);
+ if (File.Exists (app))
+ return app;
+ app = Path.Combine (p, zipAlign);
+ if (File.Exists (app))
+ return app;
+ }
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var old = Path.Combine (GetShortPathName (AndroidToolsPath), zipAlign);
+#pragma warning restore CS0618
+ if (File.Exists (old))
+ return old;
+
+ return null;
+ }
+
+ static string GetApkSignerPath ()
+ {
+ const string apkSigner = "apksigner.jar";
+
+ foreach (var p in GetBuildToolsPaths ())
+ {
+ var app = Path.Combine (p, "lib", apkSigner);
+ if (File.Exists (app))
+ return app;
+ app = Path.Combine (p, apkSigner);
+ if (File.Exists (app))
+ return app;
+ }
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var old = Path.Combine (GetShortPathName (AndroidToolsPath), apkSigner);
+#pragma warning restore CS0618
+
+ if (File.Exists (old))
+ return old;
+
+ return null;
+ }
+
+ static readonly string apkanalyzer = OS.IsWindows ? "apkanalyzer.exe" : "apkanalyzer";
+
+ public static string GetApkAnalyzerPath () => GetApkAnalyzerPath (preferredCommandLineToolsVersion: null);
+
+ public static string GetApkAnalyzerPath (string preferredCommandLineToolsVersion)
+ {
+ foreach (var p in GetCommandLineToolsPaths (preferredCommandLineToolsVersion)) {
+ var cmdLineToolsapkanalyzerPath = FindExecutableInDirectory ("apkanalyzer", Path.Combine (p, "bin")).FirstOrDefault ();
+ if (File.Exists (cmdLineToolsapkanalyzerPath)) {
+ return cmdLineToolsapkanalyzerPath;
+ }
+ }
+
+ return GetFallbackApkAnalyzerPath ();
+ }
+
+ static string GetFallbackApkAnalyzerPath ()
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
+ var apkanalyzerPath = Path.Combine (AndroidSdk.AndroidToolsPath, "bin", apkanalyzer);
+#pragma warning restore CS0618
+
+ if (File.Exists (apkanalyzerPath))
+ return apkanalyzerPath;
+
+ return null;
+ }
+
+ static readonly string aapt = OS.IsWindows ? "aapt.exe" : "aapt";
+
+ public static string GetAaptPath (string preferredBuildToolsVersion = null)
+ {
+ foreach (var p in GetBuildToolsPaths (preferredBuildToolsVersion)) {
+ var app = Path.Combine (p, "bin", aapt);
+ if (File.Exists (app))
+ return app;
+ app = Path.Combine (p, aapt);
+ if (File.Exists (app))
+ return app;
+ }
+ return null;
+ }
+
+ public static IEnumerable GetCommandLineToolsPaths (string preferredCommandLineToolsVersion = null)
+ {
+ return sdk?.GetCommandLineToolsPaths (preferredCommandLineToolsVersion) ?? Enumerable.Empty ();
+ }
+
+ public static IEnumerable GetBuildToolsPaths (string preferredBuildToolsVersion)
+ {
+ return sdk?.GetBuildToolsPaths (preferredBuildToolsVersion) ?? Enumerable.Empty ();
+ }
+
+ public static IEnumerable GetBuildToolsPaths ()
+ {
+ return sdk?.GetBuildToolsPaths () ?? Enumerable.Empty ();
+ }
+ }
+}
diff --git a/src/Xamarin.AndroidTools/AndroidSigningOptions.cs b/src/Xamarin.AndroidTools/AndroidSigningOptions.cs
new file mode 100644
index 00000000000..fff5d242968
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AndroidSigningOptions.cs
@@ -0,0 +1,55 @@
+//
+// AndroidSigningOptions.cs
+//
+// Author:
+// Michael Hutchinson
+//
+// Copyright (c) 2010-2011 Novell, Inc.
+// Copyright (c) 2011 Xamarin Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Xamarin.AndroidTools
+{
+ public enum PackageSigningAlgorithm
+ {
+ Unsupported,
+ RSA,
+ DSA,
+ SHA256withRSA
+ }
+
+ public class AndroidSigningOptions
+ {
+ public AndroidSigningOptions ()
+ {
+ SigningAlgorithm = PackageSigningAlgorithm.RSA;
+ }
+
+ public string KeyStore { get; set; }
+ public string KeyAlias { get; set; }
+ public string KeyPass { get; set; }
+ public string StorePass { get; set; }
+ public string TsaUrl { get; set; }
+ public int? MinSdkVersion { get; set; }
+ public PackageSigningAlgorithm SigningAlgorithm { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.AndroidTools/AndroidTargetArch.cs b/src/Xamarin.AndroidTools/AndroidTargetArch.cs
new file mode 100644
index 00000000000..fc1a28916a9
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AndroidTargetArch.cs
@@ -0,0 +1,44 @@
+//
+// AndroidTargetArch.cs
+//
+// Author:
+// Atsushi Eno
+//
+// Copyright (c) 2012 Xamarin Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.IO;
+using System.Linq;
+
+namespace Xamarin.AndroidTools
+{
+ [Flags]
+ public enum AndroidTargetArch
+ {
+ None = 0,
+ Arm = 1,
+ X86 = 2,
+ Mips = 4,
+ Arm64 = 8,
+ X86_64 = 16,
+ Other = 0x10000 // hope it's not too optimistic
+ }
+}
+
diff --git a/src/Xamarin.AndroidTools/AndroidVersion.cs b/src/Xamarin.AndroidTools/AndroidVersion.cs
new file mode 100644
index 00000000000..65ea00de8d8
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AndroidVersion.cs
@@ -0,0 +1,203 @@
+//
+// AndroidVersion.cs
+//
+// Author:
+// Michael Hutchinson
+//
+// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com)
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+namespace Xamarin.AndroidTools
+{
+ [Obsolete ("Use Xamarin.Android.Tools.AndroidVersion, in Xamarin.Android.Tools.AndroidSdk.dll")]
+ public class AndroidVersion : IEquatable
+ {
+ public static readonly int MaxApiLevel = 26;
+
+ public AndroidVersion (int apilevel, string osVersion)
+ {
+ this.ApiLevel = apilevel;
+ this.OSVersion = osVersion;
+ }
+
+ internal AndroidVersion (int apilevel, string osVersion, string codeName, Version version)
+ {
+ this.ApiLevel = apilevel;
+ // TODO: remove osVersion from parameter list and generate from version
+ this.OSVersion = osVersion;
+ this.CodeName = codeName;
+ this.Version = version;
+ }
+
+ public int ApiLevel { get; private set; }
+ public string OSVersion { get; private set; }
+ public string CodeName { get; private set; }
+ public Version Version { get; private set; }
+
+ public static int OSVersionToApiLevel (string osVersion)
+ {
+ int ret = TryOSVersionToApiLevel (osVersion);
+ if (ret == 0)
+ throw new ArgumentOutOfRangeException ("OS version not recognized: " + osVersion);
+ return ret;
+ }
+
+ public static int TryOSVersionToApiLevel (string frameworkVersion)
+ {
+ // Use MonoDroidSdk.GetApiLevelForFrameworkVersion because that will translate XA versions >= 5.xx to the correct api level
+ var apiLevelText = MonoDroidSdk.GetApiLevelForFrameworkVersion (frameworkVersion);
+ int apiLevel;
+ int.TryParse (apiLevelText, out apiLevel);
+ return apiLevel;
+ }
+
+ public static string ApiLevelToOSVersion (int apiLevel)
+ {
+ string ret = TryApiLevelToOSVersion (apiLevel);
+ if (ret == null)
+ throw new ArgumentOutOfRangeException ("API level not recognized: " + apiLevel);
+ return ret;
+ }
+
+ public static string TryApiLevelToOSVersion (int apiLevel)
+ {
+ var osVersion = MonoDroidSdk.GetFrameworkVersionForApiLevel (apiLevel.ToString ());
+ if (!string.IsNullOrEmpty (osVersion))
+ return osVersion.TrimStart ('v');
+ return null;
+ }
+
+ public static string TryOSVersionToCodeName (string frameworkVersion)
+ {
+ // First try to get the code name from InstalledBindingVersions
+ if (MonoDroidSdk.AndroidVersions != null) {
+ var id = MonoDroidSdk.AndroidVersions.GetIdFromFrameworkVersion(frameworkVersion);
+ var bindingVersion = MonoDroidSdk.AndroidVersions.InstalledBindingVersions.FirstOrDefault(v => v.Id == id);
+ if (bindingVersion != null) return bindingVersion.CodeName;
+ }
+
+ // If for some reason there's an error there then fall back to KnownVersions
+
+ // match on API level, the framework version might not match what we have here (>= XA 5.x uses a different version scheme)
+ var apiLevel = TryOSVersionToApiLevel (frameworkVersion);
+
+ foreach (var version in KnownVersions)
+ if (version.ApiLevel == apiLevel)
+ return version.CodeName;
+ return null;
+ }
+
+ public static string TryFrameworkVersionToOSVersion (string frameworkVersion)
+ {
+ // match on API level, the framework version might not match what we have here (>= XA 5.x uses a different version scheme)
+ var apiLevel = TryOSVersionToApiLevel (frameworkVersion);
+
+ foreach (AndroidVersion version in KnownVersions)
+ if (version.ApiLevel == apiLevel)
+ return version.OSVersion;
+ return null;
+ }
+
+ [Obsolete("No longer used")]
+ public static bool IsKnownVersion (string version)
+ {
+ return TryOSVersionToApiLevel (version) > 0;
+ }
+
+ public bool Equals (AndroidVersion other)
+ {
+ if (other == null)
+ return false;
+
+ return ApiLevel == other.ApiLevel &&
+ OSVersion == other.OSVersion &&
+ CodeName == other.CodeName;
+ }
+
+ public override bool Equals (object obj)
+ {
+ if (obj is null)
+ return false;
+
+ if (ReferenceEquals (this, obj))
+ return true;
+
+ return Equals (obj as AndroidVersion);
+ }
+
+ public static bool operator == (AndroidVersion left, AndroidVersion right)
+ {
+ if ((object) left == null || (object) right == null)
+ return ReferenceEquals (left, right);
+
+ return left.Equals (right);
+ }
+
+ public static bool operator != (AndroidVersion left, AndroidVersion right)
+ {
+ return !(left == right);
+ }
+
+ public override int GetHashCode ()
+ {
+ unchecked
+ {
+ int hash = 17;
+ hash = hash * 23 + ApiLevel.GetHashCode ();
+ hash = hash * 23 + OSVersion.GetHashCode ();
+ hash = hash * 23 + CodeName.GetHashCode ();
+ return hash;
+ }
+ }
+
+ public static AndroidVersion[] KnownVersions = new[] {
+ new AndroidVersion (4, "1.6", "Donut", new Version (1, 6)),
+ new AndroidVersion (5, "2.0", "Eclair", new Version (2, 0)),
+ new AndroidVersion (6, "2.0.1", "Eclair", new Version (2, 0, 1)),
+ new AndroidVersion (7, "2.1", "Eclair", new Version (2, 1)),
+ new AndroidVersion (8, "2.2", "Froyo", new Version (2, 2)),
+ new AndroidVersion (10, "2.3", "Gingerbread", new Version (2, 3)),
+ new AndroidVersion (11, "3.0", "Honeycomb", new Version (3, 0)),
+ new AndroidVersion (12, "3.1", "Honeycomb", new Version (3, 1)),
+ new AndroidVersion (13, "3.2", "Honeycomb", new Version (3, 2)),
+ new AndroidVersion (14, "4.0", "Ice Cream Sandwich", new Version (4, 0)),
+ new AndroidVersion (15, "4.0.3", "Ice Cream Sandwich", new Version (4, 0, 3)),
+ new AndroidVersion (16, "4.1", "Jelly Bean", new Version (4, 1)),
+ new AndroidVersion (17, "4.2", "Jelly Bean", new Version (4, 2)),
+ new AndroidVersion (18, "4.3", "Jelly Bean", new Version (4, 3)),
+ new AndroidVersion (19, "4.4", "Kit Kat", new Version (4, 4)),
+ new AndroidVersion (20, "4.4.87", "Kit Kat + Wear support", new Version (4, 4, 87)),
+ new AndroidVersion (21, "5.0", "Lollipop", new Version (5, 0)),
+ new AndroidVersion (22, "5.1", "Lollipop", new Version (5, 1)),
+ new AndroidVersion (23, "6.0", "Marshmallow", new Version (6, 0)),
+ new AndroidVersion (24, "7.0", "Nougat", new Version (7, 0)),
+ new AndroidVersion (25, "7.1", "Nougat", new Version (7, 1)),
+ new AndroidVersion (26, "8.0", "Oreo", new Version (8, 0)),
+ new AndroidVersion (27, "8.1", "Oreo", new Version (8, 1)),
+ };
+ }
+
+ public static class AndroidVersionExtensions
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
+
+ public static AndroidVersion ToLegacyVersion (this Xamarin.Android.Tools.AndroidVersion androidVersion)
+ {
+ if (!Version.TryParse (androidVersion.OSVersion, out Version version))
+ return null;
+
+ return new AndroidVersion (
+ androidVersion.ApiLevel,
+ androidVersion.OSVersion,
+ androidVersion.CodeName,
+ version
+ );
+ }
+
+#pragma warning restore CS0618
+
+ }
+}
diff --git a/src/Xamarin.AndroidTools/AssemblyInfo.cs b/src/Xamarin.AndroidTools/AssemblyInfo.cs
new file mode 100644
index 00000000000..8f4867d5ff2
--- /dev/null
+++ b/src/Xamarin.AndroidTools/AssemblyInfo.cs
@@ -0,0 +1,32 @@
+//
+// AssemblyInfo.cs
+//
+// Author:
+// Michael Hutchinson
+//
+// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly:InternalsVisibleTo("Xamarin.AndroidTools.Tests, PublicKey=" +
+ "00240000048000009400000006020000002400005253413100040000010001008B63AA15D5222FA8E77F9DBFBE47AD82E74130B737743BC5" +
+ "2A7074AD85D2EB34F28C83EFD0C1812C6957BAED24836300DF569EA0E6A71EEDA71C5E88A657AB8F243F268DA584B2D4EF4FCD3245B6A370" +
+ "001A77DE21DE670E4678E29942F5628B153E88CD19504664FC663F9729DCA1CA2977875710EAF2CBD382DD6FD52BE9D3")]
diff --git a/src/Xamarin.AndroidTools/Debugging/AmIntentCommandParser.cs b/src/Xamarin.AndroidTools/Debugging/AmIntentCommandParser.cs
new file mode 100644
index 00000000000..104ed74674e
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/AmIntentCommandParser.cs
@@ -0,0 +1,303 @@
+//
+// AmIntentCommandParser.cs
+//
+// Author:
+// Greg Munn
+//
+// Copyright (c) 2016 Xamarin Inc
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Mono.AndroidTools;
+using Mono.AndroidTools.Util;
+
+namespace Xamarin.AndroidTools.Debugging
+{
+ public static class AmIntentCommandParser
+ {
+ public static AmIntentCommand Parse(string command, string packageName)
+ {
+ string[] args;
+ if (!ProcessArgumentBuilder.TryParse(command, out args))
+ throw new ArgumentException(string.Format("Command '{0}' could not be parsed", command));
+
+ if (args.Length < 2)
+ throw new ArgumentException(string.Format("Command '{0}' does not have the correct number of arguments", command));
+
+ if (args[0] != "am")
+ throw new ArgumentException(string.Format("Command '{0}' does not start with `am`", command));
+
+ AmOptions options;
+ switch (args[1]) {
+ case "start":
+ options = new AmStartOptions(packageName);
+
+ break;
+ case "startservice":
+ options = new AmStartServiceOptions(packageName);
+
+ break;
+ case "broadcast":
+ options = new AmBroadcastOptions(packageName);
+
+ break;
+ default:
+ throw new NotSupportedException(string.Format("Unsupported `am {0}` command", args[1]));
+ }
+
+ var optSet = options.GetOptionSet();
+ var optionArgs = args.Skip(2).ToArray();
+
+ var remainingArgs = optSet.Parse(optionArgs);
+ options.HandleRemainingArgs(remainingArgs);
+
+ return options.Command;
+ }
+
+ public static ExtraDataUri ParseDataUri(string v)
+ {
+ return new ExtraDataUri(v);
+ }
+
+ public static ExtraComponentName ParseComponentName(string v)
+ {
+ return new ExtraComponentName(v);
+ }
+
+ public static long ParseLong(string v)
+ {
+ return long.Parse(v);
+ }
+
+ public static ExtraFloat ParseFloat(string v)
+ {
+ return new ExtraFloat(v);
+ }
+
+ public static int[] ParseIntArray(string v)
+ {
+ if (string.IsNullOrEmpty(v))
+ return new int[0];
+
+ var values = v.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+ var result = new int[values.Length];
+ for (int i = 0; i < values.Length; i++)
+ {
+ result[i] = int.Parse(values[i]);
+ }
+
+ return result;
+ }
+
+ public static long[] ParseLongArray(string v)
+ {
+ if (string.IsNullOrEmpty(v))
+ return new long[0];
+
+ var values = v.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+ var result = new long[values.Length];
+ for (int i = 0; i < values.Length; i++)
+ {
+ result[i] = ParseLong(values[i]);
+ }
+
+ return result;
+ }
+
+ public static ExtraFloat[] ParseFloatArray(string v)
+ {
+ if (string.IsNullOrEmpty(v))
+ return new ExtraFloat[0];
+
+ var values = v.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+ var result = new ExtraFloat[values.Length];
+ for (int i = 0; i < values.Length; i++)
+ {
+ result[i] = ParseFloat(values[i]);
+ }
+
+ return result;
+ }
+
+ public static bool ParseExtraBool(string v)
+ {
+ if (string.Equals(v, "true", StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+
+ if (string.Equals(v, "false", StringComparison.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (string.Equals(v, "1", StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+
+ if (string.Equals(v, "0", StringComparison.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ throw new FormatException("coud not parse boolean value");
+ }
+
+ abstract class AmOptions
+ {
+ public AmIntentCommand Command { get; protected set; }
+ public abstract Mono.Options.OptionSet GetOptionSet();
+ public virtual void HandleRemainingArgs(List args)
+ {
+ if (args.Count > 0) {
+ this.Command.Intent = args[0];
+ }
+ }
+
+ protected void AddIntentOptions(Mono.Options.OptionSet options)
+ {
+ // intent options
+ options.Add("n=", "Component", s => this.Command.Component = s);
+ options.Add("a=", "Action", s => this.Command.Action = s);
+ options.Add("d=", "Data Uri", s => this.Command.DataUri = s);
+ options.Add("c=", "Category", s => this.Command.Categories.Add(s));
+ options.Add("t=", "Mime Type", s => this.Command.MimeType = s);
+ // strictly speaking we should also support -p here, but we don't because of conflicts with the use of
+ // packageName for fast dev property settings
+
+ options.Add("selector", "Selector", s => this.Command.Selector = true);
+
+ }
+
+ protected void AddFlagsOptions(Mono.Options.OptionSet options)
+ {
+ options.Add("f=", (k) => { throw new NotSupportedException("-f is not supported, use individual flag arguments"); });
+
+ options.Add("grant-read-uri-permission", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.GrantReadUriPermission);
+ options.Add("grant-write-uri-permission", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.GrantWriteUriPermission);
+ options.Add("debug-log-resolution", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.DebugLogResolution);
+ options.Add("exclude-stopped-packages", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ExcludeStoppedPackages);
+ options.Add("include-stopped-packages", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.IncludeStoppedPackages);
+ options.Add("activity-brought-to-front", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityBroughtToFront);
+ options.Add("activity-clear-top", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityClearTop);
+ options.Add("activity-clear-when-task-reset", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityClearWhenTaskReset);
+ options.Add("activity-exclude-from-recents", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityExcludeFromRecents);
+ options.Add("activity-launched-from-history", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityLaunchedFromHistory);
+ options.Add("activity-multiple-task", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActvityMultipleTask);
+ options.Add("activity-no-animation", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityNoAnimation);
+ options.Add("activity-no-history", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityNoHistory);
+ options.Add("activity-no-user-action", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityNoUserAction);
+ options.Add("activity-previous-is-top", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityPreviousIsTop);
+ options.Add("activity-reorder-to-front", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityReorderToFront);
+ options.Add("activity-reset-task-if-needed", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityResetTaskIfNeeded);
+ options.Add("activity-single-top", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivitySingleTop);
+ options.Add("activity-clear-task", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityClearTask);
+ options.Add("activity-task-on-home", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ActivityTaskOnHome);
+ options.Add("receiver-registered-only", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ReceiverRegisteredOnly);
+ options.Add("receiver-replace-pending", (k) => this.Command.Flags = this.Command.Flags | IntentFlag.ReceiverReplacePending);
+ }
+
+ protected void AddExtraOptions(Mono.Options.OptionSet options)
+ {
+ options.Add("esn=", "Extra Null", (k) => this.Command.Extras.Add(k, null));
+ options.Add("e|es=", "Extra String", (k, v) => this.Command.Extras.Add(k, v));
+ options.Add("ez=", "Extra Bool", (k, v) => this.Command.Extras.Add(k, ParseExtraBool(v)));
+ options.Add("ei=", "Extra Int", (k, v) => this.Command.Extras.Add(k, int.Parse(v)));
+ options.Add("el=", "Extra Long", (k, v) => this.Command.Extras.Add(k, ParseLong(v)));
+ options.Add("ef=", "Extra Float", (k, v) => this.Command.Extras.Add(k, ParseFloat(v)));
+ options.Add("eu=", "Extra Uri", (k, v) => this.Command.Extras.Add(k, ParseDataUri(v)));
+ options.Add("ecn=", "Extra Component Name", (k, v) => this.Command.Extras.Add(k, ParseComponentName(v)));
+
+ // extras that take an array
+ options.Add("eia=", "Extra Int Array", (k, v) => this.Command.Extras.Add(k, ParseIntArray(v)));
+ options.Add("ela=", "Extra Long Array", (k, v) => this.Command.Extras.Add(k, ParseLongArray(v)));
+ options.Add("efa=", "Extra Float Array", (k, v) => this.Command.Extras.Add(k, ParseFloatArray(v)));
+ }
+ }
+
+ class AmStartOptions : AmOptions
+ {
+ readonly AmStartCommand command;
+
+ public AmStartOptions(string packageName)
+ {
+ this.Command = this.command = new AmStartCommand();
+ this.command.PackageName = packageName;
+ this.command.Extras = new Dictionary();
+ this.command.Categories = new List();
+ }
+
+ public override Mono.Options.OptionSet GetOptionSet()
+ {
+ var options = new Mono.Options.OptionSet {
+ // start options
+ { "D", "Enable Debugging", s => this.command.EnableDebugging = true },
+ { "W", "Wait For Launch", s => this.command.Wait = true },
+ { "start-profiler=", "Profiler Output", s => this.command.ProfilerOutputPath = s },
+ { "R=", "Repeat Launch", s => this.command.Repeat = int.Parse(s) },
+ { "S", "Force Stop", s => this.command.ForceStop = true },
+ { "opengl-trace", "Open GL Trace", s => this.command.EnableOpenGLTracing = true },
+ { "user=", "User Id", s => this.command.User = s },
+ };
+
+ AddIntentOptions(options);
+ AddExtraOptions(options);
+ AddFlagsOptions(options);
+ return options;
+ }
+ }
+
+ class AmStartServiceOptions : AmOptions
+ {
+ readonly AmStartServiceCommand command;
+
+ public AmStartServiceOptions(string packageName)
+ {
+ this.Command = this.command = new AmStartServiceCommand();
+ this.command.PackageName = packageName;
+ this.command.Extras = new Dictionary();
+ this.command.Categories = new List();
+ }
+
+ public override Mono.Options.OptionSet GetOptionSet()
+ {
+ var options = new Mono.Options.OptionSet {
+ { "user=", "User Id", s => this.command.User = s },
+ };
+
+ AddIntentOptions(options);
+ AddExtraOptions(options);
+ AddFlagsOptions(options);
+ return options;
+ }
+ }
+
+ class AmBroadcastOptions : AmOptions
+ {
+ readonly AmBroadcastCommand command;
+
+ public AmBroadcastOptions(string packageName)
+ {
+ this.Command = this.command = new AmBroadcastCommand();
+ this.command.PackageName = packageName;
+ this.command.Extras = new Dictionary();
+ this.command.Categories = new List();
+ }
+
+ public override Mono.Options.OptionSet GetOptionSet()
+ {
+ var options = new Mono.Options.OptionSet {
+ { "user=", "User Id", s => this.command.User = s },
+ };
+
+ AddIntentOptions(options);
+ AddExtraOptions(options);
+ AddFlagsOptions(options);
+ return options;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.AndroidTools/Debugging/DebuggerOptions.cs b/src/Xamarin.AndroidTools/Debugging/DebuggerOptions.cs
new file mode 100644
index 00000000000..7b1a5fa4ca5
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/DebuggerOptions.cs
@@ -0,0 +1,47 @@
+//
+// DebuggerOptions.cs
+//
+// Author:
+// Greg Munn
+//
+// Copyright (c) 2016 Xamarin Inc
+//
+
+using System;
+using System.Net;
+
+namespace Xamarin.AndroidTools.Debugging
+{
+ ///
+ /// Debugger options that control how the android process connects to the debugger
+ ///
+ public sealed class DebuggerOptions
+ {
+ public DebuggerOptions()
+ {
+ }
+
+ public DebuggerOptions(IPAddress address, int sdbPort, int stdoutPort, bool server)
+ {
+ this.Address = address;
+ this.SdbPort = sdbPort;
+ this.StdoutPort = stdoutPort;
+ this.Server = server;
+ }
+
+ public DebuggerOptions(IPAddress address, int sdbPort, int stdoutPort, bool server, string jdwpHostName, int jdwpPort) :
+ this (address, sdbPort, stdoutPort, server)
+ {
+ this.JdwpHostName = jdwpHostName;
+ this.JdwpPort = jdwpPort;
+ }
+
+ public IPAddress Address { get; set; }
+ public int SdbPort { get; set; }
+ public int StdoutPort { get; set; }
+ public bool Server { get; set; }
+ public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds (30);
+ public string JdwpHostName { get; set; } = "127.0.0.1";
+ public int JdwpPort { get; set; } = 8100;
+ }
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/DebuggingExtensions.cs b/src/Xamarin.AndroidTools/Debugging/DebuggingExtensions.cs
new file mode 100644
index 00000000000..fea84e4156e
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/DebuggingExtensions.cs
@@ -0,0 +1,203 @@
+//
+// DebuggingExtensions.cs
+//
+// Author:
+// Greg Munn
+//
+// Copyright (c) 2016 Xamarin Inc
+//
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Mono.AndroidTools;
+using System.Diagnostics;
+using Xamarin.AndroidTools.Debugging.Java;
+
+namespace Xamarin.AndroidTools.Debugging
+{
+ ///
+ /// Device extension methods for initiating debugging
+ ///
+ public static class DebuggingExtensions
+ {
+ const int WAIT_BEFORE_RETRY_GET_PID = 250;
+ const int WAIT_FOR_DEBUGGER_TO_ATTACH_MS = 1400;
+
+ ///
+ /// Starts the process debugging using the given execution configuration
+ ///
+ public async static Task StartWithDebuggingAsync(this IAndroidDevice device, ExecutionConfiguration configuration, CancellationToken token)
+ {
+ // TODO: refactor IAndroidDevice some more to remove casts
+ var androidDevice = (AndroidDevice)device;
+
+ await androidDevice.ExecuteAndLogCommandAsync(configuration.BeforeRunCommand, configuration.LogWiter, token).ConfigureAwait(false);
+
+ await device.SetDebugPropertiesAsync(configuration.PackageName, configuration.Debugger, token).ConfigureAwait(false);
+
+ // add --include-stopped-packages if it's not present on broadcast commands because otherwise we won't start anything anyway
+ if (configuration.RunCommand is AmBroadcastCommand) {
+ ((AmBroadcastCommand)configuration.RunCommand).Flags |= IntentFlag.IncludeStoppedPackages;
+ }
+
+ bool javaDebugging = false;
+ if (configuration.AllowJavaDebugging && configuration.RunCommand is AmStartCommand) {
+ var cmd = ((AmStartCommand)configuration.RunCommand);
+ if (androidDevice.IsWSA() || androidDevice.IsEmulator) // force -D for WSA and Emulators
+ cmd.EnableDebugging = true;
+ javaDebugging = cmd.EnableDebugging;
+ }
+
+ // if the startCommand is null it is because there is no activity to start, in which case
+ // we will return a completed task and the user will have to manually start up the process
+ if (configuration.RunCommand == null)
+ return;
+
+ if (configuration.LogWiter != null) {
+ configuration.LogWiter(configuration.RunCommand.ToString());
+ }
+
+ await androidDevice.ExecuteIntentCommandAsync(configuration.RunCommand, configuration.LogWiter, token).ConfigureAwait(false);
+ if (javaDebugging) {
+ try {
+ await androidDevice.ConnectJdwpAsync (configuration, token).ConfigureAwait(false);
+ } catch (Exception ex) {
+ if (configuration.LogWiter != null)
+ configuration.LogWiter ($"warning: Could not connect Jdwp. {ex}");
+ }
+ }
+ }
+
+ ///
+ /// Starts the process without debugging using the given execution configuration
+ ///
+ public async static Task StartWithoutDebuggingAsync(this IAndroidDevice device, ExecutionConfiguration configuration, CancellationToken token)
+ {
+ // TODO: refactor IAndroidDevice some more to remove casts
+ var androidDevice = (AndroidDevice)device;
+
+ await androidDevice.ExecuteAndLogCommandAsync(configuration.BeforeRunCommand, configuration.LogWiter, token).ConfigureAwait(false);
+
+ // reset the debug timeout in case the user tries to run after debugging within the 30 second time window
+ await androidDevice.SetProperty("debug.mono.extra", string.Empty, token).ConfigureAwait(false);
+
+ // clear the fast dev property file
+ await androidDevice.SetFastDevPropertyFile(configuration.PackageName, "debug.mono.extra", string.Empty, token).ConfigureAwait(false);
+ token.ThrowIfCancellationRequested();
+
+ // add --include-stopped-packages if it's not present on broadcast commands because otherwise we won't start anything anyway
+ if (configuration.RunCommand is AmBroadcastCommand)
+ {
+ ((AmBroadcastCommand)configuration.RunCommand).Flags |= IntentFlag.IncludeStoppedPackages;
+ }
+
+ if (configuration.LogWiter != null)
+ {
+ configuration.LogWiter(configuration.RunCommand.ToString());
+ }
+
+ await androidDevice.ExecuteIntentCommandAsync(configuration.RunCommand, configuration.LogWiter, token).ConfigureAwait(false);
+ }
+
+ ///
+ /// Returns a Task which sets up the debug property and sets the fast dev property for the given package
+ ///
+ public async static Task SetDebugPropertiesAsync(this IAndroidDevice device, string packageName, DebuggerOptions options, CancellationToken token)
+ {
+ if (string.IsNullOrEmpty(packageName))
+ throw new ArgumentException(nameof(packageName));
+
+ // TODO: refactor IAndroidDevice some more to remove casts
+ var androidDevice = (AndroidDevice)device;
+
+ const int loglevel = 0;
+
+ // Get the time the device thinks it is, and add options.Timeout seconds (defaults to 30)
+ long expire_date = (await androidDevice.GetDate(token).ConfigureAwait(false)) + (int)options.Timeout.TotalSeconds;
+
+ string endpoint = options.StdoutPort > -1
+ ? string.Format("{0}:{1}:{2}", options.Address, options.SdbPort, options.StdoutPort)
+ : string.Format("{0}:{1}", options.Address, options.SdbPort);
+
+ // Set property to tell the device to launch in debug mode
+ string debugArg = string.Format("debug={0},timeout={1},loglevel={2},server={3}", endpoint, expire_date, loglevel, options.Server ? "y" : "n");
+
+ await androidDevice.SetProperty("debug.mono.extra", debugArg, token).ConfigureAwait(false);
+
+ await androidDevice.SetFastDevPropertyFile(packageName, "debug.mono.extra", debugArg, token).ConfigureAwait(false);
+ }
+
+ ///
+ /// Executes the command and writes the result to the log writer
+ ///
+ public static Task ExecuteAndLogCommandAsync(this IAndroidDevice device, string command, Action logWriter, CancellationToken token)
+ {
+ // TODO: refactor IAndroidDevice some more to remove casts
+ var androidDevice = (AndroidDevice)device;
+ return ExecuteAndLogCommandAsync(androidDevice, command, logWriter, token);
+ }
+
+ ///
+ /// Executes the command and writes the result to the log writer
+ ///
+ public static async Task ExecuteAndLogCommandAsync(this AndroidDevice device, string command, Action logWriter, CancellationToken token)
+ {
+ if (!string.IsNullOrEmpty(command))
+ {
+ if (logWriter != null)
+ {
+ logWriter(command);
+ }
+
+ var cmdResult = await device.RunShellCommand(command, token).ConfigureAwait(false);
+ if (logWriter != null)
+ {
+ logWriter(cmdResult);
+ }
+ }
+ }
+
+ public static bool IsWSA(this AndroidDevice androidDevice)
+ {
+ if (androidDevice == null)
+ return false;
+
+ var vendor = androidDevice.Properties?.Get("ro.product.vendor.brand");
+ var model = androidDevice.Properties?.Get("ro.product.vendor.model");
+
+ return !string.IsNullOrEmpty (vendor) &&
+ !string.IsNullOrEmpty (model) &&
+ vendor.Equals ("Windows", StringComparison.InvariantCultureIgnoreCase) &&
+ model.Equals ("Subsystem for Android(TM)", StringComparison.InvariantCultureIgnoreCase);
+ }
+
+ public static async Task ConnectJdwpAsync(this AndroidDevice androidDevice, ExecutionConfiguration config, CancellationToken token)
+ {
+ if (config.RunCommand != null && config.RunCommand is AmStartCommand amStartCommand && amStartCommand.EnableDebugging)
+ {
+ var packageName = (config.RunCommand as AmStartCommand).PackageName;
+ var pid = await androidDevice.GetProcessIDAsync(packageName, 5, WAIT_BEFORE_RETRY_GET_PID, token);
+
+ if (pid <= 0)
+ {
+ throw new Exception("Process Not Found.");
+ }
+
+ var jdwpClient = new JdwpClient(config.Debugger.JdwpHostName, config.Debugger.JdwpPort);
+
+ await AdbServer.Default.ForwardPort(androidDevice, "tcp", jdwpClient.Port, "jdwp", pid, token);
+ try {
+ await jdwpClient.ConnectAsync (token);
+
+ // Keep the Connection for 1300 milliseconds, otherwise the Android OS ignores the connection!
+ // https://github.com/aosp-mirror/platform_frameworks_base/blob/6b28a227400749f4f8ad1f56799370e7c2cab149/core/java/android/os/Debug.java#L101C50-L101C54
+ await Task.Delay (WAIT_FOR_DEBUGGER_TO_ATTACH_MS);
+
+ await jdwpClient.DisconnectAsync ();
+ } finally {
+ await AdbServer.Default.KillForward (androidDevice, "tcp", jdwpClient.Port, token);
+ }
+ }
+ }
+ }
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/ExecutionConfiguration.cs b/src/Xamarin.AndroidTools/Debugging/ExecutionConfiguration.cs
new file mode 100644
index 00000000000..728a7b8ade5
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/ExecutionConfiguration.cs
@@ -0,0 +1,83 @@
+//
+// ExecutionConfiguration.cs
+//
+// Author:
+// Greg Munn
+//
+// Copyright (c) 2016 Xamarin Inc
+//
+
+using System;
+using Mono.AndroidTools;
+
+namespace Xamarin.AndroidTools.Debugging
+{
+ ///
+ /// Defines a configuration for running the application with the debugger
+ ///
+ public sealed class ExecutionConfiguration
+ {
+ public ExecutionConfiguration(string packageName, AmIntentCommand runCommand)
+ {
+ if (string.IsNullOrEmpty(packageName))
+ throw new ArgumentException(nameof(packageName));
+
+ this.PackageName = packageName;
+ this.RunCommand = runCommand;
+ this.Debugger = new DebuggerOptions();
+ }
+
+ public ExecutionConfiguration(string packageName, string runCommand)
+ {
+ if (string.IsNullOrEmpty(packageName))
+ throw new ArgumentException(nameof(packageName));
+
+ this.PackageName = packageName;
+ this.Debugger = new DebuggerOptions();
+
+ if (!string.IsNullOrEmpty(runCommand)) {
+ this.RunCommand = AmIntentCommandParser.Parse(runCommand, packageName);
+ }
+ }
+
+ ///
+ /// Gets the name of the package that is being debugged. This is needed to set FastDev property files for
+ /// devices that fail to the debug properties corectly
+ ///
+ public string PackageName { get; private set; }
+
+ ///
+ /// Gets the command that will be used to run the application
+ ///
+ public AmIntentCommand RunCommand { get; private set; }
+
+ ///
+ /// Gets the debugger options that will instruct the runtime how to connect to the debugger
+ ///
+ public DebuggerOptions Debugger { get; private set; }
+
+ ///
+ /// Gets or sets a value indicating whether Java debugging is allowed. Defaults to true, but will be available to be toggled off via -p:_AndroidAllowJavaDebugging=false.
+ ///
+ public bool AllowJavaDebugging { get; set; } = true;
+
+ ///
+ /// Gets or sets the adb command to execute prior to executing the RunCommand
+ ///
+ public string BeforeRunCommand { get; set; }
+
+ ///
+ /// Gets or sets the adb command to execute after the debugging session has ended
+ ///
+ public string AfterRunCommand { get; set; }
+
+ ///
+ /// Gets or sets an action to write a string to the application output log
+ ///
+ ///
+ /// We want to be able to output the results of the run / before run / after run commands to a log that is
+ /// visisble to the user. This property should provide a method to do so.
+ ///
+ public Action LogWiter { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.AndroidTools/Debugging/Java/CommandPacket.cs b/src/Xamarin.AndroidTools/Debugging/Java/CommandPacket.cs
new file mode 100644
index 00000000000..c5586a24e72
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/Java/CommandPacket.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Buffers.Binary;
+
+namespace Xamarin.AndroidTools.Debugging.Java
+{
+ internal class CommandPacket : Packet
+ {
+ // 0-63 sets of commands sent to target VM
+ // 64-127 sets of commands sent to debugger
+ // 128-256 vendor defined commands and extensions
+ public byte CommandSet { get; set; } = 0x0;
+
+ public byte Command { get; set; } = 0x0;
+
+ public override ReadOnlyMemory ToMemory()
+ {
+ const uint headerLength = 11;
+
+ var dataLength = Data.Length;
+
+ Memory headerSpan = new byte[headerLength + dataLength];
+
+ var l = headerLength + ((uint)Math.Max(0, dataLength));
+
+ // Length
+ BinaryPrimitives.WriteUInt32BigEndian(headerSpan.Slice(0).Span, l);
+
+ // Id
+ BinaryPrimitives.WriteInt32BigEndian(headerSpan.Slice(4).Span, Id);
+
+ // Flags
+ headerSpan.Span[8] = Flags;
+
+ // Command Set, Command
+ headerSpan.Span[9] = CommandSet;
+ headerSpan.Span[10] = Command;
+
+ // Data body if there is one
+ if (dataLength > 0)
+ Data.CopyTo(headerSpan.Slice(11));
+
+ return headerSpan;
+ }
+
+ }
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/Java/JdwpClient.cs b/src/Xamarin.AndroidTools/Debugging/Java/JdwpClient.cs
new file mode 100644
index 00000000000..5b57fa98146
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/Java/JdwpClient.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Buffers.Binary;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Mono.AndroidTools;
+
+namespace Xamarin.AndroidTools.Debugging.Java
+{
+ public class JdwpClient : IDisposable
+ {
+ const string handshake = "JDWP-Handshake";
+ const int packetSize = 11;
+ private bool disposed = false;
+
+ private TcpClient tcpClient;
+ private NetworkStream stream;
+
+ public string HostName { get; }
+
+ public int Port { get; }
+
+ public JdwpClient(string hostname = "127.0.0.1", int port = 8100)
+ {
+ HostName = hostname;
+ Port = port;
+ }
+
+ public async Task ConnectAsync(CancellationToken cancellationToken = default)
+ {
+ tcpClient = new TcpClient();
+
+ await tcpClient.ConnectAsync(HostName, Port);
+ stream = tcpClient.GetStream();
+
+ var data = Encoding.ASCII.GetBytes(handshake);
+
+ await stream.WriteAsync(data, 0, data.Length);
+
+ var buffer = new byte[handshake.Length];
+ var replyBuffer = new byte[packetSize];
+
+ // Read handshake response
+ var read = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken);
+
+ var str = Encoding.ASCII.GetString(buffer, 0, read);
+ if (str.Equals(handshake))
+ {
+ // Send version request command to kick things off
+ await SendAsync(new VersionCommandPacket(), cancellationToken);
+
+ var replies = await ReadReply (cancellationToken);
+ // Read the Result but we do not need to process it.
+ AndroidLogger.LogDebug ($"VersionCommandPacket:");
+ foreach (var reply in replies) {
+ str = Encoding.ASCII.GetString(reply.Data.ToArray (), 0, reply.Data.Length);
+ AndroidLogger.LogDebug ($"\t{str}");
+ }
+ }
+ else
+ {
+ throw new InvalidDataException($"Debugger response did not match expected value: '{handshake}'");
+ }
+ }
+
+ async Task> ReadReply(CancellationToken cancellationToken = default) where T : ReplyPacket, new()
+ {
+ List packets = new List ();
+ do
+ {
+ if (stream != null)
+ {
+ byte[] headerData = new byte[11];
+
+ // Read the header data or bust
+ var read = await stream.ReadAsync (headerData, 0, headerData.Length, cancellationToken);
+ if (read != headerData.Length) {
+ break;
+ }
+
+ // Get overall packet length from header
+ ReadOnlyMemory h = headerData;
+ var packetLength = BinaryPrimitives.ReadUInt32BigEndian(h.Slice (0, 4).Span);
+ // The remaining packet buffer is total packet length minus header length
+ byte[] packetData = new byte[packetLength - headerData.Length];
+
+ if (packetData.Length > 0) {
+ // Read the remainder of the packet into the second buffer
+ int datalen = packetData.Length;
+ while (datalen > 0) {
+ read = await stream.ReadAsync (packetData, 0, datalen, cancellationToken);
+ datalen -= read;
+ if (read == 0)
+ break;
+ }
+ if (datalen > 0) {
+ break;
+ }
+ }
+ var packet = new T ();
+ packet.FromMemory (headerData, packetData);
+ packets.Add (packet);
+ }
+ else
+ {
+ break;
+ }
+ } while (stream.DataAvailable);
+ return packets;
+ }
+
+ [Obsolete ("Use DisconnectAsync instead", error:true)]
+ public void Disconnect()
+ {
+ }
+
+ public Task DisconnectAsync()
+ {
+ if (stream != null)
+ {
+ try
+ {
+ stream.Dispose();
+ }
+ catch
+ {
+ // nothing to do
+ }
+ finally { stream = null; }
+ }
+
+ if (tcpClient != null)
+ {
+ try
+ {
+ tcpClient?.Close();
+ }
+ catch { }
+
+ try
+ {
+ tcpClient?.Dispose();
+ }
+ catch
+ {
+ // nothing to do
+ }
+ finally { tcpClient = null; }
+ }
+ return Task.CompletedTask;
+ }
+
+ async Task SendAsync(CommandPacket packet, CancellationToken cancellationToken = default)
+ {
+ if (stream != null)
+ {
+ var buffer = packet.ToMemory().ToArray();
+ await stream.WriteAsync(buffer, 0, buffer.Length, cancellationToken);
+ }
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if(!this.disposed)
+ {
+ if(disposing)
+ {
+ // Dispose managed resources.
+ DisconnectAsync().Wait ();
+ }
+
+ // Note disposing has been done.
+ disposed = true;
+ }
+ }
+ }
+
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/Java/Packet.cs b/src/Xamarin.AndroidTools/Debugging/Java/Packet.cs
new file mode 100644
index 00000000000..8cd5164ce2e
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/Java/Packet.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Buffers.Binary;
+
+namespace Xamarin.AndroidTools.Debugging.Java
+{
+ internal abstract class Packet
+ {
+ static int id = 100;
+
+ public int Id { get; set; } = id++;
+
+ public byte Flags { get; set; } = 0x00;
+
+ public ReadOnlyMemory Data { get; set; } = new byte[0];
+
+ public bool IsReply => (Flags & 0x80) == 0x80;
+
+ public abstract ReadOnlyMemory ToMemory();
+ }
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/Java/ReplyPacket.cs b/src/Xamarin.AndroidTools/Debugging/Java/ReplyPacket.cs
new file mode 100644
index 00000000000..1c899122337
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/Java/ReplyPacket.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Buffers.Binary;
+using System.Text;
+
+namespace Xamarin.AndroidTools.Debugging.Java
+{
+ internal class ReplyPacket : Packet
+ {
+ public ReplyPacket()
+ {
+ Flags &= 0x80;
+ }
+
+ public short ErrorCode { get; set; } = 0;
+
+ public override ReadOnlyMemory ToMemory()
+ {
+ const uint headerLength = 11;
+
+ var dataLength = Data.Length;
+
+ Memory headerSpan = new byte[headerLength + dataLength];
+
+ var l = headerLength + ((uint)Math.Max(0, dataLength));
+
+ // Length
+ BinaryPrimitives.WriteUInt32BigEndian(headerSpan.Slice(0).Span, l);
+
+ // Id
+ BinaryPrimitives.WriteInt32BigEndian(headerSpan.Slice(4).Span, Id);
+
+ // Flags
+ headerSpan.Span[8] = Flags;
+
+ // Error code
+ BinaryPrimitives.WriteInt16BigEndian(headerSpan.Slice(9, 2).Span, ErrorCode);
+
+ // Data body if there is one
+ if (dataLength > 0)
+ Data.Span.CopyTo(headerSpan.Slice(11, dataLength).Span);
+
+ return headerSpan;
+ }
+
+ public virtual void FromMemory(ReadOnlyMemory header, ReadOnlyMemory data)
+ {
+ Id = BinaryPrimitives.ReadInt32BigEndian(header.Slice(4, 4).Span);
+ Flags = header.Span[8];
+ ErrorCode = BinaryPrimitives.ReadInt16BigEndian(header.Slice(9, 2).Span);
+ Data = data;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.AndroidTools/Debugging/Java/VersionCommandPacket.cs b/src/Xamarin.AndroidTools/Debugging/Java/VersionCommandPacket.cs
new file mode 100644
index 00000000000..acd3e2fb8b6
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/Java/VersionCommandPacket.cs
@@ -0,0 +1,12 @@
+
+namespace Xamarin.AndroidTools.Debugging.Java
+{
+ internal class VersionCommandPacket : CommandPacket
+ {
+ public VersionCommandPacket()
+ {
+ CommandSet = 1;
+ Command = 1;
+ }
+ }
+}
diff --git a/src/Xamarin.AndroidTools/Debugging/MonoDroidProcessMonitor.cs b/src/Xamarin.AndroidTools/Debugging/MonoDroidProcessMonitor.cs
new file mode 100644
index 00000000000..a18cd104207
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Debugging/MonoDroidProcessMonitor.cs
@@ -0,0 +1,375 @@
+//
+// MonoDroidProcessMonitor.cs
+//
+// Author:
+// Greg Munn
+//
+// Copyright (c) 2015 Xamarin Inc
+//
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Mono.AndroidTools;
+
+namespace Xamarin.AndroidTools.Debugging
+{
+ ///
+ /// Monitors a running MonoDroid process during a debugging session
+ ///
+ /// something will launch the process,
+ /// this will monitor the device for the processes that match the given package name
+ /// once we find a process that matches we watch for that process to exit
+ ///
+ /// - onCompleted => end debugger session
+ ///
+ /// monitors logcat and outputs stdout and error messages
+ /// can optionally kill the process when disposed
+ ///
+ /// how to test?
+ /// - launch task
+ /// - get process task
+ /// - get logcat task
+ /// - kill process
+ /// - need to mock / augment device, maybe make the methods virtual on device
+ /// - or have an IDevice and we can pass a mock in instead
+ ///
+ ///
+ ///
+ public sealed class MonoDroidProcessMonitor : IDisposable
+ {
+ const int UNASSIGNED_PID = -1;
+ public static int RefreshPidInterval = 1000;
+
+ // Common system tags that we may want to ignore
+ readonly static string [] excludedLogTags = {
+ "dalvikvm",
+ "ActivityThread",
+ "mkestner",
+ "MonoDroid-Debugger"
+ };
+
+ readonly ManualResetEvent endHandle = new ManualResetEvent (false);
+ readonly object lockObj = new object ();
+ readonly CancellationTokenSource cancellationSource;
+ readonly IAndroidDevice device;
+ readonly string packageName;
+ readonly Action onStdOut;
+ readonly Action onStdError;
+ readonly Func killProcessOnExit;
+ readonly Action onCompleted;
+
+ ///
+ /// Func to return a task that will reset the debugger timeout, we use this to extend the debugger timeout to give the user
+ /// time to launch their app in the case where there is no launchable activity
+ ///
+ readonly Func resetTimeout;
+
+ Task getPidTask;
+ Task loggingTask;
+ volatile int pid = UNASSIGNED_PID;
+
+ public MonoDroidProcessMonitor (IAndroidDevice device, string packageName, Action stdout, Action stderr,
+ CancellationTokenSource cancellationSource, Func killProcessOnExit, Func resetTimeout, Action onCompleted)
+ {
+ if (device == null)
+ throw new ArgumentNullException ("device");
+ if (packageName == null)
+ throw new ArgumentNullException ("packageName");
+ if (stdout == null)
+ throw new ArgumentNullException ("stdout");
+ if (stderr == null)
+ throw new ArgumentNullException ("stderr");
+ if (cancellationSource == null)
+ throw new ArgumentNullException ("cancellationSource");
+
+ this.cancellationSource = cancellationSource;
+ this.device = device;
+ this.packageName = packageName;
+ this.onStdOut = stdout;
+ this.onStdError = stderr;
+ this.killProcessOnExit = killProcessOnExit;
+ this.resetTimeout = resetTimeout;
+ this.onCompleted = onCompleted;
+ }
+
+ public bool IsStarted { get; private set; }
+
+ public bool IsCompleted { get; private set; }
+
+ ///
+ /// Starts the monitoring process. If processLaunchTask is non-null, waits for the launch task to complete before monitoring
+ /// and completes the monitor if the launch failed
+ ///
+ public void Start (Task processLaunchTask = null)
+ {
+ if (this.IsStarted)
+ throw new InvalidOperationException ("Already Started");
+
+ this.IsStarted = true;
+ this.StartMonitoring (processLaunchTask);
+ }
+
+ public void Dispose ()
+ {
+ if (!cancellationSource.IsCancellationRequested)
+ cancellationSource.Cancel ();
+ cancellationSource.Dispose ();
+ }
+
+ public void Cancel ()
+ {
+ lock (lockObj) {
+ if (IsCompleted)
+ return;
+
+ // Make sure our tracking operations are finished first
+ cancellationSource.Cancel ();
+
+ // Try to kill the activity if we were able to actually get its pid
+ if (pid != UNASSIGNED_PID && killProcessOnExit != null) {
+ var killTask = killProcessOnExit (device, packageName);
+ killTask.ContinueWith (t => {
+ if (t.IsFaulted)
+ AndroidLogger.LogError ("Failed to kill application", t.Exception.Flatten ().InnerException);
+ });
+ }
+ }
+
+ SetCompleted ();
+ }
+
+ ///
+ /// Waits for the monitor to be completed, usually when the process has exited
+ ///
+ public void WaitForCompleted ()
+ {
+ lock (lockObj) {
+ if (IsCompleted)
+ return;
+ }
+
+ endHandle.WaitOne ();
+ }
+
+ ///
+ /// Waits for the monitor to be completed, usually when the process has exited
+ ///
+ public void WaitForCompleted (int timeout)
+ {
+ lock (lockObj) {
+ if (IsCompleted)
+ return;
+ }
+
+ endHandle.WaitOne (timeout);
+ }
+
+ ///
+ /// Starts the monitoring process. If processLaunchTask is null or completed, starts tracking the process on the device
+ ///
+ void StartMonitoring (Task processLaunchTask)
+ {
+ if (processLaunchTask == null) {
+ StartTrackingProcess ();
+ return;
+ }
+
+ processLaunchTask.ContinueWith (t => {
+ if (t.IsFaulted) {
+ var ex = t.Exception.Flatten ().InnerException;
+ onStdOut (string.Format ("\n Failed to launch app: {0}\n", ex.Message));
+ AndroidLogger.LogError ("Failed to launch app", ex);
+ SetCompleted ();
+ } else if (cancellationSource.IsCancellationRequested || t.IsCanceled) {
+ SetCompleted ();
+ } else {
+ StartTrackingProcess ();
+ }
+ }, cancellationSource.Token, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
+ }
+
+ ///
+ /// Starts tracking the process on the device. We determine the process to track by the package name.
+ ///
+ void StartTrackingProcess ()
+ {
+ if (cancellationSource.IsCancellationRequested)
+ return;
+
+ try {
+ getPidTask = device.GetProcessId (packageName, cancellationSource.Token);
+ if (getPidTask == null)
+ throw new InvalidOperationException ("device.GetProcessId returned null, cannot track process");
+ } catch (Exception ex) {
+ AndroidLogger.LogError ("Failure to get ProcessId task", ex);
+ SetCompleted ();
+ return;
+ }
+
+ getPidTask.ContinueWith (RefreshPid);
+ }
+
+ ///
+ /// Refreshs the pid of the process on the device, if the process has not yet started calls StartTrackingProcess again after a timeout.
+ ///
+ void RefreshPid (Task processIdTask)
+ {
+ if (cancellationSource.IsCancellationRequested)
+ return;
+
+ if (processIdTask.IsFaulted) {
+ AndroidLogger.LogError ("Failed to get PID", processIdTask.Exception.Flatten ().InnerException);
+ SetCompleted ();
+ return;
+ }
+ if (processIdTask.IsCanceled) {
+ return;
+ }
+
+ int resultPid = processIdTask.Result;
+ if (pid == UNASSIGNED_PID) {
+ // Ignore if the activity is still starting, and thus doesn't show up in 'ps'
+ if (resultPid > 0) {
+ pid = resultPid;
+ StartLogTracking (); // track log *after* getting the pid
+ }
+ } else {
+ if (resultPid == 0 || pid != resultPid) {
+ SetCompleted ();
+ return;
+ }
+ }
+
+ //carry on polling the PID, so we can detect when the app exits
+ StartTrackingAfterTimeout ();
+ }
+
+ static Task Delay(double milliseconds, CancellationToken token)
+ {
+ var tcs = new TaskCompletionSource();
+ System.Timers.Timer timer = new System.Timers.Timer();
+ timer.Elapsed+= (obj, args) => tcs.TrySetResult (true);
+ timer.Interval = milliseconds;
+ timer.AutoReset = false;
+ timer.Start();
+ return tcs.Task;
+ }
+
+ void StartTrackingAfterTimeout ()
+ {
+ if (cancellationSource.IsCancellationRequested)
+ return;
+
+ // TODO: use a Task.Delay once we can use .NET 4.5
+ var delay = Delay (RefreshPidInterval, cancellationSource.Token);
+ delay.ContinueWith ((d) => {
+ StartTrackingProcess ();
+
+ // if we are debugging an app that has no start up activity, like a watchface app, then
+ // periodically reset the debug timeout so that the user has time to start up the watchface
+ if (pid == UNASSIGNED_PID) {
+ ResetDebugerTimeout ();
+ }
+ });
+ }
+
+ ///
+ /// Starts monitoring logcat and outputs stdout and stderror
+ ///
+ void StartLogTracking ()
+ {
+ try {
+ loggingTask = device.GetLogCat (ProcessLogLine, cancellationSource.Token, excludedLogTags);
+ if (loggingTask == null)
+ throw new InvalidOperationException ("device.GetLogCat returned null, cannot monitor logcat");
+ } catch (Exception ex) {
+ AndroidLogger.LogError ("Failure to get LogCat task", ex);
+ SetCompleted ();
+ return;
+ }
+
+ loggingTask.ContinueWith (t => {
+ if (t.IsFaulted) {
+ AndroidLogger.LogError ("Logcat ended unexpectedly", t.Exception.Flatten ().InnerException);
+ SetCompleted ();
+ }
+ }, cancellationSource.Token, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
+ }
+
+ ///
+ /// Resets the debugger output, if the process has not started then bump the debugger timeout to give additional time for it to start
+ /// This is used when the user has to manually start up the process (eg. watchface apps)
+ ///
+ void ResetDebugerTimeout ()
+ {
+ if (cancellationSource.IsCancellationRequested)
+ return;
+
+ if (resetTimeout != null) {
+ var timeoutTask = resetTimeout ();
+ try {
+ timeoutTask.Wait (cancellationSource.Token);
+ }
+ catch (AggregateException ex) {
+ if (ex.InnerException is OperationCanceledException) {
+ // expected, nothing to do
+ } else
+ throw;
+ }
+ catch (OperationCanceledException) {
+ // expected, nothing to do
+ }
+ catch (Exception ex) {
+ AndroidLogger.LogError ("Failed to reset timeout for debugger", ex);
+ }
+ }
+ }
+
+ ///
+ /// Processes a line from logcat
+ ///
+ void ProcessLogLine (AndroidLogCatEntry entry)
+ {
+ // Disable the time check for now, as we need to use device-only dates
+ // We may implement a date retrieval later if needed
+ //if (pid != this.pid || time < startTime)
+ if (entry.Pid != this.pid)
+ return;
+
+ switch (entry.Tag) {
+ case "mono-stdout":
+ case "stdout":
+ onStdOut (entry.Message + "\n");
+ break;
+ case "mono-stderr":
+ case "stderr":
+ onStdError (entry.Message + "\n");
+ break;
+ default:
+ onStdOut (string.Format ("[{0}] {1}\n", entry.Tag, entry.Message));
+ break;
+ }
+ }
+
+ void SetCompleted ()
+ {
+ lock (lockObj) {
+ if (IsCompleted)
+ return;
+
+ endHandle.Set ();
+ IsCompleted = true;
+ }
+
+ try {
+ if (onCompleted != null)
+ onCompleted ();
+
+ cancellationSource.Cancel ();
+ } catch (Exception ex) {
+ AndroidLogger.LogError ("Unhandled error completing MonoDroidProcess", ex);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Xamarin.AndroidTools/Devices/AndroidDeviceExtensions.cs b/src/Xamarin.AndroidTools/Devices/AndroidDeviceExtensions.cs
new file mode 100644
index 00000000000..9a4118e3505
--- /dev/null
+++ b/src/Xamarin.AndroidTools/Devices/AndroidDeviceExtensions.cs
@@ -0,0 +1,825 @@
+
+// AndroidDeviceExtensions.cs
+//
+// Authors:
+// Jonathan Pobst
+//
+// Copyright 2011 Xamarin Inc. All rights reserved.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+using Mono.AndroidTools;
+using Mono.AndroidTools.Adb;
+using Xamarin.AndroidTools;
+using Xamarin.AndroidTools.Debugging;
+
+// These are methods for Mono.AndroidTools.AndroidDevice, but
+// are too MFA specific to go into Mono.AndroidTools.
+
+
+public static class AndroidDeviceExtensions
+{
+ [Obsolete ("Use the async overload")]
+ public static void EnsureProperties (this AndroidDevice device)
+ {
+ EnsureProperties (device, CancellationToken.None).Wait ();
+ }
+
+ public static Task EnsureProperties (this AndroidDevice device, CancellationToken cancellationToken)
+ {
+ if (device.Properties == null) {
+ return device.RefreshProperties (cancellationToken);
+ }
+ var tcs = new TaskCompletionSource