diff --git a/tests/SIL.LCModel.Tests/DomainServices/PhonologyServicesTest.cs b/tests/SIL.LCModel.Tests/DomainServices/PhonologyServicesTest.cs
index 78376e37..b27d6629 100644
--- a/tests/SIL.LCModel.Tests/DomainServices/PhonologyServicesTest.cs
+++ b/tests/SIL.LCModel.Tests/DomainServices/PhonologyServicesTest.cs
@@ -90,6 +90,17 @@ private void SetDefaultVernacularWritingSystem(LcmCache cache, CoreWritingSystem
m_cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem = vernWritingSystem);
}
+ private void TestProjects(string directory)
+ {
+ foreach (string subdir in Directory.GetDirectories(directory))
+ foreach (string file in Directory.GetFiles(subdir, "*.fwdata"))
+ {
+ CreateTestCache();
+ TestProject(subdir, file);
+ DestroyTestCache();
+ }
+ }
+
private void TestProject(string projectsDirectory, string dbFileName)
{
var projectId = new TestProjectId(BackendProviderType.kXML, dbFileName);
@@ -1223,5 +1234,15 @@ public void TestPhonologicalFeatures()
TestXml(xdoc, xdoc2);
}
}
+
+ private string PhonologyProjectsDirectory => Path.Combine(TestDirectoryFinder.RootDirectory, "tests", "SIL.LCModel.Tests", "DomainServices", "TestData", "PhonologyProjects");
+
+ [Test]
+ public void TestPhonologyProjects()
+ {
+ // You can test your personal projects with something like
+ // TestProjects("C:\\Users\\[MyAccount]\\FieldWorks\\DistFiles\\Projects")
+ TestProjects(PhonologyProjectsDirectory);
+ }
}
}
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/LexiconSettings.plsx b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/LexiconSettings.plsx
new file mode 100644
index 00000000..8923654e
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/LexiconSettings.plsx
@@ -0,0 +1,18 @@
+
+
+
+
+ Eng
+ English
+
+
+ Mal
+ Malay (macrolanguage)
+
+
+
+ Kim
+ Kimaragang
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/PC.ulsx b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/PC.ulsx
new file mode 100644
index 00000000..68321d63
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/SharedSettings/PC.ulsx
@@ -0,0 +1,17 @@
+
+
+
+
+ en-US_English
+ Charis SIL
+
+
+ en-US_English
+ Charis SIL
+
+
+ en-US_English
+ Charis SIL
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/en.ldml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/en.ldml
new file mode 100644
index 00000000..cf1cefca
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/en.ldml
@@ -0,0 +1,1336 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ left-to-right
+
+
+
+
+
+
+
+
+ [a-z]
+ [\u00E0-\u00EF\u00F1-\u00F4\u00F6\u00F8-\u00FC\u00FF\u0101\u0103\u0113\u0115\u012B\u012D\u014D\u014F\u0153\u016B\u016D]
+ [A-Z]
+ [!-#\&-*,-/\:;?@\[\]\u00A7\u2010\u2013\u2014\u2018\u2019\u201C\u201D\u2020\u2021\u2026\u2032\u2033]
+
+ [%+-.0-9\u2030]
+
+
+
+ standard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ â
+ â
+ â
+ â
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/idchangelog.xml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/idchangelog.xml
new file mode 100644
index 00000000..0b9c25ac
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/idchangelog.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ en
+
+
+ ms
+
+
+ kqr
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/kqr.ldml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/kqr.ldml
new file mode 100644
index 00000000..8293a718
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/kqr.ldml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+ ['\-\u00B2\u00B3\u00B9\u0F0B\u0F0C\u200C\u200D\u2070\u2074-\u2079\uA78B\uA78C]
+ []
+
+
+
+ left-to-right
+
+
+
+ standard
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/ms.ldml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/ms.ldml
new file mode 100644
index 00000000..594caf26
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/WritingSystemStore/ms.ldml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ left-to-right
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/project1.fwdata b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/project1.fwdata
new file mode 100644
index 00000000..489b9f37
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project1/project1.fwdata
@@ -0,0 +1,26897 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/LexiconSettings.plsx b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/LexiconSettings.plsx
new file mode 100644
index 00000000..85e27b34
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/LexiconSettings.plsx
@@ -0,0 +1,14 @@
+
+
+
+
+ Eng
+ English
+
+
+ Spa
+ Spanish
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/PC.ulsx b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/PC.ulsx
new file mode 100644
index 00000000..bf979458
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/SharedSettings/PC.ulsx
@@ -0,0 +1,13 @@
+
+
+
+
+ en-US_English
+ Charis SIL
+
+
+ en-US_English
+ Charis SIL
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/en.ldml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/en.ldml
new file mode 100644
index 00000000..e53a001f
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/en.ldml
@@ -0,0 +1,1336 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ left-to-right
+
+
+
+
+
+
+
+
+ [a-z]
+ [\u00E0-\u00EF\u00F1-\u00F4\u00F6\u00F8-\u00FC\u00FF\u0101\u0103\u0113\u0115\u012B\u012D\u014D\u014F\u0153\u016B\u016D]
+ [A-Z]
+ [!-#\&-*,-/\:;?@\[\]\u00A7\u2010\u2013\u2014\u2018\u2019\u201C\u201D\u2020\u2021\u2026\u2032\u2033]
+
+ [%+-.0-9\u2030]
+
+
+
+ standard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ â
+ â
+ â
+ â
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/es.ldml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/es.ldml
new file mode 100644
index 00000000..ffe53c55
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/es.ldml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ left-to-right
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/idchangelog.xml b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/idchangelog.xml
new file mode 100644
index 00000000..58681716
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/WritingSystemStore/idchangelog.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ en
+
+
+ es
+
+
+
\ No newline at end of file
diff --git a/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/project2.fwdata b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/project2.fwdata
new file mode 100644
index 00000000..4a3ce2c6
--- /dev/null
+++ b/tests/SIL.LCModel.Tests/DomainServices/TestData/PhonologyProjects/project2/project2.fwdata
@@ -0,0 +1,17536 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file