diff --git a/.gitignore b/.gitignore
index 018c1c0d2d..c004439946 100644
--- a/.gitignore
+++ b/.gitignore
@@ -155,6 +155,8 @@ Release/
/src/mod/applications/mod_osp/Makefile.in
/src/mod/applications/mod_rss/Makefile
/src/mod/applications/mod_snipe_hunt/Makefile
+/src/mod/applications/mod_test/test/Makefile
+/src/mod/applications/mod_test/test/Makefile.in
/src/mod/codecs/mod_com_g729/Makefile
/src/mod/codecs/mod_com_g729/Makefile.in
/src/mod/codecs/mod_dahdi_codec/Makefile
diff --git a/Freeswitch.2017.sln b/Freeswitch.2017.sln
index 725bb65def..be107fde3e 100644
--- a/Freeswitch.2017.sln
+++ b/Freeswitch.2017.sln
@@ -1,2789 +1,2858 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27130.2010
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Endpoints", "Endpoints", "{9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Applications", "Applications", "{E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dialplans", "Dialplans", "{C5F182F9-754A-4EC5-B50F-76ED02BE13F4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Event Handlers", "Event Handlers", "{9ADF1E48-2F5C-4ED7-A893-596259FABFE0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Formats", "Formats", "{A5A27244-AD24-46E5-B01B-840CD296C91D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{CBD81696-EFB4-4D2F-8451-1B8DAA86155A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Directories", "Directories", "{B8F5B47B-8568-46EB-B320-64C17D2A98BC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Languages", "Languages", "{0C808854-54D1-4230-BFF5-77B5FD905000}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASR-TTS", "ASR-TTS", "{4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loggers", "Loggers", "{A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XML Interfaces", "XML Interfaces", "{F69A4A6B-9360-4EBB-A280-22AA3C455AC5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Libraries", "_Libraries", "{EB910B0D-F27D-4B62-B67B-DE834C99AC5B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "say", "say", "{6CD61A1D-797C-470A-BE08-8C31B68BB336}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Config", "_Config", "{57D119DC-484F-420F-B9E9-8589FD9A8DF8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default", "Default", "{3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\freeswitch.xml = conf\vanilla\freeswitch.xml
- conf\vanilla\vars.xml = conf\vanilla\vars.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Build System", "_Build System", "{DB1024A8-41BF-4AD7-9AE6-13202230D1F3}"
- ProjectSection(SolutionItems) = preProject
- acsite.m4 = acsite.m4
- bootstrap.sh = bootstrap.sh
- build\buildlib.sh = build\buildlib.sh
- configure.in = configure.in
- Makefile.am = Makefile.am
- build\modmake.rules.in = build\modmake.rules.in
- build\modules.conf.in = build\modules.conf.in
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "m4", "m4", "{CDE9B06A-3C27-4987-8FAE-DF1006BC705D}"
- ProjectSection(SolutionItems) = preProject
- build\config\ac_cflags_gcc_option.m4 = build\config\ac_cflags_gcc_option.m4
- build\config\ac_cflags_sun_option.m4 = build\config\ac_cflags_sun_option.m4
- build\config\ac_gcc_archflag.m4 = build\config\ac_gcc_archflag.m4
- build\config\ac_gcc_x86_cpuid.m4 = build\config\ac_gcc_x86_cpuid.m4
- build\config\ac_prog_gzip.m4 = build\config\ac_prog_gzip.m4
- build\config\ac_prog_wget.m4 = build\config\ac_prog_wget.m4
- build\config\ax_cc_maxopt.m4 = build\config\ax_cc_maxopt.m4
- build\config\ax_cflags_warn_all_ansi.m4 = build\config\ax_cflags_warn_all_ansi.m4
- build\config\ax_check_compiler_flags.m4 = build\config\ax_check_compiler_flags.m4
- build\config\ax_compiler_vendor.m4 = build\config\ax_compiler_vendor.m4
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{3C90CCF0-2CDD-4A7A-ACFF-208C1E271692}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\autoload_configs\alsa.conf.xml = conf\vanilla\autoload_configs\alsa.conf.xml
- conf\vanilla\autoload_configs\conference.conf.xml = conf\vanilla\autoload_configs\conference.conf.xml
- conf\vanilla\autoload_configs\console.conf.xml = conf\vanilla\autoload_configs\console.conf.xml
- conf\vanilla\autoload_configs\dialplan_directory.conf.xml = conf\vanilla\autoload_configs\dialplan_directory.conf.xml
- conf\vanilla\autoload_configs\dingaling.conf.xml = conf\vanilla\autoload_configs\dingaling.conf.xml
- conf\vanilla\autoload_configs\enum.conf.xml = conf\vanilla\autoload_configs\enum.conf.xml
- conf\vanilla\autoload_configs\event_multicast.conf.xml = conf\vanilla\autoload_configs\event_multicast.conf.xml
- conf\vanilla\autoload_configs\event_socket.conf.xml = conf\vanilla\autoload_configs\event_socket.conf.xml
- conf\vanilla\autoload_configs\ivr.conf.xml = conf\vanilla\autoload_configs\ivr.conf.xml
- conf\vanilla\autoload_configs\java.conf.xml = conf\vanilla\autoload_configs\java.conf.xml
- conf\vanilla\autoload_configs\limit.conf.xml = conf\vanilla\autoload_configs\limit.conf.xml
- conf\vanilla\autoload_configs\local_stream.conf.xml = conf\vanilla\autoload_configs\local_stream.conf.xml
- conf\vanilla\autoload_configs\logfile.conf.xml = conf\vanilla\autoload_configs\logfile.conf.xml
- conf\vanilla\autoload_configs\modules.conf.xml = conf\vanilla\autoload_configs\modules.conf.xml
- conf\vanilla\autoload_configs\openmrcp.conf.xml = conf\vanilla\autoload_configs\openmrcp.conf.xml
- conf\vanilla\autoload_configs\portaudio.conf.xml = conf\vanilla\autoload_configs\portaudio.conf.xml
- conf\vanilla\autoload_configs\rss.conf.xml = conf\vanilla\autoload_configs\rss.conf.xml
- conf\vanilla\autoload_configs\sofia.conf.xml = conf\vanilla\autoload_configs\sofia.conf.xml
- conf\vanilla\autoload_configs\switch.conf.xml = conf\vanilla\autoload_configs\switch.conf.xml
- conf\vanilla\autoload_configs\syslog.conf.xml = conf\vanilla\autoload_configs\syslog.conf.xml
- conf\vanilla\autoload_configs\v8.conf.xml = conf\vanilla\autoload_configs\v8.conf.xml
- conf\vanilla\autoload_configs\voicemail.conf.xml = conf\vanilla\autoload_configs\voicemail.conf.xml
- conf\vanilla\autoload_configs\wanpipe.conf.xml = conf\vanilla\autoload_configs\wanpipe.conf.xml
- conf\vanilla\autoload_configs\woomera.conf.xml = conf\vanilla\autoload_configs\woomera.conf.xml
- conf\vanilla\autoload_configs\xml_cdr.conf.xml = conf\vanilla\autoload_configs\xml_cdr.conf.xml
- conf\vanilla\autoload_configs\xml_curl.conf.xml = conf\vanilla\autoload_configs\xml_curl.conf.xml
- conf\vanilla\autoload_configs\xml_rpc.conf.xml = conf\vanilla\autoload_configs\xml_rpc.conf.xml
- conf\vanilla\autoload_configs\zeroconf.conf.xml = conf\vanilla\autoload_configs\zeroconf.conf.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\dialplan\default.xml = conf\vanilla\dialplan\default.xml
- conf\vanilla\dialplan\public.xml = conf\vanilla\dialplan\public.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{FC71C66E-E268-4EAD-B1F5-F008DC382E83}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\sip_profiles\external.xml = conf\vanilla\sip_profiles\external.xml
- conf\vanilla\sip_profiles\internal.xml = conf\vanilla\sip_profiles\internal.xml
- conf\vanilla\sip_profiles\nat.xml = conf\vanilla\sip_profiles\nat.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{09455AA9-C243-4F16-A1A1-A016881A2765}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "en", "en", "{57199684-EC63-4A60-9DC6-11815AF6B413}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\en\en.xml = conf\vanilla\lang\en\en.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\de\de.xml = conf\vanilla\lang\de\de.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\fr\fr.xml = conf\vanilla\lang\fr\fr.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\de\demo\demo.xml = conf\vanilla\lang\de\demo\demo.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{CC3E7F48-2590-49CB-AD8B-BE3650F55462}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\de\vm\tts.xml = conf\vanilla\lang\de\vm\tts.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{765EF1B9-5027-4820-BC37-A44466A51631}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\en\demo\demo.xml = conf\vanilla\lang\en\demo\demo.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{713E4747-1126-40B1-BD84-58F9A7745423}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\en\vm\sounds.xml = conf\vanilla\lang\en\vm\sounds.xml
- conf\vanilla\lang\en\vm\tts.xml = conf\vanilla\lang\en\vm\tts.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\fr\demo\demo.xml = conf\vanilla\lang\fr\demo\demo.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}"
- ProjectSection(SolutionItems) = preProject
- conf\vanilla\lang\fr\vm\sounds.xml = conf\vanilla\lang\fr\vm\sounds.xml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sound Files", "Sound Files", "{4F227C26-768F-46A3-8684-1D08A46FB374}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unimrcp", "unimrcp", "{62F27B1A-C919-4A70-8478-51F178F3B18F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.2017.vcxproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2017.vcxproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g729", "src\mod\codecs\mod_g729\mod_g729.2017.vcxproj", "{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sndfile", "src\mod\formats\mod_sndfile\mod_sndfile.2017.vcxproj", "{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_PortAudio", "src\mod\endpoints\mod_portaudio\mod_PortAudio.2017.vcxproj", "{5FD31A25-5D83-4794-8BEE-904DAD84CE71}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "docs", "docs\docs.2017.vcxproj", "{1A1FF289-4FD6-4285-A422-D31DD67A4723}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_xml", "src\mod\dialplans\mod_dialplan_xml\mod_dialplan_xml.2017.vcxproj", "{07113B25-D3AF-4E04-BA77-4CD1171F022C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ldap", "src\mod\directories\mod_ldap\mod_ldap.2017.vcxproj", "{EC3E5C7F-EE09-47E2-80FE-546363D14A98}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_directory", "src\mod\dialplans\mod_dialplan_directory\mod_dialplan_directory.2017.vcxproj", "{A27CCA23-1541-4337-81A4-F0A6413078A0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_multicast", "src\mod\event_handlers\mod_event_multicast\mod_event_multicast.2017.vcxproj", "{784113EF-44D9-4949-835D-7065D3C7AD08}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libteletone", "libs\libteletone\libteletone.2017.vcxproj", "{89385C74-5860-4174-9CAF-A39E7C48909C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8", "src\mod\languages\mod_v8\mod_v8.2017.vcxproj", "{9B9D2551-D6BD-4F20-8BE5-DE30E154A064}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8_skel", "src\mod\languages\mod_v8\mod_v8_skel.2017.vcxproj", "{8B754330-A434-4791-97E5-1EE67060BAC0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cepstral", "src\mod\asr_tts\mod_cepstral\mod_cepstral.2017.vcxproj", "{692F6330-4D87-4C82-81DF-40DB5892636E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.2017.vcxproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.2017.vcxproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.2017.vcxproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_console", "src\mod\loggers\mod_console\mod_console.2017.vcxproj", "{1C453396-D912-4213-89FD-9B489162B7B5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_rpc", "src\mod\xml_int\mod_xml_rpc\mod_xml_rpc.2017.vcxproj", "{CBEC7225-0C21-4DA8-978E-1F158F8AD950}"
- ProjectSection(ProjectDependencies) = postProject
- {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rss", "src\mod\applications\mod_rss\mod_rss.2017.vcxproj", "{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_conference", "src\mod\applications\mod_conference\mod_conference.2017.vcxproj", "{C24FB505-05D7-4319-8485-7540B44C8603}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\applications\mod_dptools\mod_dptools.2017.vcxproj", "{B5881A85-FE70-4F64-8607-2CAAE52669C6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.2017.vcxproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.2017.vcxproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.2017.vcxproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2017.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2017.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.2017.vcxproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2017.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2017.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2017.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pthread", "libs\win32\pthread\pthread.2017.vcxproj", "{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g723_1", "src\mod\codecs\mod_g723_1\mod_g723_1.2017.vcxproj", "{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_iSAC", "src\mod\codecs\mod_isac\mod_iSAC.2017.vcxproj", "{7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_native_file", "src\mod\formats\mod_native_file\mod_native_file.2017.vcxproj", "{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2017.vcxproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2017.vcxproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_curl", "src\mod\xml_int\mod_xml_curl\mod_xml_curl.2017.vcxproj", "{AB91A099-7690-4ECF-8994-E458F4EA1ED4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_en", "src\mod\say\mod_say_en\mod_say_en.2017.vcxproj", "{988CACF7-3FCB-4992-BE69-77872AE67DC8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "libs\win32\portaudio\portaudio.2017.vcxproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.2017.vcxproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.2017.vcxproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h26x", "src\mod\codecs\mod_h26x\mod_h26x.2017.vcxproj", "{2C3C2423-234B-4772-8899-D3B137E5CA35}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_esf", "src\mod\applications\mod_esf\mod_esf.2017.vcxproj", "{3850D93A-5F24-4922-BC1C-74D08C37C256}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_local_stream", "src\mod\formats\mod_local_stream\mod_local_stream.2017.vcxproj", "{2CA40887-1622-46A1-A7F9-17FD7E7E545B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_voicemail", "src\mod\applications\mod_voicemail\mod_voicemail.2017.vcxproj", "{D7F1E3F2-A3F4-474C-8555-15122571AF52}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_de", "src\mod\say\mod_say_de\mod_say_de.2017.vcxproj", "{5BC072DB-3826-48EA-AF34-FE32AA01E83B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es", "src\mod\say\mod_say_es\mod_say_es.2017.vcxproj", "{FA429E98-8B03-45E6-A096-A4BC5E821DE4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fr", "src\mod\say\mod_say_fr\mod_say_fr.2017.vcxproj", "{06E3A538-AB32-44F2-B477-755FF9CB5D37}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_it", "src\mod\say\mod_say_it\mod_say_it.2017.vcxproj", "{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_nl", "src\mod\say\mod_say_nl\mod_say_nl.2017.vcxproj", "{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fifo", "src\mod\applications\mod_fifo\mod_fifo.2017.vcxproj", "{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_db", "src\mod\applications\mod_db\mod_db.2017.vcxproj", "{F6A33240-8F29-48BD-98F0-826995911799}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_expr", "src\mod\applications\mod_expr\mod_expr.2017.vcxproj", "{65A6273D-FCAB-4C55-B09E-65100141A5D4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_asterisk", "src\mod\dialplans\mod_dialplan_asterisk\mod_dialplan_asterisk.2017.vcxproj", "{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_logfile", "src\mod\loggers\mod_logfile\mod_logfile.2017.vcxproj", "{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_csv", "src\mod\event_handlers\mod_cdr_csv\mod_cdr_csv.2017.vcxproj", "{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_tone_stream", "src\mod\formats\mod_tone_stream\mod_tone_stream.2017.vcxproj", "{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fsv", "src\mod\applications\mod_fsv\mod_fsv.2017.vcxproj", "{E3246D17-E29B-4AB5-962A-C69B0C5837BB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lua", "src\mod\languages\mod_lua\mod_lua.2017.vcxproj", "{7B077E7F-1BE7-4291-AB86-55E527B25CAC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sphinxbase", "libs\win32\sphinxbase\sphinxbase.2017.vcxproj", "{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "libs\win32\pocketsphinx\pocketsphinx.2017.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_pocketsphinx", "src\mod\asr_tts\mod_pocketsphinx\mod_pocketsphinx.2017.vcxproj", "{2286DA73-9FC5-45BC-A508-85994C3317AB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz", "libs\win32\Sound_Files\8khz.2017.vcxproj", "{7A8D8174-B355-4114-AFC1-04777CB9DE0A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz", "libs\win32\Sound_Files\16khz.2017.vcxproj", "{7EB71250-F002-4ED8-92CA-CA218114537A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz", "libs\win32\Sound_Files\32khz.2017.vcxproj", "{464AAB78-5489-4916-BE51-BF8D61822311}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_flite", "src\mod\asr_tts\mod_flite\mod_flite.2017.vcxproj", "{66444AEE-554C-11DD-A9F0-8C5D56D89593}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp3lame", "libs\win32\libmp3lame\libmp3lame.2017.vcxproj", "{E316772F-5D8F-4F2A-8F71-094C3E859D34}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libshout", "libs\win32\libshout\libshout.2017.vcxproj", "{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shout", "src\mod\formats\mod_shout\mod_shout.2017.vcxproj", "{38FE0559-9910-43A8-9E45-3E5004C27692}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libs\win32\libogg\libogg.2017.vcxproj", "{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_snom", "src\mod\applications\mod_snom\mod_snom.2017.vcxproj", "{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_zh", "src\mod\say\mod_say_zh\mod_say_zh.2017.vcxproj", "{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_managed", "src\mod\languages\mod_managed\mod_managed.2017.vcxproj", "{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSWITCH.Managed.2017", "src\mod\languages\mod_managed\managed\FreeSWITCH.Managed.2017.csproj", "{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpg123", "libs\win32\mpg123\libmpg123.2017.vcxproj", "{419C8F80-D858-4B48-A25C-AF4007608137}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_loopback", "src\mod\endpoints\mod_loopback\mod_loopback.2017.vcxproj", "{B3F424EC-3D8F-417C-B244-3919D5E1A577}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_vmd", "src\mod\applications\mod_vmd\mod_vmd.2017.vcxproj", "{14E4A972-9CFB-436D-B0A5-4943F3F80D47}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg722_1", "libs\win32\libg722_1\libg722_1.2017.vcxproj", "{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_siren", "src\mod\codecs\mod_siren\mod_siren.2017.vcxproj", "{0B6C905B-142E-4999-B39D-92FF7951E921}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libesl", "libs\esl\src\libesl.2017.vcxproj", "{CF405366-9558-4AE8-90EF-5E21B51CCB4E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fs_cli", "libs\esl\fs_cli.2017.vcxproj", "{D2FB8043-D208-4AEE-8F18-3B5857C871B9}"
- ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_easyroute", "src\mod\applications\mod_easyroute\mod_easyroute.2017.vcxproj", "{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lcr", "src\mod\applications\mod_lcr\mod_lcr.2017.vcxproj", "{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtiff", "libs\spandsp\src\libtiff.2017.vcxproj", "{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libs\spandsp\src\libspandsp.2017.vcxproj", "{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libs\win32\speex\libspeex.2017.vcxproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libs\win32\speex\libspeexdsp.2017.vcxproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc", "libs\win32\ilbc\libilbc.2017.vcxproj", "{9A5DDF08-C88C-4A35-B7F6-D605228446BD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opal", "src\mod\endpoints\mod_opal\mod_opal.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-6338E2526666}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skinny", "src\mod\endpoints\mod_skinny\mod_skinny.2017.vcxproj", "{CC1DD008-9406-448D-A0AD-33C3186CFADB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtmp", "src\mod\endpoints\mod_rtmp\mod_rtmp.2017.vcxproj", "{48414740-C693-4968-9846-EE058020C64F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_at_dictionary", "libs\spandsp\src\msvc\make_at_dictionary.2017.vcxproj", "{DEE932AB-5911-4700-9EEB-8C7090A0A330}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_modem_filter", "libs\spandsp\src\msvc\make_modem_filter.2017.vcxproj", "{329A6FA0-0FCC-4435-A950-E670AEFA9838}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skel", "src\mod\applications\mod_skel\mod_skel.2017.vcxproj", "{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz music", "libs\win32\Sound_Files\8khzmusic.2017.vcxproj", "{D1ABE208-6442-4FB4-9AAD-1677E41BC870}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\Sound_Files\16khzmusic.2017.vcxproj", "{BA599D0A-4310-4505-91DA-6A6447B3E289}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2017.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2017.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2017.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_valet_parking", "src\mod\applications\mod_valet_parking\mod_valet_parking.2017.vcxproj", "{432DB165-1EB2-4781-A9C0-71E62610B20A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbroadvoice", "libs\win32\broadvoice\libbroadvoice.2017.vcxproj", "{CF70F278-3364-4395-A2E1-23501C9B8AD2}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_bv", "src\mod\codecs\mod_bv\mod_bv.2017.vcxproj", "{D5C87B19-150D-4EF3-A671-96589BD2D14A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aprtoolkit", "libs\unimrcp\libs\apr-toolkit\aprtoolkit.2017.vcxproj", "{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}"
- ProjectSection(ProjectDependencies) = postProject
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpf", "libs\unimrcp\libs\mpf\mpf.2017.vcxproj", "{B5A00BFA-6083-4FAE-A097-71642D6473B5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcp", "libs\unimrcp\libs\mrcp\mrcp.2017.vcxproj", "{1C320193-46A6-4B34-9C56-8AB584FC1B56}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpclient", "libs\unimrcp\libs\mrcp-client\mrcpclient.2017.vcxproj", "{72782932-37CC-46AE-8C7F-9A7B1A6EE108}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsignaling", "libs\unimrcp\libs\mrcp-signaling\mrcpsignaling.2017.vcxproj", "{12A49562-BAB9-43A3-A21D-15B60BBB4C31}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2transport", "libs\unimrcp\libs\mrcpv2-transport\mrcpv2transport.2017.vcxproj", "{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unirtsp", "libs\unimrcp\libs\uni-rtsp\unirtsp.2017.vcxproj", "{504B3154-7A4F-459D-9877-B951021C3F1F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\unimrcp\modules\mrcp-sofiasip\mrcpsofiasip.2017.vcxproj", "{746F3632-5BB2-4570-9453-31D6D58A7D8E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpunirtsp", "libs\unimrcp\modules\mrcp-unirtsp\mrcpunirtsp.2017.vcxproj", "{DEB01ACB-D65F-4A62-AED9-58C1054499E9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_unimrcp", "src\mod\asr_tts\mod_unimrcp\mod_unimrcp.2017.vcxproj", "{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "libs\win32\celt\libcelt.2017.vcxproj", "{ABB71A76-42B0-47A4-973A-42E3D920C6FD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FSComm", "fscomm\FSComm.2017.vcxproj", "{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_curl", "src\mod\applications\mod_curl\mod_curl.2017.vcxproj", "{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_silk", "src\mod\codecs\mod_silk\mod_silk.2017.vcxproj", "{AFA983D6-4569-4F88-BA94-555ED00FD9A8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\win32\libsilk\Silk_FIX.2017.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_avmd", "src\mod\applications\mod_avmd\mod_avmd.2017.vcxproj", "{990BAA76-89D3-4E38-8479-C7B28784EFC8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spandsp", "src\mod\applications\mod_spandsp\mod_spandsp.2017.vcxproj", "{1E21AFE0-6FDB-41D2-942D-863607C24B91}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_hash", "src\mod\applications\mod_hash\mod_hash.2017.vcxproj", "{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsofia_sip_ua_static", "libs\win32\sofia\libsofia_sip_ua_static.2017.vcxproj", "{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2017.vcxproj", "{B889A18E-70A7-44B5-B2C9-47798D4F43B3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h323", "src\mod\endpoints\mod_h323\mod_h323.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-7338E2514666}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_distributor", "src\mod\applications\mod_distributor\mod_distributor.2017.vcxproj", "{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pt", "src\mod\say\mod_say_pt\mod_say_pt.2017.vcxproj", "{7C22BDFF-CC09-400C-8A09-660733980028}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_sv", "src\mod\say\mod_say_sv\mod_say_sv.2017.vcxproj", "{8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2017.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_callcenter", "src\mod\applications\mod_callcenter\mod_callcenter.2017.vcxproj", "{47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_blacklist", "src\mod\applications\mod_blacklist\mod_blacklist.2017.vcxproj", "{50AAC2CE-BFC9-4912-87CC-C6381850D735}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spy", "src\mod\applications\mod_spy\mod_spy.2017.vcxproj", "{A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_httapi", "src\mod\applications\mod_httapi\mod_httapi.2017.vcxproj", "{4748FF56-CA85-4809-97D6-A94C0FAC1D77}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_abstraction", "src\mod\applications\mod_abstraction\mod_abstraction.2017.vcxproj", "{60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sms", "src\mod\applications\mod_sms\mod_sms.2017.vcxproj", "{2469B306-B027-4FF2-8815-C9C1EA2CAE79}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xmlrpc-c", "xmlrpc-c", "{9DE35039-A8F6-4FBF-B1B6-EB527F802411}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsmlib", "src\mod\endpoints\mod_gsmopen\gsmlib\gsmlib-1.10-patched-13ubuntu\win32\gsmlib.2017.vcxproj", "{26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endpoints\mod_gsmopen\mod_gsmopen.2017.vcxproj", "{74B120FF-6935-4DFE-A142-CDB6BEA99C90}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2017.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_redis", "src\mod\applications\mod_redis\mod_redis.2017.vcxproj", "{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libjpeg", "libs\win32\libjpeg\libjpeg.2017.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abyss", "libs\win32\xmlrpc-c\abyss.2017.vcxproj", "{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}"
- ProjectSection(ProjectDependencies) = postProject
- {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
- {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192}
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennmtab", "libs\win32\xmlrpc-c\gennmtab.2017.vcxproj", "{BED7539C-0099-4A14-AD5D-30828F15A171}"
- ProjectSection(ProjectDependencies) = postProject
- {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlparse", "libs\win32\xmlrpc-c\xmlparse.2017.vcxproj", "{0D108721-EAE8-4BAF-8102-D8960EC93647}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlrpc", "libs\win32\xmlrpc-c\xmlrpc.2017.vcxproj", "{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}"
- ProjectSection(ProjectDependencies) = postProject
- {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
- {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmltok", "libs\win32\xmlrpc-c\xmltok.2017.vcxproj", "{B535402E-38D2-4D54-8360-423ACBD17192}"
- ProjectSection(ProjectDependencies) = postProject
- {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171}
- EndProjectSection
-EndProject
-Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.2017", "w32\Setup\Setup.2017.wixproj", "{47213370-B933-487D-9F45-BCA26D7E2B6F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_math_fixed_tables", "libs\spandsp\src\msvc\make_math_fixed_tables.2017.vcxproj", "{2386B892-35F5-46CF-A0F0-10394D2FBF9B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt\libcbt.2017.vcxproj", "{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2017.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opus", "opus", "{ED2CA8B5-8E91-4296-A120-02BB0B674652}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "libs\win32\opus\opus.2017.vcxproj", "{FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.celt", "libs\win32\opus\opus.celt.2017.vcxproj", "{245603E3-F580-41A5-9632-B25FE3372CBF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_common", "libs\win32\opus\opus.silk_common.2017.vcxproj", "{C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_fixed", "libs\win32\opus\opus.silk_fixed.2017.vcxproj", "{8484C90D-1561-402F-A91D-2DB10F8C5171}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_float", "libs\win32\opus\opus.silk_float.2017.vcxproj", "{9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opus", "src\mod\codecs\mod_opus\mod_opus.2017.vcxproj", "{64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2017.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winFailToBan", "src\mod\languages\mod_managed\managed\examples\winFailToBan\winFailToBan.csproj", "{5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtc", "src\mod\endpoints\mod_rtc\mod_rtc.2017.vcxproj", "{3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_verto", "src\mod\endpoints\mod_verto\mod_verto.2017.vcxproj", "{5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyuv", "libs\win32\libyuv\libyuv.2017.vcxproj", "{B6E22500-3DB6-4E6E-8CD5-591B781D7D99}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvpx", "libs\win32\libvpx\libvpx.2017.vcxproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libs\win32\libpng\libpng.2017.vcxproj", "{D6973076-9317-4EF2-A0B8-B7A18AC0713E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype.2017", "libs\win32\freetype\freetype.2017.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_png", "src\mod\formats\mod_png\mod_png.2017.vcxproj", "{FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libav", "libs\win32\libav\libav.2017.vcxproj", "{841C345F-FCC7-4F64-8F54-0281CEABEB01}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_av", "src\mod\applications\mod_av\mod_av.2017.vcxproj", "{7AEE504B-23B6-4B05-829E-7CD34855F146}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libx264", "libs\win32\libx264\libx264.2017.vcxproj", "{20179127-853B-4FE9-B7C0-9E817E6A3A72}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_http_cache", "src\mod\applications\mod_http_cache\mod_http_cache.2017.vcxproj", "{87933C2D-0159-46F7-B326-E1B6E982C21E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcodec2", "libs\win32\libcodec2\libcodec2.2017.vcxproj", "{19E934D6-1484-41C8-9305-78DC42FD61F2}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_codec2", "src\mod\codecs\mod_codec2\mod_codec2.2017.vcxproj", "{CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amqp", "src\mod\event_handlers\mod_amqp\mod_amqp.2017.vcxproj", "{7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_pg_csv", "src\mod\event_handlers\mod_cdr_pg_csv\mod_cdr_pg_csv.2017.vcxproj", "{411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es_ar", "src\mod\say\mod_say_es_ar\mod_say_es_ar.2017.vcxproj", "{CEEE31E6-8A08-42C7-BEBD-5EC12072C136}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fa", "src\mod\say\mod_say_fa\mod_say_fa.2017.vcxproj", "{0E469F3A-DDD0-43BA-A94F-7D93C02219F3}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_he", "src\mod\say\mod_say_he\mod_say_he.2017.vcxproj", "{A3D7C6CF-AEB1-4159-B741-160EB4B37345}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hr", "src\mod\say\mod_say_hr\mod_say_hr.2017.vcxproj", "{DA7ADDF1-DA33-4194-83A5-B48DB714D35B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hu", "src\mod\say\mod_say_hu\mod_say_hu.2017.vcxproj", "{AF675478-995A-4115-90C4-B2B0D6470688}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ja", "src\mod\say\mod_say_ja\mod_say_ja.2017.vcxproj", "{07EA6E5A-D181-4ABB-BECF-67A906867D04}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pl", "src\mod\say\mod_say_pl\mod_say_pl.2017.vcxproj", "{20B15650-F910-4211-8729-AAB0F520C805}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_th", "src\mod\say\mod_say_th\mod_say_th.2017.vcxproj", "{C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_odbc_cdr", "src\mod\event_handlers\mod_odbc_cdr\mod_odbc_cdr.2017.vcxproj", "{096C9A84-55B2-4F9B-97E5-0FDF116FD25F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_sqlite", "src\mod\event_handlers\mod_cdr_sqlite\mod_cdr_sqlite.2017.vcxproj", "{2CA661A7-01DD-4532-BF88-B6629DFB544A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cv", "src\mod\applications\mod_cv\mod_cv.2017.vcxproj", "{40C4E2A2-B49B-496C-96D6-C04B890F7F88}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cidlookup", "src\mod\applications\mod_cidlookup\mod_cidlookup.2017.vcxproj", "{0A130A8B-3076-4619-BADF-9E86F621AEEC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_mongodb", "src\mod\event_handlers\mod_cdr_mongodb\mod_cdr_mongodb.2017.vcxproj", "{4DFF29B4-2976-447D-A8B3-43476451517C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ffmpeg", "libs\win32\ffmpeg\ffmpeg.2017.vcxproj", "{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- All|Win32 = All|Win32
- All|x64 = All|x64
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|Win32.ActiveCfg = Release|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.ActiveCfg = Release|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.Build.0 = Release|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.ActiveCfg = Debug|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.Build.0 = Debug|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.ActiveCfg = Release|x64
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.Build.0 = Release|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|Win32.ActiveCfg = Release|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.ActiveCfg = Release|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.Build.0 = Release|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.ActiveCfg = Debug|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.Build.0 = Debug|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.ActiveCfg = Release|x64
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.Build.0 = Release|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|Win32.ActiveCfg = Release Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.ActiveCfg = Release Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.Build.0 = Release Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.ActiveCfg = Debug Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.Build.0 = Debug Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.ActiveCfg = Release Passthrough|x64
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.Build.0 = Release Passthrough|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|Win32.ActiveCfg = Release|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.ActiveCfg = Release|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.Build.0 = Release|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.ActiveCfg = Debug|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.Build.0 = Debug|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.ActiveCfg = Release|x64
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.Build.0 = Release|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|Win32.ActiveCfg = Release|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.ActiveCfg = Release|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.Build.0 = Release|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.ActiveCfg = Debug|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.Build.0 = Debug|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.ActiveCfg = Release|x64
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.Build.0 = Release|x64
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|Win32.ActiveCfg = Release|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64.ActiveCfg = Release|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64.ActiveCfg = Debug|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64.ActiveCfg = Release|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|Win32.ActiveCfg = Release|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.ActiveCfg = Release|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.Build.0 = Release|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.ActiveCfg = Debug|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.Build.0 = Debug|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.ActiveCfg = Release|x64
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.Build.0 = Release|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|Win32.ActiveCfg = Release MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.ActiveCfg = Release MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.Build.0 = Release MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.ActiveCfg = Debug MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.Build.0 = Debug MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.ActiveCfg = Release MS-LDAP|x64
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.Build.0 = Release MS-LDAP|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|Win32.ActiveCfg = Release|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.ActiveCfg = Release|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.Build.0 = Release|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.ActiveCfg = Debug|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.Build.0 = Debug|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.ActiveCfg = Release|x64
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.Build.0 = Release|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.All|Win32.ActiveCfg = Release|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.ActiveCfg = Release|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.Build.0 = Release|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.ActiveCfg = Debug|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.Build.0 = Debug|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.ActiveCfg = Release|x64
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.Build.0 = Release|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.All|Win32.ActiveCfg = Release|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.ActiveCfg = Release|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.Build.0 = Release|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.ActiveCfg = Debug|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.Build.0 = Debug|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.ActiveCfg = Release|x64
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.Build.0 = Release|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|Win32.ActiveCfg = Release|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.ActiveCfg = Release|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.Build.0 = Release|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.ActiveCfg = Debug|Win32
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.Build.0 = Debug|Win32
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.ActiveCfg = Debug|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.Build.0 = Debug|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.ActiveCfg = Release|Win32
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.Build.0 = Release|Win32
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.ActiveCfg = Release|x64
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.Build.0 = Release|x64
- {8B754330-A434-4791-97E5-1EE67060BAC0}.All|Win32.ActiveCfg = Release|x64
- {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.ActiveCfg = Release|x64
- {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.Build.0 = Release|x64
- {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|Win32.ActiveCfg = Debug|Win32
- {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|x64.ActiveCfg = Debug|x64
- {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|Win32.ActiveCfg = Release|Win32
- {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|x64.ActiveCfg = Release|x64
- {692F6330-4D87-4C82-81DF-40DB5892636E}.All|Win32.ActiveCfg = Release|x64
- {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.ActiveCfg = Release|x64
- {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.Build.0 = Release|x64
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64.ActiveCfg = Debug|x64
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64.ActiveCfg = Release|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|Win32.ActiveCfg = Release|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.ActiveCfg = Release|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.Build.0 = Release|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.ActiveCfg = Debug|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.Build.0 = Debug|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.ActiveCfg = Debug|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.Build.0 = Debug|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.ActiveCfg = Release|x64
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.Build.0 = Release|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.All|Win32.ActiveCfg = Release|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.ActiveCfg = Release|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.Build.0 = Release|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.ActiveCfg = Debug|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.Build.0 = Debug|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.ActiveCfg = Release|x64
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.Build.0 = Release|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|Win32.ActiveCfg = Release|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.ActiveCfg = Release|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.Build.0 = Release|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.ActiveCfg = Debug|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.Build.0 = Debug|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.ActiveCfg = Release|x64
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.Build.0 = Release|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|Win32.ActiveCfg = Release|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.ActiveCfg = Release|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.Build.0 = Release|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.ActiveCfg = Debug|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.Build.0 = Debug|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.ActiveCfg = Release|x64
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.Build.0 = Release|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.All|Win32.ActiveCfg = Release|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.ActiveCfg = Release|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.Build.0 = Release|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.ActiveCfg = Debug|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.Build.0 = Debug|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.ActiveCfg = Release|x64
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.Build.0 = Release|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|Win32.ActiveCfg = Release|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.ActiveCfg = Release|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.Build.0 = Release|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.ActiveCfg = Debug|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.Build.0 = Debug|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.ActiveCfg = Release|x64
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.Build.0 = Release|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.All|Win32.ActiveCfg = Release|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.ActiveCfg = Release|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.Build.0 = Release|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.ActiveCfg = Debug|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.Build.0 = Debug|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.ActiveCfg = Debug|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.Build.0 = Debug|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.ActiveCfg = Release|x64
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.Build.0 = Release|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|Win32.ActiveCfg = Release DLL|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.ActiveCfg = Release DLL|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.Build.0 = Release DLL|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.ActiveCfg = Debug|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.Build.0 = Debug|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.ActiveCfg = Release|x64
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.Build.0 = Release|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|Win32.ActiveCfg = Release|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.ActiveCfg = Release|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.Build.0 = Release|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.ActiveCfg = Debug|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.Build.0 = Debug|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.ActiveCfg = Debug|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.Build.0 = Debug|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.ActiveCfg = Debug|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.Build.0 = Debug|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.ActiveCfg = Release|x64
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.Build.0 = Release|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|Win32.ActiveCfg = Release DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.ActiveCfg = Release DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.Build.0 = Release DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.ActiveCfg = Debug DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.Build.0 = Debug DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.ActiveCfg = Release DLL|x64
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.Build.0 = Release DLL|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|Win32.ActiveCfg = Release Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.ActiveCfg = Release Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.Build.0 = Release Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.ActiveCfg = Debug Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.Build.0 = Debug Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.ActiveCfg = Release Passthrough|x64
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.Build.0 = Release Passthrough|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|Win32.ActiveCfg = Release|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.ActiveCfg = Release|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.Build.0 = Release|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.ActiveCfg = Debug|Win32
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.Build.0 = Debug|Win32
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.ActiveCfg = Debug|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.Build.0 = Debug|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.ActiveCfg = Release|Win32
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.Build.0 = Release|Win32
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.ActiveCfg = Release|x64
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.Build.0 = Release|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|Win32.ActiveCfg = Release|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.ActiveCfg = Release|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.Build.0 = Release|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.ActiveCfg = Debug|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.Build.0 = Debug|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.ActiveCfg = Release|x64
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.Build.0 = Release|x64
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|Win32.ActiveCfg = Release|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.ActiveCfg = Release|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.Build.0 = Release|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.ActiveCfg = Debug|Win32
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.Build.0 = Debug|Win32
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.ActiveCfg = Debug|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.Build.0 = Debug|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.ActiveCfg = Release|Win32
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.Build.0 = Release|Win32
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.ActiveCfg = Release|x64
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.Build.0 = Release|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|Win32.ActiveCfg = Release|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.ActiveCfg = Release|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.Build.0 = Release|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.ActiveCfg = Debug|Win32
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.Build.0 = Debug|Win32
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.ActiveCfg = Debug|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.Build.0 = Debug|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.ActiveCfg = Release|Win32
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.Build.0 = Release|Win32
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.ActiveCfg = Release|x64
- {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.Build.0 = Release|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|Win32.ActiveCfg = Release DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.ActiveCfg = Release DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.Build.0 = Release DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug DirectSound|Win32
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug DirectSound|Win32
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release DirectSound|Win32
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release DirectSound|Win32
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release DirectSound|x64
- {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release DirectSound|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.ActiveCfg = Debug|Win32
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.Build.0 = Debug|Win32
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.ActiveCfg = Debug|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.Build.0 = Debug|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.ActiveCfg = Release|Win32
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.Build.0 = Release|Win32
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.ActiveCfg = Release|x64
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.Build.0 = Release|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|Win32.ActiveCfg = Release Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.ActiveCfg = Release Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.Build.0 = Release Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.Build.0 = Debug Passthrough|Win32
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.ActiveCfg = Debug Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.Build.0 = Debug Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.ActiveCfg = Release Passthrough|Win32
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.Build.0 = Release Passthrough|Win32
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.ActiveCfg = Release Passthrough|x64
- {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.Build.0 = Release Passthrough|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|Win32.ActiveCfg = Release|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.ActiveCfg = Release|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.Build.0 = Release|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.ActiveCfg = Debug|Win32
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.Build.0 = Debug|Win32
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.ActiveCfg = Debug|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.Build.0 = Debug|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.ActiveCfg = Release|Win32
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.Build.0 = Release|Win32
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.ActiveCfg = Release|x64
- {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.Build.0 = Release|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|Win32.ActiveCfg = Release|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.ActiveCfg = Release|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.Build.0 = Release|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.ActiveCfg = Debug|Win32
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.Build.0 = Debug|Win32
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.ActiveCfg = Debug|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.Build.0 = Debug|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|x64
- {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.Build.0 = Release|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|Win32.ActiveCfg = Release|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.ActiveCfg = Release|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.Build.0 = Release|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.Build.0 = Debug|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|x64
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.Build.0 = Release|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|Win32.ActiveCfg = Release|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.ActiveCfg = Release|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.Build.0 = Release|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.Build.0 = Debug|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|x64
- {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.Build.0 = Release|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|Win32.ActiveCfg = Release|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.ActiveCfg = Release|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.Build.0 = Release|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.ActiveCfg = Debug|Win32
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.Build.0 = Debug|Win32
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.ActiveCfg = Debug|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.Build.0 = Debug|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.ActiveCfg = Release|Win32
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.Build.0 = Release|Win32
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.ActiveCfg = Release|x64
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.Build.0 = Release|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|Win32.ActiveCfg = Release|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.ActiveCfg = Release|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.Build.0 = Release|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.ActiveCfg = Debug|Win32
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.Build.0 = Debug|Win32
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.ActiveCfg = Debug|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.Build.0 = Debug|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.ActiveCfg = Release|Win32
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.Build.0 = Release|Win32
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.ActiveCfg = Release|x64
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.Build.0 = Release|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|Win32.ActiveCfg = Release|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.ActiveCfg = Release|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.Build.0 = Release|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.ActiveCfg = Debug|Win32
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.Build.0 = Debug|Win32
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.ActiveCfg = Debug|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.Build.0 = Debug|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.ActiveCfg = Release|Win32
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.Build.0 = Release|Win32
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.ActiveCfg = Release|x64
- {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.Build.0 = Release|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|Win32.ActiveCfg = Release|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.ActiveCfg = Release|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.Build.0 = Release|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.ActiveCfg = Debug|Win32
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.Build.0 = Debug|Win32
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.ActiveCfg = Debug|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.Build.0 = Debug|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.ActiveCfg = Release|Win32
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.Build.0 = Release|Win32
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.ActiveCfg = Release|x64
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.Build.0 = Release|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|Win32.ActiveCfg = Release|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.ActiveCfg = Release|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.Build.0 = Release|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.ActiveCfg = Debug|Win32
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.Build.0 = Debug|Win32
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.ActiveCfg = Debug|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.Build.0 = Debug|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.ActiveCfg = Release|Win32
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.Build.0 = Release|Win32
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.ActiveCfg = Release|x64
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.Build.0 = Release|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|Win32.ActiveCfg = Release|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.ActiveCfg = Release|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.Build.0 = Release|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.ActiveCfg = Debug|Win32
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.Build.0 = Debug|Win32
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.ActiveCfg = Debug|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.Build.0 = Debug|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.ActiveCfg = Release|Win32
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.Build.0 = Release|Win32
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.ActiveCfg = Release|x64
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.Build.0 = Release|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.All|Win32.ActiveCfg = Release|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.ActiveCfg = Release|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.Build.0 = Release|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.ActiveCfg = Debug|Win32
- {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.Build.0 = Debug|Win32
- {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.ActiveCfg = Debug|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.Build.0 = Debug|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.ActiveCfg = Release|Win32
- {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.Build.0 = Release|Win32
- {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.ActiveCfg = Release|x64
- {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.Build.0 = Release|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|Win32.ActiveCfg = Release|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.ActiveCfg = Release|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.Build.0 = Release|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.ActiveCfg = Debug|Win32
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.Build.0 = Debug|Win32
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.ActiveCfg = Debug|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.Build.0 = Debug|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.ActiveCfg = Release|Win32
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.Build.0 = Release|Win32
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.ActiveCfg = Release|x64
- {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.Build.0 = Release|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|Win32.ActiveCfg = Release|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.ActiveCfg = Release|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.Build.0 = Release|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.ActiveCfg = Debug|Win32
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.Build.0 = Debug|Win32
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.ActiveCfg = Debug|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.Build.0 = Debug|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.ActiveCfg = Release|Win32
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.Build.0 = Release|Win32
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.ActiveCfg = Release|x64
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.Build.0 = Release|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|Win32.ActiveCfg = Release|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.ActiveCfg = Release|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.Build.0 = Release|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.ActiveCfg = Debug|Win32
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.Build.0 = Debug|Win32
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.ActiveCfg = Debug|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.Build.0 = Debug|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.ActiveCfg = Release|Win32
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.Build.0 = Release|Win32
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.ActiveCfg = Release|x64
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.Build.0 = Release|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|Win32.ActiveCfg = Release|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.ActiveCfg = Release|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.Build.0 = Release|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.ActiveCfg = Debug|Win32
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.Build.0 = Debug|Win32
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.ActiveCfg = Debug|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.Build.0 = Debug|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.ActiveCfg = Release|Win32
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.Build.0 = Release|Win32
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.ActiveCfg = Release|x64
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.Build.0 = Release|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|Win32.ActiveCfg = Release|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.ActiveCfg = Release|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.Build.0 = Release|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.ActiveCfg = Debug|Win32
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.Build.0 = Debug|Win32
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.ActiveCfg = Debug|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.Build.0 = Debug|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.ActiveCfg = Release|Win32
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.Build.0 = Release|Win32
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.ActiveCfg = Release|x64
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.Build.0 = Release|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|Win32.ActiveCfg = Release|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.ActiveCfg = Release|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.Build.0 = Release|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.ActiveCfg = Debug|Win32
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.Build.0 = Debug|Win32
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.ActiveCfg = Debug|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.Build.0 = Debug|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.ActiveCfg = Release|Win32
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.Build.0 = Release|Win32
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.ActiveCfg = Release|x64
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.Build.0 = Release|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|Win32.ActiveCfg = Release|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.ActiveCfg = Release|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.Build.0 = Release|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.Build.0 = Debug|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.ActiveCfg = Debug|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.Build.0 = Debug|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.Build.0 = Release|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.ActiveCfg = Release|x64
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.Build.0 = Release|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|Win32.ActiveCfg = Debug|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.ActiveCfg = Debug|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.Build.0 = Debug|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.ActiveCfg = Debug|Win32
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.Build.0 = Debug|Win32
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.ActiveCfg = Debug|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.Build.0 = Debug|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.ActiveCfg = Release|Win32
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.Build.0 = Release|Win32
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.ActiveCfg = Release|x64
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.Build.0 = Release|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.All|Win32.ActiveCfg = Debug|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.ActiveCfg = Debug|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.Build.0 = Debug|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32
- {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32
- {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32
- {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32
- {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64
- {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|Win32.ActiveCfg = Release|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.ActiveCfg = Release|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.Build.0 = Release|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.ActiveCfg = Debug|Win32
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.Build.0 = Debug|Win32
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.ActiveCfg = Debug|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.Build.0 = Debug|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.ActiveCfg = Release|Win32
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.Build.0 = Release|Win32
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.ActiveCfg = Release|x64
- {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.Build.0 = Release|x64
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.ActiveCfg = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.Build.0 = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.ActiveCfg = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64
- {7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.Build.0 = Debug|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64
- {464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.Build.0 = Debug|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64
- {464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.Build.0 = Release|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.ActiveCfg = Release|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.Build.0 = Release|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.ActiveCfg = Debug|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.Build.0 = Debug|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.ActiveCfg = Debug|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.Build.0 = Debug|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.ActiveCfg = Release|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.Build.0 = Release|Win32
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.ActiveCfg = Release|x64
- {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.Build.0 = Release|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|Win32.ActiveCfg = Debug|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.ActiveCfg = Debug|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.Build.0 = Debug|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.ActiveCfg = Debug|Win32
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.Build.0 = Debug|Win32
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.ActiveCfg = Debug|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.Build.0 = Debug|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.ActiveCfg = Release|Win32
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.Build.0 = Release|Win32
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.ActiveCfg = Release|x64
- {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.Build.0 = Release|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|Win32.ActiveCfg = Debug|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.ActiveCfg = Debug|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.Build.0 = Debug|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.ActiveCfg = Debug|Win32
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.Build.0 = Debug|Win32
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.ActiveCfg = Debug|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.Build.0 = Debug|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.ActiveCfg = Release|Win32
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.Build.0 = Release|Win32
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.ActiveCfg = Release|x64
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.Build.0 = Release|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.All|Win32.ActiveCfg = Release|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.ActiveCfg = Release|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.Build.0 = Release|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.ActiveCfg = Debug|Win32
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.Build.0 = Debug|Win32
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.ActiveCfg = Debug|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.Build.0 = Debug|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.ActiveCfg = Release|Win32
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.Build.0 = Release|Win32
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.ActiveCfg = Release|x64
- {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.Build.0 = Release|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|Win32.ActiveCfg = Debug|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.ActiveCfg = Debug|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.Build.0 = Debug|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.ActiveCfg = Debug|Win32
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.Build.0 = Debug|Win32
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.ActiveCfg = Debug|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.Build.0 = Debug|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.ActiveCfg = Release|Win32
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.Build.0 = Release|Win32
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.ActiveCfg = Release|x64
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.Build.0 = Release|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|Win32.ActiveCfg = Release|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.ActiveCfg = Release|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.Build.0 = Release|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.ActiveCfg = Debug|Win32
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.Build.0 = Debug|Win32
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.ActiveCfg = Debug|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.Build.0 = Debug|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.ActiveCfg = Release|Win32
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.Build.0 = Release|Win32
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.ActiveCfg = Release|x64
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.Build.0 = Release|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|Win32.ActiveCfg = Release|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.ActiveCfg = Release|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.Build.0 = Release|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.ActiveCfg = Debug|Win32
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.Build.0 = Debug|Win32
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.ActiveCfg = Debug|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.Build.0 = Debug|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.ActiveCfg = Release|Win32
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.Build.0 = Release|Win32
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.ActiveCfg = Release|x64
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.Build.0 = Release|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|Win32.ActiveCfg = Release_Mono|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.ActiveCfg = Release_Mono|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.Build.0 = Release_Mono|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.ActiveCfg = Debug_CLR|Win32
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.Build.0 = Debug_CLR|Win32
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.ActiveCfg = Debug_CLR|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.Build.0 = Debug_CLR|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.ActiveCfg = Release_CLR|Win32
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.Build.0 = Release_CLR|Win32
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.ActiveCfg = Release_CLR|x64
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.Build.0 = Release_CLR|x64
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|Win32.ActiveCfg = Release|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64.ActiveCfg = Release|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.Build.0 = Debug|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.ActiveCfg = Debug|x64
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.Build.0 = Debug|x64
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.ActiveCfg = Release|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.Build.0 = Release|Any CPU
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.ActiveCfg = Release|x64
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.Build.0 = Release|x64
- {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.ActiveCfg = Debug_Generic_Dll|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.Build.0 = Debug_Generic_Dll|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.ActiveCfg = Debug_Generic_Dll|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.ActiveCfg = Debug_Generic|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.Build.0 = Debug_Generic|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.ActiveCfg = Debug_Generic|x64
- {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.Build.0 = Debug_Generic|x64
- {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.ActiveCfg = Release_Generic|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.Build.0 = Release_Generic|Win32
- {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.ActiveCfg = Release_Generic|x64
- {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.Build.0 = Release_Generic|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|Win32.ActiveCfg = Release|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.ActiveCfg = Release|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.Build.0 = Release|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.ActiveCfg = Debug|Win32
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.Build.0 = Debug|Win32
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.ActiveCfg = Debug|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.Build.0 = Debug|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|x64
- {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.Build.0 = Release|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|Win32.ActiveCfg = Release|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.ActiveCfg = Release|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.Build.0 = Release|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.Build.0 = Debug|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|x64
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.Build.0 = Release|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|Win32.ActiveCfg = Release|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.ActiveCfg = Release|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.Build.0 = Release|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.ActiveCfg = Debug|Win32
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.Build.0 = Debug|Win32
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.ActiveCfg = Debug|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.Build.0 = Debug|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.ActiveCfg = Release|Win32
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.Build.0 = Release|Win32
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.ActiveCfg = Release|x64
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.Build.0 = Release|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.All|Win32.ActiveCfg = Release|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.ActiveCfg = Release|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.Build.0 = Release|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.ActiveCfg = Debug|Win32
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.Build.0 = Debug|Win32
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.ActiveCfg = Debug|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.Build.0 = Debug|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.ActiveCfg = Release|Win32
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.Build.0 = Release|Win32
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.ActiveCfg = Release|x64
- {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.Build.0 = Release|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|Win32.ActiveCfg = Release|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.ActiveCfg = Release|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.Build.0 = Release|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.ActiveCfg = Debug|Win32
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.Build.0 = Debug|Win32
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.ActiveCfg = Debug|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.Build.0 = Debug|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.ActiveCfg = Release|Win32
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.Build.0 = Release|Win32
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.ActiveCfg = Release|x64
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.Build.0 = Release|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|Win32.ActiveCfg = Release|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.ActiveCfg = Release|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.Build.0 = Release|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.ActiveCfg = Debug|Win32
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.Build.0 = Debug|Win32
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.ActiveCfg = Debug|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.Build.0 = Debug|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.ActiveCfg = Release|Win32
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.Build.0 = Release|Win32
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.ActiveCfg = Release|x64
- {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.Build.0 = Release|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|Win32.ActiveCfg = Release|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.ActiveCfg = Release|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.Build.0 = Release|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.ActiveCfg = Debug|Win32
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.Build.0 = Debug|Win32
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.ActiveCfg = Debug|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.Build.0 = Debug|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.ActiveCfg = Release|Win32
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.Build.0 = Release|Win32
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.ActiveCfg = Release|x64
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.Build.0 = Release|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|Win32.ActiveCfg = Release|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.ActiveCfg = Release|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.Build.0 = Release|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.Build.0 = Debug|Win32
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.ActiveCfg = Debug|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.Build.0 = Debug|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.ActiveCfg = Release|Win32
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.Build.0 = Release|Win32
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.ActiveCfg = Release|x64
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.Build.0 = Release|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.ActiveCfg = Release_Dynamic|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.Build.0 = Release_Dynamic|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.ActiveCfg = Release_Dynamic|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.Build.0 = Release_Dynamic|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.ActiveCfg = Debug|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.Build.0 = Debug|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.ActiveCfg = Release|x64
- {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.Build.0 = Release|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|Win32.ActiveCfg = Release_Static_SSE|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.ActiveCfg = Release_Static_SSE|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.Build.0 = Release_Static_SSE|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.Build.0 = Debug|Win32
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.ActiveCfg = Debug|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.Build.0 = Debug|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.Build.0 = Release|Win32
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.ActiveCfg = Release|x64
- {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.Build.0 = Release|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|Win32.ActiveCfg = Release|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.ActiveCfg = Release|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.Build.0 = Release|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.ActiveCfg = Debug|Win32
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.Build.0 = Debug|Win32
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.ActiveCfg = Debug|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.Build.0 = Debug|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.ActiveCfg = Release|Win32
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.Build.0 = Release|Win32
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.ActiveCfg = Release|x64
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.Build.0 = Release|x64
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.Build.0 = Release|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|Win32.ActiveCfg = Debug|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64.ActiveCfg = Debug|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|Win32.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64.ActiveCfg = Release|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|Win32.ActiveCfg = Release|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64.ActiveCfg = Release|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.ActiveCfg = Debug|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.Build.0 = Debug|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.ActiveCfg = Debug|x64
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.Build.0 = Debug|x64
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.ActiveCfg = Release|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.Build.0 = Release|Win32
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.ActiveCfg = Release|x64
- {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.Build.0 = Release|x64
- {48414740-C693-4968-9846-EE058020C64F}.All|Win32.ActiveCfg = Release|Win32
- {48414740-C693-4968-9846-EE058020C64F}.All|x64.ActiveCfg = Release|Win32
- {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.ActiveCfg = Debug|Win32
- {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.Build.0 = Debug|Win32
- {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.ActiveCfg = Debug|x64
- {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.Build.0 = Debug|x64
- {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.ActiveCfg = Release|Win32
- {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.Build.0 = Release|Win32
- {48414740-C693-4968-9846-EE058020C64F}.Release|x64.ActiveCfg = Release|x64
- {48414740-C693-4968-9846-EE058020C64F}.Release|x64.Build.0 = Release|x64
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.Build.0 = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.Build.0 = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32
- {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.Build.0 = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.Build.0 = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.Build.0 = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32
- {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.Build.0 = All|Win32
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|Win32.ActiveCfg = Release|x64
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.ActiveCfg = Release|x64
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.Build.0 = Release|x64
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|Win32.ActiveCfg = Debug|Win32
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64.ActiveCfg = Debug|x64
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|Win32.ActiveCfg = Release|Win32
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64.ActiveCfg = Release|x64
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.ActiveCfg = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.Build.0 = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.ActiveCfg = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.Build.0 = Debug|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.Build.0 = Debug|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.ActiveCfg = Debug|Win32
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.Build.0 = Debug|Win32
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.ActiveCfg = Debug|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.Build.0 = Debug|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.ActiveCfg = Release|Win32
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.Build.0 = Release|Win32
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.ActiveCfg = Release|x64
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.Build.0 = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.ActiveCfg = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.Build.0 = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.ActiveCfg = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.Build.0 = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.ActiveCfg = Debug|Win32
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.Build.0 = Debug|Win32
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.ActiveCfg = Debug|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.Build.0 = Debug|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.ActiveCfg = Release|Win32
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.Build.0 = Release|Win32
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.ActiveCfg = Release|x64
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.Build.0 = Release|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|Win32.ActiveCfg = Release|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64.ActiveCfg = Release|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.ActiveCfg = Debug|Win32
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.Build.0 = Debug|Win32
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.ActiveCfg = Debug|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.Build.0 = Debug|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.ActiveCfg = Release|Win32
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.Build.0 = Release|Win32
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.ActiveCfg = Release|x64
- {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.Build.0 = Release|x64
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.ActiveCfg = Release|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.Build.0 = Release|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64.ActiveCfg = Release|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.ActiveCfg = Debug|x64
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.Build.0 = Debug|x64
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.ActiveCfg = Release|x64
- {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.Build.0 = Release|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|Win32.ActiveCfg = Release|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.ActiveCfg = Release|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.Build.0 = Release|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.ActiveCfg = Debug|Win32
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.Build.0 = Debug|Win32
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.ActiveCfg = Debug|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.Build.0 = Debug|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.ActiveCfg = Release|Win32
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64
- {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64
- {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64
- {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64
- {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64
- {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64
- {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.ActiveCfg = Debug|Win32
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.Build.0 = Debug|Win32
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.ActiveCfg = Debug|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.Build.0 = Debug|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.ActiveCfg = Release|Win32
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.Build.0 = Release|Win32
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.ActiveCfg = Release|x64
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.Build.0 = Release|x64
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.ActiveCfg = Release|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.Build.0 = Release|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64.ActiveCfg = Release|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|Win32.ActiveCfg = Debug|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64.ActiveCfg = Debug|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|Win32.ActiveCfg = Release|Win32
- {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64.ActiveCfg = Release|Win32
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|Win32.ActiveCfg = Release|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.ActiveCfg = Release|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.Build.0 = Release|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.ActiveCfg = Debug|Win32
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.Build.0 = Debug|Win32
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.ActiveCfg = Debug|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.Build.0 = Debug|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.ActiveCfg = Release|Win32
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.Build.0 = Release|Win32
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.ActiveCfg = Release|x64
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.Build.0 = Release|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|Win32.ActiveCfg = Release|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.ActiveCfg = Release|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.Build.0 = Release|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.ActiveCfg = Debug|Win32
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.Build.0 = Debug|Win32
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.ActiveCfg = Debug|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.Build.0 = Debug|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.ActiveCfg = Release|Win32
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.Build.0 = Release|Win32
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.ActiveCfg = Release|x64
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.Build.0 = Release|x64
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.ActiveCfg = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.Build.0 = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64.ActiveCfg = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.ActiveCfg = Debug|x64
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.Build.0 = Debug|x64
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.ActiveCfg = Release|x64
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.Build.0 = Release|x64
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.ActiveCfg = Release|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.Build.0 = Release|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64.ActiveCfg = Release|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.ActiveCfg = Debug|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.Build.0 = Debug|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.ActiveCfg = Debug|x64
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.Build.0 = Debug|x64
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.ActiveCfg = Release|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.Build.0 = Release|Win32
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.ActiveCfg = Release|x64
- {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.Build.0 = Release|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|Win32.ActiveCfg = Release|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.ActiveCfg = Release|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.Build.0 = Release|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.ActiveCfg = Debug|Win32
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.Build.0 = Debug|Win32
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.ActiveCfg = Debug|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.Build.0 = Debug|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.ActiveCfg = Release|Win32
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.Build.0 = Release|Win32
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.ActiveCfg = Release|x64
- {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.Build.0 = Release|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|Win32.ActiveCfg = Release|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.ActiveCfg = Release|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.Build.0 = Release|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.ActiveCfg = Debug|Win32
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.Build.0 = Debug|Win32
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.ActiveCfg = Debug|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.Build.0 = Debug|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.ActiveCfg = Release|Win32
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.Build.0 = Release|Win32
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.ActiveCfg = Release|x64
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.Build.0 = Release|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|Win32.ActiveCfg = Release|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.ActiveCfg = Release|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.Build.0 = Release|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.ActiveCfg = Debug|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.Build.0 = Debug|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.ActiveCfg = Release|x64
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.Build.0 = Release|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|Win32.ActiveCfg = Release|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.ActiveCfg = Release|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.Build.0 = Release|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.ActiveCfg = Debug|Win32
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.Build.0 = Debug|Win32
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.Build.0 = Debug|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.Build.0 = Release|Win32
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|x64
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.Build.0 = Release|x64
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.Build.0 = Release|Win32
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|Win32.ActiveCfg = Debug|Win32
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64.ActiveCfg = Debug|x64
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|Win32.ActiveCfg = Release|Win32
- {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64.ActiveCfg = Release|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|Win32.ActiveCfg = Release|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.ActiveCfg = Release|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.Build.0 = Release|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.ActiveCfg = Debug|Win32
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.Build.0 = Debug|Win32
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.ActiveCfg = Debug|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.Build.0 = Debug|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.ActiveCfg = Release|Win32
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.Build.0 = Release|Win32
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.ActiveCfg = Release|x64
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.Build.0 = Release|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.All|Win32.ActiveCfg = Release|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.ActiveCfg = Release|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.Build.0 = Release|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.ActiveCfg = Debug|Win32
- {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.Build.0 = Debug|Win32
- {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.ActiveCfg = Debug|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.Build.0 = Debug|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.ActiveCfg = Release|Win32
- {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.Build.0 = Release|Win32
- {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.ActiveCfg = Release|x64
- {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.Build.0 = Release|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.ActiveCfg = Release|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.Build.0 = Release|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.ActiveCfg = Release|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.Build.0 = Release|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.ActiveCfg = Debug|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.Build.0 = Debug|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.ActiveCfg = Debug|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.Build.0 = Debug|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.ActiveCfg = Release|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.Build.0 = Release|Win32
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.ActiveCfg = Release|x64
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.Build.0 = Release|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64
- {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|Win32.ActiveCfg = Release|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.ActiveCfg = Release|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.Build.0 = Release|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.ActiveCfg = Debug|Win32
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.Build.0 = Debug|Win32
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.ActiveCfg = Debug|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.Build.0 = Debug|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.ActiveCfg = Release|Win32
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.Build.0 = Release|Win32
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.ActiveCfg = Release|x64
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.Build.0 = Release|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|Win32.ActiveCfg = Release|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.ActiveCfg = Release|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.Build.0 = Release|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.ActiveCfg = Debug|Win32
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.Build.0 = Debug|Win32
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.ActiveCfg = Debug|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.Build.0 = Debug|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.ActiveCfg = Release|Win32
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.Build.0 = Release|Win32
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.ActiveCfg = Release|x64
- {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.Build.0 = Release|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|Win32.ActiveCfg = Release|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.ActiveCfg = Release|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.Build.0 = Release|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.ActiveCfg = Debug|Win32
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.Build.0 = Debug|Win32
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.ActiveCfg = Debug|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.Build.0 = Debug|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.ActiveCfg = Release|Win32
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.Build.0 = Release|Win32
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.ActiveCfg = Release|x64
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.Build.0 = Release|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|Win32.ActiveCfg = Release|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.ActiveCfg = Release|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.Build.0 = Release|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.ActiveCfg = Debug|Win32
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.Build.0 = Debug|Win32
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.ActiveCfg = Debug|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.Build.0 = Debug|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.ActiveCfg = Release|Win32
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.Build.0 = Release|Win32
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.ActiveCfg = Release|x64
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.Build.0 = Release|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|Win32.ActiveCfg = Release|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.ActiveCfg = Release|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.Build.0 = Release|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.ActiveCfg = Debug|Win32
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.Build.0 = Debug|Win32
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.ActiveCfg = Debug|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.Build.0 = Debug|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.ActiveCfg = Release|Win32
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.Build.0 = Release|Win32
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.ActiveCfg = Release|x64
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.Build.0 = Release|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|Win32.ActiveCfg = Release|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.ActiveCfg = Release|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.Build.0 = Release|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.ActiveCfg = Debug|Win32
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.Build.0 = Debug|Win32
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.ActiveCfg = Debug|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.Build.0 = Debug|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.ActiveCfg = Release|Win32
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.Build.0 = Release|Win32
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.ActiveCfg = Release|x64
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.Build.0 = Release|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|Win32.ActiveCfg = Release|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.ActiveCfg = Release|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.Build.0 = Release|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.ActiveCfg = Debug|Win32
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.Build.0 = Debug|Win32
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.ActiveCfg = Debug|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.Build.0 = Debug|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.ActiveCfg = Release|Win32
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.Build.0 = Release|Win32
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.ActiveCfg = Release|x64
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.Build.0 = Release|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|Win32.ActiveCfg = Release|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.ActiveCfg = Release|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.Build.0 = Release|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.ActiveCfg = Debug|Win32
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.Build.0 = Debug|Win32
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.ActiveCfg = Debug|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.Build.0 = Debug|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.ActiveCfg = Release|Win32
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.Build.0 = Release|Win32
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.ActiveCfg = Release|x64
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.Build.0 = Release|x64
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.Build.0 = Release|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64
- {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|Win32.ActiveCfg = Release|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.ActiveCfg = Release|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.Build.0 = Release|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.ActiveCfg = Debug|Win32
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.Build.0 = Debug|Win32
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.ActiveCfg = Debug|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.Build.0 = Debug|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.ActiveCfg = Release|Win32
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.Build.0 = Release|Win32
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.ActiveCfg = Release|x64
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.Build.0 = Release|x64
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.ActiveCfg = Release|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.Build.0 = Release|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|x64.ActiveCfg = Release|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.ActiveCfg = Debug|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.Build.0 = Debug|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.ActiveCfg = Debug|x64
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.Build.0 = Debug|x64
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.ActiveCfg = Release|x64
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.Build.0 = Release|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|Win32.ActiveCfg = Release|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.ActiveCfg = Release|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.Build.0 = Release|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.ActiveCfg = Debug|Win32
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.Build.0 = Debug|Win32
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.ActiveCfg = Debug|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.Build.0 = Debug|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.ActiveCfg = Release|Win32
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.Build.0 = Release|Win32
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.ActiveCfg = Release|x64
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.Build.0 = Release|x64
- {BED7539C-0099-4A14-AD5D-30828F15A171}.All|Win32.ActiveCfg = Release|x64
- {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.ActiveCfg = Release|x64
- {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.Build.0 = Release|x64
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.ActiveCfg = Debug|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.Build.0 = Debug|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.ActiveCfg = Debug|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.Build.0 = Debug|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.ActiveCfg = Release|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.Build.0 = Release|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.ActiveCfg = Release|Win32
- {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.Build.0 = Release|Win32
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|Win32.ActiveCfg = Release|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.ActiveCfg = Release|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.Build.0 = Release|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.ActiveCfg = Debug|Win32
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.Build.0 = Debug|Win32
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.ActiveCfg = Debug|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.Build.0 = Debug|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.ActiveCfg = Release|Win32
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.Build.0 = Release|Win32
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.ActiveCfg = Release|x64
- {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.Build.0 = Release|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|Win32.ActiveCfg = Release|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.ActiveCfg = Release|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.Build.0 = Release|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.ActiveCfg = Debug|Win32
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.Build.0 = Debug|Win32
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.ActiveCfg = Debug|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.Build.0 = Debug|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.ActiveCfg = Release|Win32
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.Build.0 = Release|Win32
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.ActiveCfg = Release|x64
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.Build.0 = Release|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.All|Win32.ActiveCfg = Release|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.ActiveCfg = Release|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.Build.0 = Release|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.ActiveCfg = Debug|Win32
- {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.Build.0 = Debug|Win32
- {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.ActiveCfg = Debug|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.Build.0 = Debug|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.ActiveCfg = Release|Win32
- {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.Build.0 = Release|Win32
- {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.ActiveCfg = Release|x64
- {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.Build.0 = Release|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.ActiveCfg = Release|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.Build.0 = Release|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.ActiveCfg = Release|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.Build.0 = Release|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.ActiveCfg = Debug|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.Build.0 = Debug|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.ActiveCfg = Debug|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.Build.0 = Debug|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.ActiveCfg = Release|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.Build.0 = Release|x86
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.ActiveCfg = Release|x64
- {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.Build.0 = Release|x64
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.Build.0 = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|x64.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.Build.0 = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.Build.0 = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.Build.0 = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.ActiveCfg = All|Win32
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.Build.0 = All|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.ActiveCfg = Release|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.Build.0 = Release|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|x64.ActiveCfg = Release|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.ActiveCfg = Debug|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.Build.0 = Debug|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.ActiveCfg = Debug|x64
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.Build.0 = Debug|x64
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.ActiveCfg = Release|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.Build.0 = Release|Win32
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.ActiveCfg = Release|x64
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.Build.0 = Release|x64
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.Build.0 = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|x64.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.Build.0 = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.Build.0 = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.Build.0 = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.ActiveCfg = All|Win32
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.ActiveCfg = Release|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.Build.0 = Release|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.ActiveCfg = Release|x64
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.Build.0 = Release|x64
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.ActiveCfg = Debug|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.Build.0 = Debug|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.ActiveCfg = Debug|x64
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.Build.0 = Debug|x64
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.ActiveCfg = Release|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.Build.0 = Release|Win32
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.ActiveCfg = Release|x64
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.Build.0 = Release|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.ActiveCfg = Release|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.Build.0 = Release|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.ActiveCfg = Release|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.Build.0 = Release|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.ActiveCfg = Debug|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.Build.0 = Debug|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.ActiveCfg = Debug|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.Build.0 = Debug|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.ActiveCfg = Release|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.Build.0 = Release|Win32
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.ActiveCfg = Release|x64
- {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.Build.0 = Release|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.ActiveCfg = Release|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.Build.0 = Release|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.ActiveCfg = Release|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.Build.0 = Release|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.ActiveCfg = Debug|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.Build.0 = Debug|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.ActiveCfg = Debug|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.Build.0 = Debug|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.ActiveCfg = Release|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.Build.0 = Release|Win32
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.ActiveCfg = Release|x64
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.Build.0 = Release|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.ActiveCfg = Release|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.Build.0 = Release|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.ActiveCfg = Release|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.Build.0 = Release|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.ActiveCfg = Debug|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.Build.0 = Debug|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.ActiveCfg = Debug|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.Build.0 = Debug|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.ActiveCfg = Release|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.Build.0 = Release|Win32
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.ActiveCfg = Release|x64
- {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.Build.0 = Release|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.ActiveCfg = Release|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.Build.0 = Release|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.ActiveCfg = Release|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.Build.0 = Release|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.ActiveCfg = Debug|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.Build.0 = Debug|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.ActiveCfg = Debug|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.Build.0 = Debug|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.ActiveCfg = Release|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.Build.0 = Release|Win32
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.ActiveCfg = Release|x64
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.Build.0 = Release|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.ActiveCfg = Release|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.Build.0 = Release|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.ActiveCfg = Release|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.Build.0 = Release|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.ActiveCfg = Debug|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.Build.0 = Debug|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.ActiveCfg = Debug|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.Build.0 = Debug|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.ActiveCfg = Release|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.Build.0 = Release|Win32
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.ActiveCfg = Release|x64
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.Build.0 = Release|x64
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|Win32.ActiveCfg = Release|Any CPU
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|x64.ActiveCfg = Release|Any CPU
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|Win32.ActiveCfg = Release|Any CPU
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|x64.ActiveCfg = Release|Any CPU
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|Win32.ActiveCfg = Release|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.ActiveCfg = Release|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.Build.0 = Release|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.ActiveCfg = Debug|Win32
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.Build.0 = Debug|Win32
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.ActiveCfg = Debug|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.Build.0 = Debug|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.ActiveCfg = Release|Win32
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.Build.0 = Release|Win32
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.ActiveCfg = Release|x64
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.Build.0 = Release|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|Win32.ActiveCfg = Release|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.ActiveCfg = Release|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.Build.0 = Release|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.ActiveCfg = Debug|Win32
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.Build.0 = Debug|Win32
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.ActiveCfg = Debug|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.Build.0 = Debug|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.ActiveCfg = Release|Win32
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.Build.0 = Release|Win32
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.ActiveCfg = Release|x64
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.Build.0 = Release|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.ActiveCfg = Release|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.Build.0 = Release|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.ActiveCfg = Release|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.Build.0 = Release|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.ActiveCfg = Debug|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.Build.0 = Debug|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.ActiveCfg = Debug|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.Build.0 = Debug|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.ActiveCfg = Release|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.Build.0 = Release|Win32
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.ActiveCfg = Release|x64
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.Build.0 = Release|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.ActiveCfg = Release|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.Build.0 = Release|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.ActiveCfg = Release|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.Build.0 = Release|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.Build.0 = Debug|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.ActiveCfg = Debug|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.Build.0 = Debug|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.Build.0 = Release|Win32
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.ActiveCfg = Release|x64
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.Build.0 = Release|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.ActiveCfg = Release|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.Build.0 = Release|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.ActiveCfg = Release|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.Build.0 = Release|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.ActiveCfg = Debug|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.Build.0 = Debug|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.ActiveCfg = Debug|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.Build.0 = Debug|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.ActiveCfg = Release|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.Build.0 = Release|Win32
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.ActiveCfg = Release|x64
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.Build.0 = Release|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.ActiveCfg = Release|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.Build.0 = Release|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.ActiveCfg = Release|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.Build.0 = Release|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.ActiveCfg = Release|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.Build.0 = Release|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.ActiveCfg = Release|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.Build.0 = Release|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.ActiveCfg = Debug|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.Build.0 = Debug|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.ActiveCfg = Debug|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.Build.0 = Debug|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.ActiveCfg = Release|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.Build.0 = Release|Win32
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.ActiveCfg = Release|x64
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.Build.0 = Release|x64
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.ActiveCfg = Release|Win32
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.Build.0 = Release|Win32
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.ActiveCfg = Release|x64
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.Build.0 = Release|x64
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|Win32.ActiveCfg = Debug|Win32
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|x64.ActiveCfg = Debug|x64
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|Win32.ActiveCfg = Release|Win32
- {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|x64.ActiveCfg = Release|x64
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.ActiveCfg = Release|Win32
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.Build.0 = Release|Win32
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.ActiveCfg = Release|x64
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.Build.0 = Release|x64
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|Win32.ActiveCfg = Debug|Win32
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|x64.ActiveCfg = Debug|x64
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|Win32.ActiveCfg = Release|Win32
- {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|x64.ActiveCfg = Release|x64
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.ActiveCfg = Release|Win32
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.Build.0 = Release|Win32
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.ActiveCfg = Release|x64
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.Build.0 = Release|x64
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|Win32.ActiveCfg = Debug|Win32
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|x64.ActiveCfg = Debug|x64
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|Win32.ActiveCfg = Release|Win32
- {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|x64.ActiveCfg = Release|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.ActiveCfg = Release|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.Build.0 = Release|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.ActiveCfg = Release|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.Build.0 = Release|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.ActiveCfg = Debug|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.Build.0 = Debug|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.ActiveCfg = Debug|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.Build.0 = Debug|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.ActiveCfg = Release|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.Build.0 = Release|Win32
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.ActiveCfg = Release|x64
- {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.Build.0 = Release|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.ActiveCfg = Release|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.Build.0 = Release|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.ActiveCfg = Release|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.Build.0 = Release|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.ActiveCfg = Debug|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.Build.0 = Debug|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.ActiveCfg = Debug|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.Build.0 = Debug|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.ActiveCfg = Release|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.Build.0 = Release|Win32
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.ActiveCfg = Release|x64
- {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.Build.0 = Release|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.ActiveCfg = Release|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.Build.0 = Release|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.ActiveCfg = Release|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.Build.0 = Release|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.ActiveCfg = Debug|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.Build.0 = Debug|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.ActiveCfg = Debug|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.Build.0 = Debug|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.ActiveCfg = Release|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.Build.0 = Release|Win32
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.ActiveCfg = Release|x64
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.Build.0 = Release|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.ActiveCfg = Release|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.Build.0 = Release|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.ActiveCfg = Release|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.Build.0 = Release|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.ActiveCfg = Debug|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.Build.0 = Debug|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.ActiveCfg = Debug|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.Build.0 = Debug|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.ActiveCfg = Release|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.Build.0 = Release|Win32
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.ActiveCfg = Release|x64
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.Build.0 = Release|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.ActiveCfg = Release|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.Build.0 = Release|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.ActiveCfg = Release|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.Build.0 = Release|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.ActiveCfg = Debug|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.Build.0 = Debug|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.ActiveCfg = Debug|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.Build.0 = Debug|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.ActiveCfg = Release|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.Build.0 = Release|Win32
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.ActiveCfg = Release|x64
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.Build.0 = Release|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.ActiveCfg = Release|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.Build.0 = Release|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.ActiveCfg = Release|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.Build.0 = Release|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.ActiveCfg = Debug|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.Build.0 = Debug|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.ActiveCfg = Debug|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.Build.0 = Debug|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.ActiveCfg = Release|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.Build.0 = Release|Win32
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.ActiveCfg = Release|x64
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.Build.0 = Release|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.ActiveCfg = Release|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.Build.0 = Release|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.ActiveCfg = Release|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.Build.0 = Release|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.ActiveCfg = Debug|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.Build.0 = Debug|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.ActiveCfg = Debug|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.Build.0 = Debug|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.ActiveCfg = Release|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.Build.0 = Release|Win32
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.ActiveCfg = Release|x64
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.Build.0 = Release|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.ActiveCfg = Release|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.Build.0 = Release|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.ActiveCfg = Release|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.Build.0 = Release|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.ActiveCfg = Debug|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.Build.0 = Debug|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.ActiveCfg = Debug|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.Build.0 = Debug|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.ActiveCfg = Release|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.Build.0 = Release|Win32
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.ActiveCfg = Release|x64
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.Build.0 = Release|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.ActiveCfg = Release|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.Build.0 = Release|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.ActiveCfg = Release|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.Build.0 = Release|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.ActiveCfg = Debug|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.Build.0 = Debug|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.ActiveCfg = Debug|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.Build.0 = Debug|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.ActiveCfg = Release|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.Build.0 = Release|Win32
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.ActiveCfg = Release|x64
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.Build.0 = Release|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.ActiveCfg = Release|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.Build.0 = Release|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.ActiveCfg = Release|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.Build.0 = Release|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.ActiveCfg = Debug|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.Build.0 = Debug|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.ActiveCfg = Debug|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.Build.0 = Debug|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.ActiveCfg = Release|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.Build.0 = Release|Win32
- {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.ActiveCfg = Release|x64
- {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.Build.0 = Release|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.ActiveCfg = Release|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.Build.0 = Release|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.ActiveCfg = Release|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.Build.0 = Release|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.ActiveCfg = Debug|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.Build.0 = Debug|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.ActiveCfg = Debug|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.Build.0 = Debug|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.ActiveCfg = Release|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.Build.0 = Release|Win32
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.ActiveCfg = Release|x64
- {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.Build.0 = Release|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.ActiveCfg = Release|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.Build.0 = Release|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.ActiveCfg = Release|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.Build.0 = Release|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.ActiveCfg = Debug|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.Build.0 = Debug|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.ActiveCfg = Debug|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.Build.0 = Debug|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.ActiveCfg = Release|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.Build.0 = Release|Win32
- {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.ActiveCfg = Release|x64
- {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.Build.0 = Release|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.ActiveCfg = Release|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.Build.0 = Release|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.ActiveCfg = Release|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.Build.0 = Release|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.ActiveCfg = Debug|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.Build.0 = Debug|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.ActiveCfg = Debug|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.Build.0 = Debug|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.ActiveCfg = Release|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.Build.0 = Release|Win32
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.ActiveCfg = Release|x64
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.Build.0 = Release|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.ActiveCfg = Release|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.Build.0 = Release|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.ActiveCfg = Release|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.Build.0 = Release|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.ActiveCfg = Debug|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.Build.0 = Debug|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.ActiveCfg = Debug|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.Build.0 = Debug|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.ActiveCfg = Release|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.Build.0 = Release|Win32
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.ActiveCfg = Release|x64
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.Build.0 = Release|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.ActiveCfg = Release|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.Build.0 = Release|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.ActiveCfg = Release|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.Build.0 = Release|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.ActiveCfg = Debug|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.Build.0 = Debug|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.ActiveCfg = Debug|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.Build.0 = Debug|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.ActiveCfg = Release|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.Build.0 = Release|Win32
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.ActiveCfg = Release|x64
- {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.Build.0 = Release|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.ActiveCfg = Release|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.Build.0 = Release|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.ActiveCfg = Release|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.Build.0 = Release|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.ActiveCfg = Debug|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.Build.0 = Debug|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.ActiveCfg = Debug|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.Build.0 = Debug|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.ActiveCfg = Release|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.Build.0 = Release|Win32
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.ActiveCfg = Release|x64
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.Build.0 = Release|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.ActiveCfg = Release|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.Build.0 = Release|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.ActiveCfg = Release|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.Build.0 = Release|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.ActiveCfg = Debug|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.Build.0 = Debug|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.ActiveCfg = Debug|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.Build.0 = Debug|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.ActiveCfg = Release|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.Build.0 = Release|Win32
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.ActiveCfg = Release|x64
- {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.Build.0 = Release|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.ActiveCfg = Release|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.Build.0 = Release|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.ActiveCfg = Release|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.Build.0 = Release|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.ActiveCfg = Debug|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.Build.0 = Debug|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.ActiveCfg = Debug|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.Build.0 = Debug|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.ActiveCfg = Release|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.Build.0 = Release|Win32
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.ActiveCfg = Release|x64
- {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.Build.0 = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.ActiveCfg = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.Build.0 = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.ActiveCfg = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.Build.0 = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|Win32.ActiveCfg = Debug|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|x64.ActiveCfg = Debug|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|Win32.ActiveCfg = Release|x64
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|x64.ActiveCfg = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} = {57D119DC-484F-420F-B9E9-8589FD9A8DF8}
- {CDE9B06A-3C27-4987-8FAE-DF1006BC705D} = {DB1024A8-41BF-4AD7-9AE6-13202230D1F3}
- {3C90CCF0-2CDD-4A7A-ACFF-208C1E271692} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
- {C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
- {FC71C66E-E268-4EAD-B1F5-F008DC382E83} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
- {8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
- {09455AA9-C243-4F16-A1A1-A016881A2765} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
- {57199684-EC63-4A60-9DC6-11815AF6B413} = {09455AA9-C243-4F16-A1A1-A016881A2765}
- {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} = {09455AA9-C243-4F16-A1A1-A016881A2765}
- {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} = {09455AA9-C243-4F16-A1A1-A016881A2765}
- {D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}
- {CC3E7F48-2590-49CB-AD8B-BE3650F55462} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}
- {765EF1B9-5027-4820-BC37-A44466A51631} = {57199684-EC63-4A60-9DC6-11815AF6B413}
- {713E4747-1126-40B1-BD84-58F9A7745423} = {57199684-EC63-4A60-9DC6-11815AF6B413}
- {F1B71990-EB04-4EB5-B28A-BC3EB6F7E843} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
- {3DAF028C-AB5B-4183-A01B-DCC43F5A87F0} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
- {62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A}
- {07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
- {A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
- {784113EF-44D9-4949-835D-7065D3C7AD08} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {89385C74-5860-4174-9CAF-A39E7C48909C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {9B9D2551-D6BD-4F20-8BE5-DE30E154A064} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {8B754330-A434-4791-97E5-1EE67060BAC0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {692F6330-4D87-4C82-81DF-40DB5892636E} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
- {D3EC0AFF-76FC-4210-A825-9A17410660A3} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {1C453396-D912-4213-89FD-9B489162B7B5} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {C24FB505-05D7-4319-8485-7540B44C8603} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {05515420-16DE-4E63-BE73-85BE85BA5142} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {1906D736-08BD-4EE1-924F-B536249B9A54} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {71A967D5-0E99-4CEF-A587-98836EE6F2EF} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {AB91A099-7690-4ECF-8994-E458F4EA1ED4} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
- {988CACF7-3FCB-4992-BE69-77872AE67DC8} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
- {8DEB383C-4091-4F42-A56F-C9E46D552D79} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {2C3C2423-234B-4772-8899-D3B137E5CA35} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {3850D93A-5F24-4922-BC1C-74D08C37C256} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {D7F1E3F2-A3F4-474C-8555-15122571AF52} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {5BC072DB-3826-48EA-AF34-FE32AA01E83B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {FA429E98-8B03-45E6-A096-A4BC5E821DE4} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {06E3A538-AB32-44F2-B477-755FF9CB5D37} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {A4B122CF-5196-476B-8C0E-D8BD59AC3C14} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {F6A33240-8F29-48BD-98F0-826995911799} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {65A6273D-FCAB-4C55-B09E-65100141A5D4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
- {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}
- {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {E3246D17-E29B-4AB5-962A-C69B0C5837BB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {94001A0E-A837-445C-8004-F918F10D0226} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {2286DA73-9FC5-45BC-A508-85994C3317AB} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {7EB71250-F002-4ED8-92CA-CA218114537A} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {464AAB78-5489-4916-BE51-BF8D61822311} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {66444AEE-554C-11DD-A9F0-8C5D56D89593} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
- {E316772F-5D8F-4F2A-8F71-094C3E859D34} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {D3D8B329-20BE-475E-9E83-653CEA0E0EF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {419C8F80-D858-4B48-A25C-AF4007608137} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {B3F424EC-3D8F-417C-B244-3919D5E1A577} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {14E4A972-9CFB-436D-B0A5-4943F3F80D47} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {0B6C905B-142E-4999-B39D-92FF7951E921} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {CF405366-9558-4AE8-90EF-5E21B51CCB4E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {329FD5B0-EF28-4606-86D0-F6EA21CF8E36} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {9A5DDF08-C88C-4A35-B7F6-D605228446BD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {05C9FB27-480E-4D53-B3B7-6338E2526666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {CC1DD008-9406-448D-A0AD-33C3186CFADB} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {48414740-C693-4968-9846-EE058020C64F} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {DEE932AB-5911-4700-9EEB-8C7090A0A330} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {329A6FA0-0FCC-4435-A950-E670AEFA9838} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {BA599D0A-4310-4505-91DA-6A6447B3E289} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959} = {4F227C26-768F-46A3-8684-1D08A46FB374}
- {3C977801-FE88-48F2-83D3-FA2EBFF6688E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {0382E8FD-CFDC-41C0-8B03-792C7C84FC31} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {432DB165-1EB2-4781-A9C0-71E62610B20A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {CF70F278-3364-4395-A2E1-23501C9B8AD2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {D5C87B19-150D-4EF3-A671-96589BD2D14A} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {B5A00BFA-6083-4FAE-A097-71642D6473B5} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {1C320193-46A6-4B34-9C56-8AB584FC1B56} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {72782932-37CC-46AE-8C7F-9A7B1A6EE108} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {12A49562-BAB9-43A3-A21D-15B60BBB4C31} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {504B3154-7A4F-459D-9877-B951021C3F1F} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {746F3632-5BB2-4570-9453-31D6D58A7D8E} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {DEB01ACB-D65F-4A62-AED9-58C1054499E9} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
- {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
- {ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {AFA983D6-4569-4F88-BA94-555ED00FD9A8} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {990BAA76-89D3-4E38-8479-C7B28784EFC8} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {1E21AFE0-6FDB-41D2-942D-863607C24B91} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {2E250296-0C08-4342-9C8A-BCBDD0E7DF65} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {B889A18E-70A7-44B5-B2C9-47798D4F43B3} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {05C9FB27-480E-4D53-B3B7-7338E2514666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {7C22BDFF-CC09-400C-8A09-660733980028} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {50AAC2CE-BFC9-4912-87CC-C6381850D735} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {4748FF56-CA85-4809-97D6-A94C0FAC1D77} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {2469B306-B027-4FF2-8815-C9C1EA2CAE79} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {9DE35039-A8F6-4FBF-B1B6-EB527F802411} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {74B120FF-6935-4DFE-A142-CDB6BEA99C90} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
- {BED7539C-0099-4A14-AD5D-30828F15A171} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
- {0D108721-EAE8-4BAF-8102-D8960EC93647} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
- {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
- {B535402E-38D2-4D54-8360-423ACBD17192} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
- {2386B892-35F5-46CF-A0F0-10394D2FBF9B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {ED2CA8B5-8E91-4296-A120-02BB0B674652} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
- {245603E3-F580-41A5-9632-B25FE3372CBF} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
- {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
- {8484C90D-1561-402F-A91D-2DB10F8C5171} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
- {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
- {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
- {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
- {B6E22500-3DB6-4E6E-8CD5-591B781D7D99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
- {841C345F-FCC7-4F64-8F54-0281CEABEB01} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {7AEE504B-23B6-4B05-829E-7CD34855F146} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {20179127-853B-4FE9-B7C0-9E817E6A3A72} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {87933C2D-0159-46F7-B326-E1B6E982C21E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {19E934D6-1484-41C8-9305-78DC42FD61F2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
- {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {CEEE31E6-8A08-42C7-BEBD-5EC12072C136} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {0E469F3A-DDD0-43BA-A94F-7D93C02219F3} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {A3D7C6CF-AEB1-4159-B741-160EB4B37345} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {DA7ADDF1-DA33-4194-83A5-B48DB714D35B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {AF675478-995A-4115-90C4-B2B0D6470688} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {07EA6E5A-D181-4ABB-BECF-67A906867D04} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {20B15650-F910-4211-8729-AAB0F520C805} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
- {096C9A84-55B2-4F9B-97E5-0FDF116FD25F} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {2CA661A7-01DD-4532-BF88-B6629DFB544A} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {40C4E2A2-B49B-496C-96D6-C04B890F7F88} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {0A130A8B-3076-4619-BADF-9E86F621AEEC} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
- {4DFF29B4-2976-447D-A8B3-43476451517C} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
- {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E}
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2010
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Endpoints", "Endpoints", "{9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Applications", "Applications", "{E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dialplans", "Dialplans", "{C5F182F9-754A-4EC5-B50F-76ED02BE13F4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Event Handlers", "Event Handlers", "{9ADF1E48-2F5C-4ED7-A893-596259FABFE0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Formats", "Formats", "{A5A27244-AD24-46E5-B01B-840CD296C91D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{CBD81696-EFB4-4D2F-8451-1B8DAA86155A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Directories", "Directories", "{B8F5B47B-8568-46EB-B320-64C17D2A98BC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Languages", "Languages", "{0C808854-54D1-4230-BFF5-77B5FD905000}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASR-TTS", "ASR-TTS", "{4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loggers", "Loggers", "{A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XML Interfaces", "XML Interfaces", "{F69A4A6B-9360-4EBB-A280-22AA3C455AC5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Libraries", "_Libraries", "{EB910B0D-F27D-4B62-B67B-DE834C99AC5B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "say", "say", "{6CD61A1D-797C-470A-BE08-8C31B68BB336}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Config", "_Config", "{57D119DC-484F-420F-B9E9-8589FD9A8DF8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default", "Default", "{3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\freeswitch.xml = conf\vanilla\freeswitch.xml
+ conf\vanilla\vars.xml = conf\vanilla\vars.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Build System", "_Build System", "{DB1024A8-41BF-4AD7-9AE6-13202230D1F3}"
+ ProjectSection(SolutionItems) = preProject
+ acsite.m4 = acsite.m4
+ bootstrap.sh = bootstrap.sh
+ build\buildlib.sh = build\buildlib.sh
+ configure.in = configure.in
+ Makefile.am = Makefile.am
+ build\modmake.rules.in = build\modmake.rules.in
+ build\modules.conf.in = build\modules.conf.in
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "m4", "m4", "{CDE9B06A-3C27-4987-8FAE-DF1006BC705D}"
+ ProjectSection(SolutionItems) = preProject
+ build\config\ac_cflags_gcc_option.m4 = build\config\ac_cflags_gcc_option.m4
+ build\config\ac_cflags_sun_option.m4 = build\config\ac_cflags_sun_option.m4
+ build\config\ac_gcc_archflag.m4 = build\config\ac_gcc_archflag.m4
+ build\config\ac_gcc_x86_cpuid.m4 = build\config\ac_gcc_x86_cpuid.m4
+ build\config\ac_prog_gzip.m4 = build\config\ac_prog_gzip.m4
+ build\config\ac_prog_wget.m4 = build\config\ac_prog_wget.m4
+ build\config\ax_cc_maxopt.m4 = build\config\ax_cc_maxopt.m4
+ build\config\ax_cflags_warn_all_ansi.m4 = build\config\ax_cflags_warn_all_ansi.m4
+ build\config\ax_check_compiler_flags.m4 = build\config\ax_check_compiler_flags.m4
+ build\config\ax_compiler_vendor.m4 = build\config\ax_compiler_vendor.m4
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{3C90CCF0-2CDD-4A7A-ACFF-208C1E271692}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\autoload_configs\alsa.conf.xml = conf\vanilla\autoload_configs\alsa.conf.xml
+ conf\vanilla\autoload_configs\conference.conf.xml = conf\vanilla\autoload_configs\conference.conf.xml
+ conf\vanilla\autoload_configs\console.conf.xml = conf\vanilla\autoload_configs\console.conf.xml
+ conf\vanilla\autoload_configs\dialplan_directory.conf.xml = conf\vanilla\autoload_configs\dialplan_directory.conf.xml
+ conf\vanilla\autoload_configs\dingaling.conf.xml = conf\vanilla\autoload_configs\dingaling.conf.xml
+ conf\vanilla\autoload_configs\enum.conf.xml = conf\vanilla\autoload_configs\enum.conf.xml
+ conf\vanilla\autoload_configs\event_multicast.conf.xml = conf\vanilla\autoload_configs\event_multicast.conf.xml
+ conf\vanilla\autoload_configs\event_socket.conf.xml = conf\vanilla\autoload_configs\event_socket.conf.xml
+ conf\vanilla\autoload_configs\ivr.conf.xml = conf\vanilla\autoload_configs\ivr.conf.xml
+ conf\vanilla\autoload_configs\java.conf.xml = conf\vanilla\autoload_configs\java.conf.xml
+ conf\vanilla\autoload_configs\limit.conf.xml = conf\vanilla\autoload_configs\limit.conf.xml
+ conf\vanilla\autoload_configs\local_stream.conf.xml = conf\vanilla\autoload_configs\local_stream.conf.xml
+ conf\vanilla\autoload_configs\logfile.conf.xml = conf\vanilla\autoload_configs\logfile.conf.xml
+ conf\vanilla\autoload_configs\modules.conf.xml = conf\vanilla\autoload_configs\modules.conf.xml
+ conf\vanilla\autoload_configs\openmrcp.conf.xml = conf\vanilla\autoload_configs\openmrcp.conf.xml
+ conf\vanilla\autoload_configs\portaudio.conf.xml = conf\vanilla\autoload_configs\portaudio.conf.xml
+ conf\vanilla\autoload_configs\rss.conf.xml = conf\vanilla\autoload_configs\rss.conf.xml
+ conf\vanilla\autoload_configs\sofia.conf.xml = conf\vanilla\autoload_configs\sofia.conf.xml
+ conf\vanilla\autoload_configs\switch.conf.xml = conf\vanilla\autoload_configs\switch.conf.xml
+ conf\vanilla\autoload_configs\syslog.conf.xml = conf\vanilla\autoload_configs\syslog.conf.xml
+ conf\vanilla\autoload_configs\v8.conf.xml = conf\vanilla\autoload_configs\v8.conf.xml
+ conf\vanilla\autoload_configs\voicemail.conf.xml = conf\vanilla\autoload_configs\voicemail.conf.xml
+ conf\vanilla\autoload_configs\wanpipe.conf.xml = conf\vanilla\autoload_configs\wanpipe.conf.xml
+ conf\vanilla\autoload_configs\woomera.conf.xml = conf\vanilla\autoload_configs\woomera.conf.xml
+ conf\vanilla\autoload_configs\xml_cdr.conf.xml = conf\vanilla\autoload_configs\xml_cdr.conf.xml
+ conf\vanilla\autoload_configs\xml_curl.conf.xml = conf\vanilla\autoload_configs\xml_curl.conf.xml
+ conf\vanilla\autoload_configs\xml_rpc.conf.xml = conf\vanilla\autoload_configs\xml_rpc.conf.xml
+ conf\vanilla\autoload_configs\zeroconf.conf.xml = conf\vanilla\autoload_configs\zeroconf.conf.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\dialplan\default.xml = conf\vanilla\dialplan\default.xml
+ conf\vanilla\dialplan\public.xml = conf\vanilla\dialplan\public.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{FC71C66E-E268-4EAD-B1F5-F008DC382E83}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\sip_profiles\external.xml = conf\vanilla\sip_profiles\external.xml
+ conf\vanilla\sip_profiles\internal.xml = conf\vanilla\sip_profiles\internal.xml
+ conf\vanilla\sip_profiles\nat.xml = conf\vanilla\sip_profiles\nat.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{09455AA9-C243-4F16-A1A1-A016881A2765}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "en", "en", "{57199684-EC63-4A60-9DC6-11815AF6B413}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\en\en.xml = conf\vanilla\lang\en\en.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\de\de.xml = conf\vanilla\lang\de\de.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\fr\fr.xml = conf\vanilla\lang\fr\fr.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\de\demo\demo.xml = conf\vanilla\lang\de\demo\demo.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{CC3E7F48-2590-49CB-AD8B-BE3650F55462}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\de\vm\tts.xml = conf\vanilla\lang\de\vm\tts.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{765EF1B9-5027-4820-BC37-A44466A51631}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\en\demo\demo.xml = conf\vanilla\lang\en\demo\demo.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{713E4747-1126-40B1-BD84-58F9A7745423}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\en\vm\sounds.xml = conf\vanilla\lang\en\vm\sounds.xml
+ conf\vanilla\lang\en\vm\tts.xml = conf\vanilla\lang\en\vm\tts.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\fr\demo\demo.xml = conf\vanilla\lang\fr\demo\demo.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}"
+ ProjectSection(SolutionItems) = preProject
+ conf\vanilla\lang\fr\vm\sounds.xml = conf\vanilla\lang\fr\vm\sounds.xml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sound Files", "Sound Files", "{4F227C26-768F-46A3-8684-1D08A46FB374}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unimrcp", "unimrcp", "{62F27B1A-C919-4A70-8478-51F178F3B18F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.2017.vcxproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2017.vcxproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g729", "src\mod\codecs\mod_g729\mod_g729.2017.vcxproj", "{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sndfile", "src\mod\formats\mod_sndfile\mod_sndfile.2017.vcxproj", "{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_PortAudio", "src\mod\endpoints\mod_portaudio\mod_PortAudio.2017.vcxproj", "{5FD31A25-5D83-4794-8BEE-904DAD84CE71}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "docs", "docs\docs.2017.vcxproj", "{1A1FF289-4FD6-4285-A422-D31DD67A4723}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_xml", "src\mod\dialplans\mod_dialplan_xml\mod_dialplan_xml.2017.vcxproj", "{07113B25-D3AF-4E04-BA77-4CD1171F022C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ldap", "src\mod\directories\mod_ldap\mod_ldap.2017.vcxproj", "{EC3E5C7F-EE09-47E2-80FE-546363D14A98}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_directory", "src\mod\dialplans\mod_dialplan_directory\mod_dialplan_directory.2017.vcxproj", "{A27CCA23-1541-4337-81A4-F0A6413078A0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_multicast", "src\mod\event_handlers\mod_event_multicast\mod_event_multicast.2017.vcxproj", "{784113EF-44D9-4949-835D-7065D3C7AD08}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libteletone", "libs\libteletone\libteletone.2017.vcxproj", "{89385C74-5860-4174-9CAF-A39E7C48909C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8", "src\mod\languages\mod_v8\mod_v8.2017.vcxproj", "{9B9D2551-D6BD-4F20-8BE5-DE30E154A064}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8_skel", "src\mod\languages\mod_v8\mod_v8_skel.2017.vcxproj", "{8B754330-A434-4791-97E5-1EE67060BAC0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cepstral", "src\mod\asr_tts\mod_cepstral\mod_cepstral.2017.vcxproj", "{692F6330-4D87-4C82-81DF-40DB5892636E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.2017.vcxproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.2017.vcxproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.2017.vcxproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_console", "src\mod\loggers\mod_console\mod_console.2017.vcxproj", "{1C453396-D912-4213-89FD-9B489162B7B5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_rpc", "src\mod\xml_int\mod_xml_rpc\mod_xml_rpc.2017.vcxproj", "{CBEC7225-0C21-4DA8-978E-1F158F8AD950}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rss", "src\mod\applications\mod_rss\mod_rss.2017.vcxproj", "{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_conference", "src\mod\applications\mod_conference\mod_conference.2017.vcxproj", "{C24FB505-05D7-4319-8485-7540B44C8603}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\applications\mod_dptools\mod_dptools.2017.vcxproj", "{B5881A85-FE70-4F64-8607-2CAAE52669C6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.2017.vcxproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.2017.vcxproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.2017.vcxproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2017.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2017.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.2017.vcxproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2017.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2017.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2017.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pthread", "libs\win32\pthread\pthread.2017.vcxproj", "{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g723_1", "src\mod\codecs\mod_g723_1\mod_g723_1.2017.vcxproj", "{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_iSAC", "src\mod\codecs\mod_isac\mod_iSAC.2017.vcxproj", "{7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_native_file", "src\mod\formats\mod_native_file\mod_native_file.2017.vcxproj", "{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2017.vcxproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2017.vcxproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_curl", "src\mod\xml_int\mod_xml_curl\mod_xml_curl.2017.vcxproj", "{AB91A099-7690-4ECF-8994-E458F4EA1ED4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_en", "src\mod\say\mod_say_en\mod_say_en.2017.vcxproj", "{988CACF7-3FCB-4992-BE69-77872AE67DC8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "libs\win32\portaudio\portaudio.2017.vcxproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.2017.vcxproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.2017.vcxproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h26x", "src\mod\codecs\mod_h26x\mod_h26x.2017.vcxproj", "{2C3C2423-234B-4772-8899-D3B137E5CA35}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_esf", "src\mod\applications\mod_esf\mod_esf.2017.vcxproj", "{3850D93A-5F24-4922-BC1C-74D08C37C256}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_local_stream", "src\mod\formats\mod_local_stream\mod_local_stream.2017.vcxproj", "{2CA40887-1622-46A1-A7F9-17FD7E7E545B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_voicemail", "src\mod\applications\mod_voicemail\mod_voicemail.2017.vcxproj", "{D7F1E3F2-A3F4-474C-8555-15122571AF52}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_de", "src\mod\say\mod_say_de\mod_say_de.2017.vcxproj", "{5BC072DB-3826-48EA-AF34-FE32AA01E83B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es", "src\mod\say\mod_say_es\mod_say_es.2017.vcxproj", "{FA429E98-8B03-45E6-A096-A4BC5E821DE4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fr", "src\mod\say\mod_say_fr\mod_say_fr.2017.vcxproj", "{06E3A538-AB32-44F2-B477-755FF9CB5D37}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_it", "src\mod\say\mod_say_it\mod_say_it.2017.vcxproj", "{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_nl", "src\mod\say\mod_say_nl\mod_say_nl.2017.vcxproj", "{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fifo", "src\mod\applications\mod_fifo\mod_fifo.2017.vcxproj", "{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_db", "src\mod\applications\mod_db\mod_db.2017.vcxproj", "{F6A33240-8F29-48BD-98F0-826995911799}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_expr", "src\mod\applications\mod_expr\mod_expr.2017.vcxproj", "{65A6273D-FCAB-4C55-B09E-65100141A5D4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_asterisk", "src\mod\dialplans\mod_dialplan_asterisk\mod_dialplan_asterisk.2017.vcxproj", "{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_logfile", "src\mod\loggers\mod_logfile\mod_logfile.2017.vcxproj", "{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_csv", "src\mod\event_handlers\mod_cdr_csv\mod_cdr_csv.2017.vcxproj", "{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_tone_stream", "src\mod\formats\mod_tone_stream\mod_tone_stream.2017.vcxproj", "{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fsv", "src\mod\applications\mod_fsv\mod_fsv.2017.vcxproj", "{E3246D17-E29B-4AB5-962A-C69B0C5837BB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lua", "src\mod\languages\mod_lua\mod_lua.2017.vcxproj", "{7B077E7F-1BE7-4291-AB86-55E527B25CAC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sphinxbase", "libs\win32\sphinxbase\sphinxbase.2017.vcxproj", "{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "libs\win32\pocketsphinx\pocketsphinx.2017.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_pocketsphinx", "src\mod\asr_tts\mod_pocketsphinx\mod_pocketsphinx.2017.vcxproj", "{2286DA73-9FC5-45BC-A508-85994C3317AB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz", "libs\win32\Sound_Files\8khz.2017.vcxproj", "{7A8D8174-B355-4114-AFC1-04777CB9DE0A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz", "libs\win32\Sound_Files\16khz.2017.vcxproj", "{7EB71250-F002-4ED8-92CA-CA218114537A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz", "libs\win32\Sound_Files\32khz.2017.vcxproj", "{464AAB78-5489-4916-BE51-BF8D61822311}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_flite", "src\mod\asr_tts\mod_flite\mod_flite.2017.vcxproj", "{66444AEE-554C-11DD-A9F0-8C5D56D89593}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp3lame", "libs\win32\libmp3lame\libmp3lame.2017.vcxproj", "{E316772F-5D8F-4F2A-8F71-094C3E859D34}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libshout", "libs\win32\libshout\libshout.2017.vcxproj", "{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shout", "src\mod\formats\mod_shout\mod_shout.2017.vcxproj", "{38FE0559-9910-43A8-9E45-3E5004C27692}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libs\win32\libogg\libogg.2017.vcxproj", "{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_snom", "src\mod\applications\mod_snom\mod_snom.2017.vcxproj", "{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_zh", "src\mod\say\mod_say_zh\mod_say_zh.2017.vcxproj", "{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_managed", "src\mod\languages\mod_managed\mod_managed.2017.vcxproj", "{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSWITCH.Managed.2017", "src\mod\languages\mod_managed\managed\FreeSWITCH.Managed.2017.csproj", "{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpg123", "libs\win32\mpg123\libmpg123.2017.vcxproj", "{419C8F80-D858-4B48-A25C-AF4007608137}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_loopback", "src\mod\endpoints\mod_loopback\mod_loopback.2017.vcxproj", "{B3F424EC-3D8F-417C-B244-3919D5E1A577}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_vmd", "src\mod\applications\mod_vmd\mod_vmd.2017.vcxproj", "{14E4A972-9CFB-436D-B0A5-4943F3F80D47}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg722_1", "libs\win32\libg722_1\libg722_1.2017.vcxproj", "{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_siren", "src\mod\codecs\mod_siren\mod_siren.2017.vcxproj", "{0B6C905B-142E-4999-B39D-92FF7951E921}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libesl", "libs\esl\src\libesl.2017.vcxproj", "{CF405366-9558-4AE8-90EF-5E21B51CCB4E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fs_cli", "libs\esl\fs_cli.2017.vcxproj", "{D2FB8043-D208-4AEE-8F18-3B5857C871B9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_easyroute", "src\mod\applications\mod_easyroute\mod_easyroute.2017.vcxproj", "{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lcr", "src\mod\applications\mod_lcr\mod_lcr.2017.vcxproj", "{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtiff", "libs\spandsp\src\libtiff.2017.vcxproj", "{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libs\spandsp\src\libspandsp.2017.vcxproj", "{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libs\win32\speex\libspeex.2017.vcxproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libs\win32\speex\libspeexdsp.2017.vcxproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc", "libs\win32\ilbc\libilbc.2017.vcxproj", "{9A5DDF08-C88C-4A35-B7F6-D605228446BD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opal", "src\mod\endpoints\mod_opal\mod_opal.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-6338E2526666}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skinny", "src\mod\endpoints\mod_skinny\mod_skinny.2017.vcxproj", "{CC1DD008-9406-448D-A0AD-33C3186CFADB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtmp", "src\mod\endpoints\mod_rtmp\mod_rtmp.2017.vcxproj", "{48414740-C693-4968-9846-EE058020C64F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_at_dictionary", "libs\spandsp\src\msvc\make_at_dictionary.2017.vcxproj", "{DEE932AB-5911-4700-9EEB-8C7090A0A330}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_modem_filter", "libs\spandsp\src\msvc\make_modem_filter.2017.vcxproj", "{329A6FA0-0FCC-4435-A950-E670AEFA9838}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skel", "src\mod\applications\mod_skel\mod_skel.2017.vcxproj", "{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz music", "libs\win32\Sound_Files\8khzmusic.2017.vcxproj", "{D1ABE208-6442-4FB4-9AAD-1677E41BC870}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\Sound_Files\16khzmusic.2017.vcxproj", "{BA599D0A-4310-4505-91DA-6A6447B3E289}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2017.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2017.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2017.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_valet_parking", "src\mod\applications\mod_valet_parking\mod_valet_parking.2017.vcxproj", "{432DB165-1EB2-4781-A9C0-71E62610B20A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbroadvoice", "libs\win32\broadvoice\libbroadvoice.2017.vcxproj", "{CF70F278-3364-4395-A2E1-23501C9B8AD2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_bv", "src\mod\codecs\mod_bv\mod_bv.2017.vcxproj", "{D5C87B19-150D-4EF3-A671-96589BD2D14A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aprtoolkit", "libs\unimrcp\libs\apr-toolkit\aprtoolkit.2017.vcxproj", "{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}"
+ ProjectSection(ProjectDependencies) = postProject
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpf", "libs\unimrcp\libs\mpf\mpf.2017.vcxproj", "{B5A00BFA-6083-4FAE-A097-71642D6473B5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcp", "libs\unimrcp\libs\mrcp\mrcp.2017.vcxproj", "{1C320193-46A6-4B34-9C56-8AB584FC1B56}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpclient", "libs\unimrcp\libs\mrcp-client\mrcpclient.2017.vcxproj", "{72782932-37CC-46AE-8C7F-9A7B1A6EE108}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsignaling", "libs\unimrcp\libs\mrcp-signaling\mrcpsignaling.2017.vcxproj", "{12A49562-BAB9-43A3-A21D-15B60BBB4C31}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2transport", "libs\unimrcp\libs\mrcpv2-transport\mrcpv2transport.2017.vcxproj", "{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unirtsp", "libs\unimrcp\libs\uni-rtsp\unirtsp.2017.vcxproj", "{504B3154-7A4F-459D-9877-B951021C3F1F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\unimrcp\modules\mrcp-sofiasip\mrcpsofiasip.2017.vcxproj", "{746F3632-5BB2-4570-9453-31D6D58A7D8E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpunirtsp", "libs\unimrcp\modules\mrcp-unirtsp\mrcpunirtsp.2017.vcxproj", "{DEB01ACB-D65F-4A62-AED9-58C1054499E9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_unimrcp", "src\mod\asr_tts\mod_unimrcp\mod_unimrcp.2017.vcxproj", "{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "libs\win32\celt\libcelt.2017.vcxproj", "{ABB71A76-42B0-47A4-973A-42E3D920C6FD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FSComm", "fscomm\FSComm.2017.vcxproj", "{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_curl", "src\mod\applications\mod_curl\mod_curl.2017.vcxproj", "{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_silk", "src\mod\codecs\mod_silk\mod_silk.2017.vcxproj", "{AFA983D6-4569-4F88-BA94-555ED00FD9A8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\win32\libsilk\Silk_FIX.2017.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_avmd", "src\mod\applications\mod_avmd\mod_avmd.2017.vcxproj", "{990BAA76-89D3-4E38-8479-C7B28784EFC8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spandsp", "src\mod\applications\mod_spandsp\mod_spandsp.2017.vcxproj", "{1E21AFE0-6FDB-41D2-942D-863607C24B91}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_hash", "src\mod\applications\mod_hash\mod_hash.2017.vcxproj", "{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsofia_sip_ua_static", "libs\win32\sofia\libsofia_sip_ua_static.2017.vcxproj", "{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2017.vcxproj", "{B889A18E-70A7-44B5-B2C9-47798D4F43B3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h323", "src\mod\endpoints\mod_h323\mod_h323.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-7338E2514666}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_distributor", "src\mod\applications\mod_distributor\mod_distributor.2017.vcxproj", "{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pt", "src\mod\say\mod_say_pt\mod_say_pt.2017.vcxproj", "{7C22BDFF-CC09-400C-8A09-660733980028}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_sv", "src\mod\say\mod_say_sv\mod_say_sv.2017.vcxproj", "{8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2017.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_callcenter", "src\mod\applications\mod_callcenter\mod_callcenter.2017.vcxproj", "{47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_blacklist", "src\mod\applications\mod_blacklist\mod_blacklist.2017.vcxproj", "{50AAC2CE-BFC9-4912-87CC-C6381850D735}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spy", "src\mod\applications\mod_spy\mod_spy.2017.vcxproj", "{A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_httapi", "src\mod\applications\mod_httapi\mod_httapi.2017.vcxproj", "{4748FF56-CA85-4809-97D6-A94C0FAC1D77}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_abstraction", "src\mod\applications\mod_abstraction\mod_abstraction.2017.vcxproj", "{60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sms", "src\mod\applications\mod_sms\mod_sms.2017.vcxproj", "{2469B306-B027-4FF2-8815-C9C1EA2CAE79}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xmlrpc-c", "xmlrpc-c", "{9DE35039-A8F6-4FBF-B1B6-EB527F802411}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsmlib", "src\mod\endpoints\mod_gsmopen\gsmlib\gsmlib-1.10-patched-13ubuntu\win32\gsmlib.2017.vcxproj", "{26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endpoints\mod_gsmopen\mod_gsmopen.2017.vcxproj", "{74B120FF-6935-4DFE-A142-CDB6BEA99C90}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2017.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_redis", "src\mod\applications\mod_redis\mod_redis.2017.vcxproj", "{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libjpeg", "libs\win32\libjpeg\libjpeg.2017.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abyss", "libs\win32\xmlrpc-c\abyss.2017.vcxproj", "{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
+ {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192}
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennmtab", "libs\win32\xmlrpc-c\gennmtab.2017.vcxproj", "{BED7539C-0099-4A14-AD5D-30828F15A171}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlparse", "libs\win32\xmlrpc-c\xmlparse.2017.vcxproj", "{0D108721-EAE8-4BAF-8102-D8960EC93647}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlrpc", "libs\win32\xmlrpc-c\xmlrpc.2017.vcxproj", "{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647}
+ {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmltok", "libs\win32\xmlrpc-c\xmltok.2017.vcxproj", "{B535402E-38D2-4D54-8360-423ACBD17192}"
+ ProjectSection(ProjectDependencies) = postProject
+ {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171}
+ EndProjectSection
+EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.2017", "w32\Setup\Setup.2017.wixproj", "{47213370-B933-487D-9F45-BCA26D7E2B6F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_math_fixed_tables", "libs\spandsp\src\msvc\make_math_fixed_tables.2017.vcxproj", "{2386B892-35F5-46CF-A0F0-10394D2FBF9B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt\libcbt.2017.vcxproj", "{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2017.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opus", "opus", "{ED2CA8B5-8E91-4296-A120-02BB0B674652}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "libs\win32\opus\opus.2017.vcxproj", "{FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.celt", "libs\win32\opus\opus.celt.2017.vcxproj", "{245603E3-F580-41A5-9632-B25FE3372CBF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_common", "libs\win32\opus\opus.silk_common.2017.vcxproj", "{C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_fixed", "libs\win32\opus\opus.silk_fixed.2017.vcxproj", "{8484C90D-1561-402F-A91D-2DB10F8C5171}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_float", "libs\win32\opus\opus.silk_float.2017.vcxproj", "{9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opus", "src\mod\codecs\mod_opus\mod_opus.2017.vcxproj", "{64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2017.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winFailToBan", "src\mod\languages\mod_managed\managed\examples\winFailToBan\winFailToBan.csproj", "{5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtc", "src\mod\endpoints\mod_rtc\mod_rtc.2017.vcxproj", "{3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_verto", "src\mod\endpoints\mod_verto\mod_verto.2017.vcxproj", "{5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyuv", "libs\win32\libyuv\libyuv.2017.vcxproj", "{B6E22500-3DB6-4E6E-8CD5-591B781D7D99}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvpx", "libs\win32\libvpx\libvpx.2017.vcxproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libs\win32\libpng\libpng.2017.vcxproj", "{D6973076-9317-4EF2-A0B8-B7A18AC0713E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype.2017", "libs\win32\freetype\freetype.2017.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_png", "src\mod\formats\mod_png\mod_png.2017.vcxproj", "{FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libav", "libs\win32\libav\libav.2017.vcxproj", "{841C345F-FCC7-4F64-8F54-0281CEABEB01}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_av", "src\mod\applications\mod_av\mod_av.2017.vcxproj", "{7AEE504B-23B6-4B05-829E-7CD34855F146}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libx264", "libs\win32\libx264\libx264.2017.vcxproj", "{20179127-853B-4FE9-B7C0-9E817E6A3A72}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_http_cache", "src\mod\applications\mod_http_cache\mod_http_cache.2017.vcxproj", "{87933C2D-0159-46F7-B326-E1B6E982C21E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcodec2", "libs\win32\libcodec2\libcodec2.2017.vcxproj", "{19E934D6-1484-41C8-9305-78DC42FD61F2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_codec2", "src\mod\codecs\mod_codec2\mod_codec2.2017.vcxproj", "{CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amqp", "src\mod\event_handlers\mod_amqp\mod_amqp.2017.vcxproj", "{7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_pg_csv", "src\mod\event_handlers\mod_cdr_pg_csv\mod_cdr_pg_csv.2017.vcxproj", "{411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es_ar", "src\mod\say\mod_say_es_ar\mod_say_es_ar.2017.vcxproj", "{CEEE31E6-8A08-42C7-BEBD-5EC12072C136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fa", "src\mod\say\mod_say_fa\mod_say_fa.2017.vcxproj", "{0E469F3A-DDD0-43BA-A94F-7D93C02219F3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_he", "src\mod\say\mod_say_he\mod_say_he.2017.vcxproj", "{A3D7C6CF-AEB1-4159-B741-160EB4B37345}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hr", "src\mod\say\mod_say_hr\mod_say_hr.2017.vcxproj", "{DA7ADDF1-DA33-4194-83A5-B48DB714D35B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hu", "src\mod\say\mod_say_hu\mod_say_hu.2017.vcxproj", "{AF675478-995A-4115-90C4-B2B0D6470688}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ja", "src\mod\say\mod_say_ja\mod_say_ja.2017.vcxproj", "{07EA6E5A-D181-4ABB-BECF-67A906867D04}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pl", "src\mod\say\mod_say_pl\mod_say_pl.2017.vcxproj", "{20B15650-F910-4211-8729-AAB0F520C805}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_th", "src\mod\say\mod_say_th\mod_say_th.2017.vcxproj", "{C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_odbc_cdr", "src\mod\event_handlers\mod_odbc_cdr\mod_odbc_cdr.2017.vcxproj", "{096C9A84-55B2-4F9B-97E5-0FDF116FD25F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_sqlite", "src\mod\event_handlers\mod_cdr_sqlite\mod_cdr_sqlite.2017.vcxproj", "{2CA661A7-01DD-4532-BF88-B6629DFB544A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cv", "src\mod\applications\mod_cv\mod_cv.2017.vcxproj", "{40C4E2A2-B49B-496C-96D6-C04B890F7F88}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cidlookup", "src\mod\applications\mod_cidlookup\mod_cidlookup.2017.vcxproj", "{0A130A8B-3076-4619-BADF-9E86F621AEEC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_mongodb", "src\mod\event_handlers\mod_cdr_mongodb\mod_cdr_mongodb.2017.vcxproj", "{4DFF29B4-2976-447D-A8B3-43476451517C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ffmpeg", "libs\win32\ffmpeg\ffmpeg.2017.vcxproj", "{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9388C266-C3FC-468A-92EF-0CBC35941412}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mod_av", "src\mod\applications\mod_av\test\test_mod_av.2017.vcxproj", "{7926CB0D-62CE-4A09-AE94-1DA2BC92D625}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_switch_core", "tests\unit\test_switch_core.2017.vcxproj", "{EF62B845-A0CE-44FD-B8E6-475FE87D06C3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz", "libs\win32\Sound_Files\48khz.2017.vcxproj", "{8154C82D-58EE-4145-9DEC-A445A5AA3D6B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz music", "libs\win32\Sound_Files\48khzmusic.2017.vcxproj", "{EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_signalwire", "src\mod\applications\mod_signalwire\mod_signalwire.2017.vcxproj", "{B19AE6FC-BFFF-428D-B483-3BBEAECCC618}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ All|Win32 = All|Win32
+ All|x64 = All|x64
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|Win32.ActiveCfg = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.ActiveCfg = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.Build.0 = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.ActiveCfg = Debug|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.Build.0 = Debug|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.ActiveCfg = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.Build.0 = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|Win32.ActiveCfg = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.ActiveCfg = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.Build.0 = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.ActiveCfg = Debug|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.Build.0 = Debug|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.ActiveCfg = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.Build.0 = Release|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|Win32.ActiveCfg = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.ActiveCfg = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.Build.0 = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.ActiveCfg = Debug Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.ActiveCfg = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.Build.0 = Release Passthrough|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|Win32.ActiveCfg = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.ActiveCfg = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.Build.0 = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.ActiveCfg = Debug|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.Build.0 = Debug|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.ActiveCfg = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.Build.0 = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|Win32.ActiveCfg = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.ActiveCfg = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.Build.0 = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.ActiveCfg = Debug|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.Build.0 = Debug|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.ActiveCfg = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.Build.0 = Release|x64
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|Win32.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64.ActiveCfg = Debug|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64.ActiveCfg = Release|Win32
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|Win32.ActiveCfg = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.ActiveCfg = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.Build.0 = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.ActiveCfg = Debug|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.Build.0 = Debug|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.ActiveCfg = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.Build.0 = Release|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|Win32.ActiveCfg = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.ActiveCfg = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.Build.0 = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.ActiveCfg = Debug MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.Build.0 = Debug MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.ActiveCfg = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.Build.0 = Release MS-LDAP|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|Win32.ActiveCfg = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.ActiveCfg = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.Build.0 = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.ActiveCfg = Debug|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.Build.0 = Debug|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.ActiveCfg = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.Build.0 = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|Win32.ActiveCfg = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.ActiveCfg = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.Build.0 = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.ActiveCfg = Debug|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.Build.0 = Debug|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.ActiveCfg = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.Build.0 = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|Win32.ActiveCfg = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.ActiveCfg = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.Build.0 = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.ActiveCfg = Debug|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.Build.0 = Debug|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.ActiveCfg = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.Build.0 = Release|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|Win32.ActiveCfg = Release|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.ActiveCfg = Release|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.Build.0 = Release|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.Build.0 = Debug|Win32
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.ActiveCfg = Debug|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.Build.0 = Debug|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.ActiveCfg = Release|Win32
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.Build.0 = Release|Win32
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.ActiveCfg = Release|x64
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.Build.0 = Release|x64
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.All|Win32.ActiveCfg = Release|x64
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.ActiveCfg = Release|x64
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.Build.0 = Release|x64
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|x64.ActiveCfg = Debug|x64
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|Win32.ActiveCfg = Release|Win32
+ {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|x64.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|Win32.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.Build.0 = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64.ActiveCfg = Debug|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|Win32.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.Build.0 = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.ActiveCfg = Debug|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.Build.0 = Debug|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.ActiveCfg = Debug|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.Build.0 = Debug|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.ActiveCfg = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.Build.0 = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|Win32.ActiveCfg = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.ActiveCfg = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.Build.0 = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.ActiveCfg = Debug|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.Build.0 = Debug|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.ActiveCfg = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.Build.0 = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|Win32.ActiveCfg = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.ActiveCfg = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.Build.0 = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.ActiveCfg = Debug|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.Build.0 = Debug|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.ActiveCfg = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.Build.0 = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|Win32.ActiveCfg = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.ActiveCfg = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.Build.0 = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.ActiveCfg = Debug|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.Build.0 = Debug|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.ActiveCfg = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.Build.0 = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|Win32.ActiveCfg = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.ActiveCfg = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.Build.0 = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.ActiveCfg = Debug|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.Build.0 = Debug|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.ActiveCfg = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.Build.0 = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|Win32.ActiveCfg = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.ActiveCfg = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.Build.0 = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.ActiveCfg = Debug|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.Build.0 = Debug|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.ActiveCfg = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.Build.0 = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|Win32.ActiveCfg = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.ActiveCfg = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.Build.0 = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.ActiveCfg = Debug|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.Build.0 = Debug|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.ActiveCfg = Debug|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.Build.0 = Debug|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.ActiveCfg = Release|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.Build.0 = Release|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|Win32.ActiveCfg = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.ActiveCfg = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.Build.0 = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug|Win32
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.ActiveCfg = Debug|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.Build.0 = Debug|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release|Win32
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release|Win32
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.ActiveCfg = Release|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.Build.0 = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|Win32.ActiveCfg = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.ActiveCfg = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.Build.0 = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.ActiveCfg = Debug|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.Build.0 = Debug|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.ActiveCfg = Debug|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.Build.0 = Debug|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.ActiveCfg = Debug|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.Build.0 = Debug|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.ActiveCfg = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.Build.0 = Release|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|Win32.ActiveCfg = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.ActiveCfg = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.Build.0 = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.ActiveCfg = Debug DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.Build.0 = Debug DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.ActiveCfg = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.Build.0 = Release DLL|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|Win32.ActiveCfg = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.ActiveCfg = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.Build.0 = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.ActiveCfg = Debug Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.ActiveCfg = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.Build.0 = Release Passthrough|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|Win32.ActiveCfg = Release|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.ActiveCfg = Release|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.Build.0 = Release|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.Build.0 = Debug|Win32
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.ActiveCfg = Debug|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.Build.0 = Debug|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.ActiveCfg = Release|Win32
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.Build.0 = Release|Win32
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.ActiveCfg = Release|x64
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.Build.0 = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|Win32.ActiveCfg = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.ActiveCfg = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.Build.0 = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.ActiveCfg = Debug|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.Build.0 = Debug|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.ActiveCfg = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.Build.0 = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|Win32.ActiveCfg = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.ActiveCfg = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.Build.0 = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.Build.0 = Debug|Win32
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.ActiveCfg = Debug|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.Build.0 = Debug|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.ActiveCfg = Release|Win32
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.Build.0 = Release|Win32
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.ActiveCfg = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.Build.0 = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|Win32.ActiveCfg = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.ActiveCfg = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.Build.0 = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.Build.0 = Debug|Win32
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.ActiveCfg = Debug|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.Build.0 = Debug|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.ActiveCfg = Release|Win32
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.Build.0 = Release|Win32
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.ActiveCfg = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.Build.0 = Release|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|Win32.ActiveCfg = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.ActiveCfg = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.Build.0 = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug DirectSound|Win32
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug DirectSound|Win32
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release DirectSound|Win32
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release DirectSound|Win32
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release DirectSound|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.ActiveCfg = Debug|Win32
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.Build.0 = Debug|Win32
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.ActiveCfg = Debug|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.Build.0 = Debug|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.ActiveCfg = Release|Win32
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.Build.0 = Release|Win32
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.ActiveCfg = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.Build.0 = Release|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|Win32.ActiveCfg = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.ActiveCfg = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.Build.0 = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.Build.0 = Debug Passthrough|Win32
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.ActiveCfg = Debug Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.ActiveCfg = Release Passthrough|Win32
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.Build.0 = Release Passthrough|Win32
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.ActiveCfg = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.Build.0 = Release Passthrough|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|Win32.ActiveCfg = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.ActiveCfg = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.Build.0 = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.Build.0 = Debug|Win32
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.ActiveCfg = Debug|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.Build.0 = Debug|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.ActiveCfg = Release|Win32
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.Build.0 = Release|Win32
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.ActiveCfg = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.Build.0 = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|Win32.ActiveCfg = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.ActiveCfg = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.Build.0 = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.Build.0 = Debug|Win32
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.ActiveCfg = Debug|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.Build.0 = Debug|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.Build.0 = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|Win32.ActiveCfg = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.ActiveCfg = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.Build.0 = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.Build.0 = Debug|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.Build.0 = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|Win32.ActiveCfg = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.ActiveCfg = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.Build.0 = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.Build.0 = Debug|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.Build.0 = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|Win32.ActiveCfg = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.ActiveCfg = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.Build.0 = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.Build.0 = Debug|Win32
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.ActiveCfg = Debug|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.Build.0 = Debug|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.ActiveCfg = Release|Win32
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.Build.0 = Release|Win32
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.ActiveCfg = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.Build.0 = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|Win32.ActiveCfg = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.ActiveCfg = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.Build.0 = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.Build.0 = Debug|Win32
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.ActiveCfg = Debug|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.Build.0 = Debug|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.ActiveCfg = Release|Win32
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.Build.0 = Release|Win32
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.ActiveCfg = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.Build.0 = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|Win32.ActiveCfg = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.ActiveCfg = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.Build.0 = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.ActiveCfg = Debug|Win32
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.Build.0 = Debug|Win32
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.ActiveCfg = Debug|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.Build.0 = Debug|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.ActiveCfg = Release|Win32
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.Build.0 = Release|Win32
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.ActiveCfg = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.Build.0 = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|Win32.ActiveCfg = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.ActiveCfg = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.Build.0 = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.Build.0 = Debug|Win32
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.ActiveCfg = Debug|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.Build.0 = Debug|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.ActiveCfg = Release|Win32
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.Build.0 = Release|Win32
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.ActiveCfg = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.Build.0 = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|Win32.ActiveCfg = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.ActiveCfg = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.Build.0 = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.Build.0 = Debug|Win32
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.ActiveCfg = Debug|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.Build.0 = Debug|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.ActiveCfg = Release|Win32
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.Build.0 = Release|Win32
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.ActiveCfg = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.Build.0 = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|Win32.ActiveCfg = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.ActiveCfg = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.Build.0 = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.Build.0 = Debug|Win32
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.ActiveCfg = Debug|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.Build.0 = Debug|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.ActiveCfg = Release|Win32
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.Build.0 = Release|Win32
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.ActiveCfg = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.Build.0 = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|Win32.ActiveCfg = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.ActiveCfg = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.Build.0 = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.Build.0 = Debug|Win32
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.ActiveCfg = Debug|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.Build.0 = Debug|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.ActiveCfg = Release|Win32
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.Build.0 = Release|Win32
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.ActiveCfg = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.Build.0 = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|Win32.ActiveCfg = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.ActiveCfg = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.Build.0 = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.Build.0 = Debug|Win32
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.ActiveCfg = Debug|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.Build.0 = Debug|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.ActiveCfg = Release|Win32
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.Build.0 = Release|Win32
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.ActiveCfg = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.Build.0 = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|Win32.ActiveCfg = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.ActiveCfg = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.Build.0 = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.Build.0 = Debug|Win32
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.ActiveCfg = Debug|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.Build.0 = Debug|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.ActiveCfg = Release|Win32
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.Build.0 = Release|Win32
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.ActiveCfg = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.Build.0 = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|Win32.ActiveCfg = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.ActiveCfg = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.Build.0 = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.Build.0 = Debug|Win32
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.ActiveCfg = Debug|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.Build.0 = Debug|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.ActiveCfg = Release|Win32
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.Build.0 = Release|Win32
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.ActiveCfg = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.Build.0 = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|Win32.ActiveCfg = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.ActiveCfg = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.Build.0 = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.Build.0 = Debug|Win32
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.ActiveCfg = Debug|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.Build.0 = Debug|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.ActiveCfg = Release|Win32
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.Build.0 = Release|Win32
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.ActiveCfg = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.Build.0 = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|Win32.ActiveCfg = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.ActiveCfg = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.Build.0 = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.Build.0 = Debug|Win32
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.ActiveCfg = Debug|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.Build.0 = Debug|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.ActiveCfg = Release|Win32
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.Build.0 = Release|Win32
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.ActiveCfg = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.Build.0 = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|Win32.ActiveCfg = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.ActiveCfg = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.Build.0 = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.Build.0 = Debug|Win32
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.ActiveCfg = Debug|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.Build.0 = Debug|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.ActiveCfg = Release|Win32
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.Build.0 = Release|Win32
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.ActiveCfg = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.Build.0 = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|Win32.ActiveCfg = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.ActiveCfg = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.Build.0 = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.Build.0 = Debug|Win32
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.ActiveCfg = Debug|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.Build.0 = Debug|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.Build.0 = Release|Win32
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.ActiveCfg = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.Build.0 = Release|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|Win32.ActiveCfg = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.ActiveCfg = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.Build.0 = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.Build.0 = Debug|Win32
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.ActiveCfg = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.Build.0 = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.ActiveCfg = Release|Win32
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.Build.0 = Release|Win32
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.ActiveCfg = Release|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.Build.0 = Release|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|Win32.ActiveCfg = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.ActiveCfg = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.Build.0 = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|Win32.ActiveCfg = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.ActiveCfg = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.Build.0 = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.Build.0 = Debug|Win32
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.ActiveCfg = Debug|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.Build.0 = Debug|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.ActiveCfg = Release|Win32
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.Build.0 = Release|Win32
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.ActiveCfg = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.Build.0 = Release|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.ActiveCfg = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.ActiveCfg = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.Build.0 = Debug|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.Build.0 = Debug|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.Build.0 = Debug|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.Build.0 = Debug|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.Build.0 = Release|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.ActiveCfg = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.Build.0 = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.ActiveCfg = Debug|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.Build.0 = Debug|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.ActiveCfg = Debug|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.Build.0 = Debug|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.ActiveCfg = Release|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.Build.0 = Release|Win32
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.ActiveCfg = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.Build.0 = Release|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|Win32.ActiveCfg = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.ActiveCfg = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.Build.0 = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.Build.0 = Debug|Win32
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.ActiveCfg = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.Build.0 = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.ActiveCfg = Release|Win32
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.Build.0 = Release|Win32
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.ActiveCfg = Release|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.Build.0 = Release|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|Win32.ActiveCfg = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.ActiveCfg = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.Build.0 = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.Build.0 = Debug|Win32
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.ActiveCfg = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.Build.0 = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.ActiveCfg = Release|Win32
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.Build.0 = Release|Win32
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.ActiveCfg = Release|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.Build.0 = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|Win32.ActiveCfg = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.ActiveCfg = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.Build.0 = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.ActiveCfg = Debug|Win32
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.Build.0 = Debug|Win32
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.ActiveCfg = Debug|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.Build.0 = Debug|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.ActiveCfg = Release|Win32
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.Build.0 = Release|Win32
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.ActiveCfg = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.Build.0 = Release|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|Win32.ActiveCfg = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.ActiveCfg = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.Build.0 = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.Build.0 = Debug|Win32
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.ActiveCfg = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.Build.0 = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.ActiveCfg = Release|Win32
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.Build.0 = Release|Win32
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.ActiveCfg = Release|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.Build.0 = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|Win32.ActiveCfg = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.ActiveCfg = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.Build.0 = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.Build.0 = Debug|Win32
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.ActiveCfg = Debug|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.Build.0 = Debug|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.ActiveCfg = Release|Win32
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.Build.0 = Release|Win32
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.ActiveCfg = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.Build.0 = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|Win32.ActiveCfg = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.ActiveCfg = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.Build.0 = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.Build.0 = Debug|Win32
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.ActiveCfg = Debug|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.Build.0 = Debug|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.ActiveCfg = Release|Win32
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.Build.0 = Release|Win32
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.ActiveCfg = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.Build.0 = Release|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|Win32.ActiveCfg = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.ActiveCfg = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.Build.0 = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.ActiveCfg = Debug_CLR|Win32
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.Build.0 = Debug_CLR|Win32
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.ActiveCfg = Debug_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.Build.0 = Debug_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.ActiveCfg = Release_CLR|Win32
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.Build.0 = Release_CLR|Win32
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.ActiveCfg = Release_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.Build.0 = Release_CLR|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|Win32.ActiveCfg = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64.ActiveCfg = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.Build.0 = Debug|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.ActiveCfg = Debug|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.Build.0 = Debug|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.ActiveCfg = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.Build.0 = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.ActiveCfg = Release|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.Build.0 = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.ActiveCfg = Debug_Generic_Dll|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.Build.0 = Debug_Generic_Dll|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.ActiveCfg = Debug_Generic_Dll|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.ActiveCfg = Debug_Generic|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.Build.0 = Debug_Generic|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.ActiveCfg = Debug_Generic|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.Build.0 = Debug_Generic|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.ActiveCfg = Release_Generic|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.Build.0 = Release_Generic|Win32
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.ActiveCfg = Release_Generic|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.Build.0 = Release_Generic|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|Win32.ActiveCfg = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.ActiveCfg = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.Build.0 = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.Build.0 = Debug|Win32
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.ActiveCfg = Debug|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.Build.0 = Debug|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.Build.0 = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|Win32.ActiveCfg = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.ActiveCfg = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.Build.0 = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.Build.0 = Debug|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.Build.0 = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|Win32.ActiveCfg = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.ActiveCfg = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.Build.0 = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.Build.0 = Debug|Win32
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.ActiveCfg = Debug|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.Build.0 = Debug|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.ActiveCfg = Release|Win32
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.Build.0 = Release|Win32
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.ActiveCfg = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.Build.0 = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|Win32.ActiveCfg = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.ActiveCfg = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.Build.0 = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.Build.0 = Debug|Win32
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.ActiveCfg = Debug|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.Build.0 = Debug|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.ActiveCfg = Release|Win32
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.Build.0 = Release|Win32
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.ActiveCfg = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.Build.0 = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|Win32.ActiveCfg = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.ActiveCfg = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.Build.0 = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.Build.0 = Debug|Win32
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.ActiveCfg = Debug|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.Build.0 = Debug|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.ActiveCfg = Release|Win32
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.Build.0 = Release|Win32
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.ActiveCfg = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.Build.0 = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|Win32.ActiveCfg = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.ActiveCfg = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.Build.0 = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.Build.0 = Debug|Win32
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.ActiveCfg = Debug|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.Build.0 = Debug|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.ActiveCfg = Release|Win32
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.Build.0 = Release|Win32
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.ActiveCfg = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.Build.0 = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|Win32.ActiveCfg = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.ActiveCfg = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.Build.0 = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.ActiveCfg = Debug|Win32
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.Build.0 = Debug|Win32
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.ActiveCfg = Debug|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.Build.0 = Debug|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.ActiveCfg = Release|Win32
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.Build.0 = Release|Win32
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.ActiveCfg = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.Build.0 = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|Win32.ActiveCfg = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.ActiveCfg = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.Build.0 = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.Build.0 = Debug|Win32
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.ActiveCfg = Debug|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.Build.0 = Debug|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.ActiveCfg = Release|Win32
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.Build.0 = Release|Win32
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.ActiveCfg = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.Build.0 = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.ActiveCfg = Release_Dynamic|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.Build.0 = Release_Dynamic|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.ActiveCfg = Release_Dynamic|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.Build.0 = Release_Dynamic|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.ActiveCfg = Debug|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.Build.0 = Debug|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.ActiveCfg = Release|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.Build.0 = Release|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|Win32.ActiveCfg = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.ActiveCfg = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.Build.0 = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.Build.0 = Debug|Win32
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.ActiveCfg = Debug|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.Build.0 = Debug|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.Build.0 = Release|Win32
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.ActiveCfg = Release|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.Build.0 = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|Win32.ActiveCfg = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.ActiveCfg = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.Build.0 = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.Build.0 = Debug|Win32
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.ActiveCfg = Debug|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.Build.0 = Debug|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.ActiveCfg = Release|Win32
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.Build.0 = Release|Win32
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.ActiveCfg = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.Build.0 = Release|x64
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.Build.0 = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|Win32.ActiveCfg = Debug|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64.ActiveCfg = Debug|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|Win32.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|Win32.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.Build.0 = Debug|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.ActiveCfg = Debug|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.Build.0 = Debug|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.Build.0 = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.ActiveCfg = Release|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.Build.0 = Release|x64
+ {48414740-C693-4968-9846-EE058020C64F}.All|Win32.ActiveCfg = Release|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.All|x64.ActiveCfg = Release|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.Build.0 = Debug|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.ActiveCfg = Debug|x64
+ {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.Build.0 = Debug|x64
+ {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.ActiveCfg = Release|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.Build.0 = Release|Win32
+ {48414740-C693-4968-9846-EE058020C64F}.Release|x64.ActiveCfg = Release|x64
+ {48414740-C693-4968-9846-EE058020C64F}.Release|x64.Build.0 = Release|x64
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.Build.0 = All|Win32
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|Win32.ActiveCfg = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.ActiveCfg = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.Build.0 = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|Win32.ActiveCfg = Debug|Win32
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64.ActiveCfg = Debug|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|Win32.ActiveCfg = Release|Win32
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64.ActiveCfg = Release|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.ActiveCfg = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.ActiveCfg = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.Build.0 = Debug|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.Build.0 = Debug|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.Build.0 = Debug|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.Build.0 = Debug|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.Build.0 = Debug|Win32
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.ActiveCfg = Debug|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.Build.0 = Debug|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.ActiveCfg = Release|Win32
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.Build.0 = Release|Win32
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.Build.0 = Debug|Win32
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.ActiveCfg = Debug|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.Build.0 = Debug|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.ActiveCfg = Release|Win32
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.Build.0 = Release|Win32
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.Build.0 = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|Win32.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.Build.0 = Debug|Win32
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.ActiveCfg = Debug|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.Build.0 = Debug|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.ActiveCfg = Release|Win32
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.Build.0 = Release|Win32
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.Build.0 = Release|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.Build.0 = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.ActiveCfg = Debug|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.Build.0 = Debug|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.ActiveCfg = Release|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.Build.0 = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|Win32.ActiveCfg = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.ActiveCfg = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.Build.0 = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.Build.0 = Debug|Win32
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.ActiveCfg = Debug|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.Build.0 = Debug|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.ActiveCfg = Release|Win32
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.Build.0 = Debug|Win32
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.ActiveCfg = Debug|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.Build.0 = Debug|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.ActiveCfg = Release|Win32
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.Build.0 = Release|Win32
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.ActiveCfg = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.Build.0 = Release|x64
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.Build.0 = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64.ActiveCfg = Debug|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|Win32.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64.ActiveCfg = Release|Win32
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|Win32.ActiveCfg = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.ActiveCfg = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.Build.0 = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.Build.0 = Debug|Win32
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.ActiveCfg = Debug|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.Build.0 = Debug|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.ActiveCfg = Release|Win32
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.Build.0 = Release|Win32
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.ActiveCfg = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.Build.0 = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|Win32.ActiveCfg = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.ActiveCfg = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.Build.0 = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.Build.0 = Debug|Win32
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.ActiveCfg = Debug|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.Build.0 = Debug|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.ActiveCfg = Release|Win32
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.Build.0 = Release|Win32
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.ActiveCfg = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.Build.0 = Release|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.Build.0 = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.ActiveCfg = Debug|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.Build.0 = Debug|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.ActiveCfg = Release|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.Build.0 = Release|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.Build.0 = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.Build.0 = Debug|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.ActiveCfg = Debug|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.Build.0 = Debug|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.Build.0 = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.ActiveCfg = Release|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.Build.0 = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|Win32.ActiveCfg = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.ActiveCfg = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.Build.0 = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.Build.0 = Debug|Win32
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.ActiveCfg = Debug|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.Build.0 = Debug|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.ActiveCfg = Release|Win32
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.Build.0 = Release|Win32
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.ActiveCfg = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.Build.0 = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|Win32.ActiveCfg = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.ActiveCfg = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.Build.0 = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.Build.0 = Debug|Win32
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.ActiveCfg = Debug|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.Build.0 = Debug|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.ActiveCfg = Release|Win32
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.Build.0 = Release|Win32
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.ActiveCfg = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.Build.0 = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|Win32.ActiveCfg = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.ActiveCfg = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.Build.0 = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.ActiveCfg = Debug|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.Build.0 = Debug|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.ActiveCfg = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.Build.0 = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|Win32.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.Build.0 = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.Build.0 = Debug|Win32
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.Build.0 = Debug|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.Build.0 = Release|Win32
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.Build.0 = Release|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.Build.0 = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|Win32.ActiveCfg = Debug|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64.ActiveCfg = Debug|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|Win32.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|Win32.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.Build.0 = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.Build.0 = Debug|Win32
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.ActiveCfg = Debug|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.Build.0 = Debug|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.ActiveCfg = Release|Win32
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.Build.0 = Release|Win32
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.Build.0 = Release|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.All|Win32.ActiveCfg = Release|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.ActiveCfg = Release|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.Build.0 = Release|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.Build.0 = Debug|Win32
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.ActiveCfg = Debug|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.Build.0 = Debug|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.ActiveCfg = Release|Win32
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.Build.0 = Release|Win32
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.ActiveCfg = Release|x64
+ {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.Build.0 = Release|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.ActiveCfg = Release|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.Build.0 = Release|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.ActiveCfg = Release|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.Build.0 = Release|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.Build.0 = Debug|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.ActiveCfg = Debug|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.Build.0 = Debug|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.ActiveCfg = Release|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.Build.0 = Release|Win32
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.ActiveCfg = Release|x64
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.Build.0 = Release|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64
+ {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|Win32.ActiveCfg = Release|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.ActiveCfg = Release|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.Build.0 = Release|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.Build.0 = Debug|Win32
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.ActiveCfg = Debug|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.Build.0 = Debug|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.ActiveCfg = Release|Win32
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.Build.0 = Release|Win32
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.ActiveCfg = Release|x64
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.Build.0 = Release|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|Win32.ActiveCfg = Release|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.ActiveCfg = Release|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.Build.0 = Release|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.ActiveCfg = Debug|Win32
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.Build.0 = Debug|Win32
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.ActiveCfg = Debug|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.Build.0 = Debug|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.ActiveCfg = Release|Win32
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.Build.0 = Release|Win32
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.ActiveCfg = Release|x64
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.Build.0 = Release|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|Win32.ActiveCfg = Release|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.ActiveCfg = Release|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.Build.0 = Release|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.Build.0 = Debug|Win32
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.ActiveCfg = Debug|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.Build.0 = Debug|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.ActiveCfg = Release|Win32
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.Build.0 = Release|Win32
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.ActiveCfg = Release|x64
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.Build.0 = Release|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|Win32.ActiveCfg = Release|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.ActiveCfg = Release|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.Build.0 = Release|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.Build.0 = Debug|Win32
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.ActiveCfg = Debug|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.Build.0 = Debug|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.ActiveCfg = Release|Win32
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.Build.0 = Release|Win32
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.ActiveCfg = Release|x64
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.Build.0 = Release|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|Win32.ActiveCfg = Release|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.ActiveCfg = Release|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.Build.0 = Release|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.Build.0 = Debug|Win32
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.ActiveCfg = Debug|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.Build.0 = Debug|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.ActiveCfg = Release|Win32
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.Build.0 = Release|Win32
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.ActiveCfg = Release|x64
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.Build.0 = Release|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|Win32.ActiveCfg = Release|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.ActiveCfg = Release|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.Build.0 = Release|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.Build.0 = Debug|Win32
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.ActiveCfg = Debug|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.Build.0 = Debug|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.ActiveCfg = Release|Win32
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.Build.0 = Release|Win32
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.ActiveCfg = Release|x64
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.Build.0 = Release|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|Win32.ActiveCfg = Release|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.ActiveCfg = Release|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.Build.0 = Release|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.ActiveCfg = Debug|Win32
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.Build.0 = Debug|Win32
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.ActiveCfg = Debug|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.Build.0 = Debug|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.ActiveCfg = Release|Win32
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.Build.0 = Release|Win32
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.ActiveCfg = Release|x64
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.Build.0 = Release|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|Win32.ActiveCfg = Release|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.ActiveCfg = Release|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.Build.0 = Release|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.ActiveCfg = Debug|Win32
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.Build.0 = Debug|Win32
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.ActiveCfg = Debug|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.Build.0 = Debug|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.ActiveCfg = Release|Win32
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.Build.0 = Release|Win32
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.ActiveCfg = Release|x64
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.Build.0 = Release|x64
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.Build.0 = Release|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64
+ {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|Win32.ActiveCfg = Release|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.ActiveCfg = Release|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.Build.0 = Release|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.Build.0 = Debug|Win32
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.ActiveCfg = Debug|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.Build.0 = Debug|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.ActiveCfg = Release|Win32
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.Build.0 = Release|Win32
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.ActiveCfg = Release|x64
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.Build.0 = Release|x64
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.ActiveCfg = Release|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.Build.0 = Release|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|x64.ActiveCfg = Release|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.Build.0 = Debug|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.ActiveCfg = Debug|x64
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.Build.0 = Debug|x64
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.ActiveCfg = Release|x64
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.Build.0 = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|Win32.ActiveCfg = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.ActiveCfg = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.Build.0 = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.Build.0 = Debug|Win32
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.ActiveCfg = Debug|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.Build.0 = Debug|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.ActiveCfg = Release|Win32
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.Build.0 = Release|Win32
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.ActiveCfg = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.Build.0 = Release|x64
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.All|Win32.ActiveCfg = Release|x64
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.ActiveCfg = Release|x64
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.Build.0 = Release|x64
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.Build.0 = Debug|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.ActiveCfg = Debug|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.Build.0 = Debug|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.ActiveCfg = Release|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.Build.0 = Release|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.ActiveCfg = Release|Win32
+ {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.Build.0 = Release|Win32
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|Win32.ActiveCfg = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.ActiveCfg = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.Build.0 = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.Build.0 = Debug|Win32
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.ActiveCfg = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.Build.0 = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.ActiveCfg = Release|Win32
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.Build.0 = Release|Win32
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.ActiveCfg = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.Build.0 = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|Win32.ActiveCfg = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.ActiveCfg = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.Build.0 = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.Build.0 = Debug|Win32
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.ActiveCfg = Debug|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.Build.0 = Debug|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.ActiveCfg = Release|Win32
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.Build.0 = Release|Win32
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.ActiveCfg = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.Build.0 = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|Win32.ActiveCfg = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.ActiveCfg = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.Build.0 = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.Build.0 = Debug|Win32
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.ActiveCfg = Debug|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.Build.0 = Debug|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.ActiveCfg = Release|Win32
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.Build.0 = Release|Win32
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.ActiveCfg = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.Build.0 = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.Build.0 = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.ActiveCfg = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.Build.0 = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.ActiveCfg = Debug|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.Build.0 = Debug|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.ActiveCfg = Debug|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.Build.0 = Debug|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.Build.0 = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.ActiveCfg = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.Build.0 = Release|x64
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.Build.0 = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|x64.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.Build.0 = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.Build.0 = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.Build.0 = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.ActiveCfg = All|Win32
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.Build.0 = All|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.ActiveCfg = Release|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.Build.0 = Release|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|x64.ActiveCfg = Release|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.Build.0 = Debug|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.ActiveCfg = Debug|x64
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.Build.0 = Debug|x64
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.ActiveCfg = Release|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.Build.0 = Release|Win32
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.ActiveCfg = Release|x64
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.Build.0 = Release|x64
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.Build.0 = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|x64.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.Build.0 = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.Build.0 = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.Build.0 = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.ActiveCfg = All|Win32
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.ActiveCfg = Release|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.Build.0 = Release|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.ActiveCfg = Release|x64
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.Build.0 = Release|x64
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.Build.0 = Debug|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.ActiveCfg = Debug|x64
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.Build.0 = Debug|x64
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.ActiveCfg = Release|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.Build.0 = Release|Win32
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.ActiveCfg = Release|x64
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.Build.0 = Release|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.ActiveCfg = Release|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.Build.0 = Release|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.ActiveCfg = Release|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.Build.0 = Release|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.Build.0 = Debug|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.ActiveCfg = Debug|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.Build.0 = Debug|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.ActiveCfg = Release|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.Build.0 = Release|Win32
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.ActiveCfg = Release|x64
+ {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.Build.0 = Release|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.ActiveCfg = Release|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.Build.0 = Release|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.ActiveCfg = Release|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.Build.0 = Release|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.Build.0 = Debug|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.ActiveCfg = Debug|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.Build.0 = Debug|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.ActiveCfg = Release|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.Build.0 = Release|Win32
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.ActiveCfg = Release|x64
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.Build.0 = Release|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.ActiveCfg = Release|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.Build.0 = Release|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.ActiveCfg = Release|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.Build.0 = Release|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.Build.0 = Debug|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.ActiveCfg = Debug|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.Build.0 = Debug|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.ActiveCfg = Release|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.Build.0 = Release|Win32
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.ActiveCfg = Release|x64
+ {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.Build.0 = Release|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.ActiveCfg = Release|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.Build.0 = Release|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.ActiveCfg = Release|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.Build.0 = Release|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.Build.0 = Debug|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.ActiveCfg = Debug|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.Build.0 = Debug|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.ActiveCfg = Release|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.Build.0 = Release|Win32
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.ActiveCfg = Release|x64
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.Build.0 = Release|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.ActiveCfg = Release|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.Build.0 = Release|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.ActiveCfg = Release|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.Build.0 = Release|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.Build.0 = Debug|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.ActiveCfg = Debug|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.Build.0 = Debug|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.ActiveCfg = Release|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.Build.0 = Release|Win32
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.ActiveCfg = Release|x64
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.Build.0 = Release|x64
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|Win32.ActiveCfg = Release|Any CPU
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|x64.ActiveCfg = Release|Any CPU
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|Win32.ActiveCfg = Release|Any CPU
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|x64.ActiveCfg = Release|Any CPU
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|Win32.ActiveCfg = Release|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.ActiveCfg = Release|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.Build.0 = Release|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.Build.0 = Debug|Win32
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.ActiveCfg = Debug|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.Build.0 = Debug|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.ActiveCfg = Release|Win32
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.Build.0 = Release|Win32
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.ActiveCfg = Release|x64
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.Build.0 = Release|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|Win32.ActiveCfg = Release|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.ActiveCfg = Release|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.Build.0 = Release|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.Build.0 = Debug|Win32
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.ActiveCfg = Debug|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.Build.0 = Debug|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.ActiveCfg = Release|Win32
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.Build.0 = Release|Win32
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.ActiveCfg = Release|x64
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.Build.0 = Release|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.ActiveCfg = Release|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.Build.0 = Release|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.ActiveCfg = Release|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.Build.0 = Release|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.Build.0 = Debug|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.ActiveCfg = Debug|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.Build.0 = Debug|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.ActiveCfg = Release|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.Build.0 = Release|Win32
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.ActiveCfg = Release|x64
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.Build.0 = Release|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.ActiveCfg = Release|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.Build.0 = Release|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.ActiveCfg = Release|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.Build.0 = Release|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.Build.0 = Debug|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.ActiveCfg = Debug|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.Build.0 = Debug|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.Build.0 = Release|Win32
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.ActiveCfg = Release|x64
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.Build.0 = Release|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.ActiveCfg = Release|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.Build.0 = Release|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.ActiveCfg = Release|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.Build.0 = Release|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.Build.0 = Debug|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.ActiveCfg = Debug|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.Build.0 = Debug|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.ActiveCfg = Release|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.Build.0 = Release|Win32
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.ActiveCfg = Release|x64
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.Build.0 = Release|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.ActiveCfg = Release|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.Build.0 = Release|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.ActiveCfg = Release|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.Build.0 = Release|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.ActiveCfg = Release|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.Build.0 = Release|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.ActiveCfg = Release|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.Build.0 = Release|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.Build.0 = Debug|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.ActiveCfg = Debug|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.Build.0 = Debug|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.ActiveCfg = Release|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.Build.0 = Release|Win32
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.ActiveCfg = Release|x64
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.Build.0 = Release|x64
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.ActiveCfg = Release|Win32
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.Build.0 = Release|Win32
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.ActiveCfg = Release|x64
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.Build.0 = Release|x64
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|Win32.ActiveCfg = Debug|Win32
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|x64.ActiveCfg = Debug|x64
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|Win32.ActiveCfg = Release|Win32
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|x64.ActiveCfg = Release|x64
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.ActiveCfg = Release|Win32
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.Build.0 = Release|Win32
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.ActiveCfg = Release|x64
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.Build.0 = Release|x64
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|x64.ActiveCfg = Debug|x64
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|Win32.ActiveCfg = Release|Win32
+ {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|x64.ActiveCfg = Release|x64
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.ActiveCfg = Release|Win32
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.Build.0 = Release|Win32
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.ActiveCfg = Release|x64
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.Build.0 = Release|x64
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|Win32.ActiveCfg = Debug|Win32
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|x64.ActiveCfg = Debug|x64
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|Win32.ActiveCfg = Release|Win32
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|x64.ActiveCfg = Release|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.ActiveCfg = Release|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.Build.0 = Release|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.ActiveCfg = Release|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.Build.0 = Release|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.Build.0 = Debug|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.ActiveCfg = Debug|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.Build.0 = Debug|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.ActiveCfg = Release|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.Build.0 = Release|Win32
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.ActiveCfg = Release|x64
+ {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.Build.0 = Release|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.ActiveCfg = Release|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.Build.0 = Release|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.ActiveCfg = Release|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.Build.0 = Release|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.Build.0 = Debug|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.ActiveCfg = Debug|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.Build.0 = Debug|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.ActiveCfg = Release|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.Build.0 = Release|Win32
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.ActiveCfg = Release|x64
+ {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.Build.0 = Release|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.ActiveCfg = Release|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.Build.0 = Release|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.ActiveCfg = Release|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.Build.0 = Release|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.Build.0 = Debug|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.ActiveCfg = Debug|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.Build.0 = Debug|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.ActiveCfg = Release|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.Build.0 = Release|Win32
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.ActiveCfg = Release|x64
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.Build.0 = Release|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.ActiveCfg = Release|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.Build.0 = Release|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.ActiveCfg = Release|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.Build.0 = Release|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.Build.0 = Debug|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.ActiveCfg = Debug|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.Build.0 = Debug|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.ActiveCfg = Release|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.Build.0 = Release|Win32
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.ActiveCfg = Release|x64
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.Build.0 = Release|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.ActiveCfg = Release|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.Build.0 = Release|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.ActiveCfg = Release|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.Build.0 = Release|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.Build.0 = Debug|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.ActiveCfg = Debug|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.Build.0 = Debug|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.ActiveCfg = Release|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.Build.0 = Release|Win32
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.ActiveCfg = Release|x64
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.Build.0 = Release|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.ActiveCfg = Release|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.Build.0 = Release|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.ActiveCfg = Release|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.Build.0 = Release|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.Build.0 = Debug|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.ActiveCfg = Debug|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.Build.0 = Debug|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.ActiveCfg = Release|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.Build.0 = Release|Win32
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.ActiveCfg = Release|x64
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.Build.0 = Release|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.ActiveCfg = Release|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.Build.0 = Release|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.ActiveCfg = Release|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.Build.0 = Release|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.Build.0 = Debug|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.ActiveCfg = Debug|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.Build.0 = Debug|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.ActiveCfg = Release|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.Build.0 = Release|Win32
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.ActiveCfg = Release|x64
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.Build.0 = Release|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.ActiveCfg = Release|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.Build.0 = Release|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.ActiveCfg = Release|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.Build.0 = Release|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.Build.0 = Debug|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.ActiveCfg = Debug|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.Build.0 = Debug|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.ActiveCfg = Release|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.Build.0 = Release|Win32
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.ActiveCfg = Release|x64
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.Build.0 = Release|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.ActiveCfg = Release|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.Build.0 = Release|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.ActiveCfg = Release|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.Build.0 = Release|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.Build.0 = Debug|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.ActiveCfg = Debug|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.Build.0 = Debug|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.ActiveCfg = Release|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.Build.0 = Release|Win32
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.ActiveCfg = Release|x64
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.Build.0 = Release|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.ActiveCfg = Release|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.Build.0 = Release|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.ActiveCfg = Release|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.Build.0 = Release|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.Build.0 = Debug|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.ActiveCfg = Debug|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.Build.0 = Debug|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.ActiveCfg = Release|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.Build.0 = Release|Win32
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.ActiveCfg = Release|x64
+ {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.Build.0 = Release|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.ActiveCfg = Release|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.Build.0 = Release|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.ActiveCfg = Release|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.Build.0 = Release|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.ActiveCfg = Debug|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.Build.0 = Debug|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.ActiveCfg = Debug|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.Build.0 = Debug|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.ActiveCfg = Release|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.Build.0 = Release|Win32
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.ActiveCfg = Release|x64
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.Build.0 = Release|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.ActiveCfg = Release|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.Build.0 = Release|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.ActiveCfg = Release|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.Build.0 = Release|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.ActiveCfg = Debug|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.Build.0 = Debug|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.ActiveCfg = Debug|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.Build.0 = Debug|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.ActiveCfg = Release|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.Build.0 = Release|Win32
+ {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.ActiveCfg = Release|x64
+ {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.Build.0 = Release|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.ActiveCfg = Release|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.Build.0 = Release|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.ActiveCfg = Release|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.Build.0 = Release|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.Build.0 = Debug|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.ActiveCfg = Debug|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.Build.0 = Debug|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.ActiveCfg = Release|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.Build.0 = Release|Win32
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.ActiveCfg = Release|x64
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.Build.0 = Release|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.ActiveCfg = Release|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.Build.0 = Release|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.ActiveCfg = Release|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.Build.0 = Release|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.Build.0 = Debug|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.ActiveCfg = Debug|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.Build.0 = Debug|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.ActiveCfg = Release|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.Build.0 = Release|Win32
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.ActiveCfg = Release|x64
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.Build.0 = Release|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.ActiveCfg = Release|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.Build.0 = Release|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.ActiveCfg = Release|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.Build.0 = Release|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.Build.0 = Debug|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.ActiveCfg = Debug|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.Build.0 = Debug|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.ActiveCfg = Release|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.Build.0 = Release|Win32
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.ActiveCfg = Release|x64
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.Build.0 = Release|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.ActiveCfg = Release|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.Build.0 = Release|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.ActiveCfg = Release|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.Build.0 = Release|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.ActiveCfg = Debug|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.Build.0 = Debug|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.ActiveCfg = Debug|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.Build.0 = Debug|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.ActiveCfg = Release|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.Build.0 = Release|Win32
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.ActiveCfg = Release|x64
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.Build.0 = Release|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.ActiveCfg = Release|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.Build.0 = Release|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.ActiveCfg = Release|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.Build.0 = Release|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.Build.0 = Debug|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.ActiveCfg = Debug|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.Build.0 = Debug|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.ActiveCfg = Release|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.Build.0 = Release|Win32
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.ActiveCfg = Release|x64
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.Build.0 = Release|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.ActiveCfg = Release|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.Build.0 = Release|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.ActiveCfg = Release|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.Build.0 = Release|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.Build.0 = Debug|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.ActiveCfg = Debug|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.Build.0 = Debug|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.ActiveCfg = Release|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.Build.0 = Release|Win32
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.ActiveCfg = Release|x64
+ {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.Build.0 = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.ActiveCfg = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.Build.0 = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.ActiveCfg = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.Build.0 = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|Win32.ActiveCfg = Debug|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|x64.ActiveCfg = Debug|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|Win32.ActiveCfg = Release|x64
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|x64.ActiveCfg = Release|x64
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|Win32.ActiveCfg = Release|Win32
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|Win32.Build.0 = Release|Win32
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|x64.ActiveCfg = Release|x64
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|x64.Build.0 = Release|x64
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Debug|x64.ActiveCfg = Debug|x64
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|Win32.ActiveCfg = Release|Win32
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|x64.ActiveCfg = Release|x64
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|Win32.ActiveCfg = Release|Win32
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|Win32.Build.0 = Release|Win32
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|x64.ActiveCfg = Release|x64
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|x64.Build.0 = Release|x64
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Debug|x64.ActiveCfg = Debug|x64
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|Win32.ActiveCfg = Release|Win32
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|x64.ActiveCfg = Release|x64
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|Win32.ActiveCfg = Release|Win32
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|Win32.Build.0 = Release|Win32
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|x64.ActiveCfg = Release|x64
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|x64.Build.0 = Release|x64
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|Win32.Build.0 = Debug|Win32
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|x64.ActiveCfg = Debug|x64
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|x64.Build.0 = Debug|x64
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Release|Win32.ActiveCfg = Release|Win32
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Release|x64.ActiveCfg = Release|x64
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|Win32.ActiveCfg = Release|Win32
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|Win32.Build.0 = Release|Win32
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|x64.ActiveCfg = Release|x64
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|x64.Build.0 = Release|x64
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|Win32.Build.0 = Debug|Win32
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|x64.ActiveCfg = Debug|x64
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|x64.Build.0 = Debug|x64
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|Win32.ActiveCfg = Release|Win32
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|x64.ActiveCfg = Release|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|Win32.ActiveCfg = Release|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|Win32.Build.0 = Release|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|x64.ActiveCfg = Release|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|x64.Build.0 = Release|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|Win32.Build.0 = Debug|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|x64.ActiveCfg = Debug|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|x64.Build.0 = Debug|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|Win32.ActiveCfg = Release|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|Win32.Build.0 = Release|Win32
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|x64.ActiveCfg = Release|x64
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} = {57D119DC-484F-420F-B9E9-8589FD9A8DF8}
+ {CDE9B06A-3C27-4987-8FAE-DF1006BC705D} = {DB1024A8-41BF-4AD7-9AE6-13202230D1F3}
+ {3C90CCF0-2CDD-4A7A-ACFF-208C1E271692} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
+ {C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
+ {FC71C66E-E268-4EAD-B1F5-F008DC382E83} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
+ {8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
+ {09455AA9-C243-4F16-A1A1-A016881A2765} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}
+ {57199684-EC63-4A60-9DC6-11815AF6B413} = {09455AA9-C243-4F16-A1A1-A016881A2765}
+ {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} = {09455AA9-C243-4F16-A1A1-A016881A2765}
+ {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} = {09455AA9-C243-4F16-A1A1-A016881A2765}
+ {D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}
+ {CC3E7F48-2590-49CB-AD8B-BE3650F55462} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}
+ {765EF1B9-5027-4820-BC37-A44466A51631} = {57199684-EC63-4A60-9DC6-11815AF6B413}
+ {713E4747-1126-40B1-BD84-58F9A7745423} = {57199684-EC63-4A60-9DC6-11815AF6B413}
+ {F1B71990-EB04-4EB5-B28A-BC3EB6F7E843} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
+ {3DAF028C-AB5B-4183-A01B-DCC43F5A87F0} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}
+ {62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A}
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC}
+ {A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
+ {784113EF-44D9-4949-835D-7065D3C7AD08} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {89385C74-5860-4174-9CAF-A39E7C48909C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {9B9D2551-D6BD-4F20-8BE5-DE30E154A064} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {8B754330-A434-4791-97E5-1EE67060BAC0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {692F6330-4D87-4C82-81DF-40DB5892636E} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {1C453396-D912-4213-89FD-9B489162B7B5} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {C24FB505-05D7-4319-8485-7540B44C8603} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {05515420-16DE-4E63-BE73-85BE85BA5142} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {1906D736-08BD-4EE1-924F-B536249B9A54} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5}
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {2C3C2423-234B-4772-8899-D3B137E5CA35} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {3850D93A-5F24-4922-BC1C-74D08C37C256} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {F6A33240-8F29-48BD-98F0-826995911799} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {94001A0E-A837-445C-8004-F918F10D0226} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {2286DA73-9FC5-45BC-A508-85994C3317AB} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {7EB71250-F002-4ED8-92CA-CA218114537A} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {464AAB78-5489-4916-BE51-BF8D61822311} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {419C8F80-D858-4B48-A25C-AF4007608137} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {0B6C905B-142E-4999-B39D-92FF7951E921} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {05C9FB27-480E-4D53-B3B7-6338E2526666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {48414740-C693-4968-9846-EE058020C64F} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {BA599D0A-4310-4505-91DA-6A6447B3E289} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {432DB165-1EB2-4781-A9C0-71E62610B20A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {504B3154-7A4F-459D-9877-B951021C3F1F} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9} = {62F27B1A-C919-4A70-8478-51F178F3B18F}
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {05C9FB27-480E-4D53-B3B7-7338E2514666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {7C22BDFF-CC09-400C-8A09-660733980028} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {50AAC2CE-BFC9-4912-87CC-C6381850D735} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {4748FF56-CA85-4809-97D6-A94C0FAC1D77} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {2469B306-B027-4FF2-8815-C9C1EA2CAE79} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {9DE35039-A8F6-4FBF-B1B6-EB527F802411} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {74B120FF-6935-4DFE-A142-CDB6BEA99C90} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
+ {BED7539C-0099-4A14-AD5D-30828F15A171} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
+ {0D108721-EAE8-4BAF-8102-D8960EC93647} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
+ {B535402E-38D2-4D54-8360-423ACBD17192} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411}
+ {2386B892-35F5-46CF-A0F0-10394D2FBF9B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {ED2CA8B5-8E91-4296-A120-02BB0B674652} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
+ {245603E3-F580-41A5-9632-B25FE3372CBF} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
+ {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
+ {8484C90D-1561-402F-A91D-2DB10F8C5171} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
+ {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {ED2CA8B5-8E91-4296-A120-02BB0B674652}
+ {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0} = {0C808854-54D1-4230-BFF5-77B5FD905000}
+ {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
+ {B6E22500-3DB6-4E6E-8CD5-591B781D7D99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {841C345F-FCC7-4F64-8F54-0281CEABEB01} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {7AEE504B-23B6-4B05-829E-7CD34855F146} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {20179127-853B-4FE9-B7C0-9E817E6A3A72} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {87933C2D-0159-46F7-B326-E1B6E982C21E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {19E934D6-1484-41C8-9305-78DC42FD61F2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17} = {F881ADA2-2F1A-4046-9FEB-191D9422D781}
+ {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {CEEE31E6-8A08-42C7-BEBD-5EC12072C136} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {0E469F3A-DDD0-43BA-A94F-7D93C02219F3} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {A3D7C6CF-AEB1-4159-B741-160EB4B37345} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {DA7ADDF1-DA33-4194-83A5-B48DB714D35B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {AF675478-995A-4115-90C4-B2B0D6470688} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {07EA6E5A-D181-4ABB-BECF-67A906867D04} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {20B15650-F910-4211-8729-AAB0F520C805} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7} = {6CD61A1D-797C-470A-BE08-8C31B68BB336}
+ {096C9A84-55B2-4F9B-97E5-0FDF116FD25F} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {2CA661A7-01DD-4532-BF88-B6629DFB544A} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {40C4E2A2-B49B-496C-96D6-C04B890F7F88} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {0A130A8B-3076-4619-BADF-9E86F621AEEC} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {4DFF29B4-2976-447D-A8B3-43476451517C} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
+ {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B}
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625} = {9388C266-C3FC-468A-92EF-0CBC35941412}
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3} = {9388C266-C3FC-468A-92EF-0CBC35941412}
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31} = {4F227C26-768F-46A3-8684-1D08A46FB374}
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E}
+ EndGlobalSection
+EndGlobal
diff --git a/Makefile.am b/Makefile.am
index 907b832916..759189ecee 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
EXTRA_DIST =
-SUBDIRS = . src build
+SUBDIRS = . src build tests/unit
AUTOMAKE_OPTIONS = foreign subdir-objects
NAME = freeswitch
@@ -271,6 +271,11 @@ CORE_LIBS += libs/libzrtp/libzrtp.a
LIBS += libs/libzrtp/third_party/bnlib/libbn.a
endif
+library_includetestdir = $(includedir)/test
+library_includetest_HEADERS = \
+ src/include/test/switch_fct.h \
+ src/include/test/switch_test.h
+
library_includedir = $(includedir)
library_include_HEADERS = \
src/include/switch_am_config.h \
@@ -693,6 +698,9 @@ nodepends: .nodepends
yesdepends:
rm .nodepends
+iksemel-dep:
+ make -C src/mod/endpoints/mod_dingaling deps
+
core: $(switch_builddir)/modules.conf src/include/switch_version.h $(CORE_LIBS)
$(MAKE) $(AM_MAKEFLAGS) libfreeswitch.la
@@ -857,16 +865,3 @@ support:
@cp support-d/.bashrc ~
@test -f ~/.cc-mode-installed || sh support-d/install-cc-mode.sh && touch ~/.cc-mode-installed
-# Using a non-recursive Makefile structure for the automated tests so that the tests have visibility into
-# targets in the rest of the FreeSWITCH tree. This greatly simplifies dependency tracking at the expense
-# of longer test target names. Since the tests are expected to be run easily and rapidly after minor source
-# changes this is the most effective structure.
-
-check_PROGRAMS =
-
-include tests/unit/unit.mk
-
-TESTS = $(check_PROGRAMS)
-
-tests: $(check_PROGRAMS)
-
diff --git a/build/modules.conf.in b/build/modules.conf.in
index d998e5dba8..a3297e744c 100644
--- a/build/modules.conf.in
+++ b/build/modules.conf.in
@@ -39,6 +39,7 @@ applications/mod_httapi
#applications/mod_rad_auth
#applications/mod_redis
#applications/mod_rss
+applications/mod_signalwire
applications/mod_sms
#applications/mod_sms_flowroute
#applications/mod_snapshot
diff --git a/build/modules.conf.most b/build/modules.conf.most
index b442b966e6..a4946004d2 100644
--- a/build/modules.conf.most
+++ b/build/modules.conf.most
@@ -38,6 +38,7 @@ applications/mod_prefix
#applications/mod_rad_auth
applications/mod_redis
applications/mod_rss
+applications/mod_signalwire
applications/mod_sms
applications/mod_snapshot
applications/mod_snom
diff --git a/conf/insideout/autoload_configs/modules.conf.xml b/conf/insideout/autoload_configs/modules.conf.xml
index 3e2b09cdcb..5078503489 100644
--- a/conf/insideout/autoload_configs/modules.conf.xml
+++ b/conf/insideout/autoload_configs/modules.conf.xml
@@ -37,6 +37,7 @@
+
diff --git a/conf/minimal/autoload_configs/modules.conf.xml b/conf/minimal/autoload_configs/modules.conf.xml
index 37ece9d202..a57544f2fe 100644
--- a/conf/minimal/autoload_configs/modules.conf.xml
+++ b/conf/minimal/autoload_configs/modules.conf.xml
@@ -17,6 +17,7 @@
+
diff --git a/conf/rayo/autoload_configs/modules.conf.xml b/conf/rayo/autoload_configs/modules.conf.xml
index f6c58680bc..ee44e06c57 100644
--- a/conf/rayo/autoload_configs/modules.conf.xml
+++ b/conf/rayo/autoload_configs/modules.conf.xml
@@ -14,6 +14,7 @@
+
diff --git a/conf/sbc/autoload_configs/modules.conf.xml b/conf/sbc/autoload_configs/modules.conf.xml
index 579b1d33be..31f46a4128 100644
--- a/conf/sbc/autoload_configs/modules.conf.xml
+++ b/conf/sbc/autoload_configs/modules.conf.xml
@@ -26,6 +26,7 @@
+
diff --git a/conf/softphone/freeswitch.xml b/conf/softphone/freeswitch.xml
index 771efd9544..5fbc0cbd39 100644
--- a/conf/softphone/freeswitch.xml
+++ b/conf/softphone/freeswitch.xml
@@ -89,6 +89,7 @@
+
diff --git a/conf/vanilla/autoload_configs/av.conf.xml b/conf/vanilla/autoload_configs/av.conf.xml
index 7d0390646a..cf28fab3d3 100644
--- a/conf/vanilla/autoload_configs/av.conf.xml
+++ b/conf/vanilla/autoload_configs/av.conf.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/conf/vanilla/autoload_configs/curl.conf.xml b/conf/vanilla/autoload_configs/curl.conf.xml
new file mode 100644
index 0000000000..eff3c6b9ac
--- /dev/null
+++ b/conf/vanilla/autoload_configs/curl.conf.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml
index 2c465d1231..0b336a168d 100644
--- a/conf/vanilla/autoload_configs/modules.conf.xml
+++ b/conf/vanilla/autoload_configs/modules.conf.xml
@@ -50,6 +50,7 @@
+
diff --git a/configure.ac b/configure.ac
index b7b79a7ada..78914e608f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -595,7 +595,7 @@ AC_SUBST(SYS_XMLRPC_CFLAGS)
AC_SUBST(SYS_XMLRPC_LDFLAGS)
AM_CONDITIONAL([SYSTEM_XMLRPCC],[test "${enable_xmlrpcc}" = "yes"])
-for luaversion in lua5.2 lua-5.2 lua52 lua5.1 lua-5.1 lua; do
+for luaversion in luajit lua5.2 lua-5.2 lua52 lua5.1 lua-5.1 lua; do
PKG_CHECK_MODULES([LUA],[${luaversion}],[have_lua=yes],[have_lua=no])
if test ${have_lua} = yes; then
break
@@ -1498,6 +1498,14 @@ PKG_CHECK_MODULES([V8FS_STATIC], [v8-6.1_static >= 6.1.298],[
])
])
+PKG_CHECK_MODULES([KS], [libks >= 1.1.0],[
+ AM_CONDITIONAL([HAVE_KS],[true])],[
+ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_KS],[false])])
+
+PKG_CHECK_MODULES([SIGNALWIRE_CLIENT], [signalwire_client >= 1.0.0],[
+ AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[true])],[
+ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[false])])
+
PKG_CHECK_MODULES([AMQP], [librabbitmq >= 0.5.2],[
AM_CONDITIONAL([HAVE_AMQP],[true])],[
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_AMQP],[false])])
@@ -1807,6 +1815,7 @@ ac_cv_file_dbd_apr_dbd_mysql_c=no
AC_CONFIG_FILES([Makefile
build/Makefile
+ tests/unit/Makefile
src/Makefile
src/mod/Makefile
src/mod/applications/mod_abstraction/Makefile
@@ -1852,6 +1861,7 @@ AC_CONFIG_FILES([Makefile
src/mod/applications/mod_redis/Makefile
src/mod/applications/mod_rss/Makefile
src/mod/applications/mod_skel/Makefile
+ src/mod/applications/mod_signalwire/Makefile
src/mod/applications/mod_sms/Makefile
src/mod/applications/mod_sms_flowroute/Makefile
src/mod/applications/mod_snapshot/Makefile
@@ -1861,6 +1871,8 @@ AC_CONFIG_FILES([Makefile
src/mod/applications/mod_spandsp/Makefile
src/mod/applications/mod_spy/Makefile
src/mod/applications/mod_stress/Makefile
+ src/mod/applications/mod_test/Makefile
+ src/mod/applications/mod_test/test/Makefile
src/mod/applications/mod_translate/Makefile
src/mod/applications/mod_valet_parking/Makefile
src/mod/applications/mod_vmd/Makefile
@@ -1927,6 +1939,7 @@ AC_CONFIG_FILES([Makefile
src/mod/event_handlers/mod_radius_cdr/Makefile
src/mod/event_handlers/mod_odbc_cdr/Makefile
src/mod/event_handlers/mod_rayo/Makefile
+ src/mod/event_handlers/mod_rayo/test/Makefile
src/mod/event_handlers/mod_smpp/Makefile
src/mod/event_handlers/mod_snmp/Makefile
src/mod/event_handlers/mod_event_zmq/Makefile
@@ -1980,6 +1993,7 @@ AC_CONFIG_FILES([Makefile
src/mod/xml_int/mod_xml_rpc/Makefile
src/mod/xml_int/mod_xml_scgi/Makefile
src/mod/applications/mod_av/Makefile
+ src/mod/applications/mod_av/test/Makefile
src/mod/applications/mod_video_filter/Makefile
src/include/switch_am_config.h
build/getsounds.sh
diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh
index 4ce68473fd..18c221bf5a 100755
--- a/debian/bootstrap.sh
+++ b/debian/bootstrap.sh
@@ -343,7 +343,7 @@ EOF
print_core_control () {
cat <= 3.0-6), sysvinit | sysvinit-utils
Conflicts: freeswitch-init
Provides: freeswitch-init
@@ -1021,7 +1022,7 @@ EOF
else
cat <su_family, SU_ADDR(su), name, sizeof(name));
- snprintf(stamp, 128,
+ snprintf(stamp, 144,
"%s "MOD_ZU" bytes %s %s/[%s]:%u%s%s at %02u:%02u:%02u.%06lu:\n",
what, (size_t)n, via, self->tp_name->tpn_proto,
name, ntohs(su->su_port), label[0] ? label : "", comp,
diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
index ced491d829..8d6de2909b 100644
--- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
+++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c
@@ -254,10 +254,10 @@ int ws_handshake(wsh_t *wsh)
char version[5] = "";
char proto[256] = "";
char proto_buf[384] = "";
- char input[256] = "";
+ char input[512] = "";
unsigned char output[SHA1_HASH_SIZE] = "";
char b64[256] = "";
- char respond[512] = "";
+ char respond[1024] = "";
ssize_t bytes;
char *p, *e = 0;
diff --git a/libs/unimrcp/libs/apr-toolkit/include/apt_log.h b/libs/unimrcp/libs/apr-toolkit/include/apt_log.h
index a9ec8d91c6..9e022c3163 100644
--- a/libs/unimrcp/libs/apr-toolkit/include/apt_log.h
+++ b/libs/unimrcp/libs/apr-toolkit/include/apt_log.h
@@ -58,11 +58,11 @@ APT_BEGIN_EXTERN_C
/** Format to log string identifiers and resources */
#define APT_SIDRES_FMT "<%s@%s>"
/** Format to log pointers and identifiers */
-#define APT_PTRSID_FMT APT_PTR_FMT" "APT_SID_FMT
+#define APT_PTRSID_FMT APT_PTR_FMT" " APT_SID_FMT
/** Format to log pointers and identifiers */
-#define APT_NAMESID_FMT "%s "APT_SID_FMT
+#define APT_NAMESID_FMT "%s " APT_SID_FMT
/** Format to log names, identifiers and resources */
-#define APT_NAMESIDRES_FMT "%s "APT_SIDRES_FMT
+#define APT_NAMESIDRES_FMT "%s " APT_SIDRES_FMT
/** Priority of log messages ordered from highest priority to lowest (rfc3164) */
typedef enum {
diff --git a/libs/unimrcp/platforms/umc/src/umcconsole.cpp b/libs/unimrcp/platforms/umc/src/umcconsole.cpp
index 3165854082..a065208a91 100644
--- a/libs/unimrcp/platforms/umc/src/umcconsole.cpp
+++ b/libs/unimrcp/platforms/umc/src/umcconsole.cpp
@@ -246,7 +246,7 @@ void UmcConsole::Usage()
{
printf(
"\n"
- " * "UNI_COPYRIGHT"\n"
+ " * " UNI_COPYRIGHT"\n"
" *\n"
UNI_LICENSE"\n"
"\n"
diff --git a/libs/unimrcp/platforms/umc/src/umcscenario.cpp b/libs/unimrcp/platforms/umc/src/umcscenario.cpp
index 085aa755fb..d9300dcf3c 100644
--- a/libs/unimrcp/platforms/umc/src/umcscenario.cpp
+++ b/libs/unimrcp/platforms/umc/src/umcscenario.cpp
@@ -221,7 +221,7 @@ const char* UmcScenario::LoadFileContent(const char* pFileName, apr_size_t& size
size = (apr_size_t)finfo.size;
char* pContent = (char*) apr_palloc(pool,size+1);
- apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Load File Content size [%"APR_SIZE_T_FMT" bytes] %s",size,pFilePath);
+ apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Load File Content size [%" APR_SIZE_T_FMT" bytes] %s",size,pFilePath);
if(apr_file_read(pFile,pContent,&size) != APR_SUCCESS)
{
apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Read Content %s",pFilePath);
diff --git a/libs/win32/Sound_Files/48khz.2017.vcxproj b/libs/win32/Sound_Files/48khz.2017.vcxproj
new file mode 100644
index 0000000000..66b65f2584
--- /dev/null
+++ b/libs/win32/Sound_Files/48khz.2017.vcxproj
@@ -0,0 +1,65 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ 48khz
+ My48khz
+ {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}
+
+
+
+ Utility
+ MultiByte
+ true
+ v141
+
+
+ Utility
+ MultiByte
+ true
+ v141
+
+
+ Utility
+ MultiByte
+ v141
+
+
+ Utility
+ MultiByte
+ v141
+
+
+ en-us-callie
+ 48000
+ en\us\callie\voicemail\$(SoundQuality)
+
+
+ $(PlatformName)\$(Configuration)\$(ProjectName)\$(SoundQuality)
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/48khzmusic.2017.vcxproj b/libs/win32/Sound_Files/48khzmusic.2017.vcxproj
new file mode 100644
index 0000000000..c9eeb07288
--- /dev/null
+++ b/libs/win32/Sound_Files/48khzmusic.2017.vcxproj
@@ -0,0 +1,65 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ 48khz music
+ My48khzmusic
+ {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}
+
+
+
+ Utility
+ MultiByte
+ true
+ v141
+
+
+ Utility
+ MultiByte
+ true
+ v141
+
+
+ Utility
+ MultiByte
+ v141
+
+
+ Utility
+ MultiByte
+ v141
+
+
+ music
+ 48000
+ music\$(SoundQuality)
+
+
+ $(PlatformName)\$(Configuration)\$(ProjectName)\$(SoundQuality)
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj
index 6ab4c5f3bc..a8c70cd22a 100644
--- a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj
+++ b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj
@@ -16,7 +16,7 @@
10.0.17134.0
{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}
-
+
@@ -52,6 +52,11 @@
+
+
+ BUILDING_avdevice;BUILDING_avfilter;BUILDING_avformat;BUILDING_avcodec;BUILDING_avresample;BUILDING_swresample;BUILDING_swscale;BUILDING_avutil;%(PreprocessorDefinitions)
+
+
X64
@@ -117,9 +122,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -225,6 +227,12 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -279,6 +287,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -318,10 +329,10 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -330,6 +341,15 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -348,6 +368,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -444,6 +467,21 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -498,6 +536,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -510,7 +551,7 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -693,9 +734,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -720,6 +758,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -747,9 +788,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -768,12 +806,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -819,6 +851,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -846,15 +881,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -879,9 +905,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -975,12 +998,18 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -996,6 +1025,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1029,12 +1061,18 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1131,12 +1169,18 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1245,9 +1289,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1290,6 +1331,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1416,6 +1460,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1509,9 +1556,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1584,6 +1628,33 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1644,6 +1715,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1671,21 +1745,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1704,9 +1766,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1719,6 +1778,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1809,12 +1871,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1839,9 +1895,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1887,6 +1940,27 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -1896,9 +1970,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2022,9 +2093,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2052,6 +2120,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2064,9 +2135,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2256,6 +2324,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2406,9 +2477,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2505,9 +2573,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2520,6 +2585,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2652,15 +2720,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2706,15 +2765,27 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2724,6 +2795,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2736,6 +2810,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2745,6 +2822,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2805,6 +2885,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2835,6 +2918,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2889,6 +2975,12 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2934,15 +3026,27 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -2952,12 +3056,18 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3021,9 +3131,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3054,6 +3161,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3078,6 +3188,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3099,6 +3212,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3141,6 +3257,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3174,6 +3293,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3183,6 +3305,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3198,6 +3323,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3270,9 +3398,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3315,6 +3440,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3330,6 +3458,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3420,7 +3551,7 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3447,6 +3578,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3507,6 +3641,12 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3528,6 +3668,12 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3573,21 +3719,24 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3597,6 +3746,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3618,6 +3770,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3627,6 +3782,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3702,6 +3860,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3744,6 +3905,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3819,6 +3983,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3849,6 +4016,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3903,12 +4073,6 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
-
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -3918,6 +4082,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4038,6 +4205,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4101,6 +4271,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4221,6 +4394,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4314,6 +4490,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4491,6 +4670,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4659,6 +4841,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4683,9 +4868,15 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -4821,6 +5012,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -5013,6 +5207,9 @@
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
@@ -5395,11 +5592,6 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- Assembling %(Filename)%(Extension)
- $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5605,11 +5797,6 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
- Assembling %(Filename)%(Extension)
- $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
- $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
-
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5635,6 +5822,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5805,6 +5997,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5815,6 +6012,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5840,6 +6042,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5870,6 +6077,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
@@ -5950,6 +6162,11 @@
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
$(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
+ Assembling %(Filename)%(Extension)
+ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
+ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj
+
Assembling %(Filename)%(Extension)
$(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)"
diff --git a/scripts/lua/sound_test.lua b/scripts/lua/sound_test.lua
index e29c2f9ca7..ee169f88f2 100644
--- a/scripts/lua/sound_test.lua
+++ b/scripts/lua/sound_test.lua
@@ -60,15 +60,15 @@ else
-- Looks good, let's play some sound files
sound_base = session:getVariable('sounds_dir') .. '/en/us/callie/' .. stype .. '/' .. srate;
input_file = '/tmp/filez.txt';
- res = os.execute('ls -1 ' .. sound_base .. ' > ' .. input_file);
- freeswitch.consoleLog("INFO","Result of system call: " .. res .. "\n");
- if ( res == 0 ) then
+ res, what, code = os.execute('ls -1 ' .. sound_base .. ' > ' .. input_file);
+ freeswitch.consoleLog("INFO","Result of system call: " .. what .. " " .. code .. "\n");
+ if ( res == true and what == 'exit' and code == 0 ) then
for fname in io.lines(input_file) do
freeswitch.consoleLog("NOTICE","Playing file: " .. fname .. "\n");
session:streamFile(sound_base .. '/' .. fname);
session:sleep(100);
end
else
- freeswitch.consoleLog("ERR","Result of system call: " .. res .. "\n");
+ freeswitch.consoleLog("ERR","Result of system call: " .. what .. " " .. code .. "\n");
end
end
\ No newline at end of file
diff --git a/scripts/perl/FreeSWITCH/debian/control b/scripts/perl/FreeSWITCH/debian/control
index 06a93806cb..a726d87d90 100644
--- a/scripts/perl/FreeSWITCH/debian/control
+++ b/scripts/perl/FreeSWITCH/debian/control
@@ -9,7 +9,7 @@ Build-Depends-Indep: perl (>= 5.8.0-7), libmodule-install-perl,
Maintainer: Massimo Cetra
Package: libfreeswitch-client-perl
-Architecture: all
+Architecture: amd64
Depends: ${perl:Depends}, ${misc:Depends}, libmodule-scandeps-perl (>= 0.51), libio-socket-ssl-perl (>= 0.97)
Recommends: gnupg, libmodule-signature-perl, libpar-packer-perl
Description: FreeSWITCH Client perl library
diff --git a/src/include/test/switch_fct.h b/src/include/test/switch_fct.h
new file mode 100644
index 0000000000..8cd01cb77a
--- /dev/null
+++ b/src/include/test/switch_fct.h
@@ -0,0 +1,3956 @@
+/*
+====================================================================
+Copyright (c) 2008 Ian Blumel. All rights reserved.
+
+FCTX (Fast C Test) Unit Testing Framework
+
+Copyright (c) 2008, Ian Blumel (ian.blumel@gmail.com)
+All rights reserved.
+
+This license is based on the BSD License.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of, Ian Blumel, nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+====================================================================
+
+File: fct.h
+*/
+
+#if !defined(FCT_INCLUDED__IMB)
+#define FCT_INCLUDED__IMB
+
+/* Configuration Values. You can over-ride these values in your own
+header, then include this header. For example, in your file, myfct.h,
+
+ #define FCT_DEFAULT_LOGGER "standard"
+ #include "fct.h"
+
+then if your unit tests included, myfct.h, you would default to work
+with a standard logger. */
+
+#if !defined(FCT_DEFAULT_LOGGER)
+# define FCT_DEFAULT_LOGGER "standard"
+#endif /* !FCT_DEFAULT_LOGGER */
+
+#define FCT_VERSION_MAJOR 1
+#define FCT_VERSION_MINOR 6
+#define FCT_VERSION_MICRO 1
+
+#define _FCT_QUOTEME(x) #x
+#define FCT_QUOTEME(x) _FCT_QUOTEME(x)
+
+#define FCT_VERSION_STR (FCT_QUOTEME(FCT_VERSION_MAJOR) "."\
+ FCT_QUOTEME(FCT_VERSION_MINOR) "."\
+ FCT_QUOTEME(FCT_VERSION_MICRO))
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define FCT_MAX_NAME 256
+#define FCT_MAX_LOG_LINE 256
+
+#define nbool_t int
+#define FCT_TRUE 1
+#define FCT_FALSE 0
+
+#define FCTMIN(x, y) ( x < y) ? (x) : (y)
+
+#ifndef __INTEL_COMPILER
+/* Use regular assertions for non-Intel compilers */
+#define FCT_ASSERT(expr) assert(expr)
+#else
+/* Silence Intel warnings on assert(expr && "str") or assert("str") */
+#define FCT_ASSERT(expr) do { \
+ _Pragma("warning(push,disable:279)"); \
+ assert(expr); \
+ _Pragma("warning(pop)"); \
+ } while (0)
+#endif
+
+#if defined(__cplusplus)
+#define FCT_EXTERN_C extern "C"
+#else
+#define FCT_EXTERN_C
+#endif
+
+/* Forward declarations. The following forward declarations are required
+because there is a inter-relationship between certain objects that
+just can not be untwined. */
+typedef struct _fct_logger_evt_t fct_logger_evt_t;
+typedef struct _fct_logger_i fct_logger_i;
+typedef struct _fct_logger_types_t fct_logger_types_t;
+typedef struct _fct_standard_logger_t fct_standard_logger_t;
+typedef struct _fct_junit_logger_t fct_junit_logger_t;
+typedef struct _fct_minimal_logger_t fct_minimal_logger_t;
+typedef struct _fctchk_t fctchk_t;
+typedef struct _fct_test_t fct_test_t;
+typedef struct _fct_ts_t fct_ts_t;
+typedef struct _fctkern_t fctkern_t;
+
+/* Forward declare some functions used throughout. */
+static fct_logger_i*
+fct_standard_logger_new(void);
+
+static fct_logger_i*
+fct_minimal_logger_new(void);
+
+static fct_junit_logger_t *
+fct_junit_logger_new(void);
+
+static void
+fct_logger__del(fct_logger_i *logger);
+
+static void
+fct_logger__on_chk(fct_logger_i *self, fctchk_t const *chk);
+
+static void
+fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test);
+
+static void
+fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test);
+
+static void
+fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts);
+
+static void
+fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts);
+
+static void
+fct_logger__on_test_suite_skip(
+ fct_logger_i *logger,
+ char const *condition,
+ char const *name
+);
+
+static void
+fct_logger__on_test_skip(
+ fct_logger_i *logger,
+ char const *condition,
+ char const *name
+);
+
+
+static void
+fct_logger__on_warn(fct_logger_i *logger, char const *warn);
+
+
+
+/* Explicitly indicate a no-op */
+#define fct_pass()
+
+#define fct_unused(x) (void)(x)
+
+/* This is just a little trick to let me put comments inside of macros. I
+really only want to bother with this when we are "unwinding" the macros
+for debugging purposes. */
+#if defined(FCT_CONF_UNWIND)
+# define _fct_cmt(string) {char*_=string;}
+#else
+# define _fct_cmt(string)
+#endif
+
+/*
+--------------------------------------------------------
+UTILITIES
+--------------------------------------------------------
+*/
+
+
+/* STDIO and STDERR redirect support */
+#define FCT_PIPE_RESERVE_BYTES_DEFAULT 512
+static int fct_stdout_pipe[2];
+static int fct_stderr_pipe[2];
+static int fct_saved_stdout;
+static int fct_saved_stderr;
+
+/* Platform independent pipe functions. TODO: Look to figure this out in a way
+that follows the ISO C++ conformant naming convention. */
+#if defined(WIN32)
+# include
+# include
+# define _fct_pipe(_PFDS_) \
+ _pipe((_PFDS_), FCT_PIPE_RESERVE_BYTES_DEFAULT, _O_TEXT)
+# define _fct_dup _dup
+# define _fct_dup2 _dup2
+# define _fct_close _close
+# define _fct_read _read
+/* Until I can figure a better way to do this, rely on magic numbers. */
+# define STDOUT_FILENO 1
+# define STDERR_FILENO 2
+#else
+# include
+# define _fct_pipe pipe
+# define _fct_dup dup
+# define _fct_dup2 dup2
+# define _fct_close close
+# define _fct_read read
+#endif /* WIN32 */
+
+
+
+
+static void
+fct_switch_std_to_buffer(int std_pipe[2], FILE *out, int fileno_, int *save_handle)
+{
+ fflush(out);
+ *save_handle = _fct_dup(fileno_);
+ if ( _fct_pipe(std_pipe) != 0 )
+ {
+ exit(1);
+ }
+ _fct_dup2(std_pipe[1], fileno_);
+ _fct_close(std_pipe[1]);
+}
+
+
+static void
+fct_switch_std_to_std(FILE *out, int fileno_, int save_handle)
+{
+ fflush(out);
+ _fct_dup2(save_handle, fileno_);
+}
+
+
+#define FCT_SWITCH_STDOUT_TO_BUFFER() \
+ fct_switch_std_to_buffer(fct_stdout_pipe, stdout, STDOUT_FILENO, &fct_saved_stdout)
+#define FCT_SWITCH_STDOUT_TO_STDOUT() \
+ fct_switch_std_to_std(stdout, STDOUT_FILENO, fct_saved_stdout)
+#define FCT_SWITCH_STDERR_TO_BUFFER() \
+ fct_switch_std_to_buffer(fct_stderr_pipe, stderr, STDERR_FILENO, &fct_saved_stderr)
+#define FCT_SWITCH_STDERR_TO_STDERR() \
+ fct_switch_std_to_std(stderr, STDERR_FILENO, fct_saved_stderr)
+
+
+/* Utility for truncated, safe string copies. The NUM
+should be the length of DST plus the null-terminator. */
+static void
+fctstr_safe_cpy(char *dst, char const *src, size_t num)
+{
+ FCT_ASSERT( dst != NULL );
+ FCT_ASSERT( src != NULL );
+ FCT_ASSERT( num > 0 );
+#if defined(WIN32) && _MSC_VER >= 1400
+ strncpy_s(dst, num, src, _TRUNCATE);
+#else
+ strncpy(dst, src, num);
+#endif
+ dst[num-1] = '\0';
+}
+
+/* Isolate the vsnprintf implementation */
+static int
+fct_vsnprintf(char *buffer,
+ size_t buffer_len,
+ char const *format,
+ va_list args)
+{
+ int count =0;
+ /* Older Microsoft compilers where not ANSI compliant with this
+ function and you had to use _vsnprintf. I will assume that newer
+ Microsoft Compilers start implementing vsnprintf. */
+#if defined(_MSC_VER) && (_MSC_VER < 1400)
+ count = _vsnprintf(buffer, buffer_len, format, args);
+#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+ count = vsnprintf_s(buffer, buffer_len, _TRUNCATE, format, args);
+#else
+ count = vsnprintf(buffer, buffer_len, format, args);
+#endif
+ return count;
+}
+
+
+/* Isolate the snprintf implementation. */
+static int
+fct_snprintf(char *buffer, size_t buffer_len, char const *format, ...)
+{
+ int count =0;
+ va_list args;
+ va_start(args, format);
+ count =fct_vsnprintf(buffer, buffer_len, format, args);
+ va_end(args);
+ return count;
+}
+
+
+/* Helper to for cloning strings on the heap. Returns NULL for
+an out of memory condition. */
+static char*
+fctstr_clone(char const *s)
+{
+ char *k =NULL;
+ size_t klen =0;
+ FCT_ASSERT( s != NULL && "invalid arg");
+ klen = strlen(s)+1;
+ k = (char*)malloc(sizeof(char)*klen+1);
+ fctstr_safe_cpy(k, s, klen);
+ return k;
+}
+
+
+/* Clones and returns a lower case version of the original string. */
+static char*
+fctstr_clone_lower(char const *s)
+{
+ char *k =NULL;
+ size_t klen =0;
+ size_t i;
+ if ( s == NULL )
+ {
+ return NULL;
+ }
+ klen = strlen(s)+1;
+ k = (char*)malloc(sizeof(char)*klen+1);
+ for ( i=0; i != klen; ++i )
+ {
+ k[i] = (char)tolower(s[i]);
+ }
+ return k;
+}
+
+
+/* A very, very simple "filter". This just compares the supplied prefix
+against the test_str, to see if they both have the same starting
+characters. If they do we return true, otherwise we return false. If the
+prefix is a blank string or NULL, then it will return FCT_TRUE.*/
+static nbool_t
+fct_filter_pass(char const *prefix, char const *test_str)
+{
+ nbool_t is_match = FCT_FALSE;
+ char const *prefix_p;
+ char const *test_str_p;
+
+ /* If you got nothing to test against, why test? */
+ FCT_ASSERT( test_str != NULL );
+
+ /* When the prefix is NULL or blank, we always return FCT_TRUE. */
+ if ( prefix == NULL || prefix[0] == '\0' )
+ {
+ return FCT_TRUE;
+ }
+
+ /* Iterate through both character arrays at the same time. We are
+ going to play a game and see if we can beat the house. */
+ for ( prefix_p = prefix, test_str_p = test_str;
+ *prefix_p != '\0' && *test_str_p != '\0';
+ ++prefix_p, ++test_str_p )
+ {
+ is_match = *prefix_p == *test_str_p;
+ if ( !is_match )
+ {
+ break; /* Quit the first time we don't match. */
+ }
+ }
+
+ /* If the iterator for the test_str is pointing at the null char, and
+ the iterator for the prefix string is not, then the prefix string is
+ larger than the actual test string, and therefore we failed to pass the
+ filter. */
+ if ( *test_str_p == '\0' && *prefix_p != '\0' )
+ {
+ return FCT_FALSE;
+ }
+
+ /* is_match will be set to the either FCT_TRUE if we kicked of the loop
+ early because our filter ran out of characters or FCT_FALSE if we
+ encountered a mismatch before our filter ran out of characters. */
+ return is_match;
+}
+
+
+/* Routine checks if two strings are equal. Taken from
+http://publications.gbdirect.co.uk/c_book/chapter5/character_handling.html
+*/
+static int
+fctstr_eq(char const *s1, char const *s2)
+{
+ if ( s1 == s2 )
+ {
+ return 1;
+ }
+ if ( (s1 == NULL && s2 != NULL)
+ || (s1 != NULL && s2 == NULL) )
+ {
+ return 0;
+ }
+ while (*s1 == *s2)
+ {
+ if (*s1 == '\0')
+ return 1;
+ s1++;
+ s2++;
+ }
+ /* Difference detected! */
+ return 0;
+}
+
+
+static int
+fctstr_ieq(char const *s1, char const *s2)
+{
+ if ( s1 == s2 )
+ {
+ return 1;
+ }
+ if ( (s1 == NULL && s2 != NULL)
+ || (s1 != NULL && s2 == NULL) )
+ {
+ return 0;
+ }
+ while (tolower(*s1) == tolower(*s2))
+ {
+ if (*s1 == '\0')
+ return 1;
+ s1++;
+ s2++;
+ }
+ /* Difference detected! */
+ return 0;
+}
+
+
+/* Returns 1 if the STR contains the CHECK_INCL substring. NULLs
+are handled, and NULL always INCLUDES NULL. This check is case
+sensitive. If two strings point to the same place they are
+included. */
+static int
+fctstr_incl(char const *str, char const *check_incl)
+{
+ static char const *blank_s = "";
+ char const *found = NULL;
+ if ( str == NULL )
+ {
+ str = blank_s;
+ }
+ if ( check_incl == NULL )
+ {
+ check_incl = blank_s;
+ }
+ if ( str == check_incl )
+ {
+ return 1;
+ }
+ found = strstr(str, check_incl);
+ return found != NULL;
+}
+
+
+/* Does a case insensitive include check. */
+static int
+fctstr_iincl(char const *str, char const *check_incl)
+{
+ /* Going to do this with a memory allocation to save coding
+ time. In the future this can be rewritten. Both clone_lower
+ and _incl are NULL tolerant. */
+ char *lstr = fctstr_clone_lower(str);
+ char *lcheck_incl = fctstr_clone_lower(check_incl);
+ int found = fctstr_incl(lstr, lcheck_incl);
+ free(lstr);
+ free(lcheck_incl);
+ return found;
+}
+
+
+/* Returns true if STR starts with CHECK. NULL and NULL is consider
+true. */
+static int
+fctstr_startswith(char const *str, char const *check)
+{
+ char const *sp;
+ if ( str == NULL && check == NULL )
+ {
+ return 1;
+ }
+ else if ( ((str == NULL) && (check != NULL))
+ || ((str != NULL) && (check == NULL)) )
+ {
+ return 0;
+ }
+ sp = strstr(str, check);
+ return sp == str;
+}
+
+
+/* Case insensitive variant of fctstr_startswith. */
+static int
+fctstr_istartswith(char const *str, char const *check)
+{
+ /* Taking the lazy approach for now. */
+ char *istr = fctstr_clone_lower(str);
+ char *icheck = fctstr_clone_lower(check);
+ /* TODO: check for memory. */
+ int startswith = fctstr_startswith(istr, icheck);
+ free(istr);
+ free(icheck);
+ return startswith;
+}
+
+
+/* Returns true if the given string ends with the given
+check. Treats NULL as a blank string, and as such, will
+pass the ends with (a blank string endswith a blank string). */
+static int
+fctstr_endswith(char const *str, char const *check)
+{
+ size_t check_i;
+ size_t str_i;
+ if ( str == NULL && check == NULL )
+ {
+ return 1;
+ }
+ else if ( ((str == NULL) && (check != NULL))
+ || ((str != NULL) && (check == NULL)) )
+ {
+ return 0;
+ }
+ check_i = strlen(check);
+ str_i = strlen(str);
+ if ( str_i < check_i )
+ {
+ return 0; /* Can't do it string is too small. */
+ }
+ for ( ; check_i != 0; --check_i, --str_i)
+ {
+ if ( str[str_i] != check[check_i] )
+ {
+ return 0; /* Found a case where they are not equal. */
+ }
+ }
+ /* Exhausted check against string, can only be true. */
+ return 1;
+}
+
+
+static int
+fctstr_iendswith(char const *str, char const *check)
+{
+ size_t check_i;
+ size_t str_i;
+ if ( str == NULL && check == NULL )
+ {
+ return 1;
+ }
+ else if ( ((str == NULL) && (check != NULL))
+ || ((str != NULL) && (check == NULL)) )
+ {
+ return 0;
+ }
+ check_i = strlen(check);
+ str_i = strlen(str);
+ if ( str_i < check_i )
+ {
+ return 0; /* Can't do it string is too small. */
+ }
+ for ( ; check_i != 0; --check_i, --str_i)
+ {
+ if ( tolower(str[str_i]) != tolower(check[check_i]) )
+ {
+ return 0; /* Found a case where they are not equal. */
+ }
+ }
+ /* Exhausted check against string, can only be true. */
+ return 1;
+}
+
+
+/* Use this with the _end variant to get the
+
+STARTSWITH ........................................ END
+
+effect. Assumes that the line will be maxwidth in characters. The
+maxwidth can't be greater than FCT_DOTTED_MAX_LEN. */
+#define FCT_DOTTED_MAX_LEN 256
+static void
+fct_dotted_line_start(size_t maxwidth, char const *startwith)
+{
+ char line[FCT_DOTTED_MAX_LEN];
+ size_t len =0;
+ size_t line_len =0;
+
+ memset(line, '.', sizeof(char)*maxwidth);
+ len = strlen(startwith);
+ line_len = FCTMIN(maxwidth-1, len);
+ memcpy(line, startwith, sizeof(char)*line_len);
+ if ( len < maxwidth-1)
+ {
+ line[len] = ' ';
+ }
+ line[maxwidth-1] = '\0';
+ fputs(line, stdout);
+}
+
+
+static void
+fct_dotted_line_end(char const *endswith)
+{
+ printf(" %s\n", endswith);
+}
+
+
+/*
+--------------------------------------------------------
+TIMER
+--------------------------------------------------------
+This is a low-res implementation at the moment.
+
+We will improve this in the future, and isolate the
+implementation from the rest of the code.
+*/
+
+typedef struct _fct_timer_t fct_timer_t;
+struct _fct_timer_t
+{
+ clock_t start;
+ clock_t stop;
+ double duration;
+};
+
+
+static void
+fct_timer__init(fct_timer_t *timer)
+{
+ FCT_ASSERT(timer != NULL);
+ memset(timer, 0, sizeof(fct_timer_t));
+}
+
+
+static void
+fct_timer__start(fct_timer_t *timer)
+{
+ FCT_ASSERT(timer != NULL);
+ timer->start = clock();
+}
+
+
+static void
+fct_timer__stop(fct_timer_t *timer)
+{
+ FCT_ASSERT(timer != NULL);
+ timer->stop = clock();
+ timer->duration = (double) (timer->stop - timer->start) / CLOCKS_PER_SEC;
+}
+
+
+/* Returns the time in seconds. */
+static double
+fct_timer__duration(fct_timer_t const *timer)
+{
+ FCT_ASSERT( timer != NULL );
+ return timer->duration;
+}
+
+
+/*
+--------------------------------------------------------
+GENERIC LIST
+--------------------------------------------------------
+*/
+
+/* For now we will just keep it at a linear growth rate. */
+#define FCT_LIST_GROWTH_FACTOR 2
+
+/* Starting size for the list, to keep it simple we will start
+at a reasonable size. */
+#define FCT_LIST_DEFAULT_START_SZ 8
+
+/* Helper macros for quickly iterating through a list. You should be able
+to do something like,
+
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, my_list)
+ {
+ fct_logger__on_blah(logger);
+ }
+ FCT_NLIST_FOREACH_END();
+
+*/
+#define FCT_NLIST_FOREACH_BGN(Type, Var, List)\
+{\
+ if ( List != NULL ) {\
+ size_t item_i##Var;\
+ size_t num_items##Var = fct_nlist__size(List);\
+ for( item_i##Var =0; item_i##Var != num_items##Var; ++item_i##Var )\
+ {\
+ Type Var = (Type) fct_nlist__at((List), item_i##Var);
+
+#define FCT_NLIST_FOREACH_END() }}}
+
+/* Used to manage a list of loggers. This works mostly like
+the STL vector, where the array grows as more items are
+appended. */
+typedef struct _fct_nlist_t fct_nlist_t;
+struct _fct_nlist_t
+{
+ /* Item's are stored as pointers to void. */
+ void **itm_list;
+
+ /* Indicates the number of element's in the array. */
+ size_t avail_itm_num;
+
+ /* Indicates the number of actually elements in the array. */
+ size_t used_itm_num;
+};
+typedef void (*fct_nlist_on_del_t)(void*);
+
+
+/* Clears the contents of the list, and sets the list count to 0. The
+actual count remains unchanged. If on_del is supplied it is executed
+against each list element. */
+static void
+fct_nlist__clear(fct_nlist_t *list, fct_nlist_on_del_t on_del)
+{
+ size_t itm_i__ =0;
+ FCT_ASSERT( list != NULL );
+ if ( on_del != NULL )
+ {
+ for ( itm_i__=0; itm_i__ != list->used_itm_num; ++itm_i__ )
+ {
+ on_del(list->itm_list[itm_i__]);
+ }
+ }
+ list->used_itm_num =0;
+}
+
+
+/* If you used init, then close with final. This is useful for
+working with structures that live on the stack. */
+static void
+fct_nlist__final(fct_nlist_t *list, fct_nlist_on_del_t on_del)
+{
+ FCT_ASSERT( list != NULL );
+ fct_nlist__clear(list, on_del);
+ free(list->itm_list);
+}
+
+
+static int
+fct_nlist__init2(fct_nlist_t *list, size_t start_sz)
+{
+ FCT_ASSERT( list != NULL );
+ if ( start_sz == 0 )
+ {
+ list->itm_list = NULL;
+ }
+ else
+ {
+ list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
+ if ( list->itm_list == NULL )
+ {
+ return 0;
+ }
+ }
+ /* If these are both 0, then they are equal and that means
+ that the first append operation will allocate memory. The beauty
+ here is that if the list remains empty, then we save a malloc.
+ Empty lists are relatively common in FCT (consider an error list). */
+ list->avail_itm_num = start_sz;
+ list->used_itm_num =0;
+ return 1;
+}
+
+
+/* Initializes a list. Useful for populating existing structures.
+Returns 0 if there was an error allocating memory. Returns 1 otherwise. */
+#define fct_nlist__init(_LIST_PTR_) \
+ (fct_nlist__init2((_LIST_PTR_), FCT_LIST_DEFAULT_START_SZ))
+
+
+/* Returns the number of elements within the list. */
+static size_t
+fct_nlist__size(fct_nlist_t const *list)
+{
+ FCT_ASSERT( list != NULL );
+ return list->used_itm_num;
+}
+
+
+/* Returns the item at idx, asserts otherwise. */
+static void*
+fct_nlist__at(fct_nlist_t const *list, size_t idx)
+{
+ FCT_ASSERT( list != NULL );
+ FCT_ASSERT( idx < list->used_itm_num );
+ return list->itm_list[idx];
+}
+
+
+static void
+fct_nlist__append(fct_nlist_t *list, void *itm)
+{
+ FCT_ASSERT( list != NULL );
+ /* If we ran out of room, then the last increment should be equal to the
+ available space, in this case we need to grow a little more. If this
+ list started as size 0, then we should encounter the same effect as
+ "running out of room." */
+ if ( list->used_itm_num == list->avail_itm_num )
+ {
+ /* Use multiple and add, since the avail_itm_num could be 0. */
+ list->avail_itm_num = list->avail_itm_num*FCT_LIST_GROWTH_FACTOR+\
+ FCT_LIST_GROWTH_FACTOR;
+ list->itm_list = (void**)realloc(
+ list->itm_list, sizeof(void*)*list->avail_itm_num
+ );
+ FCT_ASSERT( list->itm_list != NULL && "memory check");
+ }
+
+ list->itm_list[list->used_itm_num] = itm;
+ ++(list->used_itm_num);
+}
+
+
+
+/*
+-----------------------------------------------------------
+A SINGLE CHECK
+-----------------------------------------------------------
+This defines a single check. It indicates what the check was,
+and where it occurred. A "Test" object will have-a bunch
+of "checks".
+*/
+
+struct _fctchk_t
+{
+ /* The name of the test this condition is in */
+ char name[FCT_MAX_LOG_LINE];
+
+ /* This string that represents the condition. */
+ char cndtn[FCT_MAX_LOG_LINE];
+
+ /* These indicate where the condition occurred. */
+ char file[FCT_MAX_LOG_LINE];
+
+ int lineno;
+
+ nbool_t is_pass;
+
+ /* This is a message that we can "format into", if
+ no format string is specified this should be
+ equivalent to the cntdn. */
+ char msg[FCT_MAX_LOG_LINE];
+};
+
+#define fctchk__is_pass(_CHK_) ((_CHK_)->is_pass)
+#define fctchk__file(_CHK_) ((_CHK_)->file)
+#define fctchk__lineno(_CHK_) ((_CHK_)->lineno)
+#define fctchk__cndtn(_CHK_) ((_CHK_)->cndtn)
+#define fctchk__msg(_CHK_) ((_CHK_)->msg)
+#define fctchk__name(_CHK_) ((_CHK_)->name)
+
+static fctchk_t*
+fctchk_new(int is_pass,
+ char const *cndtn,
+ char const *name,
+ char const *file,
+ int lineno,
+ char const *format,
+ va_list args)
+{
+ fctchk_t *chk = NULL;
+
+ FCT_ASSERT( cndtn != NULL );
+ FCT_ASSERT( file != NULL );
+ FCT_ASSERT( lineno > 0 );
+
+ chk = (fctchk_t*)calloc(1, sizeof(fctchk_t));
+ if ( chk == NULL )
+ {
+ return NULL;
+ }
+
+ fctstr_safe_cpy(chk->name, name ? name : "", FCT_MAX_LOG_LINE);
+ fctstr_safe_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE);
+ fctstr_safe_cpy(chk->file, file, FCT_MAX_LOG_LINE);
+ chk->lineno = lineno;
+
+ chk->is_pass =is_pass;
+
+ if ( format != NULL )
+ {
+ fct_vsnprintf(chk->msg, FCT_MAX_LOG_LINE, format, args);
+ }
+ else
+ {
+ /* Default to make the condition be the message, if there was no format
+ specified. */
+ fctstr_safe_cpy(chk->msg, cndtn, FCT_MAX_LOG_LINE);
+ }
+
+ return chk;
+}
+
+
+/* Cleans up a "check" object. If the `chk` is NULL, this function does
+nothing. */
+static void
+fctchk__del(fctchk_t *chk)
+{
+ if ( chk == NULL )
+ {
+ return;
+ }
+ free( chk );
+}
+
+
+/*
+-----------------------------------------------------------
+A TEST
+-----------------------------------------------------------
+A suite will have-a list of tests. Where each test will have-a
+list of failed and passed checks.
+*/
+
+struct _fct_test_t
+{
+ /* List of failed and passed "checks" (fctchk_t). Two separate
+ lists make it faster to determine how many checks passed and how
+ many checks failed. */
+ fct_nlist_t failed_chks;
+ fct_nlist_t passed_chks;
+
+ /* To store the test run time */
+ fct_timer_t timer;
+
+ /* The name of the test case. */
+ char name[FCT_MAX_NAME];
+};
+
+#define fct_test__name(_TEST_) ((_TEST_)->name)
+
+/* Clears the failed tests ... partly for internal testing. */
+#define fct_test__clear_failed(test) \
+ fct_nlist__clear(test->failed_chks, (fct_nlist_on_del_t)fctchk__del);\
+
+
+static void
+fct_test__del(fct_test_t *test)
+{
+ if (test == NULL )
+ {
+ return;
+ }
+ fct_nlist__final(&(test->passed_chks), (fct_nlist_on_del_t)fctchk__del);
+ fct_nlist__final(&(test->failed_chks), (fct_nlist_on_del_t)fctchk__del);
+ free(test);
+}
+
+
+static fct_test_t*
+fct_test_new(char const *name)
+{
+ nbool_t ok =FCT_FALSE;
+ fct_test_t *test =NULL;
+
+#ifndef __clang_analyzer__
+ test = (fct_test_t*)malloc(sizeof(fct_test_t));
+#else
+ test = NULL;
+#endif
+ if ( test == NULL )
+ {
+ return NULL;
+ }
+
+ fctstr_safe_cpy(test->name, name, FCT_MAX_NAME);
+
+ /* Failures are an exception, so lets not allocate up
+ the list until we need to. */
+ fct_nlist__init2(&(test->failed_chks), 0);
+ if (!fct_nlist__init(&(test->passed_chks)))
+ {
+ ok =FCT_FALSE;
+ goto finally;
+ }
+
+ fct_timer__init(&(test->timer));
+
+ ok =FCT_TRUE;
+finally:
+ if ( !ok )
+ {
+ fct_test__del(test);
+ test =NULL;
+ }
+ return test;
+}
+
+
+static void
+fct_test__start_timer(fct_test_t *test)
+{
+ FCT_ASSERT( test != NULL );
+ fct_timer__start(&(test->timer));
+}
+
+
+static void
+fct_test__stop_timer(fct_test_t *test)
+{
+ FCT_ASSERT( test != NULL );
+ fct_timer__stop(&(test->timer));
+}
+
+
+static double
+fct_test__duration(fct_test_t const *test)
+{
+ FCT_ASSERT( test != NULL );
+ return fct_timer__duration(&(test->timer));
+}
+
+
+static nbool_t
+fct_test__is_pass(fct_test_t const *test)
+{
+ FCT_ASSERT( test != NULL );
+ return fct_nlist__size(&(test->failed_chks)) == 0;
+}
+
+
+static void
+fct_test__add(fct_test_t *test, fctchk_t *chk)
+{
+
+ FCT_ASSERT( test != NULL );
+ FCT_ASSERT( chk != NULL );
+
+ if ( fctchk__is_pass(chk) )
+ {
+ fct_nlist__append(&(test->passed_chks), (void*)chk);
+ }
+ else
+ {
+ fct_nlist__append(&(test->failed_chks), (void*)chk);
+ }
+}
+
+/* Returns the number of checks made throughout the test. */
+static size_t
+fct_test__chk_cnt(fct_test_t const *test)
+{
+ FCT_ASSERT( test != NULL );
+ return fct_nlist__size(&(test->failed_chks)) \
+ + fct_nlist__size(&(test->passed_chks));
+}
+
+
+/*
+-----------------------------------------------------------
+TEST SUITE (TS)
+-----------------------------------------------------------
+*/
+
+
+/* The different types of 'modes' that a test suite can be in.
+
+While the test suite is iterating through all the tests, its "State"
+can change from "setup mode", to "test mode" to "tear down" mode.
+These help to indicate what mode are currently in. Think of it as a
+basic FSM.
+
+ if the count was 0 end
+ +--------->---------------------> ending_mode-----+-+
+ | ^ |
+ ^ | ^
+start | [if no more tests] |
+ | | | |
+ +-count_mode -> setup_mode -> test_mode -> teardown_mode->-+
+ | ^ | |
+ | +-----------<---------------+ |
+ +----------->---[if fct_req fails]--------+
+
+*/
+enum ts_mode
+{
+ ts_mode_cnt, /* To setup when done counting. */
+ ts_mode_setup, /* To test when done setup. */
+ ts_mode_teardown, /* To ending mode, when no more tests. */
+ ts_mode_test, /* To tear down mode. */
+ ts_mode_ending, /* To ... */
+ ts_mode_end, /* .. The End. */
+ ts_mode_abort /* Abort */
+};
+
+/* Types of states the test could be in. */
+typedef enum
+{
+ fct_test_status_SUCCESS,
+ fct_test_status_FAILURE
+} fct_test_status;
+
+
+struct _fct_ts_t
+{
+ /* For counting our 'current' test number, and the total number of
+ tests. */
+ int curr_test_num;
+ int total_test_num;
+
+ /* Keeps track of the current state of the object while it is walking
+ through its "FSM" */
+ enum ts_mode mode;
+
+ /* The name of the test suite. */
+ char name[FCT_MAX_NAME];
+
+ /* List of tests that where executed within the test suite. */
+ fct_nlist_t test_list;
+};
+
+
+#define fct_ts__is_setup_mode(ts) ((ts)->mode == ts_mode_setup)
+#define fct_ts__is_teardown_mode(ts) ((ts)->mode == ts_mode_teardown)
+#define fct_ts__is_test_mode(ts) ((ts)->mode == ts_mode_test)
+#define fct_ts__is_ending_mode(ts) ((ts)->mode == ts_mode_ending)
+#define fct_ts__is_end(ts) ((ts)->mode == ts_mode_end)
+#define fct_ts__is_cnt_mode(ts) ((ts)->mode == ts_mode_cnt)
+#define fct_ts__is_abort_mode(ts) ((ts)->mode == ts_mode_abort)
+
+/* This cndtn is set when we have iterated through all the tests, and
+there was nothing more to do. */
+#define fct_ts__ending(ts) ((ts)->mode = ts_mode_ending)
+
+/* Flag a test suite as complete. It will no longer accept any more tests. */
+#define fct_ts__end(ts) ((ts)->mode = ts_mode_end)
+
+#define fct_ts__name(ts) ((ts)->name)
+
+
+static void
+fct_ts__del(fct_ts_t *ts)
+{
+ if ( ts == NULL )
+ {
+ return;
+ }
+ fct_nlist__final(&(ts->test_list), (fct_nlist_on_del_t)fct_test__del);
+ free(ts);
+}
+
+static fct_ts_t *
+fct_ts_new(char const *name)
+{
+ fct_ts_t *ts =NULL;
+ ts = (fct_ts_t*)calloc(1, sizeof(fct_ts_t));
+ FCT_ASSERT( ts != NULL );
+
+ fctstr_safe_cpy(ts->name, name, FCT_MAX_NAME);
+ ts->mode = ts_mode_cnt;
+ fct_nlist__init(&(ts->test_list));
+ return ts;
+}
+
+
+
+static nbool_t
+fct_ts__is_more_tests(fct_ts_t const *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+ return ts->curr_test_num < ts->total_test_num;
+}
+
+
+/* Indicates that we have started a test case. */
+static void
+fct_ts__test_begin(fct_ts_t *ts)
+{
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+ ++(ts->curr_test_num);
+}
+
+
+/* Takes OWNERSHIP of a test object, and warehouses it for later stat
+generation. */
+static void
+fct_ts__add_test(fct_ts_t *ts, fct_test_t *test)
+{
+ FCT_ASSERT( ts != NULL && "invalid arg");
+ FCT_ASSERT( test != NULL && "invalid arg");
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+ fct_nlist__append(&(ts->test_list), test);
+}
+
+
+static void
+fct_ts__test_end(fct_ts_t *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ /* After a test has completed, move to teardown mode. */
+ ts->mode = ts_mode_teardown;
+}
+
+
+/* Increments the internal count by 1. */
+static void
+fct_ts__inc_total_test_num(fct_ts_t *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+ ++(ts->total_test_num);
+}
+
+
+/* Flags the end of the setup, which implies we are going to move into
+setup mode. You must be already in setup mode for this to work! */
+static void
+fct_ts__setup_end(fct_ts_t *ts)
+{
+ if ( ts->mode != ts_mode_abort )
+ {
+ ts->mode = ts_mode_test;
+ }
+}
+
+
+static fct_test_t *
+fct_ts__make_abort_test(fct_ts_t *ts)
+{
+ char setup_testname[FCT_MAX_LOG_LINE+1] = {'\0'};
+ char const *suitename = fct_ts__name(ts);
+ fct_snprintf(setup_testname, FCT_MAX_LOG_LINE, "setup_%s", suitename);
+ return fct_test_new(setup_testname);
+}
+
+/* Flags a pre-mature abort of a setup (like a failed fct_req). */
+static void
+fct_ts__setup_abort(fct_ts_t *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ ts->mode = ts_mode_abort;
+}
+
+/* Flags the end of the teardown, which implies we are going to move
+into setup mode (for the next 'iteration'). */
+static void
+fct_ts__teardown_end(fct_ts_t *ts)
+{
+ if ( ts->mode == ts_mode_abort )
+ {
+ return; /* Because we are aborting . */
+ }
+ /* We have to decide if we should keep on testing by moving into tear down
+ mode or if we have reached the real end and should be moving into the
+ ending mode. */
+ if ( fct_ts__is_more_tests(ts) )
+ {
+ ts->mode = ts_mode_setup;
+ }
+ else
+ {
+ ts->mode = ts_mode_ending;
+ }
+}
+
+
+/* Flags the end of the counting, and proceeding to the first setup.
+Consider the special case when a test suite has NO tests in it, in
+that case we will have a current count that is zero, in which case
+we can skip right to 'ending'. */
+static void
+fct_ts__cnt_end(fct_ts_t *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+ if (ts->total_test_num == 0 )
+ {
+ ts->mode = ts_mode_ending;
+ }
+ else
+ {
+ ts->mode = ts_mode_setup;
+ }
+}
+
+
+static nbool_t
+fct_ts__is_test_cnt(fct_ts_t const *ts, int test_num)
+{
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT( 0 <= test_num );
+ FCT_ASSERT( test_num < ts->total_test_num );
+ FCT_ASSERT( !fct_ts__is_end(ts) );
+
+ /* As we roll through the tests we increment the count. With this
+ count we can decide if we need to execute a test or not. */
+ return test_num == ts->curr_test_num;
+}
+
+
+/* Returns the # of tests on the FCT TS object. This is the actual
+# of tests executed. */
+static size_t
+fct_ts__tst_cnt(fct_ts_t const *ts)
+{
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT(
+ fct_ts__is_end(ts)
+ && "can't count number of tests executed until the test suite ends"
+ );
+ return fct_nlist__size(&(ts->test_list));
+}
+
+
+/* Returns the # of tests in the TS object that passed. */
+static size_t
+fct_ts__tst_cnt_passed(fct_ts_t const *ts)
+{
+ size_t tally =0;
+
+ FCT_ASSERT( ts != NULL );
+ FCT_ASSERT( fct_ts__is_end(ts) );
+
+ FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
+ {
+ if ( fct_test__is_pass(test) )
+ {
+ tally += 1;
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+ return tally;
+}
+
+
+/* Returns the # of checks made throughout a test suite. */
+static size_t
+fct_ts__chk_cnt(fct_ts_t const *ts)
+{
+ size_t tally =0;
+
+ FCT_ASSERT( ts != NULL );
+
+ FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
+ {
+ tally += fct_test__chk_cnt(test);
+ }
+ FCT_NLIST_FOREACH_END();
+ return tally;
+}
+
+/* Currently the duration is simply a sum of all the tests. */
+static double
+fct_ts__duration(fct_ts_t const *ts)
+{
+ double tally =0.0;
+ FCT_ASSERT( ts != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
+ {
+ tally += fct_test__duration(test);
+ }
+ FCT_NLIST_FOREACH_END();
+ return tally;
+}
+
+
+/*
+--------------------------------------------------------
+FCT COMMAND LINE OPTION INITIALIZATION (fctcl_init)
+--------------------------------------------------------
+
+Structure used for command line initialization. To keep it clear that we do
+not delete the char*'s present on this structure.
+*/
+
+
+typedef enum
+{
+ FCTCL_STORE_UNDEFINED,
+ FCTCL_STORE_TRUE,
+ FCTCL_STORE_VALUE
+} fctcl_store_t;
+
+
+typedef struct _fctcl_init_t
+{
+ /* What to parse for this option. --long versus -s. */
+ char const *long_opt; /* i.e. --help */
+ char const *short_opt; /* i.e. -h */
+
+ /* What action to take when the option is activated. */
+ fctcl_store_t action;
+
+ /* The help string for the action. */
+ char const *help;
+} fctcl_init_t;
+
+
+/* Use when defining the option list. */
+#define FCTCL_INIT_NULL \
+ {NULL, NULL, FCTCL_STORE_UNDEFINED, NULL}
+
+
+/*
+--------------------------------------------------------
+FCT COMMAND LINE OPTION (fctcl)
+--------------------------------------------------------
+
+Specifies the command line configuration options. Use this
+to help initialize the fct_clp (command line parser).
+*/
+
+
+/* Handy strings for storing "true" and "false". We can reference
+these strings throughout the parse operation and not have to
+worry about dealing with memory. */
+#define FCTCL_TRUE_STR "1"
+
+
+typedef struct _fctcl_t
+{
+ /* What to parse for this option. --long versus -s. */
+ char *long_opt; /* i.e. --help */
+ char *short_opt; /* i.e. -h */
+
+ /* What action to take when the option is activated. */
+ fctcl_store_t action;
+
+ /* The help string for the action. */
+ char *help;
+
+ /* The result. */
+ char *value;
+} fctcl_t;
+
+
+#define fctcl_new() ((fctcl_t*)calloc(1, sizeof(fctcl_t)))
+
+
+static void
+fctcl__del(fctcl_t *clo)
+{
+ if ( clo == NULL )
+ {
+ return;
+ }
+ free(clo->long_opt);
+ free(clo->short_opt);
+ free(clo->value);
+ free(clo->help);
+ free(clo);
+}
+
+
+static fctcl_t*
+fctcl_new2(fctcl_init_t const *clo_init)
+{
+ fctcl_t *clone = NULL;
+ int ok =0;
+ clone = fctcl_new();
+ if ( clone == NULL )
+ {
+ return NULL;
+ }
+ clone->action = clo_init->action;
+ if ( clo_init->help == NULL )
+ {
+ clone->help = NULL;
+ }
+ else
+ {
+ clone->help = fctstr_clone(clo_init->help);
+ if ( clone->help == NULL )
+ {
+ ok =0;
+ goto finally;
+ }
+ }
+ if ( clo_init->long_opt == NULL )
+ {
+ clone->long_opt = NULL;
+ }
+ else
+ {
+ clone->long_opt = fctstr_clone(clo_init->long_opt);
+ if ( clone->long_opt == NULL )
+ {
+ ok = 0;
+ goto finally;
+ }
+ }
+ if ( clo_init->short_opt == NULL )
+ {
+ clone->short_opt = NULL;
+ }
+ else
+ {
+ clone->short_opt = fctstr_clone(clo_init->short_opt);
+ if ( clone->short_opt == NULL )
+ {
+ ok =0;
+ goto finally;
+ }
+ }
+ ok = 1;
+finally:
+ if ( !ok )
+ {
+ fctcl__del(clone);
+ clone = NULL;
+ }
+ return clone;
+}
+
+
+static int
+fctcl__is_option(fctcl_t const *clo, char const *option)
+{
+ FCT_ASSERT( clo != NULL );
+ if ( option == NULL )
+ {
+ return 0;
+ }
+ return ((clo->long_opt != NULL
+ && fctstr_eq(clo->long_opt, option))
+ ||
+ (clo->short_opt != NULL
+ && fctstr_eq(clo->short_opt, option))
+ );
+}
+
+
+#define fctcl__set_value(_CLO_, _VAL_) \
+ (_CLO_)->value = fctstr_clone((_VAL_));
+
+/*
+--------------------------------------------------------
+FCT COMMAND PARSER (fct_clp)
+--------------------------------------------------------
+*/
+
+#define FCT_CLP_MAX_ERR_MSG_LEN 256
+
+typedef struct _fct_clp_t
+{
+ /* List of command line options. */
+ fct_nlist_t clo_list;
+
+ /* List of parameters (not options). */
+ fct_nlist_t param_list;
+
+ char error_msg[FCT_CLP_MAX_ERR_MSG_LEN];
+ int is_error;
+} fct_clp_t;
+
+
+static void
+fct_clp__final(fct_clp_t *clp)
+{
+ fct_nlist__final(&(clp->clo_list), (fct_nlist_on_del_t)fctcl__del);
+ fct_nlist__final(&(clp->param_list), (fct_nlist_on_del_t)free);
+}
+
+
+/* Add an configuration options. */
+static int
+fct_clp__add_options(fct_clp_t *clp, fctcl_init_t const *options)
+{
+ fctcl_init_t const *pclo =NULL;
+ int ok;
+ for ( pclo = options; pclo->action != FCTCL_STORE_UNDEFINED; ++pclo )
+ {
+ fctcl_t *cpy = fctcl_new2(pclo);
+ if ( cpy == NULL )
+ {
+ ok = 0;
+ goto finally;
+ }
+ fct_nlist__append(&(clp->clo_list), (void*)cpy);
+ }
+ ok =1;
+finally:
+ return ok;
+}
+
+/* Returns false if we ran out of memory. */
+static int
+fct_clp__init(fct_clp_t *clp, fctcl_init_t const *options)
+{
+ int ok =0;
+ FCT_ASSERT( clp != NULL );
+ /* It is just much saner to manage a clone of the options. Then we know
+ who is in charge of the memory. */
+ ok = fct_nlist__init(&(clp->clo_list));
+ if ( !ok )
+ {
+ goto finally;
+ }
+ if ( options != NULL )
+ {
+ ok = fct_clp__add_options(clp, options);
+ if ( !ok )
+ {
+ goto finally;
+ }
+ }
+ ok = fct_nlist__init(&(clp->param_list));
+ if ( !ok )
+ {
+ goto finally;
+ }
+ ok =1;
+finally:
+ if ( !ok )
+ {
+ fct_clp__final(clp);
+ }
+ return ok;
+}
+
+
+/* Parses the command line arguments. Use fct_clp__is_error and
+fct_clp__get_error to figure out if something went awry. */
+static void
+fct_clp__parse(fct_clp_t *clp, int argc, char const *argv[])
+{
+ int argi =1;
+ int is_option =0;
+ char *arg =NULL;
+ char *token =NULL;
+ char *next_token =NULL;
+
+ clp->error_msg[0] = '\0';
+ clp->is_error =0;
+
+ while ( argi < argc )
+ {
+ is_option =0;
+ token =NULL;
+ next_token = NULL;
+ arg = fctstr_clone(argv[argi]);
+
+#if defined(_MSC_VER) && _MSC_VER > 1300
+ token = strtok_s(arg, "=", &next_token);
+#else
+ token = strtok(arg, "=");
+ next_token = strtok(NULL, "=");
+#endif
+
+ FCT_NLIST_FOREACH_BGN(fctcl_t*, pclo, &(clp->clo_list))
+ {
+ /* Need to reset for each search. strtok below is destructive. */
+ if ( fctcl__is_option(pclo, token) )
+ {
+ is_option =1;
+ if ( pclo->action == FCTCL_STORE_VALUE )
+ {
+ /* If this is --xxxx=value then the next strtok should succeed.
+ Otherwise, we need to chew up the next argument. */
+ if ( next_token != NULL && strlen(next_token) > 0 )
+ {
+ fctcl__set_value(pclo, next_token);
+ }
+ else
+ {
+ ++argi; /* Chew up the next value */
+ if ( argi >= argc )
+ {
+ /* error */
+ fct_snprintf(
+ clp->error_msg,
+ FCT_CLP_MAX_ERR_MSG_LEN,
+ "missing argument for %s",
+ token
+ );
+ clp->is_error =1;
+ break;
+ }
+ fctcl__set_value(pclo, argv[argi]);
+ }
+ }
+ else if (pclo->action == FCTCL_STORE_TRUE)
+ {
+ fctcl__set_value(pclo, FCTCL_TRUE_STR);
+ }
+ else
+ {
+ FCT_ASSERT("undefined action requested");
+ }
+ break; /* No need to parse this argument further. */
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+ /* If we have an error, exit. */
+ if ( clp->is_error )
+ {
+ break;
+ }
+ /* If we walked through all the options, and didn't find
+ anything, then we must have a parameter. Forget the fact that
+ an unknown option will be treated like a parameter... */
+ if ( !is_option )
+ {
+ fct_nlist__append(&(clp->param_list), arg);
+ arg =NULL; /* Owned by the nlist */
+ }
+ ++argi;
+ if ( arg != NULL )
+ {
+ free(arg);
+ arg =NULL;
+ }
+ }
+}
+
+
+static fctcl_t const*
+fct_clp__get_clo(fct_clp_t const *clp, char const *option)
+{
+ fctcl_t const *found =NULL;
+
+ FCT_NLIST_FOREACH_BGN(fctcl_t const*, pclo, &(clp->clo_list))
+ {
+ if ( fctcl__is_option(pclo, option) )
+ {
+ found = pclo;
+ break;
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+ return found;
+}
+
+
+#define fct_clp__optval(_CLP_, _OPTION_) \
+ fct_clp__optval2((_CLP_), (_OPTION_), NULL)
+
+
+/* Returns the value parsed at the command line, and equal to OPTION.
+If the value wasn't parsed, the DEFAULT_VAL is returned instead. */
+static char const*
+fct_clp__optval2(fct_clp_t *clp, char const *option, char const *default_val)
+{
+ fctcl_t const *clo =NULL;
+ FCT_ASSERT( clp != NULL );
+ FCT_ASSERT( option != NULL );
+ clo = fct_clp__get_clo(clp, option);
+ if ( clo == NULL || clo->value == NULL)
+ {
+ return default_val;
+ }
+ return clo->value;
+}
+
+
+
+/* Mainly used for unit tests. */
+static int
+fct_clp__is_param(fct_clp_t *clp, char const *param)
+{
+ if ( clp == NULL || param == NULL )
+ {
+ return 0;
+ }
+ FCT_NLIST_FOREACH_BGN(char *, aparam, &(clp->param_list))
+ {
+ if ( fctstr_eq(aparam, param) )
+ {
+ return 1;
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+ return 0;
+}
+
+
+#define fct_clp__is_error(_CLP_) ((_CLP_)->is_error)
+#define fct_clp__get_error(_CLP_) ((_CLP_)->error_msg);
+
+#define fct_clp__num_clo(_CLP_) \
+ (fct_nlist__size(&((_CLP_)->clo_list)))
+
+#define fct_clp__param_cnt(_CLP_) \
+ (fct_nlist__size(&((_CLP_)->param_list)))
+
+/* Returns a *reference* to the parameter at _IDX_. Do not modify
+its contents. */
+#define fct_clp__param_at(_CLP_, _IDX_) \
+ ((char const*)fct_nlist__at(&((_CLP_)->param_list), (_IDX_)))
+
+
+/* Returns true if the given option was on the command line.
+Use either the long or short option name to check against. */
+#define fct_clp__is(_CLP_, _OPTION_) \
+ (fct_clp__optval((_CLP_), (_OPTION_)) != NULL)
+
+
+
+/*
+--------------------------------------------------------
+FCT NAMESPACE
+--------------------------------------------------------
+
+The macros below start to pollute the watch window with
+lots of "system" variables. This NAMESPACE is an
+attempt to hide all the "system" variables in one place.
+*/
+typedef struct _fct_namespace_t
+{
+ /* The currently active test suite. */
+ fct_ts_t *ts_curr;
+ int ts_is_skip_suite;
+ char const *ts_skip_cndtn;
+
+ /* Current test name. */
+ char const* curr_test_name;
+ fct_test_t *curr_test;
+ const char *test_skip_cndtn;
+ int test_is_skip;
+
+ /* Counts the number of tests in a test suite. */
+ int test_num;
+
+ /* Set at the end of the test suites. */
+ size_t num_total_failed;
+} fct_namespace_t;
+
+
+static void
+fct_namespace_init(fct_namespace_t *ns)
+{
+ FCT_ASSERT( ns != NULL && "invalid argument!");
+ memset(ns, 0, sizeof(fct_namespace_t));
+}
+
+
+/*
+--------------------------------------------------------
+FCT KERNEL
+--------------------------------------------------------
+
+The "fctkern" is a singleton that is defined throughout the
+system.
+*/
+
+struct _fctkern_t
+{
+ /* Holds variables used throughout MACRO MAGIC. In order to reduce
+ the "noise" in the watch window during a debug trace. */
+ fct_namespace_t ns;
+
+ /* Command line parsing. */
+ fct_clp_t cl_parser;
+
+ /* Hold onto the command line arguments. */
+ int cl_argc;
+ char const **cl_argv;
+ /* Track user options. */
+ fctcl_init_t const *cl_user_opts;
+
+ /* Tracks the delay parsing. */
+ int cl_is_parsed;
+
+ /* This is an list of loggers that can be used in the fct system. */
+ fct_nlist_t logger_list;
+
+ /* Array of custom types, you have built-in system ones and you
+ have optionally supplied user ones.. */
+ fct_logger_types_t *lt_usr;
+ fct_logger_types_t *lt_sys;
+
+ /* This is a list of prefix's that can be used to determine if a
+ test is should be run or not. */
+ fct_nlist_t prefix_list;
+
+ /* This is a list of test suites that where generated throughout the
+ testing process. */
+ fct_nlist_t ts_list;
+
+ /* Records what we expect to fail. */
+ size_t num_expected_failures;
+};
+
+
+#define FCT_OPT_VERSION "--version"
+#define FCT_OPT_VERSION_SHORT "-v"
+#define FCT_OPT_HELP "--help"
+#define FCT_OPT_HELP_SHORT "-h"
+#define FCT_OPT_LOGGER "--logger"
+#define FCT_OPT_LOGGER_SHORT "-l"
+static fctcl_init_t FCT_CLP_OPTIONS[] =
+{
+ /* Totally unsafe, since we are assuming we can clean out this data,
+ what I need to do is have an "initialization" object, full of
+ const objects. But for now, this should work. */
+ {
+ FCT_OPT_VERSION,
+ FCT_OPT_VERSION_SHORT,
+ FCTCL_STORE_TRUE,
+ "Displays the FCTX version number and exits."
+ },
+ {
+ FCT_OPT_HELP,
+ FCT_OPT_HELP_SHORT,
+ FCTCL_STORE_TRUE,
+ "Shows this help."
+ },
+ {
+ FCT_OPT_LOGGER,
+ FCT_OPT_LOGGER_SHORT,
+ FCTCL_STORE_VALUE,
+ NULL
+ },
+ FCTCL_INIT_NULL /* Sentinel */
+};
+
+typedef fct_logger_i* (*fct_logger_new_fn)(void);
+struct _fct_logger_types_t
+{
+ char const *name;
+ fct_logger_new_fn logger_new_fn;
+ char const *desc;
+};
+
+static fct_logger_types_t FCT_LOGGER_TYPES[] =
+{
+ {
+ "standard",
+ (fct_logger_new_fn)fct_standard_logger_new,
+ "the basic fctx logger"
+ },
+ {
+ "minimal",
+ (fct_logger_new_fn)fct_minimal_logger_new,
+ "the least amount of logging information."
+ },
+ {
+ "junit",
+ (fct_logger_new_fn)fct_junit_logger_new,
+ "junit compatible xml"
+ },
+ {NULL, (fct_logger_new_fn)NULL, NULL} /* Sentinel */
+};
+
+
+/* Returns the number of filters defined for the fct kernel. */
+#define fctkern__filter_cnt(_NK_) (fct_nlist__size(&((_NK_)->prefix_list)))
+
+
+static void
+fctkern__add_logger(fctkern_t *nk, fct_logger_i *logger_owns)
+{
+ FCT_ASSERT(nk != NULL && "invalid arg");
+ FCT_ASSERT(logger_owns != NULL && "invalid arg");
+ fct_nlist__append(&(nk->logger_list), logger_owns);
+}
+
+
+static void
+fctkern__write_help(fctkern_t *nk, FILE *out)
+{
+ fct_clp_t *clp = &(nk->cl_parser);
+ fprintf(out, "test.exe [options] prefix_filter ...\n\n");
+ FCT_NLIST_FOREACH_BGN(fctcl_t*, clo, &(clp->clo_list))
+ {
+ if ( clo->short_opt != NULL )
+ {
+ fprintf(out, "%s, %s\n", clo->short_opt, clo->long_opt);
+ }
+ else
+ {
+ fprintf(out, "%s\n", clo->long_opt);
+ }
+ if ( !fctstr_ieq(clo->long_opt, FCT_OPT_LOGGER) )
+ {
+ /* For now lets not get to fancy with the text wrapping. */
+ fprintf(out, " %s\n", clo->help);
+ }
+ else
+ {
+ fct_logger_types_t *types[2];
+ int type_i;
+ fct_logger_types_t *itr;
+ types[0] = nk->lt_sys;
+ types[1] = nk->lt_usr;
+ fputs(" Sets the logger. The types of loggers currently "
+ "available are,\n", out);
+ for (type_i =0; type_i != 2; ++type_i )
+ {
+ for ( itr=types[type_i]; itr && itr->name != NULL; ++itr )
+ {
+ fprintf(out, " =%s : %s\n", itr->name, itr->desc);
+ }
+ }
+ fprintf(out, " default is '%s'.\n", FCT_DEFAULT_LOGGER);
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+ fputs("\n", out);
+}
+
+
+/* Appends a prefix filter that is used to determine if a test can
+be executed or not. If the test starts with the same characters as
+the prefix, then it should be "runnable". The prefix filter must be
+a non-NULL, non-Blank string. */
+static void
+fctkern__add_prefix_filter(fctkern_t *nk, char const *prefix_filter)
+{
+ char *filter =NULL;
+ size_t filter_len =0;
+ FCT_ASSERT( nk != NULL && "invalid arg" );
+ FCT_ASSERT( prefix_filter != NULL && "invalid arg" );
+ FCT_ASSERT( strlen(prefix_filter) > 0 && "invalid arg" );
+ /* First we make a copy of the prefix, then we store it away
+ in our little list. */
+ filter_len = strlen(prefix_filter);
+ filter = (char*)malloc(sizeof(char)*(filter_len+1));
+ fctstr_safe_cpy(filter, prefix_filter, filter_len+1);
+ fct_nlist__append(&(nk->prefix_list), (void*)filter);
+}
+
+
+/* Cleans up the contents of a fctkern. NULL does nothing. */
+static void
+fctkern__final(fctkern_t *nk)
+{
+ if ( nk == NULL )
+ {
+ return;
+ }
+ fct_clp__final(&(nk->cl_parser));
+ fct_nlist__final(&(nk->logger_list), (fct_nlist_on_del_t)fct_logger__del);
+ /* The prefix list is a list of malloc'd strings. */
+ fct_nlist__final(&(nk->prefix_list), (fct_nlist_on_del_t)free);
+ fct_nlist__final(&(nk->ts_list), (fct_nlist_on_del_t)fct_ts__del);
+}
+
+
+#define fctkern__cl_is_parsed(_NK_) ((_NK_)->cl_is_parsed)
+
+
+static int
+fctkern__cl_is(fctkern_t *nk, char const *opt_str)
+{
+ FCT_ASSERT( opt_str != NULL );
+ return opt_str[0] != '\0'
+ && fct_clp__is(&(nk->cl_parser), opt_str);
+}
+
+
+/* Returns the command line value given by OPT_STR. If OPT_STR was not defined
+at the command line, DEF_STR is returned (you can use NULL for the DEF_STR).
+The result returned should not be modified, and MAY even be the same pointer
+to DEF_STR. */
+static char const *
+fctkern__cl_val2(fctkern_t *nk, char const *opt_str, char const *def_str)
+{
+ FCT_ASSERT( opt_str != NULL );
+ if ( nk == NULL )
+ {
+ return NULL;
+ }
+ return fct_clp__optval2(&(nk->cl_parser), opt_str, def_str);
+}
+
+
+/* Selects a logger from the list based on the selection name.
+May return NULL if the name doesn't exist in the list. */
+static fct_logger_i*
+fckern_sel_log(fct_logger_types_t *search, char const *sel_logger)
+{
+ fct_logger_types_t *iter;
+ FCT_ASSERT(search != NULL);
+ FCT_ASSERT(sel_logger != NULL);
+ FCT_ASSERT(strlen(sel_logger) > 0);
+ for ( iter = search; iter->name != NULL; ++iter)
+ {
+ if ( fctstr_ieq(iter->name, sel_logger) )
+ {
+ return iter->logger_new_fn();
+ }
+ }
+ return NULL;
+}
+
+static int
+fctkern__cl_parse_config_logger(fctkern_t *nk)
+{
+ fct_logger_i *logger =NULL;
+ char const *sel_logger =NULL;
+ char const *def_logger =FCT_DEFAULT_LOGGER;
+ sel_logger = fctkern__cl_val2(nk, FCT_OPT_LOGGER, def_logger);
+ FCT_ASSERT(sel_logger != NULL && "should never be NULL");
+ /* First search the user selected types, then search the
+ built-in types. */
+ if ( nk->lt_usr != NULL )
+ {
+ logger = fckern_sel_log(nk->lt_usr, sel_logger);
+ }
+ if ( nk->lt_sys != NULL && logger == NULL )
+ {
+ logger = fckern_sel_log(nk->lt_sys, sel_logger);
+ }
+ if ( logger == NULL )
+ {
+ /* No logger configured, you must have supplied an invalid selection. */
+ fprintf(stderr, "error: unknown logger selected - '%s'", sel_logger);
+ return 0;
+ }
+ fctkern__add_logger(nk, logger);
+ logger = NULL; /* owned by nk. */
+ return 1;
+}
+
+
+
+/* Call this if you want to (re)parse the command line options with a new
+set of options. Returns -1 if you are to abort with EXIT_SUCCESS, returns
+0 if you are to abort with EXIT_FAILURE and returns 1 if you are to continue. */
+static int
+fctkern__cl_parse(fctkern_t *nk)
+{
+ int status =0;
+ size_t num_params =0;
+ size_t param_i =0;
+ if ( nk == NULL )
+ {
+ return 0;
+ }
+ if ( nk->cl_user_opts != NULL )
+ {
+ if ( !fct_clp__add_options(&(nk->cl_parser), nk->cl_user_opts) )
+ {
+ status =0;
+ goto finally;
+ }
+ }
+ /* You want to add the "house options" after the user defined ones. The
+ options are stored as a list so it means that any option listed after
+ the above ones won't get parsed. */
+ if ( !fct_clp__add_options(&(nk->cl_parser), FCT_CLP_OPTIONS) )
+ {
+ status =0;
+ goto finally;
+ }
+ fct_clp__parse(&(nk->cl_parser), nk->cl_argc, nk->cl_argv);
+ if ( fct_clp__is_error(&(nk->cl_parser)) )
+ {
+ char *err = fct_clp__get_error(&(nk->cl_parser));
+ fprintf(stderr, "error: %s", err);
+ status =0;
+ goto finally;
+ }
+ num_params = fct_clp__param_cnt(&(nk->cl_parser));
+ for ( param_i =0; param_i != num_params; ++param_i )
+ {
+ char const *param = fct_clp__param_at(&(nk->cl_parser), param_i);
+ fctkern__add_prefix_filter(nk, param);
+ }
+ if ( fctkern__cl_is(nk, FCT_OPT_VERSION) )
+ {
+ (void)printf("Built using FCTX version %s.\n", FCT_VERSION_STR);
+ status = -1;
+ goto finally;
+ }
+ if ( fctkern__cl_is(nk, FCT_OPT_HELP) )
+ {
+ fctkern__write_help(nk, stdout);
+ status = -1;
+ goto finally;
+ }
+ if ( !fctkern__cl_parse_config_logger(nk) )
+ {
+ status = -1;
+ goto finally;
+ }
+ status =1;
+ nk->cl_is_parsed =1;
+finally:
+ return status;
+}
+
+
+
+/* Parses the command line and sets up the framework. The argc and argv
+should be directly from the program's main. */
+static int
+fctkern__init(fctkern_t *nk, int argc, const char *argv[])
+{
+ if ( argc == 0 && argv == NULL )
+ {
+ return 0;
+ }
+ memset(nk, 0, sizeof(fctkern_t));
+ fct_clp__init(&(nk->cl_parser), NULL);
+ fct_nlist__init(&(nk->logger_list));
+ nk->lt_usr = NULL; /* Supplied via 'install' mechanics. */
+ nk->lt_sys = FCT_LOGGER_TYPES;
+ fct_nlist__init2(&(nk->prefix_list), 0);
+ fct_nlist__init2(&(nk->ts_list), 0);
+ nk->cl_is_parsed =0;
+ /* Save a copy of the arguments. We do a delay parse of the command
+ line arguments in order to allow the client code to optionally configure
+ the command line parser.*/
+ nk->cl_argc = argc;
+ nk->cl_argv = argv;
+ fct_namespace_init(&(nk->ns));
+ return 1;
+}
+
+
+/* Takes OWNERSHIP of the test suite after we have finished executing
+its contents. This way we can build up all kinds of summaries at the end
+of a run. */
+static void
+fctkern__add_ts(fctkern_t *nk, fct_ts_t *ts)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( ts != NULL );
+ fct_nlist__append(&(nk->ts_list), ts);
+}
+
+
+/* Returns FCT_TRUE if the supplied test_name passes the filters set on
+this test suite. If there are no filters, we return FCT_TRUE always. */
+static nbool_t
+fctkern__pass_filter(fctkern_t *nk, char const *test_name)
+{
+ size_t prefix_i =0;
+ size_t prefix_list_size =0;
+ FCT_ASSERT( nk != NULL && "invalid arg");
+ FCT_ASSERT( test_name != NULL );
+ FCT_ASSERT( strlen(test_name) > 0 );
+ prefix_list_size = fctkern__filter_cnt(nk);
+ /* If there is no filter list, then we return FCT_TRUE always. */
+ if ( prefix_list_size == 0 )
+ {
+ return FCT_TRUE;
+ }
+ /* Iterate through the prefix filter list, and see if we have
+ anything that does not pass. All we require is ONE item that
+ passes the test in order for us to succeed here. */
+ for ( prefix_i = 0; prefix_i != prefix_list_size; ++prefix_i )
+ {
+ char const *prefix = (char const*)fct_nlist__at(
+ &(nk->prefix_list), prefix_i
+ );
+ nbool_t pass = fct_filter_pass(prefix, test_name);
+ if ( pass )
+ {
+ return FCT_TRUE;
+ }
+ }
+ /* Otherwise, we never managed to find a prefix that satisfied the
+ supplied test name. Therefore we have failed to pass to the filter
+ list test. */
+ return FCT_FALSE;
+}
+
+
+/* Returns the number of tests that were performed. */
+static size_t
+fctkern__tst_cnt(fctkern_t const *nk)
+{
+ size_t tally =0;
+ FCT_ASSERT( nk != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
+ {
+ tally += fct_ts__tst_cnt(ts);
+ }
+ FCT_NLIST_FOREACH_END();
+ return tally;
+}
+
+
+/* Returns the number of tests that passed. */
+static size_t
+fctkern__tst_cnt_passed(fctkern_t const *nk)
+{
+ size_t tally =0;
+ FCT_ASSERT( nk != NULL );
+
+ FCT_NLIST_FOREACH_BGN(fct_ts_t*, ts, &(nk->ts_list))
+ {
+ tally += fct_ts__tst_cnt_passed(ts);
+ }
+ FCT_NLIST_FOREACH_END();
+
+ return tally;
+}
+
+
+/* Returns the number of tests that failed. */
+#define fctkern__tst_cnt_failed(nk) \
+ (fctkern__tst_cnt(nk) - fctkern__tst_cnt_passed(nk))
+
+
+/* Returns the number of checks made throughout the entire test. */
+#if defined(FCT_USE_TEST_COUNT)
+static size_t
+fctkern__chk_cnt(fctkern_t const *nk)
+{
+ size_t tally =0;
+ FCT_ASSERT( nk != NULL );
+
+ FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
+ {
+ tally += fct_ts__chk_cnt(ts);
+ }
+ FCT_NLIST_FOREACH_END();
+ return tally;
+}
+#endif /* FCT_USE_TEST_COUNT */
+
+
+/* Indicates the very end of all the tests. */
+#define fctkern__end(nk) /* unused */
+
+
+static void
+fctkern__log_suite_start(fctkern_t *nk, fct_ts_t const *ts)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( ts != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_suite_start(logger, ts);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_suite_end(fctkern_t *nk, fct_ts_t const *ts)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( ts != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_suite_end(logger, ts);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_suite_skip(fctkern_t *nk, char const *condition, char const *name)
+{
+ if ( nk == NULL )
+ {
+ return;
+ }
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_suite_skip(logger, condition, name);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_test_skip(fctkern_t *nk, char const *condition, char const *name)
+{
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_skip(logger, condition, name);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+/* Use this for displaying information about a "Check" (i.e.
+a condition). */
+static void
+fctkern__log_chk(fctkern_t *nk, fctchk_t const *chk)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( chk != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_chk(logger, chk);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+/* Use this for displaying warning messages. */
+static void
+fctkern__log_warn(fctkern_t *nk, char const *warn)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( warn != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_warn(logger, warn);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+/* Called whenever a test is started. */
+static void
+fctkern__log_test_start(fctkern_t *nk, fct_test_t const *test)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( test != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_start(logger, test);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_test_end(fctkern_t *nk, fct_test_t *test)
+{
+ FCT_ASSERT( nk != NULL );
+ FCT_ASSERT( test != NULL );
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+ {
+ fct_logger__on_test_end(logger, test);
+ }
+ FCT_NLIST_FOREACH_END();
+}
+
+
+#define fctkern__log_start(_NK_) \
+ {\
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
+ {\
+ fct_logger__on_fctx_start(logger, (_NK_));\
+ }\
+ FCT_NLIST_FOREACH_END();\
+ }
+
+
+#define fctkern__log_end(_NK_) \
+ {\
+ FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
+ {\
+ fct_logger__on_fctx_end(logger, (_NK_));\
+ }\
+ FCT_NLIST_FOREACH_END();\
+ }
+
+
+
+
+/*
+-----------------------------------------------------------
+LOGGER INTERFACE
+
+Defines an interface to a logging system. A logger
+must define the following functions in order to hook
+into the logging system.
+
+See the "Standard Logger" and "Minimal Logger" as examples
+of the implementation.
+-----------------------------------------------------------
+*/
+
+/* Common event argument. The values of the each event may or may not be
+defined depending on the event in question. */
+struct _fct_logger_evt_t
+{
+ fctkern_t const *kern;
+ fctchk_t const *chk;
+ fct_test_t const *test;
+ fct_ts_t const *ts;
+ char const *msg;
+ char const *cndtn;
+ char const *name;
+};
+
+
+typedef struct _fct_logger_i_vtable_t
+{
+ /* 1
+ * Fired when an "fct_chk*" (check) function is completed. The event
+ * will contain a reference to the "chk" object created.
+ * */
+ void (*on_chk)(fct_logger_i *logger, fct_logger_evt_t const *e);
+
+ /* 2
+ * Fired when a test starts and before any checks are made. The
+ * event will have its "test" object set. */
+ void (*on_test_start)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 3 */
+ void (*on_test_end)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 4 */
+ void (*on_test_suite_start)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 5 */
+ void (*on_test_suite_end)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 6 */
+ void (*on_fctx_start)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 7 */
+ void (*on_fctx_end)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 8
+ Called when the logger object must "clean up". */
+ void (*on_delete)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 9 */
+ void (*on_warn)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* -- new in 1.2 -- */
+ /* 10 */
+ void (*on_test_suite_skip)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+ /* 11 */
+ void (*on_test_skip)(
+ fct_logger_i *logger,
+ fct_logger_evt_t const *e
+ );
+} fct_logger_i_vtable_t;
+
+#define _fct_logger_head \
+ fct_logger_i_vtable_t vtable; \
+ fct_logger_evt_t evt
+
+struct _fct_logger_i
+{
+ _fct_logger_head;
+};
+
+
+static void
+fct_logger__stub(fct_logger_i *l, fct_logger_evt_t const *e)
+{
+ fct_unused(l);
+ fct_unused(e);
+}
+
+
+static fct_logger_i_vtable_t fct_logger_default_vtable =
+{
+ fct_logger__stub, /* 1. on_chk */
+ fct_logger__stub, /* 2. on_test_start */
+ fct_logger__stub, /* 3. on_test_end */
+ fct_logger__stub, /* 4. on_test_suite_start */
+ fct_logger__stub, /* 5. on_test_suite_end */
+ fct_logger__stub, /* 6. on_fctx_start */
+ fct_logger__stub, /* 7. on_fctx_end */
+ fct_logger__stub, /* 8. on_delete */
+ fct_logger__stub, /* 9. on_warn */
+ fct_logger__stub, /* 10. on_test_suite_skip */
+ fct_logger__stub, /* 11. on_test_skip */
+};
+
+
+/* Initializes the elements of a logger interface so they are at their
+standard values. */
+static void
+fct_logger__init(fct_logger_i *logger)
+{
+ FCT_ASSERT( logger != NULL );
+ memcpy(
+ &(logger->vtable),
+ &fct_logger_default_vtable,
+ sizeof(fct_logger_i_vtable_t)
+ );
+ memset(&(logger->evt),0, sizeof(fct_logger_evt_t));
+}
+
+static void
+fct_logger__del(fct_logger_i *logger)
+{
+ if ( logger )
+ {
+ logger->vtable.on_delete(logger, &(logger->evt));
+ }
+}
+
+
+static void
+fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test)
+{
+ logger->evt.test = test;
+ logger->vtable.on_test_start(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test)
+{
+ logger->evt.test = test;
+ logger->vtable.on_test_end(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts)
+{
+ logger->evt.ts = ts;
+ logger->vtable.on_test_suite_start(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts)
+{
+ logger->evt.ts = ts;
+ logger->vtable.on_test_suite_end(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_skip(
+ fct_logger_i *logger,
+ char const *condition,
+ char const *name
+)
+{
+ logger->evt.cndtn = condition;
+ logger->evt.name = name;
+ logger->vtable.on_test_suite_skip(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_skip(
+ fct_logger_i *logger,
+ char const *condition,
+ char const *name
+)
+{
+ logger->evt.cndtn = condition;
+ logger->evt.name = name;
+ logger->vtable.on_test_skip(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_chk(fct_logger_i *logger, fctchk_t const *chk)
+{
+ logger->evt.chk = chk;
+ logger->vtable.on_chk(logger, &(logger->evt));
+}
+
+/* When we start all our tests. */
+#define fct_logger__on_fctx_start(LOGGER, KERN) \
+ (LOGGER)->evt.kern = (KERN);\
+ (LOGGER)->vtable.on_fctx_start((LOGGER), &((LOGGER)->evt));
+
+
+/* When we have reached the end of ALL of our testing. */
+#define fct_logger__on_fctx_end(LOGGER, KERN) \
+ (LOGGER)->evt.kern = (KERN);\
+ (LOGGER)->vtable.on_fctx_end((LOGGER), &((LOGGER)->evt));
+
+
+static void
+fct_logger__on_warn(fct_logger_i *logger, char const *msg)
+{
+ logger->evt.msg = msg;
+ logger->vtable.on_warn(logger, &(logger->evt));
+}
+
+
+/* Common routine to record strings representing failures. The
+chk should be a failure before we call this, and the list is a list
+of conditions that will eventually be free'd by the logger. */
+static void
+fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list)
+{
+ fctchk_t *dup_chk = (fctchk_t *)malloc(sizeof(*dup_chk));
+ memcpy(dup_chk, chk, sizeof(*dup_chk));
+ fct_nlist__append(fail_list, (void *)dup_chk);
+}
+
+
+/* Another common routine, to print the failures at the end of a run. */
+static void
+fct_logger_print_failures(fct_nlist_t const *fail_list)
+{
+ const char *last_test = NULL;
+ puts(
+ "\n----------------------------------------------------------------------------\n"
+ );
+ puts("FAILED TESTS\n");
+ FCT_NLIST_FOREACH_BGN(fctchk_t const *, chk, fail_list)
+ {
+ if (!last_test || strcmp(last_test, fctchk__name(chk))) {
+ printf("\n%s\n", fctchk__name(chk));
+ }
+ last_test = fctchk__name(chk);
+ printf(" %s(%d):\n %s\n",
+ fctchk__file(chk),
+ fctchk__lineno(chk),
+ fctchk__msg(chk));
+ }
+ FCT_NLIST_FOREACH_END();
+
+ puts("\n");
+}
+
+
+
+
+/*
+-----------------------------------------------------------
+MINIMAL LOGGER
+-----------------------------------------------------------
+
+At the moment the MINIMAL LOGGER is currently disabled. Hope
+to bring it back online soon. The only reason it is
+disabled is that we don't currently have the ability to specify
+loggers.
+*/
+
+
+/* Minimal logger, reports the minimum amount of information needed
+to determine "something is happening". */
+struct _fct_minimal_logger_t
+{
+ _fct_logger_head;
+ /* A list of char*'s that needs to be cleaned up. */
+ fct_nlist_t failed_cndtns_list;
+};
+
+
+static void
+fct_minimal_logger__on_chk(
+ fct_logger_i *self_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+ if ( fctchk__is_pass(e->chk) )
+ {
+ fputs(".", stdout);
+ }
+ else
+ {
+ fputs("x", stdout);
+ fct_logger_record_failure(e->chk, &(self->failed_cndtns_list));
+
+ }
+}
+
+static void
+fct_minimal_logger__on_fctx_end(
+ fct_logger_i *self_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+ fct_unused(e);
+ if ( fct_nlist__size(&(self->failed_cndtns_list)) >0 )
+ {
+ fct_logger_print_failures(&(self->failed_cndtns_list));
+ }
+}
+
+
+static void
+fct_minimal_logger__on_delete(
+ fct_logger_i *self_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+ fct_unused(e);
+ fct_nlist__final(&(self->failed_cndtns_list), (fct_nlist_on_del_t)fctchk__del);
+ free(self);
+
+}
+
+
+fct_logger_i*
+fct_minimal_logger_new(void)
+{
+ fct_minimal_logger_t *self = (fct_minimal_logger_t*)\
+ calloc(1,sizeof(fct_minimal_logger_t));
+ if ( self == NULL )
+ {
+ return NULL;
+ }
+ fct_logger__init((fct_logger_i*)self);
+ self->vtable.on_chk = fct_minimal_logger__on_chk;
+ self->vtable.on_fctx_end = fct_minimal_logger__on_fctx_end;
+ self->vtable.on_delete = fct_minimal_logger__on_delete;
+ fct_nlist__init2(&(self->failed_cndtns_list), 0);
+ return (fct_logger_i*)self;
+}
+
+
+/*
+-----------------------------------------------------------
+STANDARD LOGGER
+-----------------------------------------------------------
+*/
+
+struct _fct_standard_logger_t
+{
+ _fct_logger_head;
+
+ /* Start time. For now we use the low-accuracy time_t version. */
+ fct_timer_t timer;
+
+ /* A list of char*'s that needs to be cleaned up. */
+ fct_nlist_t failed_cndtns_list;
+};
+
+
+#define FCT_STANDARD_LOGGER_MAX_LINE 68
+
+
+/* When a failure occurs, we will record the details so we can display
+them when the log "finishes" up. */
+static void
+fct_standard_logger__on_chk(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+ /* Only record failures. */
+ if ( !fctchk__is_pass(e->chk) )
+ {
+ fct_logger_record_failure(e->chk, &(logger->failed_cndtns_list));
+ }
+}
+
+
+static void
+fct_standard_logger__on_test_skip(
+ fct_logger_i* logger_,
+ fct_logger_evt_t const *e
+)
+{
+ char const *condition = e->cndtn;
+ char const *name = e->name;
+ char msg[256] = {'\0'};
+ fct_unused(logger_);
+ fct_unused(condition);
+ fct_snprintf(msg, sizeof(msg), "%s (%s)", name, condition);
+ msg[sizeof(msg)-1] = '\0';
+ fct_dotted_line_start(FCT_STANDARD_LOGGER_MAX_LINE, msg);
+ fct_dotted_line_end("- SKIP -");
+}
+
+
+static void
+fct_standard_logger__on_test_start(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_unused(logger_);
+ fct_dotted_line_start(
+ FCT_STANDARD_LOGGER_MAX_LINE,
+ fct_test__name(e->test)
+ );
+}
+
+
+static void
+fct_standard_logger__on_test_end(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ nbool_t is_pass;
+ fct_unused(logger_);
+ is_pass = fct_test__is_pass(e->test);
+ fct_dotted_line_end((is_pass) ? "PASS" : "FAIL ***" );
+}
+
+
+static void
+fct_standard_logger__on_fctx_start(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+ fct_unused(e);
+ fct_timer__start(&(logger->timer));
+}
+
+
+static void
+fct_standard_logger__on_fctx_end(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+ nbool_t is_success =1;
+ double elasped_time =0;
+ size_t num_tests =0;
+ size_t num_passed =0;
+
+ fct_timer__stop(&(logger->timer));
+
+ is_success = fct_nlist__size(&(logger->failed_cndtns_list)) ==0;
+
+ if ( !is_success )
+ {
+ fct_logger_print_failures(&(logger->failed_cndtns_list));
+ }
+ puts(
+ "\n----------------------------------------------------------------------------\n"
+ );
+ num_tests = fctkern__tst_cnt(e->kern);
+ num_passed = fctkern__tst_cnt_passed(e->kern);
+ printf(
+ "%s (%lu/%lu tests",
+ (is_success) ? "PASSED" : "FAILED",
+ (unsigned long) num_passed,
+ (unsigned long) num_tests
+ );
+ elasped_time = fct_timer__duration(&(logger->timer));
+ if ( elasped_time > 0.0000001 )
+ {
+ printf(" in %.6fs)\n", elasped_time);
+ }
+ else
+ {
+ /* Don't bother displaying the time to execute. */
+ puts(")\n");
+ }
+}
+
+
+static void
+fct_standard_logger__on_delete(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+ fct_unused(e);
+ fct_nlist__final(&(logger->failed_cndtns_list), (fct_nlist_on_del_t)fctchk__del);
+ free(logger);
+ logger_ =NULL;
+}
+
+
+static void
+fct_standard_logger__on_warn(
+ fct_logger_i* logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_unused(logger_);
+ (void)printf("WARNING: %s", e->msg);
+}
+
+
+fct_logger_i*
+fct_standard_logger_new(void)
+{
+ fct_standard_logger_t *logger = (fct_standard_logger_t *)calloc(
+ 1, sizeof(fct_standard_logger_t)
+ );
+ if ( logger == NULL )
+ {
+ return NULL;
+ }
+ fct_logger__init((fct_logger_i*)logger);
+ logger->vtable.on_chk = fct_standard_logger__on_chk;
+ logger->vtable.on_test_start = fct_standard_logger__on_test_start;
+ logger->vtable.on_test_end = fct_standard_logger__on_test_end;
+ logger->vtable.on_fctx_start = fct_standard_logger__on_fctx_start;
+ logger->vtable.on_fctx_end = fct_standard_logger__on_fctx_end;
+ logger->vtable.on_delete = fct_standard_logger__on_delete;
+ logger->vtable.on_warn = fct_standard_logger__on_warn;
+ logger->vtable.on_test_skip = fct_standard_logger__on_test_skip;
+ fct_nlist__init2(&(logger->failed_cndtns_list), 0);
+ fct_timer__init(&(logger->timer));
+ return (fct_logger_i*)logger;
+}
+
+
+/*
+-----------------------------------------------------------
+JUNIT LOGGER
+-----------------------------------------------------------
+*/
+
+
+/* JUnit logger */
+struct _fct_junit_logger_t
+{
+ _fct_logger_head;
+};
+
+
+static void
+fct_junit_logger__on_test_suite_start(
+ fct_logger_i *l,
+ fct_logger_evt_t const *e
+)
+{
+ fct_unused(l);
+ fct_unused(e);
+ FCT_SWITCH_STDOUT_TO_BUFFER();
+ FCT_SWITCH_STDERR_TO_BUFFER();
+}
+
+
+static void
+fct_junit_logger__on_test_suite_end(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_ts_t const *ts = e->ts; /* Test Suite */
+ nbool_t is_pass;
+ double elasped_time = 0;
+ char std_buffer[1024];
+ int read_length;
+ int first_out_line;
+
+ fct_unused(logger_);
+
+ elasped_time = fct_ts__duration(ts);
+
+ FCT_SWITCH_STDOUT_TO_STDOUT();
+ FCT_SWITCH_STDERR_TO_STDERR();
+
+ /* opening testsuite tag */
+ printf("\t\n",
+ (unsigned long) fct_ts__tst_cnt(ts)
+ - fct_ts__tst_cnt_passed(ts),
+ (unsigned long) fct_ts__tst_cnt(ts),
+ fct_ts__name(ts),
+ elasped_time);
+
+ FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
+ {
+ is_pass = fct_test__is_pass(test);
+
+ /* opening testcase tag */
+ if (is_pass)
+ {
+ printf("\t\t\n",
+ fct_test__name(test),
+ fct_test__duration(test)
+ );
+ }
+
+ FCT_NLIST_FOREACH_BGN(fctchk_t*, chk, &(test->failed_chks))
+ {
+ /* error tag */
+ printf("\t\t\t", chk->msg);
+ printf("file:%s, line:%d", chk->file, chk->lineno);
+ printf("\n");
+ }
+ FCT_NLIST_FOREACH_END();
+
+ /* closing testcase tag */
+ if (is_pass)
+ {
+ printf(" />\n");
+ }
+ else
+ {
+ printf("\t\t\n");
+ }
+ }
+ FCT_NLIST_FOREACH_END();
+
+ /* print the std streams */
+ first_out_line = 1;
+ printf("\t\t\n\t\t\t 0)
+ {
+ if (first_out_line)
+ {
+ printf("\n");
+ first_out_line = 0;
+ }
+ printf("%.*s", read_length, std_buffer);
+ }
+ printf("]]>\n\t\t\n");
+
+ first_out_line = 1;
+ printf("\t\t\n\t\t\t 0)
+ {
+ if (first_out_line)
+ {
+ printf("\n");
+ first_out_line = 0;
+ }
+ printf("%.*s", read_length, std_buffer);
+ }
+ printf("]]>\n\t\t\n");
+
+ /* closing testsuite tag */
+ printf("\t\n");
+}
+
+static void
+fct_junit_logger__on_fct_start(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_unused(logger_);
+ fct_unused(e);
+ printf("\n");
+ printf("\n");
+}
+
+static void
+fct_junit_logger__on_fctx_end(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_unused(logger_);
+ fct_unused(e);
+ printf("\n");
+}
+
+static void
+fct_junit_logger__on_delete(
+ fct_logger_i *logger_,
+ fct_logger_evt_t const *e
+)
+{
+ fct_junit_logger_t *logger = (fct_junit_logger_t*)logger_;
+ fct_unused(e);
+ free(logger);
+ logger_ =NULL;
+}
+
+
+fct_junit_logger_t *
+fct_junit_logger_new(void)
+{
+ fct_junit_logger_t *logger =
+ (fct_junit_logger_t *)calloc(1, sizeof(fct_junit_logger_t));
+ if ( logger == NULL )
+ {
+ return NULL;
+ }
+ fct_logger__init((fct_logger_i*)logger);
+ logger->vtable.on_test_suite_start = fct_junit_logger__on_test_suite_start;
+ logger->vtable.on_test_suite_end = fct_junit_logger__on_test_suite_end;
+ logger->vtable.on_fctx_start = fct_junit_logger__on_fct_start;
+ logger->vtable.on_fctx_end = fct_junit_logger__on_fctx_end;
+ logger->vtable.on_delete = fct_junit_logger__on_delete;
+ return logger;
+}
+
+
+/*
+------------------------------------------------------------
+MACRO MAGIC
+------------------------------------------------------------
+This is where the show begins!
+*/
+
+/* This macro invokes a bunch of functions that need to be referenced in
+order to avoid a "unreferenced local function has been removed" warning.
+The logical acrobatics below try and make it appear to the compiler that
+they are needed, but at runtime, only the cheap, first call is made. */
+#define FCT_REFERENCE_FUNCS() \
+ {\
+ int check = 0 && fctstr_ieq(NULL, NULL);\
+ if ( check ) {\
+ _fct_cmt("not to be executed");\
+ (void)_fct_chk_empty_str(NULL);\
+ (void)_fct_chk_full_str(NULL);\
+ (void)fct_test__start_timer(NULL);\
+ (void)fct_test__stop_timer(NULL);\
+ (void)fct_ts_new(NULL);\
+ (void)fct_ts__test_begin(NULL);\
+ (void)fct_ts__add_test(NULL, NULL);\
+ (void)fct_ts__test_end(NULL);\
+ (void)fct_ts__inc_total_test_num(NULL);\
+ (void)fct_ts__make_abort_test(NULL);\
+ (void)fct_ts__setup_abort(NULL);\
+ (void)fct_ts__setup_end(NULL);\
+ (void)fct_ts__teardown_end(NULL);\
+ (void)fct_ts__cnt_end(NULL);\
+ (void)fct_ts__is_test_cnt(NULL, 0);\
+ (void)fct_xchk_fn(0, "");\
+ (void)fct_xchk2_fn(NULL, 0, "");\
+ (void)fctkern__cl_parse(NULL);\
+ (void)fctkern__add_ts(NULL, NULL);\
+ (void)fctkern__pass_filter(NULL, NULL);\
+ (void)fctkern__log_suite_start(NULL, NULL);\
+ (void)fctkern__log_suite_end(NULL, NULL);\
+ (void)fctkern__log_test_skip(NULL, NULL, NULL);\
+ (void)fctkern__log_test_start(NULL, NULL);\
+ (void)fctkern__log_test_end(NULL, NULL);\
+ (void)fctstr_endswith(NULL,NULL);\
+ (void)fctstr_iendswith(NULL,NULL);\
+ (void)fctstr_ieq(NULL,NULL);\
+ (void)fctstr_incl(NULL, NULL);\
+ (void)fctstr_iincl(NULL, NULL);\
+ (void)fctstr_iendswith(NULL,NULL);\
+ (void)fctstr_istartswith(NULL,NULL);\
+ (void)fctstr_clone_lower(NULL);\
+ (void)fctstr_startswith(NULL,NULL);\
+ (void)fctkern__init(NULL, 0, NULL);\
+ (void)fctkern__cl_is(NULL, "");\
+ (void)fctkern__cl_val2(NULL, NULL, NULL);\
+ fctkern__log_suite_skip(NULL, NULL, NULL);\
+ (void)fct_clp__is_param(NULL,NULL);\
+ _fct_cmt("should never construct an object");\
+ (void)fct_test_new(NULL);\
+ (void)fct_ts__chk_cnt(NULL);\
+ }\
+ }
+
+
+#define FCT_INIT(_ARGC_, _ARGV_) \
+ fctkern_t fctkern__; \
+ fctkern_t* fctkern_ptr__ = &fctkern__; \
+ FCT_REFERENCE_FUNCS(); \
+ if ( !fctkern__init(fctkern_ptr__, (_ARGC_), (const char **)(_ARGV_)) ) {\
+ (void)fprintf( \
+ stderr, "FATAL ERROR: Unable to initialize FCTX Kernel." \
+ ); \
+ exit(EXIT_FAILURE); \
+ } \
+
+
+#define FCT_FINAL() \
+ fctkern_ptr__->ns.num_total_failed = fctkern__tst_cnt_failed( \
+ (fctkern_ptr__) \
+ ); \
+ fctkern__log_end(fctkern_ptr__); \
+ fctkern__end(fctkern_ptr__); \
+ fctkern__final(fctkern_ptr__); \
+ FCT_ASSERT( !((int)fctkern_ptr__->ns.num_total_failed < 0) \
+ && "or we got truncated!"); \
+ if ( fctkern_ptr__->ns.num_total_failed == \
+ fctkern_ptr__->num_expected_failures) { \
+ fctkern_ptr__->ns.num_total_failed = 0; \
+ } \
+
+
+
+#define FCT_NUM_FAILED() \
+ fctkern_ptr__->ns.num_total_failed \
+
+
+
+/* Typically used internally only, this mentions to FCTX that you EXPECT
+to _NUM_FAILS_. If you the expected matches the actual, a 0 value is returned
+from the program. */
+#define FCT_EXPECTED_FAILURES(_NUM_FAILS_) \
+ ((fctkern_ptr__->num_expected_failures = (_NUM_FAILS_)))
+
+
+#define FCT_BGN_FN(_FNNAME_) \
+ int _FNNAME_(int argc, char* argv[])\
+ { \
+ FCT_INIT(argc, argv)
+
+#define FCT_END_FN() FCT_END()
+
+/* This defines our start. The fctkern__ is a kernel object
+that lives throughout the lifetime of our program. The
+fctkern_ptr__ makes it easier to abstract out macros. */
+#define FCT_BGN() FCT_BGN_FN(main)
+
+
+/* Silence Intel complaints about unspecified operand order in user's code */
+#ifndef __INTEL_COMPILER
+# define FCT_END_WARNINGFIX_BGN
+# define FCT_END_WARNINGFIX_END
+#else
+# define FCT_END_WARNINGFIX_BGN _Pragma("warning(push,disable:981)");
+# define FCT_END_WARNINGFIX_END _Pragma("warning(pop)");
+#endif
+
+/* Ends the test suite by returning the number failed. The "chk_cnt" call is
+made in order allow strict compilers to pass when it encounters unreferenced
+functions. */
+#define FCT_END() \
+ { \
+ FCT_END_WARNINGFIX_BGN \
+ FCT_FINAL(); \
+ return (int) FCT_NUM_FAILED();\
+ FCT_END_WARNINGFIX_END \
+ }\
+}
+
+#define fctlog_install(_CUST_LOGGER_LIST_) \
+ fctkern_ptr__->lt_usr = (_CUST_LOGGER_LIST_)
+
+/* Re-parses the command line options with the addition of user defined
+options. */
+#define fctcl_install(_CLO_INIT_) \
+ {\
+ fctkern_ptr__->cl_user_opts = (_CLO_INIT_);\
+ _fct_cmt("Delay parse in order to allow for user customization.");\
+ if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
+ int status = fctkern__cl_parse((fctkern_ptr__));\
+ _fct_cmt("Need to parse command line before we start logger.");\
+ fctkern__log_start((fctkern_ptr__));\
+ switch( status ) {\
+ case -1:\
+ case 0:\
+ fctkern__final(fctkern_ptr__);\
+ exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
+ break;\
+ default:\
+ fct_pass();\
+ }\
+ }\
+ }
+
+
+#define fctcl_is(_OPT_STR_) (fctkern__cl_is(fctkern_ptr__, (_OPT_STR_)))
+
+#define fctcl_val(_OPT_STR_) (fctcl_val2((_OPT_STR_), NULL))
+
+#define fctcl_val2(_OPT_STR_, _DEF_STR_) \
+ (fctkern__cl_val2(fctkern_ptr__, (_OPT_STR_), (_DEF_STR_)))
+
+
+/* We delay the first parse of the command line until we get the first
+test fixture. This allows the user to possibly add their own parse
+specification. */
+#define FCT_FIXTURE_SUITE_BGN(_NAME_) \
+ {\
+ fctkern_ptr__->ns.ts_curr = fct_ts_new( #_NAME_ );\
+ _fct_cmt("Delay parse in order to allow for user customization.");\
+ if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
+ int status = fctkern__cl_parse((fctkern_ptr__));\
+ _fct_cmt("Need to parse command line before we start logger.");\
+ fctkern__log_start((fctkern_ptr__));\
+ switch( status ) {\
+ case -1:\
+ case 0:\
+ fct_ts__del((fctkern_ptr__->ns.ts_curr));\
+ fctkern__final(fctkern_ptr__);\
+ exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
+ break;\
+ default:\
+ fct_pass();\
+ }\
+ }\
+ if ( fctkern_ptr__->ns.ts_curr == NULL ) {\
+ fctkern__log_warn((fctkern_ptr__), "out of memory");\
+ }\
+ else\
+ {\
+ fctkern__log_suite_start((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+ for (;;)\
+ {\
+ fctkern_ptr__->ns.test_num = -1;\
+ if ( fct_ts__is_ending_mode(fctkern_ptr__->ns.ts_curr) \
+ || fct_ts__is_abort_mode(fctkern_ptr__->ns.ts_curr) )\
+ {\
+ _fct_cmt("flag the test suite as complete.");\
+ fct_ts__end(fctkern_ptr__->ns.ts_curr);\
+ break;\
+ }
+
+
+
+/* Closes off a "Fixture" test suite. */
+#define FCT_FIXTURE_SUITE_END() \
+ if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
+ {\
+ fct_ts__cnt_end(fctkern_ptr__->ns.ts_curr);\
+ }\
+ }\
+ fctkern__add_ts((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+ fctkern__log_suite_end((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+ fct_ts__end(fctkern_ptr__->ns.ts_curr);\
+ fctkern_ptr__->ns.ts_curr = NULL;\
+ }\
+ }
+
+#define FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, _NAME_) \
+ fctkern_ptr__->ns.ts_is_skip_suite = !(_CONDITION_);\
+ fctkern_ptr__->ns.ts_skip_cndtn = #_CONDITION_;\
+ if ( fctkern_ptr__->ns.ts_is_skip_suite ) {\
+ fctkern__log_suite_skip((fctkern_ptr__), #_CONDITION_, #_NAME_);\
+ }\
+ FCT_FIXTURE_SUITE_BGN(_NAME_);
+
+#define FCT_FIXTURE_SUITE_END_IF() \
+ FCT_FIXTURE_SUITE_END();\
+ fctkern_ptr__->ns.ts_is_skip_suite =0;\
+ fctkern_ptr__->ns.ts_skip_cndtn =NULL;\
+
+#define FCT_SETUP_BGN()\
+ if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) ) {
+
+#define FCT_SETUP_END() \
+ fct_ts__setup_end(fctkern_ptr__->ns.ts_curr); }
+
+#define FCT_TEARDOWN_BGN() \
+ if ( fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) {\
+
+#define FCT_TEARDOWN_END() \
+ fct_ts__teardown_end(fctkern_ptr__->ns.ts_curr); \
+ continue; \
+ }
+
+/* Lets you create a test suite, where maybe you don't want a fixture. We
+do it by 'stubbing' out the setup/teardown logic. */
+#define FCT_SUITE_BGN(Name) \
+ FCT_FIXTURE_SUITE_BGN(Name) {\
+ FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
+ FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
+
+#define FCT_SUITE_END() } FCT_FIXTURE_SUITE_END()
+
+#define FCT_SUITE_BGN_IF(_CONDITION_, _NAME_) \
+ FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, (_NAME_)) {\
+ FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
+ FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
+
+#define FCT_SUITE_END_IF() } FCT_FIXTURE_SUITE_END_IF()
+
+typedef enum
+{
+ FCT_TEST_END_FLAG_Default = 0x0000,
+ FCT_TEST_END_FLAG_ClearFail = 0x0001
+} FCT_TEST_END_FLAG;
+
+
+#define FCT_TEST_BGN_IF(_CONDITION_, _NAME_) { \
+ fctkern_ptr__->ns.test_is_skip = !(_CONDITION_);\
+ fctkern_ptr__->ns.test_skip_cndtn = #_CONDITION_;\
+ FCT_TEST_BGN(_NAME_) {\
+
+#define FCT_TEST_END_IF() \
+ } FCT_TEST_END();\
+ fctkern_ptr__->ns.test_is_skip = 0;\
+ fctkern_ptr__->ns.test_skip_cndtn = NULL;\
+ }
+
+
+/* Depending on whether or not we are counting the tests, we will have to
+first determine if the test is the "current" count. Then we have to determine
+if we can pass the filter. Finally we will execute everything so that when a
+check fails, we can "break" out to the end of the test. And in between all
+that we do a memory check and fail a test if we can't build a fct_test
+object (should be rare). */
+#define FCT_TEST_BGN(_NAME_) \
+ {\
+ fctkern_ptr__->ns.curr_test_name = #_NAME_;\
+ ++(fctkern_ptr__->ns.test_num);\
+ if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
+ {\
+ fct_ts__inc_total_test_num(fctkern_ptr__->ns.ts_curr);\
+ }\
+ else if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) \
+ && fct_ts__is_test_cnt(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.test_num) )\
+ {\
+ fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
+ if ( fctkern__pass_filter(fctkern_ptr__, fctkern_ptr__->ns.curr_test_name ) )\
+ {\
+ fctkern_ptr__->ns.curr_test = fct_test_new( fctkern_ptr__->ns.curr_test_name );\
+ if ( fctkern_ptr__->ns.curr_test == NULL ) {\
+ fctkern__log_warn(fctkern_ptr__, "out of memory");\
+ } else if ( fctkern_ptr__->ns.ts_is_skip_suite \
+ || fctkern_ptr__->ns.test_is_skip ) {\
+ fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
+ fctkern__log_test_skip(\
+ fctkern_ptr__,\
+ fctkern_ptr__->ns.curr_test_name,\
+ (fctkern_ptr__->ns.test_is_skip) ?\
+ (fctkern_ptr__->ns.test_skip_cndtn) :\
+ (fctkern_ptr__->ns.ts_skip_cndtn)\
+ );\
+ fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
+ continue;\
+ } else {\
+ fctkern__log_test_start(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
+ fct_test__start_timer(fctkern_ptr__->ns.curr_test);\
+ for (;;) \
+ {
+
+
+
+
+#define FCT_TEST_END() \
+ break;\
+ }\
+ fct_test__stop_timer(fctkern_ptr__->ns.curr_test);\
+ }\
+ fct_ts__add_test(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test);\
+ fctkern__log_test_end(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
+ }\
+ fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
+ continue;\
+ }\
+ }\
+
+
+
+/*
+---------------------------------------------------------
+CHECKING MACROS
+----------------------------------------------------------
+
+The chk variants will continue on while the req variants will abort
+a test if a chk condition fails. The req variants are useful when you
+no longer want to keep checking conditions because a critical condition
+is not being met. */
+
+
+/* To support older compilers that do not have macro variable argument lists
+we have to use a function. The macro manages to store away the line/file
+location into a global before it runs this function, a trick I picked up from
+the error handling in the APR library. The unfortunate thing is that we can
+not carry forth the actual test through a "stringize" operation, but if you
+wanted to do that you should use fct_chk. */
+
+static int fct_xchk_lineno =0;
+static char const *fct_xchk_file = NULL;
+static fct_test_t *fct_xchk_test = NULL;
+static fctkern_t *fct_xchk_kern =NULL;
+
+
+static int
+_fct_xchk_fn_varg(
+ char const *condition,
+ int is_pass,
+ char const *format,
+ va_list args
+)
+{
+ fctchk_t *chk =NULL;
+ chk = fctchk_new(
+
+ is_pass,
+ condition,
+ fct_test__name(fct_xchk_test),
+ fct_xchk_file,
+ fct_xchk_lineno,
+ format,
+ args
+ );
+ if ( chk == NULL )
+ {
+ fctkern__log_warn(fct_xchk_kern, "out of memory (aborting test)");
+ goto finally;
+ }
+
+ fct_test__add(fct_xchk_test, chk);
+ fctkern__log_chk(fct_xchk_kern, chk);
+finally:
+ fct_xchk_lineno =0;
+ fct_xchk_file =NULL;
+ fct_xchk_test =NULL;
+ fct_xchk_kern =NULL;
+ return is_pass;
+}
+
+
+static int
+fct_xchk2_fn(const char *condition, int is_pass, char const *format, ...)
+{
+ int r =0;
+ va_list args;
+ va_start(args, format);
+ r = _fct_xchk_fn_varg(condition, is_pass, format, args);
+ va_end(args);
+ return r;
+}
+
+
+static int
+fct_xchk_fn(int is_pass, char const *format, ...)
+{
+ int r=0;
+ va_list args;
+ va_start(args, format);
+ r = _fct_xchk_fn_varg("", is_pass, format, args);
+ va_end(args);
+ return r;
+}
+
+
+/* Call this with the following argument list:
+
+ fct_xchk(test_condition, format_str, ...)
+
+the bulk of this macro presets some globals to allow us to support
+variable argument lists on older compilers. The idea came from the APR
+libraries error checking routines. */
+#define fct_xchk fct_xchk_kern = fctkern_ptr__,\
+ fct_xchk_test = fctkern_ptr__->ns.curr_test,\
+ fct_xchk_lineno =__LINE__,\
+ fct_xchk_file=__FILE__,\
+ fct_xchk_fn
+
+#define fct_xchk2 fct_xchk_kern = fctkern_ptr__,\
+ fct_xchk_test = fctkern_ptr__->ns.curr_test,\
+ fct_xchk_lineno =__LINE__,\
+ fct_xchk_file=__FILE__,\
+ fct_xchk2_fn
+
+
+/* This checks the condition and reports the condition as a string
+if it fails. */
+#define fct_chk(_CNDTN_) (fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_))
+
+#define _fct_req(_CNDTN_) \
+ if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { break; }
+
+
+/* When in test mode, construct a mock test object for fct_xchk to operate
+with. If we fail a setup up, then we go directly to a teardown mode. */
+#define fct_req(_CNDTN_) \
+ if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) ) { \
+ _fct_req((_CNDTN_)); \
+ } \
+ else if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) \
+ || fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) { \
+ fctkern_ptr__->ns.curr_test = fct_ts__make_abort_test( \
+ fctkern_ptr__->ns.ts_curr \
+ ); \
+ if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { \
+ fct_ts__setup_abort(fctkern_ptr__->ns.ts_curr); \
+ fct_ts__add_test( \
+ fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test \
+ ); \
+ } \
+ } else { \
+ assert("invalid condition for fct_req!"); \
+ _fct_req((_CNDTN_)); \
+ }
+
+
+#define fct_chk_eq_dbl(V1, V2) \
+ fct_xchk(\
+ ((int)(fabs((V1)-(V2)) < DBL_EPSILON)),\
+ "chk_eq_dbl: %f != %f",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_neq_dbl(V1, V2) \
+ fct_xchk(\
+ ((int)(fabs((V1)-(V2)) >= DBL_EPSILON)),\
+ "chk_neq_dbl: %f == %f",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_eq_str(V1, V2) \
+ fct_xchk(fctstr_eq((V1), (V2)),\
+ "chk_eq_str: '%s' != '%s'",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_neq_str(V1, V2) \
+ fct_xchk(!fctstr_eq((V1), (V2)),\
+ "chk_neq_str: '%s' == '%s'",\
+ (V1),\
+ (V2)\
+ )
+
+/* To quiet warnings with GCC, who think we are being silly and passing
+in NULL to strlen, we will filter the predicate through these little
+functions */
+static int
+_fct_chk_empty_str(char const *s)
+{
+ if ( s == NULL )
+ {
+ return 1;
+ }
+ return strlen(s) ==0;
+}
+static int
+_fct_chk_full_str(char const *s)
+{
+ if ( s == NULL )
+ {
+ return 0;
+ }
+ return strlen(s) >0;
+}
+
+
+#define fct_chk_empty_str(V) \
+ fct_xchk(_fct_chk_empty_str((V)),\
+ "string not empty: '%s'",\
+ (V)\
+ )
+
+#define fct_chk_full_str(V) \
+ fct_xchk(_fct_chk_full_str((V)),\
+ "string is full: '%s'",\
+ (V)\
+ )
+
+
+#define fct_chk_eq_istr(V1, V2) \
+ fct_xchk(fctstr_ieq((V1), (V2)),\
+ "chk_eq_str: '%s' != '%s'",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_neq_istr(V1, V2) \
+ fct_xchk(!fctstr_ieq((V1), (V2)),\
+ "chk_neq_str: '%s' == '%s'",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_endswith_str(STR, CHECK)\
+ fct_xchk(fctstr_endswith((STR),(CHECK)),\
+ "fct_chk_endswith_str: '%s' doesn't end with '%s'",\
+ (STR),\
+ (CHECK)\
+ )
+
+
+#define fct_chk_iendswith_str(STR, CHECK)\
+ fct_xchk(fctstr_iendswith((STR), (CHECK)),\
+ "fch_chk_iendswith_str: '%s' doesn't end with '%s'.",\
+ (STR),\
+ (CHECK)\
+ )
+
+#define fct_chk_excl_str(STR, CHECK_EXCLUDE) \
+ fct_xchk(!fctstr_incl((STR), (CHECK_EXCLUDE)),\
+ "fct_chk_excl_str: '%s' is included in '%s'",\
+ (STR),\
+ (CHECK_EXCLUDE)\
+ )
+
+#define fct_chk_excl_istr(ISTR, ICHECK_EXCLUDE) \
+ fct_xchk(!fctstr_iincl((ISTR), (ICHECK_EXCLUDE)),\
+ "fct_chk_excl_istr (case insensitive): '%s' is "\
+ "included in'%s'",\
+ (ISTR),\
+ (ICHECK_EXCLUDE)\
+ )
+
+#define fct_chk_incl_str(STR, CHECK_INCLUDE) \
+ fct_xchk(fctstr_incl((STR), (CHECK_INCLUDE)),\
+ "fct_chk_incl_str: '%s' does not include '%s'",\
+ (STR),\
+ (CHECK_INCLUDE)\
+ )
+
+
+#define fct_chk_incl_istr(ISTR, ICHECK_INCLUDE) \
+ fct_xchk(fctstr_iincl((ISTR), (ICHECK_INCLUDE)),\
+ "fct_chk_incl_istr (case insensitive): '%s' does "\
+ "not include '%s'",\
+ (ISTR),\
+ (ICHECK_INCLUDE)\
+ )
+
+
+#define fct_chk_startswith_str(STR, CHECK)\
+ fct_xchk(fctstr_startswith((STR), (CHECK)),\
+ "'%s' does not start with '%s'",\
+ (STR),\
+ (CHECK)\
+ )
+
+
+#define fct_chk_startswith_istr(STR, CHECK)\
+ fct_xchk(fctstr_istartswith((STR), (CHECK)),\
+ "case insensitive check: '%s' does not start with '%s'",\
+ (STR),\
+ (CHECK)\
+ )
+
+#define fct_chk_eq_int(V1, V2) \
+ fct_xchk(\
+ ((V1) == (V2)),\
+ "chq_eq_int: %d != %d",\
+ (V1),\
+ (V2)\
+ )
+
+
+#define fct_chk_neq_int(V1, V2) \
+ fct_xchk(\
+ ((V1) != (V2)),\
+ "chq_neq_int: %d == %d",\
+ (V1),\
+ (V2)\
+ )
+
+#define fct_chk_ex(EXCEPTION, CODE) \
+ { \
+ bool pass_chk_ex = false; \
+ try { \
+ CODE; \
+ pass_chk_ex = false; \
+ } catch ( EXCEPTION ) { \
+ pass_chk_ex = true; \
+ } catch ( ... ) { \
+ pass_chk_ex = false; \
+ } \
+ fct_xchk( \
+ pass_chk_ex, \
+ "%s exception not generated", \
+ #EXCEPTION \
+ ); \
+ } \
+
+/*
+---------------------------------------------------------
+GUT CHECK MACROS
+----------------------------------------------------------
+
+The following macros are used to help check the "guts" of
+the FCT, and to confirm that it all works according to spec.
+*/
+
+/* Generates a message to STDERR and exits the application with a
+non-zero number. */
+#define _FCT_GUTCHK(_CNDTN_) \
+ if ( !(_CNDTN_) ) {\
+ fprintf(stderr, "gutchk fail: '" #_CNDTN_ "' was not true.\n");\
+ exit(1);\
+ }\
+ else {\
+ fprintf(stdout, "gutchk pass: '" #_CNDTN_ "'\n");\
+ }
+
+/*
+---------------------------------------------------------
+MULTI-FILE TEST SUITE MACROS
+----------------------------------------------------------
+
+I struggled trying to figure this out in a way that was
+as simple as possible. I wanted to be able to define
+the test suite in one object file, then refer it within
+the other one within the minimum amount of typing.
+
+Unfortunately without resorting to some supermacro
+work, I could only find a happy comprimise.
+
+See test_multi.c for an example.
+*/
+
+/* The following macros are used in your separate object
+file to define your test suite. */
+
+
+#define FCTMF_FIXTURE_SUITE_BGN(NAME) \
+ void NAME (fctkern_t *fctkern_ptr__) {\
+ FCT_REFERENCE_FUNCS();\
+ FCT_FIXTURE_SUITE_BGN( NAME ) {
+
+#define FCTMF_FIXTURE_SUITE_END() \
+ } FCT_FIXTURE_SUITE_END();\
+ }
+
+#define FCTMF_SUITE_BGN(NAME) \
+ void NAME (fctkern_t *fctkern_ptr__) {\
+ FCT_REFERENCE_FUNCS();\
+ FCT_SUITE_BGN( NAME ) {
+#define FCTMF_SUITE_END() \
+ } FCT_SUITE_END(); \
+ }
+
+
+/* Deprecated, no longer required. */
+#define FCTMF_SUITE_DEF(NAME)
+
+
+/* Executes a test suite defined by FCTMF_SUITE* */
+#define FCTMF_SUITE_CALL(NAME) {\
+ void NAME (fctkern_t *);\
+ NAME (fctkern_ptr__);\
+ }
+
+
+/*
+---------------------------------------------------------
+FCT QUICK TEST API
+----------------------------------------------------------
+The goal of these little macros is to try and get you
+up and running with a test as quick as possible.
+
+The basic idea is that there is one test per test suite.
+*/
+
+#define FCT_QTEST_BGN(NAME) \
+ FCT_SUITE_BGN(NAME) {\
+ FCT_TEST_BGN(NAME) {\
+
+#define FCT_QTEST_END() \
+ } FCT_TEST_END();\
+ } FCT_SUITE_END();
+
+
+#define FCT_QTEST_BGN_IF(_CONDITION_, _NAME_) \
+ FCT_SUITE_BGN(_NAME_) {\
+ FCT_TEST_BGN_IF(_CONDITION_, _NAME_) {\
+
+#define FCT_QTEST_END_IF() \
+ } FCT_TEST_END_IF();\
+ } FCT_SUITE_END();
+
+#endif /* !FCT_INCLUDED__IMB */
diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h
new file mode 100644
index 0000000000..18656b3e29
--- /dev/null
+++ b/src/include/test/switch_test.h
@@ -0,0 +1,807 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Chris Rienzo
+ * Seven Du
+ *
+ * switch_test.h -- FreeSWITCH test macros
+ */
+#ifndef SWITCH_FST_H
+#define SWITCH_FST_H
+
+#include
+
+#include
+
+/**
+ * Get environment variable and save to var
+ */
+static char *fst_getenv_default(const char *env, char *default_value, switch_bool_t required)
+{
+ char *val = getenv(env);
+ if (!val) {
+ if (required) {
+ fprintf(stderr, "Failed to start test: environment variable \"%s\" is not set!\n", env);
+ exit(1);
+ }
+ return default_value;
+ }
+ return val;
+}
+
+/**
+ * Get environment variable and save to var
+ */
+#define fst_getenv(env, default_value) \
+ char *env = fst_getenv_default(#env, (char *)default_value, SWITCH_FALSE);
+
+/**
+ * Get mandatory environment variable and save to var. Exit with error if missing.
+ */
+#define fst_getenv_required(env) \
+ char *env = fst_getenv_default(#env, NULL, SWITCH_TRUE);
+
+/**
+ * initialize FS core from optional configuration dir
+ */
+static void fst_init_core_and_modload(const char *confdir, const char *basedir, int minimal)
+{
+ const char *err;
+ // Let FreeSWITCH core pick these
+ //SWITCH_GLOBAL_dirs.base_dir = strdup("/usr/local/freeswitch");
+ //SWITCH_GLOBAL_dirs.mod_dir = strdup("/usr/local/freeswitch/mod");
+ //SWITCH_GLOBAL_dirs.lib_dir = strdup("/usr/local/freeswitch/lib");
+ //SWITCH_GLOBAL_dirs.temp_dir = strdup("/tmp");
+
+ if (zstr(basedir)) {
+ basedir = ".";
+ }
+
+ // Allow test to define the runtime dir
+ if (!zstr(confdir)) {
+#ifdef SWITCH_TEST_BASE_DIR_FOR_CONF
+ SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf("%s%s%s", SWITCH_TEST_BASE_DIR_FOR_CONF, SWITCH_PATH_SEPARATOR, confdir);
+#else
+ if (confdir[0] != '/') {
+ SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf(".%s%s", SWITCH_PATH_SEPARATOR, confdir);
+ } else {
+ SWITCH_GLOBAL_dirs.conf_dir = strdup(confdir);
+ }
+#endif
+ } else {
+ SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf("%s%sconf", basedir, SWITCH_PATH_SEPARATOR);
+ }
+
+ SWITCH_GLOBAL_dirs.log_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.run_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.recordings_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.sounds_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.cache_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.db_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.script_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.htdocs_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.grammar_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.fonts_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.images_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.storage_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.data_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+ SWITCH_GLOBAL_dirs.localstate_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR);
+
+ switch_core_set_globals();
+
+ if (!minimal) {
+ switch_core_init_and_modload(0, SWITCH_TRUE, &err);
+ switch_sleep(1 * 1000000);
+ switch_core_set_variable("sound_prefix", "." SWITCH_PATH_SEPARATOR);
+ } else {
+ switch_core_init(SCF_MINIMAL, SWITCH_TRUE, &err);
+ }
+}
+
+/**
+ * Park FreeSWITCH session. This is handy when wanting to use switch_core_session_execute_async() on the test session.
+ * @param session to park
+ */
+#define fst_session_park(session) \
+ switch_ivr_park_session(session); \
+ switch_channel_wait_for_state(switch_core_session_get_channel(session), NULL, CS_PARK);
+
+/**
+ * check for test requirement - execute teardown on failure
+ */
+#define fst_requires fct_req
+
+/**
+ * check for required module - execute teardown on failure
+ */
+#define fst_requires_module(modname) fct_req(switch_loadable_module_exists(modname) == SWITCH_STATUS_SUCCESS)
+
+/**
+ * test boolean expression - continue test execution on failure
+ */
+#define fst_check fct_chk
+
+/**
+ * test integers for equality - continue test execution on failure
+ */
+#define fst_check_int_equals fct_chk_eq_int
+
+/**
+ * test strings for equality - continue test execution on failure
+ */
+#define fst_check_string_equals fct_chk_eq_str
+
+/**
+ * test strings for inequality - continue test execution on failure
+ */
+#define fst_check_string_not_equals fct_chk_neq_str
+
+/**
+ * Mark reference for time measure
+ */
+#define fst_time_mark() \
+ fst_time_start = switch_time_now();
+
+/**
+ * Check a test /w error message
+ */
+#define fst_xcheck(expr, error_msg) \
+ fct_xchk(expr, error_msg);
+
+/**
+ * Fail a test
+ */
+#define fst_fail(error_msg) \
+ fct_xchk(0, error_msg);
+
+/**
+ * Check duration relative to test start, last marked time, or last check.
+ */
+#define fst_check_duration(duration_ms, precision_ms) \
+ { \
+ int actual_duration_ms = (int)((switch_time_now() - fst_time_start) / 1000); \
+ fct_xchk( \
+ abs((actual_duration_ms - duration_ms)) <= precision_ms, \
+ "fst_check_duration: %d != %d +/- %d", \
+ (actual_duration_ms), \
+ (duration_ms), \
+ (precision_ms) \
+ ); \
+ }
+
+/**
+ * Check if integer is in range
+ */
+#define fst_check_int_range(actual, expected, precision) \
+ fct_xchk( \
+ abs((actual - expected)) <= precision, \
+ "fst_check_int_range: %d != %d +/- %d", \
+ (actual), \
+ (expected), \
+ (precision) \
+ );
+
+/**
+ * Check if double-precision number is in range
+ */
+#define fst_check_double_range(actual, expected, precision) \
+ fct_xchk( \
+ fabs((actual - expected)) <= precision, \
+ "fst_check_double_range: %f != %f +/- %f", \
+ (actual), \
+ (expected), \
+ (precision) \
+ );
+
+/**
+ * Run test without loading FS core
+ */
+#define FST_BEGIN() \
+ FCT_BGN() \
+ { \
+ int fst_core = 0; \
+ switch_time_t fst_time_start = 0; \
+ switch_timer_t fst_timer = { 0 }; \
+ switch_memory_pool_t *fst_pool = NULL; \
+ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \
+ if (fst_core) { \
+ fst_init_core_and_modload(NULL, NULL, 0); /* shuts up compiler */ \
+ } \
+ { \
+
+
+#define FST_END() \
+ } \
+ if (fst_time_start) { \
+ /* shut up compiler */ \
+ fst_time_start = 0; \
+ } \
+ } \
+ FCT_END()
+
+/**
+ * Define the beginning of a freeswitch core test driver. Only one per test application allowed.
+ * @param confdir directory containing freeswitch.xml configuration
+ */
+#define FST_CORE_BEGIN(confdir) \
+ FCT_BGN() \
+ { \
+ int fst_core = 2; \
+ switch_time_t fst_time_start = 0; \
+ switch_timer_t fst_timer = { 0 }; \
+ switch_memory_pool_t *fst_pool = NULL; \
+ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \
+ fst_init_core_and_modload(confdir, NULL, 0); \
+ {
+
+
+/**
+ * Define the end of a freeswitch core test driver.
+ */
+#define FST_CORE_END() \
+ /*switch_core_destroy();*/ \
+ } \
+ if (fst_time_start) { \
+ /* shut up compiler */ \
+ fst_time_start = 0; \
+ } \
+ } \
+ FCT_END()
+
+/**
+ * Minimal FS core load
+ */
+#define FST_MINCORE_BEGIN() \
+ FCT_BGN() \
+ { \
+ int fst_core = 1; \
+ switch_time_t fst_time_start = 0; \
+ switch_timer_t fst_timer = { 0 }; \
+ switch_memory_pool_t *fst_pool = NULL; \
+ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \
+ fst_init_core_and_modload(".", NULL, 1); /* minimal load */ \
+ {
+
+#define FST_MINCORE_END FST_CORE_END
+
+/**
+ * Define the beginning of a FreeSWITCH module test suite. Loads the module for test.
+ * @param modname name of module to load.
+ * @param suite the name of this test suite
+ */
+#ifdef WIN32
+#define FST_MODULE_BEGIN(modname,suite) \
+ { \
+ const char *fst_test_module = #modname; \
+ if (fst_core && !zstr(fst_test_module)) { \
+ const char *err; \
+ switch_loadable_module_load_module((char *)"./mod", (char *)fst_test_module, SWITCH_TRUE, &err); \
+ } \
+ FCT_FIXTURE_SUITE_BGN(suite);
+#else
+#define FST_MODULE_BEGIN(modname,suite) \
+ { \
+ const char *fst_test_module = #modname; \
+ if (fst_core && !zstr(fst_test_module)) { \
+ const char *err; \
+ switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_TRUE, &err); \
+ } \
+ FCT_FIXTURE_SUITE_BGN(suite);
+#endif
+
+/**
+ * Define the end of a FreeSWITCH module test suite.
+ */
+#ifdef WIN32
+#define FST_MODULE_END() \
+ FCT_FIXTURE_SUITE_END(); \
+ if (!zstr(fst_test_module) && switch_loadable_module_exists(fst_test_module) == SWITCH_STATUS_SUCCESS) { \
+ const char *err; \
+ switch_loadable_module_unload_module((char *)"./mod", (char *)fst_test_module, SWITCH_FALSE, &err); \
+ } \
+ }
+#else
+#define FST_MODULE_END() \
+ FCT_FIXTURE_SUITE_END(); \
+ if (!zstr(fst_test_module) && switch_loadable_module_exists(fst_test_module) == SWITCH_STATUS_SUCCESS) { \
+ const char *err; \
+ switch_loadable_module_unload_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \
+ } \
+ }
+#endif
+
+/**
+ * Define the beginning of a test suite not associated with a module.
+ * @param suite the name of this test suite
+ */
+#define FST_SUITE_BEGIN(suite) \
+ const char *fst_test_module = NULL; \
+ FCT_FIXTURE_SUITE_BGN(suite)
+
+/**
+ * Define the end of a test suite.
+ */
+#define FST_SUITE_END FCT_FIXTURE_SUITE_END
+
+
+/**
+ * Define the test suite setup. This is run before each test or session test.
+ */
+#define FST_SETUP_BEGIN() \
+ FCT_SETUP_BGN() \
+ if (fst_core) { \
+ switch_core_new_memory_pool(&fst_pool); \
+ fst_requires(fst_pool != NULL); \
+ if (fst_core > 1) { \
+ fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \
+ } \
+ fst_time_mark(); \
+ }
+
+/**
+ * Define the end of test suite setup.
+ */
+#define FST_SETUP_END FCT_SETUP_END
+
+
+/**
+ * Define the test suite teardown. This is run after each test or session test.
+ */
+#define FST_TEARDOWN_BEGIN() \
+ FCT_TEARDOWN_BGN() \
+ if (fst_core) { \
+ switch_core_destroy_memory_pool(&fst_pool); \
+ if (fst_core > 1) { \
+ switch_core_timer_destroy(&fst_timer); \
+ } \
+ }
+
+/**
+ * Define the test suite teardown end.
+ */
+#define FST_TEARDOWN_END FCT_TEARDOWN_END
+
+/**
+ * Define a test in a test suite.
+ * Defined vars:
+ * switch_memory_pool_t *fst_pool; A memory pool that is torn down on test completion
+ * switch_core_timer_t *fst_timer; A 8kHz, 20ms soft timer (160 samples per frame)
+ * @param name the name of this test
+ */
+#define FST_TEST_BEGIN(name) \
+ FCT_TEST_BGN(name) \
+ if (fst_test_module) { \
+ fst_requires_module(fst_test_module); \
+ }
+
+#define FST_TEST_END FCT_TEST_END
+
+
+/**
+ * Define a session test in a test suite. This can be used to test IVR functions.
+ *
+ * Records session audio to /tmp/name.wav where name is the name of the test.
+ *
+ * Required modules:
+ * mod_loopback - for null endpoint
+ * mod_sndfile - for wav file support
+ *
+ * Defined vars:
+ * switch_memory_pool_t *fst_pool; A memory pool that is torn down on test completion
+ * switch_core_timer_t *fst_timer; A 8kHz, 20ms soft timer (160 samples per frame)
+ * switch_core_session_t *fst_session; The outbound null session. L16, 1 channel, 8kHz.
+ * switch_core_session_t *fst_session_pool; The outbound null session's pool.
+ * switch_channel_t *fst_channel; The outbound null session's channel.
+ *
+ * @param name the name of this test
+ * @param rate the rate of the channel
+ */
+
+#define FST_SESSION_BEGIN_RATE(name, rate) \
+ FCT_TEST_BGN(name) \
+ { \
+ switch_core_session_t *fst_session = NULL; \
+ switch_event_t *fst_originate_vars = NULL; \
+ switch_call_cause_t fst_cause = SWITCH_CAUSE_NORMAL_CLEARING; \
+ fst_requires(fst_core); \
+ if (fst_test_module) { \
+ fst_requires_module(fst_test_module); \
+ } \
+ fst_requires_module("mod_loopback"); \
+ fst_requires_module("mod_sndfile"); \
+ fst_requires(switch_core_running()); \
+ fst_requires(switch_event_create_plain(&fst_originate_vars, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS); \
+ switch_event_add_header_string(fst_originate_vars, SWITCH_STACK_BOTTOM, "origination_caller_id_number", "+15551112222"); \
+ switch_event_add_header(fst_originate_vars, SWITCH_STACK_BOTTOM, "rate", "%d", rate); \
+ if (switch_ivr_originate(NULL, &fst_session, &fst_cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, fst_originate_vars, SOF_NONE, NULL, NULL) == SWITCH_STATUS_SUCCESS && fst_session) { \
+ switch_memory_pool_t *fst_session_pool = switch_core_session_get_pool(fst_session); \
+ switch_channel_t *fst_channel = switch_core_session_get_channel(fst_session); \
+ switch_channel_set_state(fst_channel, CS_SOFT_EXECUTE); \
+ switch_channel_wait_for_state(fst_channel, NULL, CS_SOFT_EXECUTE); \
+ switch_channel_set_variable(fst_channel, "send_silence_when_idle", "-1"); \
+ switch_channel_set_variable(fst_channel, "RECORD_STEREO", "true"); \
+ switch_ivr_record_session(fst_session, (char *)"/tmp/"#name".wav", 0, NULL); \
+ for(;;) {
+
+/**
+ * Define a session test in a test suite. This can be used to test IVR functions.
+ * See FST_SESSION_BEGIN_RATE
+ */
+
+#define FST_SESSION_BEGIN(name) FST_SESSION_BEGIN_RATE(name, 8000)
+
+/* BODY OF TEST CASE HERE */
+
+/**
+ * Define the end of a session test in a test suite.
+ * Hangs up session under test.
+ */
+#define FST_SESSION_END() \
+ break; \
+ } \
+ if (switch_channel_ready(fst_channel)) { \
+ switch_channel_hangup(fst_channel, SWITCH_CAUSE_NORMAL_CLEARING); \
+ } \
+ if (fst_originate_vars) { \
+ switch_event_destroy(&fst_originate_vars); \
+ } \
+ if (fst_session_pool) { \
+ fst_session_pool = NULL; \
+ } \
+ switch_core_session_rwunlock(fst_session); \
+ switch_sleep(1000000); \
+ } \
+ } \
+ FCT_TEST_END()
+
+
+/* CORE ASR TEST MACROS */
+
+/**
+ * Open core ASR for a recognizer module. Opens for L16, 1 channel, 8KHz.
+ *
+ * Test Requires:
+ * switch_core_asr_open() == SWITCH_STATUS_SUCCESS
+ *
+ * Defined vars:
+ * switch_asr_handle_t ah; Core ASR handle
+ * switch_asr_flag_t flags; Core ASR flags used to open recognizer.
+ * char *fst_asr_result; Result of last recognition. Allocated from test memory pool.
+ *
+ * @param recognizer name of recognizer to open (like gcloud_dialogflow)
+ *
+ */
+#define fst_test_core_asr_open(recognizer) \
+{\
+ char *fst_asr_result = NULL; \
+ switch_asr_handle_t ah = { 0 }; \
+ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE; \
+ fst_requires(fst_core > 1); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Open recognizer: %s\n", recognizer); \
+ /* open ASR interface and feed recorded audio into it and collect result */ \
+ fst_requires(switch_core_asr_open(&ah, recognizer, "L16", 8000, "", &flags, fst_pool) == SWITCH_STATUS_SUCCESS); \
+
+/**
+ * Execute test on opened recognizer. Reads audio from input file and passes it to the recognizer.
+ *
+ * Test Requires:
+ * switch_core_asr_load_grammar(grammar) == SWITCH_STATUS_SUCCESS
+ * switch_core_file_open(input_filename) == SWITCH_STATUS_SUCCESS
+ * switch_core_file_close() == SWITCH_STATUS_SUCCESS
+ *
+ * Test Checks:
+ * Got result from recognizer.
+ *
+ * Test Output:
+ * fst_asr_result has the xmlstr from switch_core_file_get_results()
+ *
+ * @param grammar recognizer grammar
+ * @param input_filename name of file containing audio to send to recognizer.
+ */
+#define fst_test_core_asr(grammar, input_filename) \
+{ \
+ /* feed file into ASR */ \
+ switch_status_t result; \
+ switch_file_handle_t file_handle = { 0 }; \
+ uint8_t *buf; \
+ size_t len = 160; \
+ int got_result = 0; \
+ fst_asr_result = NULL; \
+ file_handle.channels = 1; \
+ file_handle.native_rate = 8000; \
+ fst_requires(fst_core > 1); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \
+ fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \
+ fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \
+ buf = (uint8_t *)switch_core_alloc(fst_pool, sizeof(uint8_t) * 160 * sizeof(uint16_t) * file_handle.channels); \
+ switch_core_timer_sync(&fst_timer); \
+ while ((result = switch_core_file_read(&file_handle, buf, &len)) == SWITCH_STATUS_SUCCESS) { \
+ fst_requires(switch_core_asr_feed(&ah, buf, len * sizeof(int16_t), &flags) == SWITCH_STATUS_SUCCESS); \
+ switch_core_timer_next(&fst_timer); \
+ if (switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS) { \
+ char *xmlstr = NULL; \
+ switch_event_t *headers = NULL; \
+ flags = SWITCH_ASR_FLAG_NONE; \
+ /* switch_ivr_detect_speech.. checks one in media bug then again in speech_thread */ \
+ fst_requires(switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS); \
+ result = switch_core_asr_get_results(&ah, &xmlstr, &flags); \
+ if (result == SWITCH_STATUS_SUCCESS) { \
+ got_result++; \
+ switch_core_asr_get_result_headers(&ah, &headers, &flags); \
+ if (headers) { \
+ switch_event_destroy(&headers); \
+ } \
+ fst_check(xmlstr != NULL); \
+ if (xmlstr != NULL) { \
+ fst_asr_result = switch_core_strdup(fst_pool, xmlstr);\
+ } \
+ switch_safe_free(xmlstr); \
+ break; \
+ } \
+ } \
+ len = 160; \
+ } \
+ fst_check(got_result == 1); \
+ fst_requires(switch_core_file_close(&file_handle) == SWITCH_STATUS_SUCCESS); \
+}
+
+/**
+ * Pause an open recognizer.
+ *
+ * Test Requires:
+ * switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS
+ */
+#define fst_test_core_asr_pause() \
+ fst_requires(fst_core > 1); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Pause recognizer\n"); \
+ flags = SWITCH_ASR_FLAG_NONE; \
+ fst_requires(switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS);
+
+/**
+ * Resumes an open recognizer
+ *
+ * Test Requires:
+ * switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS
+ */
+#define fst_test_core_asr_resume() \
+ fst_requires(fst_core > 1); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Resume recognizer\n"); \
+ flags = SWITCH_ASR_FLAG_NONE; \
+ fst_requires(switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS);
+
+/**
+ * Close an open recognizer
+ *
+ * Test Requires:
+ * switch_core_asr_close(&ah, flags) == SWITCH_STATUS_SUCCESS
+ */
+#define fst_test_core_asr_close() \
+ fst_requires(fst_core > 1); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Close recognizer\n"); \
+ flags = SWITCH_ASR_FLAG_NONE; \
+ fst_requires(switch_core_asr_close(&ah, &flags) == SWITCH_STATUS_SUCCESS); \
+}
+
+
+
+/* PLAY AND DETECT SPEECH TEST MACROS - requires FST_SESSION */
+
+/**
+ * Define beginning of play_and_detect_speech recognizer test
+ *
+ * Defined vars:
+ * const char *fst_asr_result; Result of last recognition. Allocated from test memory pool.
+ */
+#define fst_play_and_detect_speech_test_begin() \
+{ \
+ const char *fst_asr_result = NULL; \
+ fst_requires(fst_core > 1);
+
+/**
+ * Use play_and_detect_speech APP to test recognizer
+ *
+ * Test Requires:
+ * switch_ivr_displace_session(input_filename) == SWITCH_STATUS_SUCCESS
+ * switch_core_session_execute_application(play_and_detect_speech) == SWITCH_STATUS_SUCCESS
+ * mod_dptools is loaded
+ *
+ * Test Checks:
+ * fst_asr_result != NULL after recognition completes
+ *
+ * Test Output:
+ * fst_asr_result has the result from detect_speech_result channel variable.
+ *
+ * @param recognizer name of recognizer
+ * @param grammar recognizer grammar
+ * @param prompt_filename name of prompt to play
+ * @param input_filename name of file containing input audio for the recognizer
+ */
+#define fst_play_and_detect_speech_app_test(recognizer, grammar, prompt_filename, input_filename) \
+{ \
+ char *args = NULL; \
+ fst_requires(fst_core > 1); \
+ fst_requires_module("mod_dptools"); \
+ switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \
+ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \
+ args = switch_core_session_sprintf(fst_session, "%s detect:%s %s", prompt_filename, recognizer, grammar); \
+ fst_requires(switch_core_session_execute_application(fst_session, "play_and_detect_speech", args) == SWITCH_STATUS_SUCCESS); \
+ fst_asr_result = switch_channel_get_variable(fst_channel, "detect_speech_result"); \
+ fst_check(fst_asr_result != NULL); \
+}
+
+/**
+ * Use play_and_detect_speech core function to test recognizer
+ *
+ * Test Requires:
+ * switch_ivr_displace_session(input_filename) == SWITCH_STATUS_SUCCESS
+ *
+ * Test Checks:
+ * fst_asr_result != NULL after recognition completes
+ *
+ * Test Output:
+ * fst_asr_result has the result from detect_speech_result channel variable.
+ *
+ * @param recognizer name of recognizer
+ * @param grammar recognizer grammar
+ * @param prompt_filename name of prompt to play
+ * @param input_filename name of file containing input audio for the recognizer
+ * @param input_args input callback args
+ */
+#define fst_play_and_detect_speech_test(recognizer, grammar, prompt_filename, input_filename, input_args) \
+{ \
+ char *args = NULL; \
+ fst_asr_result = NULL; \
+ fst_requires(fst_core > 1); \
+ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \
+ switch_status_t status = switch_ivr_play_and_detect_speech(fst_session, prompt_filename, recognizer, grammar, (char **)&fst_asr_result, 0, input_args); \
+ fst_check(fst_asr_result != NULL); \
+}
+
+/**
+ * Define end of play_and_detect_speech recognizer test
+ */
+#define fst_play_and_detect_speech_test_end() \
+}
+
+
+/**
+ * Compare extension dialplan apps and args with expected apps and args
+ * @param expected NULL terminated string array of app arg and names.
+ * const char *expected[] = { "playback", "https://example.com/foo.wav", "park", "", NULL };
+ * @param extension the switch_caller_extension_t to check
+ */
+#define fst_check_extension_apps(expected, extension) \
+ { \
+ fst_xcheck(extension != NULL, "Missing extension\n"); \
+ if (extension) { \
+ int i; \
+ switch_caller_application_t *cur_app = extension->applications; \
+ for (i = 0; ; i += 2, cur_app = cur_app->next) { \
+ int cur_app_num = i / 2 + 1; \
+ if (!expected[i]) { \
+ if (cur_app != NULL) { \
+ fst_fail(switch_core_sprintf(fst_pool, "Unexpected application #%d \"%s\"\n", cur_app_num, cur_app->application_name)); \
+ } \
+ break; \
+ } \
+ fst_xcheck(cur_app != NULL, switch_core_sprintf(fst_pool, "Extension application #%d \"%s\" is missing", cur_app_num, expected[i])); \
+ if (!cur_app) { \
+ break; \
+ } \
+ fst_xcheck(cur_app->application_name && !strcmp(expected[i], cur_app->application_name), switch_core_sprintf(fst_pool, "Expected application #%d name is \"%s\", but is \"%s\"\n", cur_app_num, expected[i], cur_app->application_name)); \
+ fst_xcheck(cur_app->application_data && !strcmp(expected[i + 1], cur_app->application_data), switch_core_sprintf(fst_pool, "Expected application #%d %s data is \"%s\", but is \"%s\"\n", cur_app_num, expected[i], expected[i + 1], cur_app->application_data)); \
+ } \
+ } \
+ }
+
+
+/**
+ * Inject DTMF into the session to be detected.
+ *
+ * Test Requires:
+ * switch_api_execute(sched_api) == SWITCH_STATUS_SUCCESS
+ * mod_commands is loaded
+ *
+ * @param when string describing when to send dtmf
+ * @param digits to send
+ */
+#define fst_sched_recv_dtmf(when, digits) \
+{ \
+ switch_stream_handle_t stream = { 0 }; \
+ SWITCH_STANDARD_STREAM(stream); \
+ fst_requires(fst_core > 1); \
+ fst_requires_module("mod_commands"); \
+ switch_status_t api_result = switch_api_execute("sched_api", switch_core_session_sprintf(fst_session, "%s none uuid_recv_dtmf %s %s", when, switch_core_session_get_uuid(fst_session), digits), NULL, &stream); \
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fst_session), SWITCH_LOG_INFO, "Injecting DTMF %s at %s\n", digits, when); \
+ fst_requires(api_result == SWITCH_STATUS_SUCCESS); \
+ switch_safe_free(stream.data); \
+}
+
+#define fst_xml_start() \
+ switch_stream_handle_t fst_xml_stream = { 0 }; \
+ SWITCH_STANDARD_STREAM(fst_xml_stream);
+ int fst_tag_children = 0;
+ int fst_tag_body = 0;
+
+#define fst_xml_open_tag(tag_name) \
+ fst_xml_stream.write_function(&fst_xml_stream, "<%s", #tag_name); \
+ fst_tag_children++;
+
+#define fst_xml_attr(attr) \
+ if (!zstr(attr)) fst_xml_stream.write_function(&fst_xml_stream, " %s=\"%s\"", #attr, attr);
+
+#define fst_xml_close_tag(tag_name) \
+ --fst_tag_children; \
+ if (fst_tag_children > 0 || fst_tag_body) { \
+ fst_xml_stream.write_function(&fst_xml_stream, "%s>", #tag_name); \
+ } else { \
+ fst_xml_stream.write_function(&fst_xml_stream, "/>"); \
+ } \
+ fst_tag_body = 0;
+
+#define fst_xml_body(body) \
+ if (fst_tag_body) { \
+ fst_xml_stream.write_function(&fst_xml_stream, "%s", body); \
+ } else { \
+ fst_tag_body = 1; \
+ fst_xml_stream.write_function(&fst_xml_stream, ">%s", body); \
+ }
+
+#define fst_xml_end() \
+ switch_xml_parse_str_dynamic((char *)fst_xml_stream.data, SWITCH_FALSE);
+
+
+/**
+ * Parse JSON file and save to varname
+ *
+ * Test Requires:
+ * JSON file can be opened and parsed
+ *
+ * Test Output:
+ * varname points at cJSON object
+ *
+ * @param varname name of var to store the resulting cJSON object
+ * @param file name of file to parse
+ */
+#define fst_parse_json_file(varname, file) \
+cJSON *varname = NULL; \
+{ \
+ char *buf; \
+ struct stat s; \
+ int size; \
+ int fd = open(file, O_RDONLY); \
+ fst_requires(fd >= 0); \
+ fstat(fd, &s); \
+ buf = malloc(s.st_size + 1); \
+ fst_requires(buf); \
+ size = read(fd, buf, s.st_size); \
+ fst_requires(size == s.st_size); \
+ close(fd); \
+ varname = cJSON_Parse(buf); \
+ free(buf); \
+ fst_requires(varname); \
+}
+
+#endif
diff --git a/src/mod/applications/mod_av/Makefile.am b/src/mod/applications/mod_av/Makefile.am
index 261985c7a9..cefcdcf113 100644
--- a/src/mod/applications/mod_av/Makefile.am
+++ b/src/mod/applications/mod_av/Makefile.am
@@ -9,6 +9,8 @@ mod_av_la_CFLAGS = $(AM_CFLAGS) $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE
mod_av_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS)
mod_av_la_LDFLAGS = -avoid-version -module -no-undefined -shared -lm -lz
+SUBDIRS=. test
+
else
install: error
all: error
diff --git a/src/mod/applications/mod_av/autoload_configs/av.conf.xml b/src/mod/applications/mod_av/autoload_configs/av.conf.xml
index 7d0390646a..cf28fab3d3 100644
--- a/src/mod/applications/mod_av/autoload_configs/av.conf.xml
+++ b/src/mod/applications/mod_av/autoload_configs/av.conf.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c
index 39b426acd6..594999310c 100644
--- a/src/mod/applications/mod_av/avcodec.c
+++ b/src/mod/applications/mod_av/avcodec.c
@@ -1089,14 +1089,16 @@ static void set_h264_private_data(h264_codec_context_t *context, avcodec_profile
if (context->hw_encoder) {
av_opt_set(context->encoder_ctx->priv_data, "preset", "llhp", 0);
av_opt_set_int(context->encoder_ctx->priv_data, "2pass", 1, 0);
+ av_opt_set_int(context->encoder_ctx->priv_data, "delay", 0, 0);
+ av_opt_set(context->encoder_ctx->priv_data, "forced-idr", "true", 0);
return;
}
av_opt_set(context->encoder_ctx->priv_data, "preset", "veryfast", 0);
av_opt_set(context->encoder_ctx->priv_data, "intra-refresh", "1", 0);
av_opt_set(context->encoder_ctx->priv_data, "tune", "animation+zerolatency", 0);
- av_opt_set(context->encoder_ctx->priv_data, "sc_threshold", "40", 0);
- av_opt_set(context->encoder_ctx->priv_data, "crf", "18", 0);
+ //av_opt_set(context->encoder_ctx->priv_data, "sc_threshold", "40", 0);
+ //av_opt_set(context->encoder_ctx->priv_data, "crf", "18", 0);
if (profile->options) {
switch_event_header_t *hp;
@@ -1269,22 +1271,19 @@ GCC_DIAG_ON(deprecated-declarations)
return SWITCH_STATUS_FALSE;
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not open hardware codec %s, trying software encoder\n", codec_string);
+ if (context->encoder_ctx) {
+ if (avcodec_is_open(context->encoder_ctx)) {
+ avcodec_close(context->encoder_ctx);
+ }
+ av_free(context->encoder_ctx);
+ context->encoder_ctx = NULL;
+ }
+ context->encoder = NULL;
context->hw_encoder = 0;
- av_opt_free(context->encoder_ctx->priv_data);
- set_h264_private_data(context, profile);
- context->encoder = avcodec_find_encoder(context->av_codec_id);
-
- if (!context->encoder) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find encoder id: %d\n", context->av_codec_id);
- return SWITCH_STATUS_FALSE;
- }
-
- if (avcodec_open2(context->encoder_ctx, context->encoder, NULL) < 0) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open codec %s\n", codec_string);
- return SWITCH_STATUS_FALSE;
- }
+ context->codec_settings.video.try_hardware_encoder = 0;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not open hardware codec %s, trying software encoder\n", codec_string);
+ return open_encoder(context, width, height);
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "codec opened: %s\n", codec_string);
@@ -1993,6 +1992,9 @@ static void load_config()
val = atoi(value);
+ ctx->profile = FF_PROFILE_H264_BASELINE;
+ ctx->level = 31;
+
if (!strcmp(name, "dec-threads")) {
aprofile->decoder_thread_count = switch_parse_cpu_string(value);
} else if (!strcmp(name, "enc-threads")) {
diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c
index 84900b601c..42abce911c 100644
--- a/src/mod/applications/mod_av/avformat.c
+++ b/src/mod/applications/mod_av/avformat.c
@@ -51,6 +51,13 @@ GCC_DIAG_ON(deprecated-declarations)
#define AV_TS_MAX_STRING_SIZE 32
+// Compatibility with old libav on Debian Jessie
+// Not required if libavcodec version > 56.34.1
+#ifndef AV_CODEC_FLAG_LOOP_FILTER
+#define AV_CODEC_FLAG_LOOP_FILTER CODEC_FLAG_LOOP_FILTER
+#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER
+#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE
+#endif
/* App interface */
@@ -479,13 +486,14 @@ GCC_DIAG_ON(deprecated-declarations)
c->ticks_per_frame = 2;
- c->flags|=CODEC_FLAG_LOOP_FILTER; // flags=+loop
+ c->flags|=AV_CODEC_FLAG_LOOP_FILTER; // flags=+loop
c->me_cmp|= 1; // cmp=+chroma, where CHROMA = 1
c->me_range = 16; // me_range=16
c->max_b_frames = 3; // bf=3
av_opt_set_int(c->priv_data, "b_strategy", 1, 0);
- av_opt_set_int(c->priv_data, "motion_est", ME_HEX, 0);
+ //av_opt_set_int(c->priv_data, "motion_est", ME_HEX, 0);
+ av_opt_set(c->priv_data, "motion_est", "hex", 0);
av_opt_set_int(c->priv_data, "coder", 1, 0);
switch (mm->vprofile) {
@@ -568,7 +576,7 @@ GCC_DIAG_ON(deprecated-declarations)
/* Some formats want stream headers to be separate. */
if (fc->oformat->flags & AVFMT_GLOBALHEADER) {
- c->flags |= CODEC_FLAG_GLOBAL_HEADER;
+ c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
mst->active = 1;
@@ -660,7 +668,7 @@ GCC_DIAG_ON(deprecated-declarations)
mst->frame->format = AV_SAMPLE_FMT_S16;
mst->frame->channel_layout = c->channel_layout;
- if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE) {
+ if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) {
//mst->frame->nb_samples = 10000;
mst->frame->nb_samples = (mst->frame->sample_rate / 50) * c->channels;
} else {
@@ -2357,6 +2365,7 @@ static switch_status_t av_file_read_video(switch_file_handle_t *handle, switch_f
}
if (pop && status == SWITCH_STATUS_SUCCESS) {
+ switch_img_free(&context->last_img);
context->last_img = (switch_image_t *)pop;
switch_img_copy(context->last_img, &frame->img);
context->vid_ready = 1;
@@ -2467,6 +2476,7 @@ GCC_DIAG_ON(deprecated-declarations)
if (switch_micro_time_now() - mst->next_pts > -10000) {
frame->img = img;
} else {
+ switch_img_free(&context->last_img);
context->last_img = img;
return SWITCH_STATUS_BREAK;
}
diff --git a/src/mod/applications/mod_av/test/Makefile.am b/src/mod/applications/mod_av/test/Makefile.am
new file mode 100644
index 0000000000..4c66bd22f6
--- /dev/null
+++ b/src/mod/applications/mod_av/test/Makefile.am
@@ -0,0 +1,4 @@
+bin_PROGRAMS = test_mod_av
+AM_CFLAGS = $(SWITCH_AM_CFLAGS) -I../ $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(AVRESAMPLE_CFALGS)
+AM_LDFLAGS = $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) ../mod_av.la
+TESTS = $(bin_PROGRAMS)
diff --git a/src/mod/applications/mod_av/test/conf/freeswitch.xml b/src/mod/applications/mod_av/test/conf/freeswitch.xml
new file mode 100644
index 0000000000..4c01b81229
--- /dev/null
+++ b/src/mod/applications/mod_av/test/conf/freeswitch.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj b/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj
new file mode 100644
index 0000000000..b8a036891f
--- /dev/null
+++ b/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj
@@ -0,0 +1,203 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ test_mod_av
+ test_mod_av
+ Win32Proj
+ 10.0.17134.0
+ {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}
+
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(PlatformName)\$(Configuration)\
+ false
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(PlatformName)\$(Configuration)\
+ false
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
+ false
+
+
+
+ $(SolutionDir)src\include;%(AdditionalIncludeDirectories)
+ SWITCH_TEST_BASE_DIR_FOR_CONF="..\\..\\src\\mod\\applications\\mod_av\\test\\";%(PreprocessorDefinitions)
+
+
+
+
+
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebugDLL
+
+
+ Level4
+ ProgramDatabase
+ true
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+
+
+ MachineX86
+
+
+
+
+
+ X64
+
+
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebugDLL
+
+
+ Level4
+ ProgramDatabase
+ true
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+
+
+ MachineX64
+
+
+
+
+
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreadedDLL
+
+
+ Level4
+ ProgramDatabase
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+ true
+
+
+ MachineX86
+
+
+
+
+
+ X64
+
+
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreadedDLL
+
+
+ Level4
+ ProgramDatabase
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+ true
+
+
+ MachineX64
+
+
+
+
+
+
+
+ {202d7a4e-760d-4d0e-afa1-d7459ced30ff}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mod/applications/mod_av/test/test_mod_av.c b/src/mod/applications/mod_av/test/test_mod_av.c
new file mode 100644
index 0000000000..51e594f344
--- /dev/null
+++ b/src/mod/applications/mod_av/test/test_mod_av.c
@@ -0,0 +1,145 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Seven Du
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ *
+ * mod_av_test -- avcodec tests
+ *
+ */
+
+#include
+
+int loop = 0;
+
+/* Add our command line options. */
+static fctcl_init_t my_cl_options[] = {
+ {"--disable-hw", /* long_opt */
+ NULL, /* short_opt (optional) */
+ FCTCL_STORE_TRUE , /* action */
+ "disable hardware encoder" /* help */
+ },
+
+ {"--loop", /* long_opt */
+ NULL, /* short_opt (optional) */
+ FCTCL_STORE_VALUE , /* action */
+ "loops to encode a picture" /* help */
+ },
+ FCTCL_INIT_NULL /* Sentinel */
+};
+
+FST_CORE_BEGIN("conf")
+{
+ fctcl_install(my_cl_options);
+
+ const char *loop_ = fctcl_val("--loop");
+ if (loop_) loop = atoi(loop_);
+
+ FST_MODULE_BEGIN(mod_av, mod_av_test)
+ {
+ FST_SETUP_BEGIN()
+ {
+ // fst_requires_module("mod_av");
+ }
+ FST_SETUP_END()
+
+ FST_TEST_BEGIN(encoder_test)
+ {
+ switch_status_t status;
+ switch_codec_t codec = { 0 };
+ switch_codec_settings_t codec_settings = { 0 };
+
+ // switch_set_string(codec_settings.video.config_profile_name, "conference");
+
+ if (!fctcl_is("--disable-hw")) {
+ codec_settings.video.try_hardware_encoder = 1;
+ }
+
+ status = switch_core_codec_init(&codec,
+ "H264",
+ NULL,
+ NULL,
+ 0,
+ 0,
+ 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ &codec_settings, fst_pool);
+ fst_check(status == SWITCH_STATUS_SUCCESS);
+
+ switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1);
+ fst_requires(img);
+
+ uint8_t buf[SWITCH_DEFAULT_VIDEO_SIZE + 12];
+ switch_frame_t frame = { 0 };
+
+ frame.packet = buf;
+ frame.packetlen = SWITCH_DEFAULT_VIDEO_SIZE + 12;
+ frame.data = buf + 12;
+ frame.datalen = SWITCH_DEFAULT_VIDEO_SIZE;
+ frame.payload = 96;
+ frame.m = 0;
+ frame.seq = 0;
+ frame.timestamp = 0;
+ frame.img = img;
+
+ int packets = 0;
+ switch_status_t encode_status;
+
+ do {
+ frame.datalen = SWITCH_DEFAULT_VIDEO_SIZE;
+ encode_status = switch_core_codec_encode_video(&codec, &frame);
+
+ if (encode_status == SWITCH_STATUS_SUCCESS || encode_status == SWITCH_STATUS_MORE_DATA) {
+
+ fst_requires((encode_status == SWITCH_STATUS_SUCCESS && frame.m) || !frame.m);
+
+ if (frame.flags & SFF_PICTURE_RESET) {
+ frame.flags &= ~SFF_PICTURE_RESET;
+ fst_check(0);
+ }
+
+ if (frame.datalen == 0) break;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[%d]: %02x %02x | m=%d | %d\n", loop, buf[12], buf[13], frame.m, frame.datalen);
+ packets++;
+ }
+
+ } while(encode_status == SWITCH_STATUS_MORE_DATA || loop-- > 1);
+
+ fst_check(frame.m == 1);
+ fst_check(packets > 0);
+
+ switch_core_codec_destroy(&codec);
+ }
+ FST_TEST_END()
+
+ FST_TEARDOWN_BEGIN()
+ {
+ const char *err = NULL;
+ switch_sleep(1000000);
+ fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_av", SWITCH_TRUE, &err) == SWITCH_STATUS_SUCCESS);
+ }
+ FST_TEARDOWN_END()
+ }
+ FST_MODULE_END()
+}
+FST_CORE_END()
diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c
index 6f6b1a41f9..3e15aa9fd8 100644
--- a/src/mod/applications/mod_conference/conference_api.c
+++ b/src/mod/applications/mod_conference/conference_api.c
@@ -2709,6 +2709,9 @@ switch_status_t conference_api_sub_file_seek(conference_obj_t *conference, switc
switch_status_t conference_api_set_moh(conference_obj_t *conference, const char *what)
{
+ if (!what) {
+ return SWITCH_STATUS_FALSE;
+ }
if (!strcasecmp(what, "toggle")) {
if (conference_utils_test_flag(conference, CFLAG_NO_MOH)) {
@@ -2737,7 +2740,15 @@ switch_status_t conference_api_set_moh(conference_obj_t *conference, const char
switch_status_t conference_api_sub_moh(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
{
- conference_api_set_moh(conference, argv[2]);
+ if (conference_api_set_moh(conference, argv[2]) == SWITCH_STATUS_SUCCESS) {
+ if (stream) {
+ stream->write_function(stream, "+OK moh\n");
+ }
+ } else {
+ if (stream) {
+ stream->write_function(stream, "-ERR invalid moh param\n");
+ }
+ }
return SWITCH_STATUS_SUCCESS;
}
@@ -4084,6 +4095,8 @@ switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switc
switch_assert(ebuf);
stream->write_function(stream, "%s", ebuf);
free(ebuf);
+
+ cJSON_Delete(conferences);
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/applications/mod_conference/conference_file.c b/src/mod/applications/mod_conference/conference_file.c
index f4e2866052..8f0dc1d8b7 100644
--- a/src/mod/applications/mod_conference/conference_file.c
+++ b/src/mod/applications/mod_conference/conference_file.c
@@ -248,7 +248,7 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u
flags = SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT;
- if (conference_utils_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) {
+ if (conference_utils_test_flag(conference, CFLAG_TRANSCODE_VIDEO) && conference->conference_video_mode == CONF_VIDEO_MODE_MUX) {
flags |= SWITCH_FILE_FLAG_VIDEO;
}
diff --git a/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml
new file mode 100644
index 0000000000..eff3c6b9ac
--- /dev/null
+++ b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/mod/applications/mod_curl/mod_curl.c b/src/mod/applications/mod_curl/mod_curl.c
index 2438490432..e82502cb6c 100644
--- a/src/mod/applications/mod_curl/mod_curl.c
+++ b/src/mod/applications/mod_curl/mod_curl.c
@@ -55,11 +55,20 @@ static char *SYNTAX = "curl url [headers|json|content-type |connect-t
#define HTTP_SENDFILE_ACK_EVENT "curl_sendfile::ack"
#define HTTP_SENDFILE_RESPONSE_SIZE 32768
#define HTTP_MAX_APPEND_HEADERS 10
+#define HTTP_DEFAULT_MAX_BYTES 64000
static struct {
switch_memory_pool_t *pool;
+ switch_event_node_t *node;
+ int max_bytes;
} globals;
+static switch_xml_config_item_t instructions[] = {
+ /* parameter name type reloadable pointer default value options structure */
+ SWITCH_CONFIG_ITEM("max-bytes", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &globals.max_bytes, (void *) HTTP_DEFAULT_MAX_BYTES, NULL,NULL, NULL),
+ SWITCH_CONFIG_ITEM_END()
+};
+
typedef enum {
CSO_NONE = (1 << 0),
CSO_EVENT = (1 << 1),
@@ -173,7 +182,7 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
memset(http_data, 0, sizeof(http_data_t));
http_data->pool = pool;
- http_data->max_bytes = 64000;
+ http_data->max_bytes = globals.max_bytes;
SWITCH_STANDARD_STREAM(http_data->stream);
if (!method) {
@@ -1037,24 +1046,44 @@ SWITCH_STANDARD_API(curl_function)
return status;
}
+static void do_config(switch_bool_t reload)
+{
+ globals.max_bytes = HTTP_DEFAULT_MAX_BYTES;
+
+ switch_xml_config_parse_module_settings("curl.conf", reload, instructions);
+}
+
+static void event_handler(switch_event_t *event)
+{
+ do_config(SWITCH_TRUE);
+}
+
/* Macro expands to: switch_status_t mod_cidlookup_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */
SWITCH_MODULE_LOAD_FUNCTION(mod_curl_load)
{
switch_api_interface_t *api_interface;
switch_application_interface_t *app_interface;
+ memset(&globals, 0, sizeof(globals));
+
if (switch_event_reserve_subclass(HTTP_SENDFILE_ACK_EVENT) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!\n", HTTP_SENDFILE_ACK_EVENT);
return SWITCH_STATUS_TERM;
}
+ if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind event!\n");
+ switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT);
+ return SWITCH_STATUS_TERM;
+ }
+
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
- memset(&globals, 0, sizeof(globals));
-
globals.pool = pool;
+ do_config(SWITCH_FALSE);
+
SWITCH_ADD_API(api_interface, "curl", "curl API", curl_function, SYNTAX);
SWITCH_ADD_APP(app_interface, "curl", "Perform a http request", "Perform a http request",
curl_app_function, SYNTAX, SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
@@ -1074,6 +1103,10 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_curl_shutdown)
switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT);
+ switch_xml_config_cleanup(instructions);
+
+ switch_event_unbind(&globals.node);
+
/* Cleanup dynamically allocated config settings */
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/applications/mod_signalwire/Makefile.am b/src/mod/applications/mod_signalwire/Makefile.am
new file mode 100644
index 0000000000..d46251b832
--- /dev/null
+++ b/src/mod/applications/mod_signalwire/Makefile.am
@@ -0,0 +1,27 @@
+include $(top_srcdir)/build/modmake.rulesam
+MODNAME=mod_signalwire
+
+if HAVE_KS
+if HAVE_SIGNALWIRE_CLIENT
+
+mod_LTLIBRARIES = mod_signalwire.la
+mod_signalwire_la_SOURCES = mod_signalwire.c
+mod_signalwire_la_CFLAGS = $(AM_CFLAGS)
+mod_signalwire_la_CFLAGS += $(KS_CFLAGS) $(SIGNALWIRE_CLIENT_CFLAGS)
+mod_signalwire_la_LIBADD = $(switch_builddir)/libfreeswitch.la
+mod_signalwire_la_LDFLAGS = -avoid-version -module -no-undefined -shared $(KS_LIBS) $(SIGNALWIRE_CLIENT_LIBS)
+
+else
+install: error
+all: error
+error:
+ $(error You must install signalwire-client-c to build mod_signalwire)
+endif
+
+else
+install: error
+all: error
+error:
+ $(error You must install libks to build mod_signalwire)
+endif
+
diff --git a/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml b/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml
new file mode 100644
index 0000000000..c62ad72ff0
--- /dev/null
+++ b/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj b/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj
new file mode 100644
index 0000000000..192c82d51d
--- /dev/null
+++ b/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj
@@ -0,0 +1,149 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ mod_signalwire
+ mod_signalwire
+ Win32Proj
+ {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}
+
+
+
+ DynamicLibrary
+ MultiByte
+ v141
+
+
+ DynamicLibrary
+ MultiByte
+ v141
+
+
+ DynamicLibrary
+ MultiByte
+ v141
+
+
+ DynamicLibrary
+ MultiByte
+ v141
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+
+
+
+ .;%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+ _DEBUG;DEBUG;%(PreprocessorDefinitions)
+
+
+ false
+
+
+
+
+
+
+ X64
+
+
+
+
+ _DEBUG;DEBUG;%(PreprocessorDefinitions)
+
+
+ false
+
+
+ MachineX64
+
+
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ false
+
+
+
+
+
+
+ X64
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ false
+
+
+ MachineX64
+
+
+
+
+
+
+
+ {202d7a4e-760d-4d0e-afa1-d7459ced30ff}
+ false
+
+
+
+
+
+
diff --git a/src/mod/applications/mod_signalwire/mod_signalwire.c b/src/mod/applications/mod_signalwire/mod_signalwire.c
new file mode 100644
index 0000000000..5fd2fe828e
--- /dev/null
+++ b/src/mod/applications/mod_signalwire/mod_signalwire.c
@@ -0,0 +1,1308 @@
+/*
+ * mod_signalwire.c -- SignalWire module
+ *
+ * Copyright (c) 2018 SignalWire, 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.
+ */
+
+#include
+#include
+#include
+#include
+
+#ifndef WIN32
+#include
+#endif
+
+#define SW_KS_JSON_PRINT(_h, _j) do { \
+ char *_json = ks_json_print(_j); \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ALERT, "--- %s ---\n%s\n---\n", _h, _json); \
+ ks_json_free(&_json); \
+ } while (0)
+
+static int debug_level = 7;
+
+static int signalwire_gateway_exists(void);
+
+/* Prototypes */
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_signalwire_shutdown);
+SWITCH_MODULE_LOAD_FUNCTION(mod_signalwire_load);
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_signalwire_runtime);
+
+/* SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime)
+ * Defines a switch_loadable_module_function_table_t and a static const char[] modname
+ */
+SWITCH_MODULE_DEFINITION(mod_signalwire, mod_signalwire_load, mod_signalwire_shutdown, mod_signalwire_runtime);
+
+typedef enum {
+ SW_STATE_ADOPTION,
+ SW_STATE_OFFLINE,
+ SW_STATE_ONLINE,
+ SW_STATE_CONFIGURE,
+ SW_STATE_START_PROFILE,
+ SW_STATE_REGISTER,
+ SW_STATE_READY,
+} sw_state_t;
+
+static struct {
+ int ssl_verify;
+ ks_bool_t shutdown;
+ ks_bool_t restarting;
+ swclt_config_t *config;
+ char blade_bootstrap[1024];
+ char adoption_service[1024];
+ char stun_server[1024];
+ char adoption_token[64];
+ ks_size_t adoption_backoff;
+ ks_time_t adoption_next;
+
+ char adoption_data_local_ip[256];
+ char adoption_data_external_ip[256];
+ char adoption_data_uname[1024];
+
+ char relay_connector_id[256];
+
+ swclt_sess_t signalwire_session;
+ swclt_hmon_t signalwire_session_monitor;
+ sw_state_t state;
+ ks_bool_t profile_update;
+ ks_bool_t profile_reload;
+ ks_bool_t signalwire_reconnected;
+ switch_xml_t signalwire_profile;
+ char signalwire_profile_md5[SWITCH_MD5_DIGEST_STRING_SIZE];
+
+ ks_bool_t kslog_on;
+
+ switch_mutex_t *mutex; // general mutex for this mod
+ char gateway_ip[80];
+ char gateway_port[10];
+} globals;
+
+static void mod_signalwire_kslogger(const char *file, const char *func, int line, int level, const char *fmt, ...)
+{
+ const char *fp;
+ va_list ap;
+ char buf[32768];
+
+ if (level > debug_level) return;
+
+ fp = switch_cut_path(file);
+
+ va_start(ap, fmt);
+
+ vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
+ buf[sizeof(buf) - 1] = '\0';
+
+ va_end(ap);
+
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, fp, func, line, NULL, level, "%s\n", buf);
+}
+
+static switch_status_t switch_find_available_port(switch_port_t *port, const char *ip, int type)
+{
+ switch_status_t ret = SWITCH_STATUS_SUCCESS;
+ switch_memory_pool_t *pool = NULL;
+ switch_sockaddr_t *addr = NULL;
+ switch_socket_t *sock = NULL;
+ switch_bool_t found = SWITCH_FALSE;
+
+ if ((ret = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ while (!found) {
+ if ((ret = switch_sockaddr_info_get(&addr, ip, SWITCH_UNSPEC, *port, 0, pool)) != SWITCH_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ if ((ret = switch_socket_create(&sock, switch_sockaddr_get_family(addr), type, 0, pool)) != SWITCH_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ if (!(found = (switch_socket_bind(sock, addr) == SWITCH_STATUS_SUCCESS))) {
+ *port = *port + 1;
+ }
+
+ switch_socket_close(sock);
+ }
+
+done:
+ if (pool) switch_core_destroy_memory_pool(&pool);
+
+ return ret;
+}
+
+struct response_data {
+ char *data;
+ size_t size;
+};
+
+static size_t response_data_handler(void *contents, size_t size, size_t nmemb, void *userp)
+{
+ size_t received = size * nmemb;
+ struct response_data *rd = (struct response_data *)userp;
+
+ if (!rd->data) rd->data = ks_pool_alloc(NULL, received + 1);
+ else rd->data = ks_pool_resize(rd->data, rd->size + received + 1);
+
+ memcpy(rd->data + rd->size, contents, received);
+ rd->size += received;
+ rd->data[rd->size] = 0;
+
+ return received;
+}
+
+static void save_sip_config(const char *config)
+{
+ char confpath[1024];
+ FILE *fp = NULL;
+
+ switch_snprintf(confpath, sizeof(confpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat");
+ fp = fopen(confpath, "w");
+ if (!fp) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire SIP configuration\n", confpath);
+ return;
+ }
+
+ fputs(config, fp);
+ fclose(fp);
+}
+
+static void load_sip_config(void)
+{
+ char confpath[1024];
+ char data[32767] = { 0 };
+ FILE *fp = NULL;
+
+ switch_snprintf(confpath, sizeof(confpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat");
+ if (!(fp = fopen(confpath, "r"))) return;
+
+ if (!fread(data, 1, sizeof(data), fp)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire SIP configuration from %s\n", confpath);
+ }
+ fclose(fp);
+ if (!zstr_buf(data)) {
+ switch_md5_string(globals.signalwire_profile_md5, (void *) data, strlen(data));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "saved profile MD5 = \"%s\"\n", globals.signalwire_profile_md5);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "saved profile = \"%s\"\n", (char *)data);
+ globals.signalwire_profile = switch_xml_parse_str_dynamic((char *)data, SWITCH_TRUE);
+ }
+}
+
+static ks_status_t load_credentials_from_json(ks_json_t *json)
+{
+ ks_status_t status = KS_STATUS_SUCCESS;
+ ks_json_t *authentication = NULL;
+ const char *authentication_str = NULL;
+ const char *bootstrap = NULL;
+ const char *relay_connector_id = NULL;
+
+ if ((bootstrap = ks_json_get_object_cstr(json, "bootstrap")) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing bootstrap URL\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ if ((relay_connector_id = ks_json_get_object_cstr(json, "relay_connector_id")) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing relay_connector_id\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ if ((authentication = ks_json_get_object_item(json, "authentication")) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing authentication\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ // update the internal connection target, which is normally assigned in swclt_sess_create()
+ if (swclt_sess_target_set(globals.signalwire_session, bootstrap) != KS_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to connect to SignalWire at %s\n", bootstrap);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ // update the relay_connector_id passed to profile configuration
+ strncpy(globals.relay_connector_id, relay_connector_id, sizeof(globals.relay_connector_id) - 1);
+ strncpy(globals.blade_bootstrap, bootstrap, sizeof(globals.blade_bootstrap) - 1);
+
+ // got adopted, update the client config authentication
+ authentication_str = ks_json_pprint_unformatted(NULL, authentication);
+ swclt_config_set_authentication(globals.config, authentication_str);
+
+ ks_pool_free(&authentication_str);
+done:
+
+ return status;
+}
+
+static ks_status_t mod_signalwire_adoption_post(void)
+{
+ ks_status_t status = KS_STATUS_SUCCESS;
+ switch_memory_pool_t *pool = NULL;
+ switch_CURL *curl = NULL;
+ switch_curl_slist_t *headers = NULL;
+ char url[1024];
+ char errbuf[CURL_ERROR_SIZE];
+ CURLcode res;
+ long rescode;
+ ks_json_t *json = ks_json_create_object();
+ struct response_data rd = { 0 };
+ char *jsonstr = NULL;
+
+ // Determine and cache adoption data values that are heavier to figure out
+ if (!globals.adoption_data_local_ip[0]) {
+ switch_find_local_ip(globals.adoption_data_local_ip, sizeof(globals.adoption_data_local_ip), NULL, AF_INET);
+ }
+
+ if (!globals.adoption_data_external_ip[0]) {
+ switch_port_t local_port = 6050;
+ char *error = NULL;
+ char *external_ip;
+ switch_port_t external_port;
+
+ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SignalWire adoption failed: could not allocate memory pool\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+ if (switch_find_available_port(&local_port, globals.adoption_data_local_ip, SOCK_STREAM) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: could not get available local port\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ external_ip = globals.adoption_data_local_ip;
+ external_port = local_port;
+ if (switch_stun_lookup(&external_ip, &external_port, globals.stun_server, SWITCH_STUN_DEFAULT_PORT, &error, pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: stun [%s] lookup error: %s\n", globals.stun_server, error);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+ strncpy(globals.adoption_data_external_ip, external_ip, sizeof(globals.adoption_data_external_ip));
+ }
+
+ if (!globals.adoption_data_uname[0]) {
+#ifndef WIN32
+ struct utsname buf;
+ if (uname(&buf)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: could not get uname\n");
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+ switch_snprintf(globals.adoption_data_uname,
+ sizeof(globals.adoption_data_uname),
+ "%s %s %s %s %s",
+ buf.sysname,
+ buf.nodename,
+ buf.release,
+ buf.version,
+ buf.machine);
+#else
+ // @todo set globals.adoption_data_uname from GetVersion Win32API
+#endif
+ }
+
+
+ ks_json_add_string_to_object(json, "client_uuid", globals.adoption_token);
+ ks_json_add_string_to_object(json, "hostname", switch_core_get_hostname());
+ ks_json_add_string_to_object(json, "ip", globals.adoption_data_local_ip);
+ ks_json_add_string_to_object(json, "ext_ip", globals.adoption_data_external_ip);
+ ks_json_add_string_to_object(json, "version", switch_version_full());
+ ks_json_add_string_to_object(json, "uname", globals.adoption_data_uname);
+
+ jsonstr = ks_json_print_unformatted(json);
+ ks_json_delete(&json);
+
+ switch_snprintf(url, sizeof(url), "%s/%s", globals.adoption_service, globals.adoption_token);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Checking %s for SignalWire adoption of this FreeSWITCH\n", url);
+
+ curl = switch_curl_easy_init();
+
+ headers = switch_curl_slist_append(headers, "Accept: application/json");
+ headers = switch_curl_slist_append(headers, "Accept-Charset: utf-8");
+ headers = switch_curl_slist_append(headers, "Content-Type: application/json");
+
+ switch_curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
+ switch_curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
+
+ if (!strncasecmp(url, "https", 5)) {
+ switch_curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, globals.ssl_verify);
+ switch_curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, globals.ssl_verify);
+ }
+
+ switch_curl_easy_setopt(curl, CURLOPT_URL, url);
+ switch_curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+ switch_curl_easy_setopt(curl, CURLOPT_USERAGENT, "mod_signalwire/1");
+ switch_curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonstr);
+ switch_curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
+ switch_curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&rd);
+ switch_curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, response_data_handler);
+
+ if ((res = switch_curl_easy_perform(curl))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Curl Result %d, Error: %s\n", res, errbuf);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ switch_curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rescode);
+
+ if (rescode == 404) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,
+ "Go to https://signalwire.com to set up your Connector now! Enter connection token %s\n", globals.adoption_token);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ if (rescode != 200) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed with HTTP code %ld, %s\n", rescode, rd.data);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ json = ks_json_parse(rd.data);
+ if (!json) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received bad SignalWire adoption response\n%s\n", rd.data);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ if ((status = load_credentials_from_json(json)) != KS_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ ks_json_delete(&json);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire adoption of this FreeSWITCH completed\n");
+
+ // write out the data to save it for reloading in the future
+ {
+ char authpath[1024];
+ FILE *fp = NULL;
+
+ switch_snprintf(authpath, sizeof(authpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat");
+ fp = fopen(authpath, "w");
+ if (!fp) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire creds\n", authpath);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+
+ fputs(rd.data, fp);
+ fclose(fp);
+ }
+
+ globals.state = SW_STATE_OFFLINE;
+ swclt_sess_connect(globals.signalwire_session);
+
+done:
+ if (rd.data) ks_pool_free(&rd.data);
+ if (jsonstr) ks_json_free_ex((void **)&jsonstr);
+ if (json) ks_json_delete(&json);
+ if (curl) {
+ curl_easy_cleanup(curl);
+ if (headers) curl_slist_free_all(headers);
+ }
+ if (pool) switch_core_destroy_memory_pool(&pool);
+ return status;
+}
+
+#define SIGNALWIRE_SYNTAX "token | adoption | adopted | reload | update | debug | kslog "
+SWITCH_STANDARD_API(mod_signalwire_api_function)
+{
+ int argc = 0;
+ char *argv[2] = { 0 };
+ char *buf = NULL;
+
+
+ if (!cmd || !(buf = strdup(cmd))) {
+ stream->write_function(stream, "-USAGE: signalwire %s\n", SIGNALWIRE_SYNTAX);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ if ((argc = switch_separate_string(buf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
+ if (!strcmp(argv[0], "token")) {
+ if (globals.adoption_token[0]) {
+ stream->write_function(stream,
+ " _____ _ ___ ___\n"
+ " / ___/(_)___ _____ ____ _/ / | / (_)_______\n"
+ " \\__ \\/ / __ `/ __ \\/ __ `/ /| | /| / / / ___/ _ \\\n"
+ " ___/ / / /_/ / / / / /_/ / / | |/ |/ / / / / __/\n"
+ " /____/_/\\__, /_/ /_/\\__,_/_/ |__/|__/_/_/ \\___/\n"
+ " /____/\n"
+ "\n /=====================================================================\\\n"
+ "| Connection Token: %s |\n"
+ " \\=====================================================================/\n"
+ " Go to https://signalwire.com to set up your Connector now!\n", globals.adoption_token);
+ } else {
+ stream->write_function(stream, "-ERR connection token not available\n");
+ }
+ goto done;
+ }
+ else if (!strcmp(argv[0], "adoption")) {
+ if (globals.state == SW_STATE_ADOPTION) {
+ globals.adoption_next = ks_time_now();
+ stream->write_function(stream, "+OK\n");
+ } else {
+ stream->write_function(stream, "-ERR adoption not currently pending\n");
+ }
+ goto done;
+ }
+ else if (!strcmp(argv[0], "adopted")) {
+ stream->write_function(stream, "+OK %s\n", globals.state == SW_STATE_ADOPTION ? "Not Adopted" : "Adopted");
+ goto done;
+ }
+ else if (!strcmp(argv[0], "debug")) {
+ if (argv[1]) {
+ debug_level = atoi(argv[1]);
+ }
+
+ stream->write_function(stream, "+OK debug %d\n", debug_level);
+ goto done;
+ } else if (!strcmp(argv[0], "kslog")) {
+ if (argv[1]) {
+ if (!strcmp(argv[1], "on")) {
+ ks_global_set_logger(mod_signalwire_kslogger);
+ } else if (!strcmp(argv[1], "off")) {
+ ks_global_set_logger(NULL);
+ }
+ }
+
+ stream->write_function(stream, "+OK %s\n", argv[1]);
+ goto done;
+ } else if (!strcmp(argv[0], "reload")) {
+ globals.profile_reload = KS_TRUE;
+ stream->write_function(stream, "+OK\n");
+ goto done;
+ } else if (!strcmp(argv[0], "update")) {
+ globals.profile_update = KS_TRUE;
+ stream->write_function(stream, "+OK\n");
+ goto done;
+ }
+ }
+
+ stream->write_function(stream, "-USAGE: signalwire %s\n", SIGNALWIRE_SYNTAX);
+
+done:
+ switch_safe_free(buf);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static void mod_signalwire_session_state_handler(swclt_sess_t sess, swclt_hstate_change_t *state_change_info, const char *cb_data)
+{
+ SWCLT_HSTATE new_state = state_change_info->new_state;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire Session State Change: %s\n", swclt_hstate_describe_change(state_change_info));
+
+ if (new_state == SWCLT_HSTATE_ONLINE) {
+ // Connected with NEW or RESTORED session
+ globals.signalwire_reconnected = KS_TRUE;
+ } else if (new_state == SWCLT_HSTATE_OFFLINE) {
+ // Disconnected
+ }
+}
+
+static void __on_provisioning_events(swclt_sess_t sess, blade_broadcast_rqu_t *rqu, void *cb_data)
+{
+ if (!strcmp(rqu->event, "update")) {
+ globals.profile_update = KS_TRUE;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update requested\n");
+ }
+}
+
+static switch_xml_t xml_config_handler(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params,
+ void *user_data)
+{
+ char *profileName = NULL;
+ char *reconfigValue = NULL;
+ switch_xml_t signalwire_profile_dup = NULL;
+
+ if (!section || strcmp(section, "configuration")) return NULL;
+ if (!key_name || strcmp(key_name, "name")) return NULL;
+ if (!key_value || strcmp(key_value, "sofia.conf")) return NULL;
+ if (!params) return NULL;
+ profileName = switch_event_get_header(params, "profile");
+ if (!profileName || strcmp(profileName, "signalwire")) return NULL;
+ reconfigValue = switch_event_get_header(params, "reconfig");
+ if (!reconfigValue || strcmp(reconfigValue, "true")) return NULL;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received XML lookup for SignalWire SIP profile\n");
+
+ if (globals.signalwire_profile) {
+ signalwire_profile_dup = switch_xml_dup(globals.signalwire_profile);
+ }
+ return signalwire_profile_dup;
+}
+
+static switch_status_t mod_signalwire_load_or_generate_token(void)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ char tokenpath[1024];
+
+ switch_snprintf(tokenpath, sizeof(tokenpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-token.dat");
+ if (switch_file_exists(tokenpath, NULL) != SWITCH_STATUS_SUCCESS) {
+ // generate first time uuid
+ ks_uuid_t uuid;
+ const char *token;
+ FILE *fp = fopen(tokenpath, "w");
+ if (!fp) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire connection token\n", tokenpath);
+ status = SWITCH_STATUS_TERM;
+ goto done;
+ }
+
+ ks_uuid(&uuid);
+ token = ks_uuid_str(NULL, &uuid);
+
+ fputs(token, fp);
+ fclose(fp);
+
+ strncpy(globals.adoption_token, token, sizeof(globals.adoption_token) - 1);
+
+ ks_pool_free(&token);
+ } else {
+ char token[64];
+ FILE *fp = fopen(tokenpath, "r");
+ if (!fp) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to read SignalWire connection token\n", tokenpath);
+ status = SWITCH_STATUS_TERM;
+ goto done;
+ }
+ if (!fgets(token, sizeof(token), fp)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire connection token from %s\n", tokenpath);
+ fclose(fp);
+ status = SWITCH_STATUS_TERM;
+ goto done;
+ }
+ fclose(fp);
+
+ // trim newline markers in case they exist, only want the token
+ for (size_t len = strlen(token); len > 0 && (token[len - 1] == '\r' || token[len - 1] == '\n'); --len) {
+ token[len - 1] = '\0';
+ }
+
+ strncpy(globals.adoption_token, token, sizeof(globals.adoption_token) - 1);
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
+ "\n /=====================================================================\\\n"
+ "| Connection Token: %s |\n"
+ " \\=====================================================================/\n"
+ " Go to https://signalwire.com to set up your Connector now!\n", globals.adoption_token);
+
+done:
+ return status;
+}
+
+static switch_status_t load_config()
+{
+ char *cf = "signalwire.conf";
+ switch_xml_t cfg, xml;
+ const char *data;
+
+ globals.ssl_verify = 1;
+ switch_set_string(globals.blade_bootstrap, "edge..signalwire.com/api/relay/wss");
+ switch_set_string(globals.adoption_service, "https://adopt.signalwire.com/adoption");
+ switch_set_string(globals.stun_server, "stun.freeswitch.org");
+
+ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "open of %s failed\n", cf);
+ // don't need the config
+ } else {
+ switch_xml_t settings, param, tmp;
+ if ((settings = switch_xml_child(cfg, "settings"))) {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "kslog") && !ks_zstr(val)) {
+ if (!strcmp(val, "off")) {
+ globals.kslog_on = KS_FALSE;
+ } else if (!strcmp(val, "on")) {
+ globals.kslog_on = KS_TRUE;
+ }
+ } else if (!strcasecmp(var, "blade-bootstrap") && !ks_zstr(val)) {
+ switch_set_string(globals.blade_bootstrap, val);
+ } else if (!strcasecmp(var, "adoption-service") && !ks_zstr(val)) {
+ switch_set_string(globals.adoption_service, val);
+ } else if (!strcasecmp(var, "stun-server") && !ks_zstr(val)) {
+ switch_set_string(globals.stun_server, val);
+ } else if (!strcasecmp(var, "ssl-verify")) {
+ globals.ssl_verify = switch_true(val) ? 1 : 0;
+ }
+ }
+ if ((tmp = switch_xml_child(settings, "authentication"))) {
+ const char *txt = switch_xml_txt(tmp);
+ if (!ks_zstr(txt)) {
+ swclt_config_set_authentication(globals.config, txt);
+ }
+ }
+ }
+ switch_xml_free(xml);
+ }
+
+ if ((data = getenv("SW_BLADE_BOOTSTRAP"))) {
+ switch_set_string(globals.blade_bootstrap, data);
+ }
+
+ if ((data = getenv("SW_ADOPTION_SERVICE"))) {
+ strncpy(globals.adoption_service, data, sizeof(globals.adoption_service));
+ }
+
+ swclt_config_load_from_env(globals.config);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static ks_status_t load_credentials(void)
+{
+ ks_status_t status = KS_STATUS_SUCCESS;
+ char authpath[1024];
+ char data[2048];
+ FILE *fp = NULL;
+ ks_json_t *json = NULL;
+
+ switch_snprintf(authpath, sizeof(authpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat");
+ if (!(fp = fopen(authpath, "r"))) goto done;
+
+ if (!fgets(data, sizeof(data), fp)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire authentication data from %s\n", authpath);
+ fclose(fp);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+ fclose(fp);
+
+ json = ks_json_parse(data);
+ if (!json) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to parse SignalWire authentication data from %s\n", authpath);
+ status = KS_STATUS_FAIL;
+ goto done;
+ }
+ status = load_credentials_from_json(json);
+ ks_json_delete(&json);
+
+done:
+ return status;
+}
+
+static void mod_signalwire_session_auth_failed_handler(swclt_sess_t sess)
+{
+ char path[1024];
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire authentication failed\n");
+
+ switch_snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat");
+ unlink(path);
+
+ switch_snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat");
+ unlink(path);
+
+ globals.restarting = KS_TRUE;
+
+ globals.adoption_backoff = 0;
+ globals.adoption_next = 0;
+
+ globals.state = SW_STATE_ADOPTION;
+}
+
+/* Dialplan INTERFACE */
+SWITCH_STANDARD_DIALPLAN(dialplan_hunt)
+{
+ switch_caller_extension_t *extension = NULL;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ const char *network_ip = switch_channel_get_variable(channel, "sip_network_ip");
+ const char *network_port = switch_channel_get_variable(channel, "sip_network_port");
+
+ if (!caller_profile) {
+ if (!(caller_profile = switch_channel_get_caller_profile(channel))) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error obtaining caller profile!\n");
+ goto done;
+ }
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Processing %s <%s>->%s in context %s\n",
+ caller_profile->caller_id_name, caller_profile->caller_id_number, caller_profile->destination_number, caller_profile->context);
+
+ if ((extension = switch_caller_extension_new(session, "signalwire", caller_profile->destination_number)) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n");
+ goto done;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "call from %s:%s\n", network_ip, network_port);
+
+ switch_mutex_lock(globals.mutex);
+
+ if (network_ip &&
+ !zstr_buf(globals.gateway_ip) && !strcmp(globals.gateway_ip, network_ip)) {
+ // good to go
+ char transfer_to[1024];
+
+ switch_snprintf(transfer_to, sizeof(transfer_to), "%s %s %s", caller_profile->destination_number, "XML", caller_profile->context);
+ switch_caller_extension_add_application(session, extension, "transfer", transfer_to);
+ } else {
+ switch_caller_extension_add_application(session, extension, "respond", "500");
+ }
+
+ switch_mutex_unlock(globals.mutex);
+
+done:
+ return extension;
+}
+
+/**
+ * Module load or unload callback from core
+ * @param event the event
+ */
+static void on_module_load_unload(switch_event_t *event)
+{
+ const char *type = switch_event_get_header(event, "type");
+ const char *name = switch_event_get_header(event, "name");
+ if (!zstr(type) && !zstr(name) && !strcmp(type, "endpoint") && !strcmp(name, "sofia")) {
+ globals.profile_reload = KS_TRUE;
+ }
+}
+
+/**
+ * Sofia sofia::gateway_state change callback
+ * @param event the event
+ */
+static void on_sofia_gateway_state(switch_event_t *event)
+{
+ const char *ip = switch_event_get_header(event, "Register-Network-IP");
+ const char *port = switch_event_get_header(event, "Register-Network-Port");
+ const char *state = switch_event_get_header(event, "State");
+ const char *gateway = switch_event_get_header(event, "Gateway");
+
+ if (!ip || !port || !state || !gateway) {
+ return;
+ }
+
+ if (!strcmp(gateway, "signalwire")) {
+ switch_mutex_lock(globals.mutex);
+
+ if (!strcmp(state, "REGED")) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP Gateway registered to %s:%s\n", ip, port);
+ switch_set_string(globals.gateway_ip, ip);
+ switch_set_string(globals.gateway_port, port);
+ } else if (!strcmp(state, "NOREG")) {
+ globals.gateway_ip[0] = '\0';
+ globals.gateway_port[0] = '\0';
+ }
+
+ switch_mutex_unlock(globals.mutex);
+ }
+}
+
+/* Macro expands to: switch_status_t mod_signalwire_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */
+SWITCH_MODULE_LOAD_FUNCTION(mod_signalwire_load)
+{
+ switch_api_interface_t *api_interface = NULL;
+ switch_dialplan_interface_t *dialplan_interface;
+ const char *kslog_env = NULL;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ memset(&globals, 0, sizeof(globals));
+
+ kslog_env = getenv("KSLOG");
+ if (kslog_env && kslog_env[0] && kslog_env[0] != '0') globals.kslog_on = KS_TRUE;
+
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+ ks_global_set_logger(mod_signalwire_kslogger);
+
+ SWITCH_ADD_API(api_interface, "signalwire", "SignalWire API", mod_signalwire_api_function, SIGNALWIRE_SYNTAX);
+ switch_console_set_complete("add signalwire debug");
+ switch_console_set_complete("add signalwire debug 1");
+ switch_console_set_complete("add signalwire debug 2");
+ switch_console_set_complete("add signalwire debug 3");
+ switch_console_set_complete("add signalwire debug 4");
+ switch_console_set_complete("add signalwire debug 5");
+ switch_console_set_complete("add signalwire debug 6");
+ switch_console_set_complete("add signalwire debug 7");
+ switch_console_set_complete("add signalwire kslog");
+ switch_console_set_complete("add signalwire kslog on");
+ switch_console_set_complete("add signalwire kslog off");
+ switch_console_set_complete("add signalwire token");
+ switch_console_set_complete("add signalwire adoption");
+ switch_console_set_complete("add signalwire adopted");
+ switch_console_set_complete("add signalwire update");
+ switch_console_set_complete("add signalwire reload");
+
+ switch_xml_bind_search_function(xml_config_handler, SWITCH_XML_SECTION_CONFIG, NULL);
+
+ ks_ssl_init_skip(KS_TRUE);
+
+ swclt_init(KS_LOG_LEVEL_DEBUG);
+
+ if (globals.kslog_on == KS_FALSE) {
+ ks_global_set_logger(NULL);
+ } else {
+ ks_global_set_logger(mod_signalwire_kslogger);
+ }
+
+ // Configuration
+ swclt_config_create(&globals.config);
+ load_config();
+
+ switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, pool);
+
+ switch_event_bind("mod_signalwire", SWITCH_EVENT_MODULE_LOAD, NULL, on_module_load_unload, NULL);
+ switch_event_bind("mod_signalwire", SWITCH_EVENT_MODULE_UNLOAD, NULL, on_module_load_unload, NULL);
+ switch_event_bind("mod_signalwire", SWITCH_EVENT_CUSTOM, "sofia::gateway_state", on_sofia_gateway_state, NULL);
+
+ SWITCH_ADD_DIALPLAN(dialplan_interface, "signalwire", dialplan_hunt);
+
+ // Load credentials if they exist from a prior adoption
+ load_credentials();
+
+ // SignalWire
+ swclt_sess_create(&globals.signalwire_session,
+ globals.blade_bootstrap,
+ globals.config);
+ swclt_sess_set_auth_failed_cb(globals.signalwire_session, mod_signalwire_session_auth_failed_handler);
+
+ if (!globals.signalwire_session) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "signalwire_session create error\n");
+ switch_goto_status(SWITCH_STATUS_TERM, err);
+ }
+
+ swclt_hmon_register(&globals.signalwire_session_monitor, globals.signalwire_session, mod_signalwire_session_state_handler, NULL);
+
+ // @todo register nodestore callbacks here if needed
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Welcome to\n"
+ " _____ _ ___ ___\n"
+ " / ___/(_)___ _____ ____ _/ / | / (_)_______\n"
+ " \\__ \\/ / __ `/ __ \\/ __ `/ /| | /| / / / ___/ _ \\\n"
+ " ___/ / / /_/ / / / / /_/ / / | |/ |/ / / / / __/\n"
+ " /____/_/\\__, /_/ /_/\\__,_/_/ |__/|__/_/_/ \\___/\n"
+ " /____/\n");
+
+ // storage_dir was missing in clean install
+ switch_dir_make_recursive(SWITCH_GLOBAL_dirs.storage_dir, SWITCH_DEFAULT_DIR_PERMS, pool);
+
+ if ((status = mod_signalwire_load_or_generate_token()) != SWITCH_STATUS_SUCCESS) {
+ goto err;
+ }
+
+ if (swclt_sess_has_authentication(globals.signalwire_session)) {
+ // Load cached profile if we already have one. We'll still connect to SignalWire and
+ // fetch a new profile in the background.
+ load_sip_config();
+ if (globals.signalwire_profile) {
+ globals.state = SW_STATE_START_PROFILE;
+ } else {
+ globals.state = SW_STATE_OFFLINE;
+ }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Connecting to SignalWire\n");
+ swclt_sess_connect(globals.signalwire_session);
+ } else {
+ globals.state = SW_STATE_ADOPTION;
+ }
+
+ goto done;
+
+err:
+ if (globals.signalwire_session) ks_handle_destroy(&globals.signalwire_session);
+ swclt_config_destroy(&globals.config);
+ ks_global_set_logger(NULL);
+
+done:
+
+ return status;
+}
+
+/*
+ Called when the system shuts down
+ Macro expands to: switch_status_t mod_signalwire_shutdown() */
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_signalwire_shutdown)
+{
+ /* Cleanup dynamically allocated config settings */
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Disconnecting from SignalWire\n");
+
+ switch_event_unbind_callback(on_module_load_unload);
+ switch_event_unbind_callback(on_sofia_gateway_state);
+
+ // stop things that might try to use blade or kafka while they are shutting down
+ globals.shutdown = KS_TRUE;
+
+ swclt_sess_disconnect(globals.signalwire_session);
+ while (swclt_hstate_current_get(globals.signalwire_session) == SWCLT_HSTATE_ONLINE) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sleeping for pending disconnect\n");
+ ks_sleep_ms(1000);
+ }
+
+ //signalwire_dialplan_shutdown();
+ // @todo signalwire profile unbinding and unloading
+ switch_xml_unbind_search_function_ptr(xml_config_handler);
+
+ // kill signalwire, so nothing more can come into the system
+ ks_handle_destroy(&globals.signalwire_session);
+
+ // cleanup config
+ swclt_config_destroy(&globals.config);
+
+ // shutdown libblade (but not libks?)
+ swclt_shutdown();
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static void mod_signalwire_state_adoption(void)
+{
+ // keep trying to check adoption token for authentication
+ if (ks_time_now() >= globals.adoption_next) {
+ // Use a very very simple backoff algorithm, every time we try, backoff another minute
+ // so that after first try we wait 1 minute, after next try we wait 2 minutes, at third
+ // try we are waiting 3 minutes, upto a max backoff of 15 minutes between adoption checks
+ if (globals.adoption_backoff < 15) globals.adoption_backoff++;
+ globals.adoption_next = ks_time_now() + (globals.adoption_backoff * 60 * KS_USEC_PER_SEC);
+ if (mod_signalwire_adoption_post() != KS_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Next SignalWire adoption check in %"SWITCH_SIZE_T_FMT" minutes\n", globals.adoption_backoff);
+ }
+ }
+ if (globals.signalwire_reconnected) {
+ // OK to continue as is
+ globals.signalwire_reconnected = KS_FALSE;
+ }
+}
+
+static void mod_signalwire_state_offline(void)
+{
+ if (globals.signalwire_reconnected) {
+ globals.signalwire_reconnected = KS_FALSE;
+ globals.state = SW_STATE_ONLINE;
+ }
+}
+
+static void mod_signalwire_state_online(void)
+{
+ globals.signalwire_reconnected = KS_FALSE;
+ if (!swclt_sess_provisioning_setup(globals.signalwire_session, __on_provisioning_events, NULL)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected to SignalWire\n");
+ globals.state = SW_STATE_CONFIGURE;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Failed to connect to SignalWire\n");
+ ks_sleep_ms(4000);
+ globals.state = SW_STATE_OFFLINE;
+ globals.restarting = KS_TRUE;
+ }
+}
+
+static void mod_signalwire_state_configure(void)
+{
+ switch_memory_pool_t *pool = NULL;
+ char local_ip[256];
+ switch_port_t local_port = 6050;
+ char local_endpoint[256];
+ char *external_ip;
+ switch_port_t external_port;
+ char external_endpoint[256];
+ char *error = NULL;
+ swclt_cmd_t cmd;
+
+ if (globals.signalwire_reconnected) {
+ globals.signalwire_reconnected = KS_FALSE;
+ globals.state = SW_STATE_ONLINE;
+ }
+
+ // already restarting/updating...
+ globals.profile_reload = KS_FALSE;
+ globals.profile_update = KS_FALSE;
+
+ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SignalWire configure failed: could not allocate memory pool\n");
+ goto done;
+ }
+
+ switch_find_local_ip(local_ip, sizeof(local_ip), NULL, AF_INET);
+
+ if (switch_find_available_port(&local_port, local_ip, SOCK_STREAM) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire configure failed: could not get available local port\n");
+ ks_sleep_ms(4000);
+ goto done;
+ }
+
+ snprintf(local_endpoint, sizeof(local_endpoint), "%s:%u", local_ip, local_port);
+
+ external_ip = local_ip;
+ external_port = local_port;
+
+ if (switch_stun_lookup(&external_ip, &external_port, globals.stun_server, SWITCH_STUN_DEFAULT_PORT, &error, pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire configure failed: stun [%s] lookup error: %s\n", globals.stun_server, error);
+ ks_sleep_ms(4000);
+ goto done;
+ }
+
+ snprintf(external_endpoint, sizeof(external_endpoint), "%s:%u", external_ip, external_port);
+
+ if (!swclt_sess_provisioning_configure(globals.signalwire_session, "freeswitch", local_endpoint, external_endpoint, globals.relay_connector_id, &cmd)) {
+ SWCLT_CMD_TYPE cmd_type;
+ swclt_cmd_type(cmd, &cmd_type);
+ if (cmd_type == SWCLT_CMD_TYPE_RESULT) {
+ const ks_json_t *result;
+ signalwire_provisioning_configure_response_t *configure_res;
+
+ swclt_cmd_result(cmd, &result);
+ result = ks_json_get_object_item(result, "result");
+ if (!SIGNALWIRE_PROVISIONING_CONFIGURE_RESPONSE_PARSE(ks_handle_pool(cmd), result, &configure_res)) {
+ const ks_json_t *configuration = configure_res->configuration;
+ const char *configuration_profile = ks_json_get_object_cstr(configuration, "profile");
+ if (globals.signalwire_profile) {
+ switch_xml_free(globals.signalwire_profile);
+ globals.signalwire_profile = NULL;
+ }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\"%s\"\n", configuration_profile);
+ globals.signalwire_profile = switch_xml_parse_str_dynamic((char *)configuration_profile, SWITCH_TRUE);
+ if (!globals.signalwire_profile) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to parse configuration profile\n");
+ } else {
+ char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 };
+ switch_md5_string(digest, (void *) configuration_profile, strlen(configuration_profile));
+ save_sip_config(configuration_profile);
+ if (!signalwire_gateway_exists() || zstr_buf(globals.signalwire_profile_md5) || strcmp(globals.signalwire_profile_md5, digest)) {
+ // not registered or new profile - update md5 and load it
+ strcpy(globals.signalwire_profile_md5, digest);
+ globals.state = SW_STATE_START_PROFILE;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "profile MD5 = \"%s\"\n", globals.signalwire_profile_md5);
+ } else {
+ // already registered
+ globals.state = SW_STATE_READY;
+ }
+ }
+ }
+ }
+ }
+ ks_handle_destroy(&cmd);
+ if (globals.state == SW_STATE_CONFIGURE) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Failed to receive valid configuration from SignalWire\n");
+ ks_sleep_ms(4000);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Received configuration from SignalWire\n");
+ }
+
+done:
+ if (pool) switch_core_destroy_memory_pool(&pool);
+}
+
+static int signalwire_gateway_exists(void)
+{
+ int exists = 0;
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ if (switch_api_execute("sofia", "profile signalwire gwlist", NULL, &stream) == SWITCH_STATUS_SUCCESS && stream.data) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "gwlist = \"%s\"\n", (char *)stream.data);
+ exists = (strstr((char *)stream.data, "Invalid Profile") == NULL) &&
+ (strstr((char*)stream.data, "signalwire") != NULL);
+ }
+ switch_safe_free(stream.data);
+ return exists;
+}
+
+static int signalwire_profile_is_started(void)
+{
+ int started = 0;
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ if (switch_api_execute("sofia", "status profile signalwire", NULL, &stream) == SWITCH_STATUS_SUCCESS && stream.data) {
+ started = (strstr((char *)stream.data, "Invalid Profile") == NULL) &&
+ (strstr((char *)stream.data, "signalwire") != NULL);
+ }
+ switch_safe_free(stream.data);
+ return started;
+}
+
+static int signalwire_profile_rescan(void)
+{
+ int success = 0;
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ if (switch_api_execute("sofia", "profile signalwire rescan", NULL, &stream) == SWITCH_STATUS_SUCCESS) {
+ success = signalwire_profile_is_started();
+ }
+ switch_safe_free(stream.data);
+ return success;
+}
+
+static int signalwire_profile_start(void)
+{
+ int success = 0;
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ if (switch_api_execute("sofia", "profile signalwire start", NULL, &stream) == SWITCH_STATUS_SUCCESS) {
+ success = signalwire_profile_is_started();
+ }
+ switch_safe_free(stream.data);
+ return success;
+}
+
+static void signalwire_profile_killgw(void)
+{
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ switch_api_execute("sofia", "profile signalwire killgw signalwire", NULL, &stream);
+ switch_safe_free(stream.data);
+}
+
+static void mod_signalwire_state_start_profile(void)
+{
+ if (globals.profile_update) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update initiated\n");
+ globals.state = SW_STATE_CONFIGURE;
+ globals.profile_update = KS_FALSE;
+ return;
+ }
+ globals.profile_reload = KS_FALSE; // already here
+
+ // ignore SignalWire reconnections until register is attempted
+
+ if (switch_loadable_module_exists("mod_sofia") != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for mod_sofia to load\n");
+ } else if (signalwire_profile_is_started()) {
+ // kill gateway if already up and rescan the profile
+ if (signalwire_gateway_exists()) {
+ signalwire_profile_killgw();
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP gateway killed\n");
+ }
+ if (signalwire_profile_rescan()) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP profile rescanned\n");
+ globals.state = SW_STATE_REGISTER;
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Starting SignalWire SIP profile\n");
+ signalwire_profile_start(); // assume success - it gets checked in next state
+ globals.state = SW_STATE_REGISTER;
+ }
+}
+
+static void mod_signalwire_state_register(void)
+{
+ if (globals.profile_update) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update initiated\n");
+ globals.state = SW_STATE_CONFIGURE;
+ globals.profile_update = KS_FALSE;
+ return;
+ } else if (globals.profile_reload) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile reload initiated\n");
+ globals.state = SW_STATE_START_PROFILE;
+ globals.profile_reload = KS_FALSE;
+ return;
+ }
+ // ignore SignalWire reconnections until register is attempted
+
+ if (switch_loadable_module_exists("mod_sofia") != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for mod_sofia to load\n");
+ globals.state = SW_STATE_START_PROFILE;
+ } else if (signalwire_gateway_exists() || signalwire_profile_rescan()) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP gateway started\n");
+ globals.state = SW_STATE_READY;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to start SignalWire SIP gateway\n");
+ globals.state = SW_STATE_CONFIGURE;
+ ks_sleep_ms(5000);
+ }
+}
+
+static void mod_signalwire_state_ready()
+{
+ if (globals.profile_update) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Signalwire SIP profile update initiated\n");
+ globals.state = SW_STATE_CONFIGURE;
+ globals.profile_update = KS_FALSE;
+ } else if (globals.profile_reload) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile reload initiated\n");
+ globals.state = SW_STATE_START_PROFILE;
+ globals.profile_reload = KS_FALSE;
+ } else if (globals.signalwire_reconnected) {
+ globals.signalwire_reconnected = KS_FALSE;
+ globals.state = SW_STATE_ONLINE;
+ }
+}
+
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_signalwire_runtime)
+{
+ while (!globals.shutdown) {
+ if (globals.restarting) {
+ swclt_sess_disconnect(globals.signalwire_session);
+ while (swclt_hstate_current_get(globals.signalwire_session) == SWCLT_HSTATE_ONLINE) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sleeping for pending disconnect\n");
+ ks_sleep_ms(1000);
+ }
+
+ // kill signalwire, so nothing more can come into the system
+ ks_handle_destroy(&globals.signalwire_session);
+
+ // Create a new session and start over
+ swclt_sess_create(&globals.signalwire_session,
+ globals.blade_bootstrap,
+ globals.config);
+ swclt_sess_set_auth_failed_cb(globals.signalwire_session, mod_signalwire_session_auth_failed_handler);
+
+ swclt_hmon_register(&globals.signalwire_session_monitor, globals.signalwire_session, mod_signalwire_session_state_handler, NULL);
+
+ globals.restarting = KS_FALSE;
+ continue;
+ }
+
+ switch(globals.state) {
+ case SW_STATE_ADOPTION: // waiting for adoption to occur
+ mod_signalwire_state_adoption();
+ break;
+ case SW_STATE_OFFLINE: // waiting for session to go online
+ mod_signalwire_state_offline();
+ break;
+ case SW_STATE_ONLINE: // provisioning service setup
+ mod_signalwire_state_online();
+ break;
+ case SW_STATE_CONFIGURE: // provisioning configuration
+ mod_signalwire_state_configure();
+ break;
+ case SW_STATE_START_PROFILE:
+ mod_signalwire_state_start_profile();
+ break;
+ case SW_STATE_REGISTER:
+ mod_signalwire_state_register();
+ break;
+ case SW_STATE_READY: // ready for runtime
+ mod_signalwire_state_ready();
+ break;
+ default: break;
+ }
+ ks_sleep_ms(1000);
+ }
+
+ return SWITCH_STATUS_TERM;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet
+ */
diff --git a/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp b/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp
index 734a09ba4e..fc2843440b 100644
--- a/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp
+++ b/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp
@@ -252,7 +252,8 @@ SWITCH_STANDARD_APP(soundtouch_start_function)
char *argv[6];
int argc;
char *lbuf = NULL;
- int x, n;
+ int x;
+ int n=0;
if ((bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_soundtouch_"))) {
if (!zstr(data) && !strcasecmp(data, "stop")) {
@@ -334,7 +335,6 @@ SWITCH_STANDARD_API(soundtouch_api_function)
char *argv[10] = { 0 };
char *uuid = NULL;
char *action = NULL;
- char *lbuf = NULL;
int x, n;
if (zstr(cmd)) {
diff --git a/src/mod/applications/mod_test/Makefile.am b/src/mod/applications/mod_test/Makefile.am
new file mode 100644
index 0000000000..35cf0ed45e
--- /dev/null
+++ b/src/mod/applications/mod_test/Makefile.am
@@ -0,0 +1,10 @@
+include $(top_srcdir)/build/modmake.rulesam
+MODNAME=mod_test
+
+mod_LTLIBRARIES = mod_test.la
+mod_test_la_SOURCES = mod_test.c
+mod_test_la_CFLAGS = $(AM_CFLAGS)
+mod_test_la_LIBADD = $(switch_builddir)/libfreeswitch.la
+mod_test_la_LDFLAGS = -avoid-version -module -no-undefined -shared
+
+SUBDIRS=. test
diff --git a/src/mod/applications/mod_test/mod_test.c b/src/mod/applications/mod_test/mod_test.c
new file mode 100644
index 0000000000..d5460ac364
--- /dev/null
+++ b/src/mod/applications/mod_test/mod_test.c
@@ -0,0 +1,407 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Rienzo
+ *
+ *
+ * mod_test.c -- mock module interfaces for testing
+ *
+ */
+
+#include
+
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_test_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_test_shutdown);
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_test_runtime);
+SWITCH_MODULE_DEFINITION(mod_test, mod_test_load, mod_test_shutdown, mod_test_runtime);
+
+
+typedef enum {
+ ASRFLAG_READY = (1 << 0),
+ ASRFLAG_INPUT_TIMERS = (1 << 1),
+ ASRFLAG_START_OF_SPEECH = (1 << 2),
+ ASRFLAG_RETURNED_START_OF_SPEECH = (1 << 3),
+ ASRFLAG_NOINPUT_TIMEOUT = (1 << 4),
+ ASRFLAG_RESULT = (1 << 5),
+ ASRFLAG_RETURNED_RESULT = (1 << 6)
+} test_asr_flag_t;
+
+typedef struct {
+ uint32_t flags;
+ const char *result_text;
+ double result_confidence;
+ uint32_t thresh;
+ uint32_t silence_ms;
+ uint32_t voice_ms;
+ int no_input_timeout;
+ int speech_timeout;
+ switch_bool_t start_input_timers;
+ switch_time_t no_input_time;
+ switch_time_t speech_time;
+ char *grammar;
+ char *channel_uuid;
+ switch_vad_t *vad;
+} test_asr_t;
+
+
+static void test_asr_reset(test_asr_t *context)
+{
+ if (context->vad) {
+ switch_vad_reset(context->vad);
+ }
+ context->flags = 0;
+ context->result_text = "agent";
+ context->result_confidence = 87.3;
+ switch_set_flag(context, ASRFLAG_READY);
+ context->no_input_time = switch_micro_time_now();
+ if (context->start_input_timers) {
+ switch_set_flag(context, ASRFLAG_INPUT_TIMERS);
+ }
+}
+
+static switch_status_t test_asr_open(switch_asr_handle_t *ah, const char *codec, int rate, const char *dest, switch_asr_flag_t *flags)
+{
+ test_asr_t *context;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_open attempt on CLOSED asr handle\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (!(context = (test_asr_t *) switch_core_alloc(ah->memory_pool, sizeof(*context)))) {
+ return SWITCH_STATUS_MEMERR;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "codec = %s, rate = %d, dest = %s\n", codec, rate, dest);
+
+ ah->private_info = context;
+ ah->codec = switch_core_strdup(ah->memory_pool, codec);
+
+ if (rate > 16000) {
+ ah->native_rate = 16000;
+ }
+
+ context->thresh = 400;
+ context->silence_ms = 700;
+ context->voice_ms = 60;
+ context->start_input_timers = 1;
+ context->no_input_timeout = 5000;
+ context->speech_timeout = 10000;
+
+ context->vad = switch_vad_init(ah->native_rate, 1);
+ switch_vad_set_mode(context->vad, -1);
+ switch_vad_set_param(context->vad, "thresh", context->thresh);
+ switch_vad_set_param(context->vad, "silence_ms", context->silence_ms);
+ switch_vad_set_param(context->vad, "voice_ms", context->voice_ms);
+ switch_vad_set_param(context->vad, "debug", 0);
+
+ test_asr_reset(context);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name)
+{
+ test_asr_t *context = (test_asr_t *)ah->private_info;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_open attempt on CLOSED asr handle\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "load grammar %s\n", grammar);
+ context->grammar = switch_core_strdup(ah->memory_pool, grammar);
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_asr_unload_grammar(switch_asr_handle_t *ah, const char *name)
+{
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags)
+{
+ test_asr_t *context = (test_asr_t *)ah->private_info;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Double ASR close!\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_NOTICE, "ASR closing ...\n");
+
+ if (context->vad) {
+ switch_vad_destroy(&context->vad);
+ }
+
+ switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED);
+ return status;
+}
+
+static switch_status_t test_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_vad_state_t vad_state;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ return SWITCH_STATUS_BREAK;
+ }
+
+ if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) && switch_test_flag(ah, SWITCH_ASR_FLAG_AUTO_RESUME)) {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Auto Resuming\n");
+ test_asr_reset(context);
+ }
+
+ if (switch_test_flag(context, ASRFLAG_READY)) {
+ vad_state = switch_vad_process(context->vad, (int16_t *)data, len / sizeof(uint16_t));
+ if (vad_state == SWITCH_VAD_STATE_STOP_TALKING) {
+ switch_set_flag(context, ASRFLAG_RESULT);
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "Talking stopped, have result.\n");
+ switch_vad_reset(context->vad);
+ switch_clear_flag(context, ASRFLAG_READY);
+ } else if (vad_state == SWITCH_VAD_STATE_START_TALKING) {
+ switch_set_flag(context, ASRFLAG_START_OF_SPEECH);
+ context->speech_time = switch_micro_time_now();
+ }
+ }
+
+ return status;
+}
+
+static switch_status_t test_asr_pause(switch_asr_handle_t *ah)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_pause attempt on CLOSED asr handle\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Pausing\n");
+ context->flags = 0;
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_asr_resume(switch_asr_handle_t *ah)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_resume attempt on CLOSED asr handle\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Resuming\n");
+ test_asr_reset(context);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_asr_check_results(switch_asr_handle_t *ah, switch_asr_flag_t *flags)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+
+ if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) || switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ return SWITCH_STATUS_BREAK;
+ }
+
+ if (!switch_test_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH) && switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) {
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ if ((!switch_test_flag(context, ASRFLAG_RESULT)) && (!switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT))) {
+ if (switch_test_flag(context, ASRFLAG_INPUT_TIMERS) && !(switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) &&
+ context->no_input_timeout >= 0 &&
+ (switch_micro_time_now() - context->no_input_time) / 1000 >= context->no_input_timeout) {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "NO INPUT TIMEOUT %" SWITCH_TIME_T_FMT "ms\n", (switch_micro_time_now() - context->no_input_time) / 1000);
+ switch_set_flag(context, ASRFLAG_NOINPUT_TIMEOUT);
+ } else if (switch_test_flag(context, ASRFLAG_START_OF_SPEECH) && context->speech_timeout > 0 && (switch_micro_time_now() - context->speech_time) / 1000 >= context->speech_timeout) {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "SPEECH TIMEOUT %" SWITCH_TIME_T_FMT "ms\n", (switch_micro_time_now() - context->speech_time) / 1000);
+ if (switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) {
+ switch_set_flag(context, ASRFLAG_RESULT);
+ } else {
+ switch_set_flag(context, ASRFLAG_NOINPUT_TIMEOUT);
+ }
+ }
+ }
+
+ return switch_test_flag(context, ASRFLAG_RESULT) || switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_BREAK;
+}
+
+static switch_status_t test_asr_get_results(switch_asr_handle_t *ah, char **resultstr, switch_asr_flag_t *flags)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_stream_handle_t result = { 0 };
+ SWITCH_STANDARD_STREAM(result);
+
+ if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) || switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (switch_test_flag(context, ASRFLAG_RESULT)) {
+
+ *resultstr = switch_mprintf("{\"grammar\": \"%s\", \"text\": \"%s\", \"confidence\": %f}", context->grammar, context->result_text, context->result_confidence);
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_ERROR, "Result: %s\n", *resultstr);
+
+ status = SWITCH_STATUS_SUCCESS;
+ } else if (switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT)) {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Result: NO INPUT\n");
+
+ *resultstr = switch_mprintf("{\"grammar\": \"%s\", \"text\": \"\", \"confidence\": 0, \"error\": \"no_input\"}", context->grammar);
+
+ status = SWITCH_STATUS_SUCCESS;
+ } else if (!switch_test_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH) && switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) {
+ switch_set_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH);
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Result: START OF SPEECH\n");
+ status = SWITCH_STATUS_BREAK;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_ERROR, "Unexpected call to asr_get_results - no results to return!\n");
+ status = SWITCH_STATUS_FALSE;
+ }
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ switch_set_flag(context, ASRFLAG_RETURNED_RESULT);
+ switch_clear_flag(context, ASRFLAG_READY);
+ }
+
+ return status;
+}
+
+static switch_status_t test_asr_start_input_timers(switch_asr_handle_t *ah)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+
+ if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_start_input_timers attempt on CLOSED asr handle\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "start_input_timers\n");
+
+ if (!switch_test_flag(context, ASRFLAG_INPUT_TIMERS)) {
+ switch_set_flag(context, ASRFLAG_INPUT_TIMERS);
+ context->no_input_time = switch_micro_time_now();
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "Input timers already started\n");
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static void test_asr_text_param(switch_asr_handle_t *ah, char *param, const char *val)
+{
+ test_asr_t *context = (test_asr_t *) ah->private_info;
+
+ if (!zstr(param) && !zstr(val)) {
+ int nval = atoi(val);
+ double fval = atof(val);
+
+ if (!strcasecmp("no-input-timeout", param) && switch_is_number(val)) {
+ context->no_input_timeout = nval;
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "no-input-timeout = %d\n", context->no_input_timeout);
+ } else if (!strcasecmp("speech-timeout", param) && switch_is_number(val)) {
+ context->speech_timeout = nval;
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "speech-timeout = %d\n", context->speech_timeout);
+ } else if (!strcasecmp("start-input-timers", param)) {
+ context->start_input_timers = switch_true(val);
+ if (context->start_input_timers) {
+ switch_set_flag(context, ASRFLAG_INPUT_TIMERS);
+ } else {
+ switch_clear_flag(context, ASRFLAG_INPUT_TIMERS);
+ }
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "start-input-timers = %d\n", context->start_input_timers);
+ } else if (!strcasecmp("vad-mode", param)) {
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "vad-mode = %s\n", val);
+ if (context->vad) switch_vad_set_mode(context->vad, nval);
+ } else if (!strcasecmp("vad-voice-ms", param) && nval > 0) {
+ context->voice_ms = nval;
+ switch_vad_set_param(context->vad, "voice_ms", nval);
+ } else if (!strcasecmp("vad-silence-ms", param) && nval > 0) {
+ context->silence_ms = nval;
+ switch_vad_set_param(context->vad, "silence_ms", nval);
+ } else if (!strcasecmp("vad-thresh", param) && nval > 0) {
+ context->thresh = nval;
+ switch_vad_set_param(context->vad, "thresh", nval);
+ } else if (!strcasecmp("channel-uuid", param)) {
+ context->channel_uuid = switch_core_strdup(ah->memory_pool, val);
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "channel-uuid = %s\n", val);
+ } else if (!strcasecmp("result", param)) {
+ context->result_text = switch_core_strdup(ah->memory_pool, val);
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "result = %s\n", val);
+ } else if (!strcasecmp("confidence", param) && fval >= 0.0) {
+ context->result_confidence = fval;
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "confidence = %f\n", fval);
+ }
+ }
+}
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_test_load)
+{
+ switch_asr_interface_t *asr_interface;
+
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+ asr_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ASR_INTERFACE);
+ asr_interface->interface_name = "test";
+ asr_interface->asr_open = test_asr_open;
+ asr_interface->asr_load_grammar = test_asr_load_grammar;
+ asr_interface->asr_unload_grammar = test_asr_unload_grammar;
+ asr_interface->asr_close = test_asr_close;
+ asr_interface->asr_feed = test_asr_feed;
+ asr_interface->asr_resume = test_asr_resume;
+ asr_interface->asr_pause = test_asr_pause;
+ asr_interface->asr_check_results = test_asr_check_results;
+ asr_interface->asr_get_results = test_asr_get_results;
+ asr_interface->asr_start_input_timers = test_asr_start_input_timers;
+ asr_interface->asr_text_param = test_asr_text_param;
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_test_shutdown)
+{
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_test_runtime)
+{
+ return SWITCH_STATUS_TERM;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
+ */
diff --git a/src/mod/applications/mod_test/test/Makefile.am b/src/mod/applications/mod_test/test/Makefile.am
new file mode 100644
index 0000000000..ed630acae0
--- /dev/null
+++ b/src/mod/applications/mod_test/test/Makefile.am
@@ -0,0 +1,5 @@
+include $(top_srcdir)/build/modmake.rulesam
+bin_PROGRAMS = test_asr
+test_asr_CFLAGS = $(AM_CFLAGS) -I../
+test_asr_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_test.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+TESTS = $(bin_PROGRAMS)
diff --git a/src/mod/applications/mod_test/test/freeswitch.xml b/src/mod/applications/mod_test/test/freeswitch.xml
new file mode 100644
index 0000000000..032569cd24
--- /dev/null
+++ b/src/mod/applications/mod_test/test/freeswitch.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/src/mod/applications/mod_test/test/sounds/agent.wav b/src/mod/applications/mod_test/test/sounds/agent.wav
new file mode 100644
index 0000000000..dc9c44ebbf
Binary files /dev/null and b/src/mod/applications/mod_test/test/sounds/agent.wav differ
diff --git a/src/mod/applications/mod_test/test/sounds/hi.wav b/src/mod/applications/mod_test/test/sounds/hi.wav
new file mode 100644
index 0000000000..fec0d6b073
Binary files /dev/null and b/src/mod/applications/mod_test/test/sounds/hi.wav differ
diff --git a/src/mod/applications/mod_test/test/sounds/ivr-please_state_your_name_and_reason_for_calling.wav b/src/mod/applications/mod_test/test/sounds/ivr-please_state_your_name_and_reason_for_calling.wav
new file mode 100644
index 0000000000..f6549736fd
Binary files /dev/null and b/src/mod/applications/mod_test/test/sounds/ivr-please_state_your_name_and_reason_for_calling.wav differ
diff --git a/src/mod/applications/mod_test/test/sounds/test.wav b/src/mod/applications/mod_test/test/sounds/test.wav
new file mode 100644
index 0000000000..3c72ab4cee
Binary files /dev/null and b/src/mod/applications/mod_test/test/sounds/test.wav differ
diff --git a/src/mod/applications/mod_test/test/sounds/test_agent.wav b/src/mod/applications/mod_test/test/sounds/test_agent.wav
new file mode 100644
index 0000000000..7202f6774a
Binary files /dev/null and b/src/mod/applications/mod_test/test/sounds/test_agent.wav differ
diff --git a/src/mod/applications/mod_test/test/test_asr.c b/src/mod/applications/mod_test/test/test_asr.c
new file mode 100644
index 0000000000..3ab3452d27
--- /dev/null
+++ b/src/mod/applications/mod_test/test/test_asr.c
@@ -0,0 +1,292 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Rienzo
+ *
+ *
+ * test_asr.c -- tests for mock test asr interface
+ *
+ */
+#include
+#include
+#include
+
+
+static const char *get_query_result_text(switch_memory_pool_t *pool, const char *result)
+{
+ const char *result_text = NULL;
+ cJSON *result_json = cJSON_Parse(result);
+ if (result_json) {
+ const char *text = cJSON_GetObjectCstr(result_json, "text");
+ if (!zstr(text)) {
+ result_text = switch_core_strdup(pool, text);
+ } else {
+ text = cJSON_GetObjectCstr(result_json, "error");
+ if (!zstr(text)) {
+ result_text = switch_core_strdup(pool, text);
+ }
+ }
+ cJSON_Delete(result_json);
+ }
+ return result_text;
+}
+
+
+FST_CORE_BEGIN(".")
+
+FST_MODULE_BEGIN(mod_test, test_asr)
+
+FST_SETUP_BEGIN()
+{
+ fst_requires_module("mod_tone_stream");
+ fst_requires_module("mod_sndfile");
+ fst_requires_module("mod_dptools");
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+
+FST_TEST_BEGIN(core_asr)
+{
+ const char* session_id = "123435";
+ char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id);
+ fst_test_core_asr_open("test");
+ fst_test_core_asr(
+ grammar,
+ "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "silence_stream://30000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "silence_stream://30000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_pause();
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_close();
+
+ fst_test_core_asr_open("test");
+ fst_test_core_asr(
+ grammar,
+ "file_string://silence_stream://1000,0!sounds/ivr-please_state_your_name_and_reason_for_calling.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_close();
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(core_asr_auto_resume)
+{
+ const char* session_id = "123435";
+ char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id);
+ fst_test_core_asr_open("test");
+ switch_set_flag(&ah, SWITCH_ASR_FLAG_AUTO_RESUME);
+ fst_test_core_asr(
+ grammar,
+ "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr(
+ grammar,
+ "silence_stream://30000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input");
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr(
+ grammar,
+ "silence_stream://30000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://silence_stream://1000,0!sounds/ivr-please_state_your_name_and_reason_for_calling.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_close();
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(core_asr_abuse)
+{
+ const char* session_id = "5351514";
+ char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id);
+ fst_test_core_asr_open("test");
+ fst_test_core_asr(
+ grammar,
+ "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_resume();
+ fst_test_core_asr_resume();
+ fst_test_core_asr_resume();
+ fst_test_core_asr_pause();
+ fst_test_core_asr_resume();
+ fst_test_core_asr(
+ grammar,
+ "file_string://sounds/agent.wav!silence_stream://3000,0");
+ fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent");
+ fst_test_core_asr_resume();
+
+ // Tested double-close, but FS core will crash...
+ fst_test_core_asr_close();
+}
+FST_TEST_END()
+
+
+FST_SESSION_BEGIN(play_and_detect_1)
+{
+ const char *result_text = NULL;
+ char *grammar = switch_core_session_sprintf(fst_session, "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", switch_core_session_get_uuid(fst_session));
+ fst_play_and_detect_speech_test_begin();
+
+ /* initial welcome and request */
+ fst_play_and_detect_speech_app_test("test",
+ grammar,
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "sounds/agent.wav");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "agent");
+
+ /* follow up request */
+ fst_play_and_detect_speech_app_test("test",
+ grammar,
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "file_string://1000,0!sounds/agent.wav");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "agent");
+
+ fst_play_and_detect_speech_test_end();
+}
+FST_SESSION_END()
+
+FST_SESSION_BEGIN(play_and_detect_no_input_follow_up)
+{
+ const char *result_text = NULL;
+ char *grammar = switch_core_session_sprintf(fst_session, "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}", switch_core_session_get_uuid(fst_session));
+
+ switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE);
+ fst_play_and_detect_speech_test_begin();
+ fst_play_and_detect_speech_app_test("test",
+ grammar,
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "file_string://silence_stream://4000,0!sounds/agent.wav");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "agent");
+
+ /* follow up request - no input */
+ fst_play_and_detect_speech_app_test("test",
+ grammar,
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "silence_stream://10000,0");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "no_input");
+
+ fst_play_and_detect_speech_test_end();
+}
+FST_SESSION_END()
+
+FST_SESSION_BEGIN(play_and_detect_no_input)
+{
+ const char *result_text = NULL;
+
+ switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE);
+ fst_play_and_detect_speech_test_begin();
+ fst_play_and_detect_speech_app_test("test",
+ switch_core_session_sprintf(fst_session,
+ "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default",
+ switch_core_session_get_uuid(fst_session)),
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "silence_stream://10000,0");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "no_input");
+
+ fst_play_and_detect_speech_test_end();
+}
+FST_SESSION_END()
+
+FST_SESSION_BEGIN(play_and_detect_start_input_timers)
+{
+ const char *result_text = NULL;
+
+ switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE);
+ fst_play_and_detect_speech_test_begin();
+
+ fst_play_and_detect_speech_app_test("test",
+ switch_core_session_sprintf(fst_session,
+ "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default",
+ switch_core_session_get_uuid(fst_session)),
+ "sounds/ivr-please_state_your_name_and_reason_for_calling.wav",
+ "silence_stream://10000,0");
+ result_text = get_query_result_text(fst_pool, fst_asr_result);
+ fst_requires(result_text != NULL);
+ fst_check_string_equals(result_text, "no_input");
+
+ fst_play_and_detect_speech_test_end();
+
+ fst_check_duration(5000, 500);
+}
+FST_SESSION_END()
+
+FST_TEST_BEGIN(unload_test)
+{
+ const char *err = NULL;
+ switch_sleep(1000000);
+ fst_check(switch_loadable_module_unload_module((char *)"../.libs", (char *)"mod_test", SWITCH_FALSE, &err) == SWITCH_STATUS_SUCCESS);
+}
+FST_TEST_END()
+
+
+FST_MODULE_END()
+
+FST_CORE_END()
diff --git a/src/mod/codecs/mod_isac/typedefs.h b/src/mod/codecs/mod_isac/typedefs.h
index e4a85afe30..df0df45723 100644
--- a/src/mod/codecs/mod_isac/typedefs.h
+++ b/src/mod/codecs/mod_isac/typedefs.h
@@ -61,6 +61,9 @@
#define WEBRTC_ARCH_X86_64
#define WEBRTC_ARCH_64_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(__aarch64__)
+#define WEBRTC_ARCH_64_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(_M_IX86) || defined(__i386__)
#define WEBRTC_ARCH_X86_FAMILY
#define WEBRTC_ARCH_X86
diff --git a/src/mod/codecs/mod_opus/mod_opus.c b/src/mod/codecs/mod_opus/mod_opus.c
index b06d8fa188..1125a27d17 100644
--- a/src/mod/codecs/mod_opus/mod_opus.c
+++ b/src/mod/codecs/mod_opus/mod_opus.c
@@ -207,19 +207,19 @@ static uint32_t switch_opus_encoder_set_audio_bandwidth(OpusEncoder *encoder_obj
static switch_bool_t switch_opus_show_audio_bandwidth(int audiobandwidth,char *audiobandwidth_str)
{
if (audiobandwidth == OPUS_BANDWIDTH_NARROWBAND) {
- strncpy(audiobandwidth_str, "NARROWBAND",10);
+ strncpy(audiobandwidth_str, "NARROWBAND",11);
return SWITCH_TRUE;
} else if (audiobandwidth == OPUS_BANDWIDTH_MEDIUMBAND) {
- strncpy(audiobandwidth_str, "MEDIUMBAND",10);
+ strncpy(audiobandwidth_str, "MEDIUMBAND",11);
return SWITCH_TRUE;
} else if (audiobandwidth == OPUS_BANDWIDTH_WIDEBAND) {
- strncpy(audiobandwidth_str,"WIDEBAND",8);
+ strncpy(audiobandwidth_str,"WIDEBAND",9);
return SWITCH_TRUE;
} else if (audiobandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) {
- strncpy(audiobandwidth_str, "SUPERWIDEBAND",13);
+ strncpy(audiobandwidth_str, "SUPERWIDEBAND",14);
return SWITCH_TRUE;
} else if (audiobandwidth == OPUS_BANDWIDTH_FULLBAND) {
- strncpy(audiobandwidth_str, "FULLBAND",8);
+ strncpy(audiobandwidth_str, "FULLBAND",9);
return SWITCH_TRUE;
}
return SWITCH_FALSE;
diff --git a/src/mod/endpoints/mod_dingaling/Makefile.am b/src/mod/endpoints/mod_dingaling/Makefile.am
index d19cf41bdf..3412a3ef59 100644
--- a/src/mod/endpoints/mod_dingaling/Makefile.am
+++ b/src/mod/endpoints/mod_dingaling/Makefile.am
@@ -20,3 +20,5 @@ BUILT_SOURCES=$(IKS_LA)
$(IKS_LA): $(IKS_BUILDDIR) $(IKS_DIR) $(IKS_DIR)/.update
@cd $(IKS_BUILDDIR) && $(MAKE)
@$(TOUCH_TARGET)
+
+deps: $(IKS_LA)
\ No newline at end of file
diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index 1ef3690578..242f3c645c 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -1220,6 +1220,7 @@ struct null_private_object {
switch_caller_profile_t *caller_profile;
switch_frame_t read_frame;
int16_t *null_buf;
+ int rate;
};
typedef struct null_private_object null_private_t;
@@ -1239,20 +1240,19 @@ static switch_status_t null_channel_kill_channel(switch_core_session_t *session,
static switch_status_t null_tech_init(null_private_t *tech_pvt, switch_core_session_t *session)
{
const char *iananame = "L16";
- uint32_t rate = 8000;
uint32_t interval = 20;
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_channel_t *channel = switch_core_session_get_channel(session);
const switch_codec_implementation_t *read_impl;
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s setup codec %s/%d/%d\n", switch_channel_get_name(channel), iananame, rate,
- interval);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s setup codec %s/%d/%d\n",
+ switch_channel_get_name(channel), iananame, tech_pvt->rate, interval);
status = switch_core_codec_init(&tech_pvt->read_codec,
iananame,
NULL,
NULL,
- rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session));
+ tech_pvt->rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session));
if (status != SWITCH_STATUS_SUCCESS || !tech_pvt->read_codec.implementation || !switch_core_codec_ready(&tech_pvt->read_codec)) {
goto end;
@@ -1262,7 +1262,7 @@ static switch_status_t null_tech_init(null_private_t *tech_pvt, switch_core_sess
iananame,
NULL,
NULL,
- rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session));
+ tech_pvt->rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session));
if (status != SWITCH_STATUS_SUCCESS) {
@@ -1494,6 +1494,19 @@ static switch_call_cause_t null_channel_outgoing_channel(switch_core_session_t *
switch_core_session_add_stream(*new_session, NULL);
if ((tech_pvt = (null_private_t *) switch_core_session_alloc(*new_session, sizeof(null_private_t))) != 0) {
+ const char *rate_ = switch_event_get_header(var_event, "rate");
+ int rate = 0;
+
+ if (rate_) {
+ rate = atoi(rate_);
+ }
+
+ if (!(rate > 0 && rate % 8000 == 0)) {
+ rate = 8000;
+ }
+
+ tech_pvt->rate = rate;
+
channel = switch_core_session_get_channel(*new_session);
switch_snprintf(name, sizeof(name), "null/%s", outbound_profile->destination_number);
switch_channel_set_name(channel, name);
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index a6afe36f97..0c7a27534d 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -1993,26 +1993,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"),
TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), SIPTAG_PAYLOAD_STR(message), TAG_END());
- } else if (update_allowed && ua && switch_stristr("polycom", ua)) {
- if ( switch_stristr("UA/4", ua) ) {
- snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip);
- } else {
- snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", name, number);
- }
- sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY);
- nua_update(tech_pvt->nh,
- NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
- NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher),
- NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher),
- TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)),
- TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)),
- TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
- TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), TAG_END());
- } else if (update_allowed && ua && ((switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) ||
- (switch_stristr("cisco/spa50", ua) || switch_stristr("cisco/spa525", ua)) ||
- switch_stristr("cisco/spa30", ua) || switch_stristr("Grandstream GXP", ua) ||
- switch_stristr("Yealink", ua) || switch_stristr("Mitel", ua) ||
- switch_stristr("Panasonic", ua))) {
+ } else if (update_allowed && ua && (switch_stristr("polycom", ua) ||
+ (switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) ||
+ (switch_stristr("cisco/spa50", ua) ||
+ switch_stristr("cisco/spa525", ua)) ||
+ switch_stristr("cisco/spa30", ua) ||
+ switch_stristr("Grandstream", ua) ||
+ switch_stristr("Yealink", ua) ||
+ switch_stristr("Mitel", ua) ||
+ switch_stristr("Panasonic", ua))) {
snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip);
sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY);
@@ -2020,6 +2009,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher),
NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher),
+ TAG_IF(!zstr(tech_pvt->privacy), SIPTAG_PRIVACY_STR(tech_pvt->privacy)),
TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)),
TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)),
TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h
index 6b9b90ad5b..cdb311f35a 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.h
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.h
@@ -561,6 +561,8 @@ struct sofia_gateway {
sofia_gateway_subscription_t *subscriptions;
int distinct_to;
sofia_cid_type_t cid_type;
+ char register_network_ip[80];
+ int register_network_port;
};
typedef enum {
diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index 142424f3a6..4a5f64fa51 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -8916,11 +8916,15 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel_a, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_core_session_get_uuid(b_session));
switch_event_fire(&event);
}
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEREE) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(a_channel, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_replaced_call_id", switch_core_session_get_uuid(b_session));
switch_event_fire(&event);
}
}
@@ -9023,6 +9027,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel_a, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_core_session_get_uuid(b_session));
switch_event_fire(&event);
}
@@ -9101,6 +9108,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
if(sofia_test_pflag(profile, PFLAG_FIRE_TRANFER_EVENTS)) {
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel_a, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", switch_core_session_get_uuid(hup_session));
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", switch_core_session_get_uuid(t_session));
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_channel_get_partner_uuid(t_channel));
switch_event_fire(&event);
}
@@ -9288,6 +9298,8 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
if(sofia_test_pflag(profile, PFLAG_FIRE_TRANFER_EVENTS)) {
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b);
switch_channel_event_set_data(channel_a, event);
switch_event_fire(&event);
}
diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c
index d04fb02533..767ec8c8e0 100644
--- a/src/mod/endpoints/mod_sofia/sofia_presence.c
+++ b/src/mod/endpoints/mod_sofia/sofia_presence.c
@@ -4945,7 +4945,7 @@ void sofia_presence_handle_sip_i_message(int status,
first_history_info = 0;
} else {
/* Append the History-Info into one long string */
- const char *history_var = switch_channel_get_variable(channel, "sip_history_info");
+ const char *history_var = switch_event_get_header(event, "sip_history_info");
if (!zstr(history_var)) {
char *tmp_str;
if ((tmp_str = switch_mprintf("%s, %s", history_var, un->un_value))) {
diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c
index 842e6c3bf7..39ae6b3b03 100644
--- a/src/mod/endpoints/mod_sofia/sofia_reg.c
+++ b/src/mod/endpoints/mod_sofia/sofia_reg.c
@@ -151,6 +151,9 @@ void sofia_reg_fire_custom_gateway_state_event(sofia_gateway_t *gateway, int sta
switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Gateway", gateway->name);
switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "State", sofia_state_string(gateway->state));
switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Ping-Status", sofia_gateway_status_name(gateway->status));
+ switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Register-Network-IP", gateway->register_network_ip);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "Register-Network-Port", "%d", gateway->register_network_port);
+
if (!zstr(phrase)) {
switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Phrase", phrase);
}
@@ -2402,6 +2405,15 @@ void sofia_reg_handle_sip_r_register(int status,
if (sofia_private && gateway) {
reg_state_t ostate = gateway->state;
+ char oregister_network_ip[80] = { 0 };
+ char network_ip[80];
+
+ if (!zstr_buf(gateway->register_network_ip)) {
+ strncpy(oregister_network_ip, gateway->register_network_ip, sizeof(oregister_network_ip) - 1);
+ }
+ sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &gateway->register_network_port);
+ snprintf(gateway->register_network_ip, sizeof(gateway->register_network_ip), (msg_addrinfo(de->data->e_msg))->ai_addr->sa_family == AF_INET6 ? "[%s]" : "%s", network_ip);
+
switch (status) {
case 200:
if (sip && sip->sip_contact) {
@@ -2457,7 +2469,9 @@ void sofia_reg_handle_sip_r_register(int status,
gateway->name, switch_str_nil(phrase), status, ++gateway->failures);
break;
}
- if (ostate != gateway->state) {
+ if (ostate != gateway->state ||
+ zstr_buf(oregister_network_ip) || strcmp(oregister_network_ip, gateway->register_network_ip)) {
+
sofia_reg_fire_custom_gateway_state_event(gateway, status, phrase);
}
}
@@ -3075,7 +3089,7 @@ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile,
switch_assert(call_id);
sql = switch_mprintf("select count(sip_user) from sip_registrations where sip_user='%q' AND call_id <> '%q' AND sip_host='%q'",
- username, call_id, domain_name);
+ sip->sip_to->a_url->url_user, call_id, domain_name);
switch_assert(sql != NULL);
sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_regcount_callback, &count);
free(sql);
diff --git a/src/mod/endpoints/mod_verto/ws.c b/src/mod/endpoints/mod_verto/ws.c
index d92fd0bcea..86c73c18fa 100644
--- a/src/mod/endpoints/mod_verto/ws.c
+++ b/src/mod/endpoints/mod_verto/ws.c
@@ -254,10 +254,10 @@ int ws_handshake(wsh_t *wsh)
char version[5] = "";
char proto[256] = "";
char proto_buf[384] = "";
- char input[256] = "";
+ char input[512] = "";
unsigned char output[SHA1_HASH_SIZE] = "";
char b64[256] = "";
- char respond[512] = "";
+ char respond[1024] = "";
ssize_t bytes;
char *p, *e = 0;
diff --git a/src/mod/event_handlers/mod_rayo/Makefile.am b/src/mod/event_handlers/mod_rayo/Makefile.am
index 5c0c5b4008..872329fde3 100644
--- a/src/mod/event_handlers/mod_rayo/Makefile.am
+++ b/src/mod/event_handlers/mod_rayo/Makefile.am
@@ -17,3 +17,5 @@ BUILT_SOURCES=$(IKS_LA)
$(IKS_LA): $(IKS_BUILDDIR) $(IKS_DIR) $(IKS_DIR)/.update
@cd $(IKS_BUILDDIR) && $(MAKE)
@$(TOUCH_TARGET)
+
+SUBDIRS=. test
diff --git a/src/mod/event_handlers/mod_rayo/iks_helpers.h b/src/mod/event_handlers/mod_rayo/iks_helpers.h
index 2017134713..e221abe390 100644
--- a/src/mod/event_handlers/mod_rayo/iks_helpers.h
+++ b/src/mod/event_handlers/mod_rayo/iks_helpers.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -51,50 +51,50 @@ struct xmpp_error {
#undef XMPP_ERROR
#define XMPP_ERROR(def_name, name, type) \
- extern const struct xmpp_error def_name##_val; \
- extern const struct xmpp_error *def_name;
+ SWITCH_DECLARE(const struct xmpp_error) def_name##_val; \
+ SWITCH_DECLARE(const struct xmpp_error *) def_name;
#include "xmpp_errors.def"
/* See RFC-3920 XMPP core for error definitions */
-extern iks *iks_new_presence(const char *name, const char *namespace, const char *from, const char *to);
-extern iks *iks_new_error(iks *iq, const struct xmpp_error *err);
-extern iks *iks_new_error_detailed(iks *iq, const struct xmpp_error *err, const char *detail_text);
-extern iks *iks_new_error_detailed_printf(iks *iq, const struct xmpp_error *err, const char *detail_text_format, ...);
-extern iks *iks_new_iq_result(iks *iq);
-extern const char *iks_find_attrib_soft(iks *xml, const char *attrib);
-extern const char *iks_find_attrib_default(iks *xml, const char *attrib, const char *def);
-extern int iks_find_bool_attrib(iks *xml, const char *attrib);
-extern int iks_find_int_attrib(iks *xml, const char *attrib);
-extern char iks_find_char_attrib(iks *xml, const char *attrib);
-extern double iks_find_decimal_attrib(iks *xml, const char *attrib);
-extern const char *iks_node_type_to_string(int type);
-extern const char *iks_net_error_to_string(int err);
-extern iks *iks_insert_attrib_printf(iks *xml, const char *name, const char *fmt, ...);
+SWITCH_DECLARE(iks *) iks_new_presence(const char *name, const char *namespace, const char *from, const char *to);
+SWITCH_DECLARE(iks *) iks_new_error(iks *iq, const struct xmpp_error *err);
+SWITCH_DECLARE(iks *) iks_new_error_detailed(iks *iq, const struct xmpp_error *err, const char *detail_text);
+SWITCH_DECLARE(iks *) iks_new_error_detailed_printf(iks *iq, const struct xmpp_error *err, const char *detail_text_format, ...);
+SWITCH_DECLARE(iks *) iks_new_iq_result(iks *iq);
+SWITCH_DECLARE(const char *) iks_find_attrib_soft(iks *xml, const char *attrib);
+SWITCH_DECLARE(const char *) iks_find_attrib_default(iks *xml, const char *attrib, const char *def);
+SWITCH_DECLARE(int) iks_find_bool_attrib(iks *xml, const char *attrib);
+SWITCH_DECLARE(int) iks_find_int_attrib(iks *xml, const char *attrib);
+SWITCH_DECLARE(char) iks_find_char_attrib(iks *xml, const char *attrib);
+SWITCH_DECLARE(double) iks_find_decimal_attrib(iks *xml, const char *attrib);
+SWITCH_DECLARE(const char *) iks_node_type_to_string(int type);
+SWITCH_DECLARE(const char *) iks_net_error_to_string(int err);
+SWITCH_DECLARE(iks *) iks_insert_attrib_printf(iks *xml, const char *name, const char *fmt, ...);
-extern char *iks_server_dialback_key(const char *secret, const char *receiving_server, const char *originating_server, const char *stream_id);
-extern void iks_sha_print_base64(iksha *sha, char *buf);
+SWITCH_DECLARE(char *) iks_server_dialback_key(const char *secret, const char *receiving_server, const char *originating_server, const char *stream_id);
+SWITCH_DECLARE(void) iks_sha_print_base64(iksha *sha, char *buf);
/** A function to validate attribute value */
typedef int (*iks_attrib_validation_function)(const char *);
-extern int validate_optional_attrib(iks_attrib_validation_function fn, const char *attrib);
+SWITCH_DECLARE(int) validate_optional_attrib(iks_attrib_validation_function fn, const char *attrib);
-#define ELEMENT_DECL(name) extern int VALIDATE_##name(iks *node);
+#define ELEMENT_DECL(name) SWITCH_DECLARE(int) VALIDATE_##name(iks *node);
#define ELEMENT(name) int VALIDATE_##name(iks *node) { int result = 1; if (!node) return 0;
#define ATTRIB(name, def, rule) result &= iks_attrib_is_##rule(iks_find_attrib_default(node, #name, #def));
#define OPTIONAL_ATTRIB(name, def, rule) result &= validate_optional_attrib(iks_attrib_is_##rule, iks_find_attrib_default(node, #name, #def));
#define STRING_ATTRIB(name, def, rule) result &= value_matches(iks_find_attrib_default(node, #name, #def), rule);
#define ELEMENT_END return result; }
-extern int value_matches(const char *value, const char *rule);
+SWITCH_DECLARE(int) value_matches(const char *value, const char *rule);
-extern int iks_attrib_is_bool(const char *value);
-extern int iks_attrib_is_not_negative(const char *value);
-extern int iks_attrib_is_positive(const char *value);
-extern int iks_attrib_is_positive_or_neg_one(const char *value);
-extern int iks_attrib_is_any(const char *value);
-extern int iks_attrib_is_decimal_between_zero_and_one(const char *value);
-extern int iks_attrib_is_dtmf_digit(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_bool(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_not_negative(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_positive(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_positive_or_neg_one(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_any(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_decimal_between_zero_and_one(const char *value);
+SWITCH_DECLARE(int) iks_attrib_is_dtmf_digit(const char *value);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.h b/src/mod/event_handlers/mod_rayo/mod_rayo.h
index cefd4e1782..2d066c4e21 100644
--- a/src/mod/event_handlers/mod_rayo/mod_rayo.h
+++ b/src/mod/event_handlers/mod_rayo/mod_rayo.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -129,20 +129,20 @@ struct rayo_component {
#define RAYO_CALL(x) ((struct rayo_call *)x)
#define RAYO_MIXER(x) ((struct rayo_mixer *)x)
-extern void rayo_message_send(struct rayo_actor *from, const char *to, iks *payload, int dup, int reply, const char *file, int line);
-extern void rayo_message_destroy(struct rayo_message *msg);
-extern iks *rayo_message_remove_payload(struct rayo_message *msg);
+SWITCH_DECLARE(void) rayo_message_send(struct rayo_actor *from, const char *to, iks *payload, int dup, int reply, const char *file, int line);
+SWITCH_DECLARE(void) rayo_message_destroy(struct rayo_message *msg);
+SWITCH_DECLARE(iks *) rayo_message_remove_payload(struct rayo_message *msg);
#define RAYO_SEND_MESSAGE(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 0, 0, __FILE__, __LINE__)
#define RAYO_SEND_MESSAGE_DUP(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 1, 0, __FILE__, __LINE__)
#define RAYO_SEND_REPLY(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 0, 1, __FILE__, __LINE__)
#define RAYO_SEND_REPLY_DUP(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 1, 1, __FILE__, __LINE__)
-extern struct rayo_actor *rayo_actor_locate(const char *jid, const char *file, int line);
-extern struct rayo_actor *rayo_actor_locate_by_id(const char *id, const char *file, int line);
-extern int rayo_actor_seq_next(struct rayo_actor *actor);
-extern void rayo_actor_retain(struct rayo_actor *actor, const char *file, int line);
-extern void rayo_actor_release(struct rayo_actor *actor, const char *file, int line);
-extern void rayo_actor_destroy(struct rayo_actor *actor, const char *file, int line);
+SWITCH_DECLARE(struct rayo_actor *) rayo_actor_locate(const char *jid, const char *file, int line);
+SWITCH_DECLARE(struct rayo_actor *) rayo_actor_locate_by_id(const char *id, const char *file, int line);
+SWITCH_DECLARE(int) rayo_actor_seq_next(struct rayo_actor *actor);
+SWITCH_DECLARE(void) rayo_actor_retain(struct rayo_actor *actor, const char *file, int line);
+SWITCH_DECLARE(void) rayo_actor_release(struct rayo_actor *actor, const char *file, int line);
+SWITCH_DECLARE(void) rayo_actor_destroy(struct rayo_actor *actor, const char *file, int line);
#define RAYO_LOCATE(jid) rayo_actor_locate(jid, __FILE__, __LINE__)
#define RAYO_LOCATE_BY_ID(id) rayo_actor_locate_by_id(id, __FILE__, __LINE__)
@@ -156,21 +156,21 @@ extern void rayo_actor_destroy(struct rayo_actor *actor, const char *file, int l
#define RAYO_DESTROY(x) rayo_actor_destroy(RAYO_ACTOR(x), __FILE__, __LINE__)
#define RAYO_SEQ_NEXT(x) rayo_actor_seq_next(RAYO_ACTOR(x))
-extern int rayo_call_is_joined(struct rayo_call *call);
-extern int rayo_call_is_faxing(struct rayo_call *call);
-extern void rayo_call_set_faxing(struct rayo_call *call, int faxing);
-extern const char *rayo_call_get_dcp_jid(struct rayo_call *call);
+SWITCH_DECLARE(int) rayo_call_is_joined(struct rayo_call *call);
+SWITCH_DECLARE(int) rayo_call_is_faxing(struct rayo_call *call);
+SWITCH_DECLARE(void) rayo_call_set_faxing(struct rayo_call *call, int faxing);
+SWITCH_DECLARE(const char *) rayo_call_get_dcp_jid(struct rayo_call *call);
#define rayo_mixer_get_name(mixer) RAYO_ID(mixer)
#define rayo_component_init(component, pool, type, subtype, id, parent, client_jid) _rayo_component_init(component, pool, type, subtype, id, parent, client_jid, NULL, __FILE__, __LINE__)
#define rayo_component_init_cleanup(component, pool, type, subtype, id, parent, client_jid, cleanup) _rayo_component_init(component, pool, type, subtype, id, parent, client_jid, cleanup, __FILE__, __LINE__)
-extern struct rayo_component *_rayo_component_init(struct rayo_component *component, switch_memory_pool_t *pool, const char *type, const char *subtype, const char *id, struct rayo_actor *parent, const char *client_jid, rayo_actor_cleanup_fn cleanup, const char *file, int line);
-extern switch_bool_t is_component_actor(struct rayo_actor *);
+SWITCH_DECLARE(struct rayo_component *) _rayo_component_init(struct rayo_component *component, switch_memory_pool_t *pool, const char *type, const char *subtype, const char *id, struct rayo_actor *parent, const char *client_jid, rayo_actor_cleanup_fn cleanup, const char *file, int line);
+SWITCH_DECLARE(switch_bool_t) is_component_actor(struct rayo_actor *);
typedef iks *(*rayo_actor_xmpp_handler)(struct rayo_actor *, struct rayo_message *, void *);
-extern void rayo_actor_command_handler_add(const char *type, const char *subtype, const char *name, rayo_actor_xmpp_handler fn);
-extern void rayo_actor_event_handler_add(const char *from_type, const char *from_subtype, const char *to_type, const char *to_subtype, const char *name, rayo_actor_xmpp_handler fn);
+SWITCH_DECLARE(void) rayo_actor_command_handler_add(const char *type, const char *subtype, const char *name, rayo_actor_xmpp_handler fn);
+SWITCH_DECLARE(void) rayo_actor_event_handler_add(const char *from_type, const char *from_subtype, const char *to_type, const char *to_subtype, const char *name, rayo_actor_xmpp_handler fn);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/nlsml.c b/src/mod/event_handlers/mod_rayo/nlsml.c
index 79f8157e9f..752ddc3efa 100644
--- a/src/mod/event_handlers/mod_rayo/nlsml.c
+++ b/src/mod/event_handlers/mod_rayo/nlsml.c
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2014, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -30,6 +30,7 @@
#include
#include "nlsml.h"
+#include "iks_helpers.h"
struct nlsml_parser;
@@ -417,48 +418,60 @@ static int isdtmf(const char digit)
}
/**
- * Construct an NLSML result for digit match
- * @param digits the matching digits
+ * Construct an NLSML result for match
+ * @param match the matching digits or text
+ * @param interpretation the optional digit interpretation
+ * @param mode dtmf or speech
+ * @param confidence 0-100
+ * @return the NLSML
+ */
+iks *nlsml_create_match(const char *match, const char *interpretation, const char *mode, int confidence)
+{
+ iks *result = iks_new("result");
+ iks_insert_attrib(result, "xmlns", NLSML_NS);
+ iks_insert_attrib(result, "xmlns:xf", "http://www.w3.org/2000/xforms");
+ if (!zstr(match)) {
+ iks *interpretation_node = iks_insert(result, "interpretation");
+ iks *input_node = iks_insert(interpretation_node, "input");
+ iks *instance_node = iks_insert(interpretation_node, "instance");
+ iks_insert_attrib(input_node, "mode", mode);
+ iks_insert_attrib_printf(input_node, "confidence", "%d", confidence);
+ iks_insert_cdata(input_node, match, strlen(match));
+ if (zstr(interpretation)) {
+ iks_insert_cdata(instance_node, match, strlen(match));
+ } else {
+ iks_insert_cdata(instance_node, interpretation, strlen(interpretation));
+ }
+ }
+ return result;
+}
+
+/**
+ * Construct an NLSML result for match
+ * @param match the matching digits or text
* @param interpretation the optional digit interpretation
* @return the NLSML
*/
iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation)
{
- iks *result = iks_new("result");
- iks_insert_attrib(result, "xmlns", NLSML_NS);
- iks_insert_attrib(result, "xmlns:xf", "http://www.w3.org/2000/xforms");
- if (!zstr(digits)) {
- int first = 1;
- int i;
- int num_digits = strlen(digits);
- switch_stream_handle_t stream = { 0 };
-
- iks *interpretation_node = iks_insert(result, "interpretation");
- iks *input_node = iks_insert(interpretation_node, "input");
- iks *instance_node = iks_insert(interpretation_node, "instance");
- iks_insert_attrib(input_node, "mode", "dtmf");
- iks_insert_attrib(input_node, "confidence", "100");
-
- SWITCH_STANDARD_STREAM(stream);
- for (i = 0; i < num_digits; i++) {
- if (isdtmf(digits[i])) {
- if (first) {
- stream.write_function(&stream, "%c", digits[i]);
- first = 0;
- } else {
- stream.write_function(&stream, " %c", digits[i]);
- }
+ iks *result = NULL;
+ int first = 1;
+ int i;
+ int num_digits = strlen(digits);
+ switch_stream_handle_t stream = { 0 };
+ SWITCH_STANDARD_STREAM(stream);
+ for (i = 0; i < num_digits; i++) {
+ if (isdtmf(digits[i])) {
+ if (first) {
+ stream.write_function(&stream, "%c", digits[i]);
+ first = 0;
+ } else {
+ stream.write_function(&stream, " %c", digits[i]);
}
}
- iks_insert_cdata(input_node, stream.data, strlen(stream.data));
-
- if (zstr(interpretation)) {
- iks_insert_cdata(instance_node, stream.data, strlen(stream.data));
- } else {
- iks_insert_cdata(instance_node, interpretation, strlen(interpretation));
- }
- switch_safe_free(stream.data);
}
+ result = nlsml_create_match((const char *)stream.data, interpretation, "dtmf", 100);
+ switch_safe_free(stream.data);
return result;
}
diff --git a/src/mod/event_handlers/mod_rayo/nlsml.h b/src/mod/event_handlers/mod_rayo/nlsml.h
index f5be079ba5..35f79adc26 100644
--- a/src/mod/event_handlers/mod_rayo/nlsml.h
+++ b/src/mod/event_handlers/mod_rayo/nlsml.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2014, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -39,11 +39,12 @@ enum nlsml_match_type {
NMT_NOMATCH
};
-extern int nlsml_init(void);
-extern void nlsml_destroy(void);
-enum nlsml_match_type nlsml_parse(const char *result, const char *uuid);
-iks *nlsml_normalize(const char *result);
-extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation);
+SWITCH_DECLARE(int) nlsml_init(void);
+SWITCH_DECLARE(void) nlsml_destroy(void);
+SWITCH_DECLARE(enum nlsml_match_type) nlsml_parse(const char *result, const char *uuid);
+SWITCH_DECLARE(iks *) nlsml_normalize(const char *result);
+SWITCH_DECLARE(iks *) nlsml_create_dtmf_match(const char *digits, const char *interpretation);
+SWITCH_DECLARE(iks *) nlsml_create_match(const char *digits, const char *interpretation, const char *mode, int confidence);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/rayo_components.h b/src/mod/event_handlers/mod_rayo/rayo_components.h
index 6cd30757a1..9be7881a4e 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_components.h
+++ b/src/mod/event_handlers/mod_rayo/rayo_components.h
@@ -60,37 +60,37 @@
#define COMPONENT_COMPLETE_HANGUP "hangup", RAYO_EXT_COMPLETE_NS
#define COMPONENT_COMPLETE_DONE "done", RAYO_EXT_COMPLETE_NS
-extern switch_status_t rayo_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_input_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_output_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_prompt_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_record_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_fax_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_exec_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_input_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_output_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_prompt_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_record_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_fax_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(switch_status_t) rayo_exec_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern switch_status_t rayo_components_shutdown(void);
-extern switch_status_t rayo_input_component_shutdown(void);
-extern switch_status_t rayo_output_component_shutdown(void);
-extern switch_status_t rayo_prompt_component_shutdown(void);
-extern switch_status_t rayo_record_component_shutdown(void);
-extern switch_status_t rayo_fax_components_shutdown(void);
-extern switch_status_t rayo_exec_component_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_components_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_input_component_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_output_component_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_prompt_component_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_record_component_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_fax_components_shutdown(void);
+SWITCH_DECLARE(switch_status_t) rayo_exec_component_shutdown(void);
-extern void rayo_component_send_start(struct rayo_component *component, iks *iq);
-extern void rayo_component_send_iq_error(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type);
-extern void rayo_component_send_iq_error_detailed(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type, const char *detail);
-extern void rayo_component_send_complete(struct rayo_component *component, const char *reason, const char *reason_namespace);
-extern void rayo_component_send_complete_event(struct rayo_component *component, iks *response);
-extern void rayo_component_send_complete_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete);
-extern void rayo_component_send_complete_with_metadata_string(struct rayo_component *component, const char *reason, const char *reason_namespace, const char *meta, int child_of_complete);
+SWITCH_DECLARE(void) rayo_component_send_start(struct rayo_component *component, iks *iq);
+SWITCH_DECLARE(void) rayo_component_send_iq_error(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type);
+SWITCH_DECLARE(void) rayo_component_send_iq_error_detailed(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type, const char *detail);
+SWITCH_DECLARE(void) rayo_component_send_complete(struct rayo_component *component, const char *reason, const char *reason_namespace);
+SWITCH_DECLARE(void) rayo_component_send_complete_event(struct rayo_component *component, iks *response);
+SWITCH_DECLARE(void) rayo_component_send_complete_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete);
+SWITCH_DECLARE(void) rayo_component_send_complete_with_metadata_string(struct rayo_component *component, const char *reason, const char *reason_namespace, const char *meta, int child_of_complete);
-extern iks *rayo_component_create_complete_event(struct rayo_component *component, const char *reason, const char *reason_namespace);
-extern iks *rayo_component_create_complete_event_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete);
+SWITCH_DECLARE(iks *) rayo_component_create_complete_event(struct rayo_component *component, const char *reason, const char *reason_namespace);
+SWITCH_DECLARE(iks *) rayo_component_create_complete_event_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete);
-extern void rayo_component_api_execute_async(struct rayo_component *component, const char *cmd, const char *args);
+SWITCH_DECLARE(void) rayo_component_api_execute_async(struct rayo_component *component, const char *cmd, const char *args);
#define RAYO_COMPONENT_LOCATE(id) rayo_component_locate(id, __FILE__, __LINE__)
-extern struct rayo_component *rayo_component_locate(const char *id, const char *file, int line);
+SWITCH_DECLARE(struct rayo_component *) rayo_component_locate(const char *id, const char *file, int line);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h
index 36354c9508..442ec1f4c8 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h
+++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h
@@ -34,9 +34,9 @@
#include "mod_rayo.h"
-extern switch_status_t rayo_cpa_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern void rayo_cpa_component_shutdown(void);
-extern iks *rayo_cpa_component_start(struct rayo_actor *call, struct rayo_message *msg, void *session_data);
+SWITCH_DECLARE(switch_status_t) rayo_cpa_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(void) rayo_cpa_component_shutdown(void);
+SWITCH_DECLARE(iks *) rayo_cpa_component_start(struct rayo_actor *call, struct rayo_message *msg, void *session_data);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h
index fcdc35f2f4..fec720dadf 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h
+++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h
@@ -33,10 +33,10 @@
#include "mod_rayo.h"
-extern switch_status_t rayo_cpa_detector_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
-extern void rayo_cpa_detector_shutdown(void);
-extern int rayo_cpa_detector_start(const char *call_uuid, const char *signal_ns, const char **error_detail);
-extern void rayo_cpa_detector_stop(const char *call_uuid, const char *signal_ns);
+SWITCH_DECLARE(switch_status_t) rayo_cpa_detector_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file);
+SWITCH_DECLARE(void) rayo_cpa_detector_shutdown(void);
+SWITCH_DECLARE(int) rayo_cpa_detector_start(const char *call_uuid, const char *signal_ns, const char **error_detail);
+SWITCH_DECLARE(void) rayo_cpa_detector_stop(const char *call_uuid, const char *signal_ns);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/rayo_elements.c b/src/mod/event_handlers/mod_rayo/rayo_elements.c
index d0892dca80..14e9c61c55 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_elements.c
+++ b/src/mod/event_handlers/mod_rayo/rayo_elements.c
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -42,7 +42,6 @@ ELEMENT(RAYO_INPUT)
ATTRIB(sensitivity, 0.5, decimal_between_zero_and_one)
ATTRIB(min-confidence, 0, decimal_between_zero_and_one)
ATTRIB(max-silence, -1, positive_or_neg_one)
- /* for now, only NLSML */
STRING_ATTRIB(match-content-type, application/nlsml+xml, "application/nlsml+xml")
/* internal attribs for prompt support */
ATTRIB(barge-event, false, bool)
@@ -72,6 +71,7 @@ ELEMENT(RAYO_OUTPUT)
ATTRIB(max-time, -1, positive_or_neg_one)
ATTRIB(renderer,, any)
ATTRIB(voice,, any)
+ STRING_ATTRIB(direction, out, "out,in")
ELEMENT_END
/**
diff --git a/src/mod/event_handlers/mod_rayo/rayo_input_component.c b/src/mod/event_handlers/mod_rayo/rayo_input_component.c
index dc7a71c9d9..84a8e745cc 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_input_component.c
+++ b/src/mod/event_handlers/mod_rayo/rayo_input_component.c
@@ -415,7 +415,7 @@ static int validate_call_input(iks *input, const char **error)
if (!zstr(iks_find_attrib(grammar, "url"))) {
*error = "url not allowed with content-type";
return 0;
- } else if (strcmp("application/srgs+xml", content_type)) {
+ } else if (strcmp("application/srgs+xml", content_type) && strcmp("text/plain", content_type)) {
*error = "Unsupported content type";
return 0;
}
@@ -876,6 +876,30 @@ static iks *start_timers_call_input_component(struct rayo_actor *component, stru
return iks_new_iq_result(iq);
}
+/**
+ * Get text / error from result
+ */
+static const char *get_detected_speech_result_text(cJSON *result_json, double *confidence, const char **error_text)
+{
+ const char *result_text = NULL;
+ const char *text = cJSON_GetObjectCstr(result_json, "text");
+ if (confidence) {
+ *confidence = 0.0;
+ }
+ if (!zstr(text)) {
+ cJSON *json_confidence = cJSON_GetObjectItem(result_json, "confidence");
+ if (json_confidence && json_confidence->valuedouble > 0.0) {
+ *confidence = json_confidence->valuedouble;
+ } else {
+ *confidence = 0.99;
+ }
+ result_text = text;
+ } else if (error_text) {
+ *error_text = cJSON_GetObjectCstr(result_json, "error");
+ }
+ return result_text;
+}
+
/**
* Handle speech detection event
*/
@@ -905,7 +929,50 @@ static void on_detected_speech_event(switch_event_t *event)
if (zstr(result)) {
rayo_component_send_complete(component, INPUT_NOMATCH);
} else {
- if (strchr(result, '<')) {
+ if (result[0] == '{') {
+ // internal FS JSON format
+ cJSON *json_result = cJSON_Parse(result);
+ if (json_result) {
+ // examine result to determine what happened
+ double confidence = 0.0;
+ const char *error_text = NULL;
+ const char *result_text = NULL;
+ result_text = get_detected_speech_result_text(json_result, &confidence, &error_text);
+ if (!zstr(result_text)) {
+ // got result... send as NLSML
+ iks *result = nlsml_create_match(result_text, NULL, "speech", (int)(confidence * 100.0));
+ /* notify of match */
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "MATCH = %s\n", result_text);
+ send_match_event(RAYO_COMPONENT(component), result);
+ iks_delete(result);
+ } else if (zstr(error_text)) {
+ // unknown error
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_WARNING, "No matching text nor error in result: %s!\n", result);
+ rayo_component_send_complete(component, INPUT_NOMATCH);
+ } else if (!strcmp(error_text, "no_input")) {
+ // no input error
+ rayo_component_send_complete(component, INPUT_NOINPUT);
+ } else if (!strcmp(error_text, "no_match")) {
+ // no match error
+ rayo_component_send_complete(component, INPUT_NOMATCH);
+ } else {
+ // generic error
+ iks *response = rayo_component_create_complete_event(component, COMPONENT_COMPLETE_ERROR);
+ iks *error = NULL;
+ if ((error = iks_find(response, "complete"))) {
+ if ((error = iks_find(error, "error"))) {
+ iks_insert_cdata(error, error_text, strlen(error_text));
+ }
+ }
+ rayo_component_send_complete_event(component, response);
+ }
+ cJSON_Delete(json_result);
+ } else {
+ // failed to parse JSON result
+ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_WARNING, "Failed to parse JSON result: %s!\n", result);
+ rayo_component_send_complete(component, INPUT_NOMATCH);
+ }
+ } else if (strchr(result, '<')) {
/* got an XML result */
enum nlsml_match_type match_type = nlsml_parse(result, uuid);
switch (match_type) {
diff --git a/src/mod/event_handlers/mod_rayo/rayo_output_component.c b/src/mod/event_handlers/mod_rayo/rayo_output_component.c
index f94921fd91..6ea607e33b 100644
--- a/src/mod/event_handlers/mod_rayo/rayo_output_component.c
+++ b/src/mod/event_handlers/mod_rayo/rayo_output_component.c
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2016, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -53,6 +53,8 @@ struct output_component {
const char *renderer;
/** optional headers to pass to renderer */
const char *headers;
+ /** audio direction */
+ const char *direction;
};
#define OUTPUT_FINISH "finish", RAYO_OUTPUT_COMPLETE_NS
@@ -79,6 +81,7 @@ static struct rayo_component *create_output_component(struct rayo_actor *actor,
output_component->max_time_ms = iks_find_int_attrib(output, "max-time");
output_component->start_paused = iks_find_bool_attrib(output, "start-paused");
output_component->renderer = switch_core_strdup(RAYO_POOL(output_component), iks_find_attrib_soft(output, "renderer"));
+ output_component->direction = strcmp(iks_find_attrib_soft(output, "direction"), "in") ? "m" : "mr";
output_component->headers = NULL;
/* get custom headers */
{
@@ -136,7 +139,7 @@ static iks *start_call_output(struct rayo_component *component, switch_core_sess
}
stream.write_function(&stream, "}fileman://rayo://%s", RAYO_JID(component));
- if (switch_ivr_displace_session(session, stream.data, 0, "m") == SWITCH_STATUS_SUCCESS) {
+ if (switch_ivr_displace_session(session, stream.data, 0, OUTPUT_COMPONENT(component)->direction) == SWITCH_STATUS_SUCCESS) {
RAYO_RELEASE(component);
} else {
if (component->complete) {
diff --git a/src/mod/event_handlers/mod_rayo/sasl.h b/src/mod/event_handlers/mod_rayo/sasl.h
index 17b4a99f66..641bcfa064 100644
--- a/src/mod/event_handlers/mod_rayo/sasl.h
+++ b/src/mod/event_handlers/mod_rayo/sasl.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -29,7 +29,7 @@
#ifndef SASL_H
#define SASL_H
-extern void parse_plain_auth_message(const char *message, char **authzid, char **authcid, char **password);
+SWITCH_DECLARE(void) parse_plain_auth_message(const char *message, char **authzid, char **authcid, char **password);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/srgs.h b/src/mod/event_handlers/mod_rayo/srgs.h
index cfe2c6c93a..e32b522d33 100644
--- a/src/mod/event_handlers/mod_rayo/srgs.h
+++ b/src/mod/event_handlers/mod_rayo/srgs.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2014, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -45,15 +45,15 @@ enum srgs_match_type {
SMT_MATCH_END
};
-extern int srgs_init(void);
-extern void srgs_destroy(void);
-extern struct srgs_parser *srgs_parser_new(const char *uuid);
-extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document);
-extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar);
-extern const char *srgs_grammar_to_jsgf(struct srgs_grammar *grammar);
-extern const char *srgs_grammar_to_jsgf_file(struct srgs_grammar *grammar, const char *basedir, const char *ext);
-extern enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation);
-extern void srgs_parser_destroy(struct srgs_parser *parser);
+SWITCH_DECLARE(int) srgs_init(void);
+SWITCH_DECLARE(void) srgs_destroy(void);
+SWITCH_DECLARE(struct srgs_parser *) srgs_parser_new(const char *uuid);
+SWITCH_DECLARE(struct srgs_grammar *) srgs_parse(struct srgs_parser *parser, const char *document);
+SWITCH_DECLARE(const char *) srgs_grammar_to_regex(struct srgs_grammar *grammar);
+SWITCH_DECLARE(const char *) srgs_grammar_to_jsgf(struct srgs_grammar *grammar);
+SWITCH_DECLARE(const char *) srgs_grammar_to_jsgf_file(struct srgs_grammar *grammar, const char *basedir, const char *ext);
+SWITCH_DECLARE(enum srgs_match_type) srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation);
+SWITCH_DECLARE(void) srgs_parser_destroy(struct srgs_parser *parser);
#endif
diff --git a/src/mod/event_handlers/mod_rayo/test.h b/src/mod/event_handlers/mod_rayo/test.h
deleted file mode 100644
index 4b5d1e0ac1..0000000000
--- a/src/mod/event_handlers/mod_rayo/test.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013, Grasshopper
- *
- * Version: MPL 1.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- *
- * The Initial Developer of the Original Code is Grasshopper
- * Portions created by the Initial Developer are Copyright (C)
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Chris Rienzo
- *
- * test.h -- simple unit testing macros
- *
- */
-#ifndef TEST_H
-#define TEST_H
-
-#define assert_equals(test, expected_str, expected, actual, file, line) \
-{ \
- int actual_val = actual; \
- if (expected != actual_val) { \
- printf("TEST\t%s\tFAIL\t%s\t%i\t!=\t%i\t%s:%i\n", test, expected_str, expected, actual_val, file, line); \
- exit(1); \
- } else { \
- printf("TEST\t%s\tPASS\n", test); \
- } \
-}
-
-#define assert_string_equals(test, expected, actual, file, line) \
-{ \
- const char *actual_str = actual; \
- if (!actual_str || strcmp(expected, actual_str)) { \
- printf("TEST\t%s\tFAIL\t\t%s\t!=\t%s\t%s:%i\n", test, expected, actual_str, file, line); \
- exit(1); \
- } else { \
- printf("TEST\t%s\tPASS\n", test); \
- } \
-}
-
-#define assert_not_null(test, actual, file, line) \
-{ \
- const void *actual_val = actual; \
- if (!actual_val) { \
- printf("TEST\t%s\tFAIL\t\t\t\t\t%s:%i\n", test, file, line); \
- exit(1); \
- } else { \
- printf("TEST\t%s\tPASS\n", test); \
- } \
-}
-
-#define assert_null(test, actual, file, line) \
-{ \
- const void *actual_val = actual; \
- if (actual_val) { \
- printf("TEST\t%s\tFAIL\t\t\t\t\t%s:%i\n", test, file, line); \
- exit(1); \
- } else { \
- printf("TEST\t%s\tPASS\n", test); \
- } \
-}
-
-#define ASSERT_EQUALS(expected, actual) assert_equals(#actual, #expected, expected, actual, __FILE__, __LINE__)
-#define ASSERT_STRING_EQUALS(expected, actual) assert_string_equals(#actual, expected, actual, __FILE__, __LINE__)
-#define ASSERT_NOT_NULL(actual) assert_not_null(#actual " not null", actual, __FILE__, __LINE__)
-#define ASSERT_NULL(actual) assert_null(#actual " is null", actual, __FILE__, __LINE__)
-
-#define SKIP_ASSERT_EQUALS(expected, actual) if (0) { ASSERT_EQUALS(expected, actual); }
-
-#define TEST(name) printf("TEST BEGIN\t" #name "\n"); name(); printf("TEST END\t"#name "\tPASS\n");
-
-#define SKIP_TEST(name) if (0) { TEST(name) };
-
-#define TEST_INIT switch_core_init(0, SWITCH_TRUE, &err);
-
-#endif
-
-/* For Emacs:
- * Local Variables:
- * mode:c
- * indent-tabs-mode:t
- * tab-width:4
- * c-basic-offset:4
- * End:
- * For VIM:
- * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet
- */
-
diff --git a/src/mod/event_handlers/mod_rayo/test/Makefile.am b/src/mod/event_handlers/mod_rayo/test/Makefile.am
new file mode 100644
index 0000000000..0648275b0e
--- /dev/null
+++ b/src/mod/event_handlers/mod_rayo/test/Makefile.am
@@ -0,0 +1,13 @@
+include $(top_srcdir)/build/modmake.rulesam
+bin_PROGRAMS = test_iks test_nlsml test_srgs
+
+test_iks_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS)
+test_iks_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+
+test_nlsml_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS)
+test_nlsml_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+
+test_srgs_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS)
+test_srgs_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+
+TESTS = $(bin_PROGRAMS)
diff --git a/src/mod/event_handlers/mod_rayo/test/test_iks.c b/src/mod/event_handlers/mod_rayo/test/test_iks.c
new file mode 100644
index 0000000000..02a17303d9
--- /dev/null
+++ b/src/mod/event_handlers/mod_rayo/test/test_iks.c
@@ -0,0 +1,204 @@
+
+
+#include
+#include
+#include
+#include
+
+static const char *voxeo_grammar =
+ "";
+
+
+static const char *repeating_bracket =
+ "]]]]]]]]] ]] ]]>";
+
+
+static const char *normal_cdata =
+ "";
+
+
+static const char *empty_cdata =
+ "";
+
+static const char *rayo_test_srgs =
+ "\n"
+ " \n"
+ " \n"
+ " - \n"
+ "
- need a
\n"
+ " - i need a
\n"
+ " \n"
+ " - clue
\n"
+ " \n"
+ " out.concept = \"clue\";\n"
+ " \n"
+ " - \n"
+ "
- have an
\n"
+ " - i have an
\n"
+ " \n"
+ " - answer
\n"
+ " \n"
+ " out.concept = \"answer\";\n"
+ " \n"
+ " \n"
+ " \n"
+ "";
+
+
+#define MATCH 1
+#define NO_MATCH 0
+
+
+/**
+ * main program
+ */
+FST_BEGIN()
+
+FST_SUITE_BEGIN(iks)
+
+FST_SETUP_BEGIN()
+{
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+
+FST_TEST_BEGIN(iks_cdata_bug)
+{
+ iks *iq = NULL;
+ iks *input = NULL;
+ iksparser *p = iks_dom_new(&iq);
+ const char *cdata;
+ fst_check(IKS_OK == iks_parse(p, voxeo_grammar, 0, 1));
+ iks_parser_delete(p);
+ fst_check((input = iks_find(iq, "input")));
+ fst_check((cdata = iks_find_cdata(input, "grammar")));
+ fst_check_string_equals("[1 DIGITS]", cdata);
+ iks_delete(iq);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(repeating_bracket)
+{
+ iks *iq = NULL;
+ iks *input = NULL;
+ iksparser *p = iks_dom_new(&iq);
+ const char *cdata;
+ fst_check(IKS_OK == iks_parse(p, repeating_bracket, 0, 1));
+ iks_parser_delete(p);
+ fst_check((input = iks_find(iq, "input")));
+ fst_check((cdata = iks_find_cdata(input, "grammar")));
+ fst_check_string_equals("[1 DIGITS]>]]]]]]]]] ]] ", cdata);
+ iks_delete(iq);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(normal_cdata)
+{
+ iks *iq = NULL;
+ iks *input = NULL;
+ iksparser *p = iks_dom_new(&iq);
+ const char *cdata;
+ fst_check(IKS_OK == iks_parse(p, normal_cdata, 0, 1));
+ iks_parser_delete(p);
+ fst_check((input = iks_find(iq, "input")));
+ fst_check((cdata = iks_find_cdata(input, "grammar")));
+ fst_check_string_equals("1 DIGITS", cdata);
+ iks_delete(iq);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(empty_cdata)
+{
+ iks *iq = NULL;
+ iks *input = NULL;
+ iksparser *p = iks_dom_new(&iq);
+ const char *cdata;
+ fst_check(IKS_OK == iks_parse(p, empty_cdata, 0, 1));
+ iks_parser_delete(p);
+ fst_check((input = iks_find(iq, "input")));
+ fst_check(NULL == (cdata = iks_find_cdata(input, "grammar")));
+ iks_delete(iq);
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(rayo_test_srgs)
+{
+ iks *grammar = NULL;
+ iksparser *p = iks_dom_new(&grammar);
+ fst_check(IKS_OK == iks_parse(p, rayo_test_srgs, 0, 1));
+ iks_parser_delete(p);
+ iks_delete(grammar);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(iks_helper_value_matches)
+{
+ fst_check(MATCH == value_matches("1", "1,2,3"));
+ fst_check(MATCH == value_matches("2", "1,2,3"));
+ fst_check(MATCH == value_matches("3", "1,2,3"));
+ fst_check(NO_MATCH == value_matches("4", "1,2,3"));
+ fst_check(NO_MATCH == value_matches("1,2", "1,2,3"));
+ fst_check(NO_MATCH == value_matches(NULL, "1,2,3"));
+ fst_check(NO_MATCH == value_matches(NULL, NULL));
+ fst_check(NO_MATCH == value_matches("1", NULL));
+ fst_check(NO_MATCH == value_matches("", "1,2,3"));
+ fst_check(NO_MATCH == value_matches("", ""));
+ fst_check(NO_MATCH == value_matches("1", ""));
+ fst_check(MATCH == value_matches("duplex", "duplex,send,recv"));
+ fst_check(MATCH == value_matches("send", "duplex,send,recv"));
+ fst_check(MATCH == value_matches("recv", "duplex,send,recv"));
+ fst_check(NO_MATCH == value_matches("sendrecv", "duplex,send,recv"));
+ fst_check(MATCH == value_matches("duplex1", "duplex1,duplex2,duplex3"));
+ fst_check(MATCH == value_matches("duplex2", "duplex1,duplex2,duplex3"));
+ fst_check(MATCH == value_matches("duplex3", "duplex1,duplex2,duplex3"));
+ fst_check(NO_MATCH == value_matches("duplex4", "duplex1,duplex2,duplex3"));
+ fst_check(NO_MATCH == value_matches("duplex", "duplex1,duplex2,duplex3"));
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(dialback_key)
+{
+ fst_check_string_equals("37c69b1cf07a3f67c04a5ef5902fa5114f2c76fe4a2686482ba5b89323075643", iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("", "xmpp.example.com", "example.org", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "", "example.org", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", ""));
+ fst_check(NULL == iks_server_dialback_key(NULL, "xmpp.example.com", "example.org", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", NULL, "example.org", "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", NULL, "D60000229F"));
+ fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", NULL));
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(validate_dtmf)
+{
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("1"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("A"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("a"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("D"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("d"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("*"));
+ fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("#"));
+ fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit("E"));
+ fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit(NULL));
+ fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit(""));
+ fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit("11"));
+ fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "A"));
+ fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "1"));
+ fst_check(SWITCH_FALSE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "Z"));
+ fst_check(SWITCH_FALSE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "11"));
+ fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, NULL));
+ fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, ""));
+}
+FST_TEST_END()
+
+
+FST_SUITE_END()
+
+FST_END()
diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/main.c b/src/mod/event_handlers/mod_rayo/test/test_nlsml.c
similarity index 86%
rename from src/mod/event_handlers/mod_rayo/test_nlsml/main.c
rename to src/mod/event_handlers/mod_rayo/test/test_nlsml.c
index 0577288b7c..df5948f05a 100644
--- a/src/mod/event_handlers/mod_rayo/test_nlsml/main.c
+++ b/src/mod/event_handlers/mod_rayo/test/test_nlsml.c
@@ -1,8 +1,8 @@
#include
-#include "test.h"
-#include "nlsml.h"
+#include
+#include
static const char *nlsml_good =
"\n"
"\n";
-/**
- * Test parsing NLSML example results
- */
-static void test_parse_nlsml_examples(void)
-{
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_good, "1234"));
- ASSERT_EQUALS(NMT_BAD_XML, nlsml_parse(nlsml_bad, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_match_with_model_instance, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_multi_input, "1234"));
- ASSERT_EQUALS(NMT_NOINPUT, nlsml_parse(nlsml_no_input, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_multi_input_dtmf, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_meta, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_simple_ambiguity, "1234"));
- ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_mixed_initiative, "1234"));
- ASSERT_EQUALS(NMT_NOMATCH, nlsml_parse(nlsml_no_match, "1234"));
-}
static const char *nlsml_dtmf_result =
"1 2 3 4"
"";
-/**
- * Test creating DTMF match result
- */
-static void test_create_dtmf_match(void)
-{
- iks *result = nlsml_create_dtmf_match("1234", NULL);
- char *result_str;
- ASSERT_NOT_NULL(result);
- result_str = iks_string(NULL, result);
- ASSERT_STRING_EQUALS(nlsml_dtmf_result, result_str);
- iks_free(result_str);
-}
-
-static const char *nlsml_dtmf_instance_result =
- ""
- "1"
- "foo"
- "";
-
-/**
- * Test creating DTMF match result with instance interpretation
- */
-static void test_create_dtmf_instance(void)
-{
- iks *result = nlsml_create_dtmf_match("1", "foo");
- char *result_str;
- ASSERT_NOT_NULL(result);
- result_str = iks_string(NULL, result);
- ASSERT_STRING_EQUALS(nlsml_dtmf_instance_result, result_str);
- iks_free(result_str);
-}
static const char *nlsml_good_normalized =
""
"";
+
+static const char *nlsml_dtmf_instance_result =
+ ""
+ "1"
+ "foo"
+ "";
+
+
+FST_BEGIN()
+
+FST_SUITE_BEGIN(nlsml)
+
+FST_SETUP_BEGIN()
+{
+ fst_requires(nlsml_init());
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+/**
+ * Test parsing NLSML example results
+ */
+FST_TEST_BEGIN(parse_nlsml_examples)
+{
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_good, "1234"));
+ fst_check(NMT_BAD_XML == nlsml_parse(nlsml_bad, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_match_with_model_instance, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_multi_input, "1234"));
+ fst_check(NMT_NOINPUT == nlsml_parse(nlsml_no_input, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_multi_input_dtmf, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_meta, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_simple_ambiguity, "1234"));
+ fst_check(NMT_MATCH == nlsml_parse(nlsml_mixed_initiative, "1234"));
+ fst_check(NMT_NOMATCH == nlsml_parse(nlsml_no_match, "1234"));
+}
+FST_TEST_END()
+
+/**
+ * Test creating DTMF match result
+ */
+FST_TEST_BEGIN(create_dtmf_match)
+{
+ iks *result = nlsml_create_dtmf_match("1234", NULL);
+ char *result_str;
+ fst_requires(result);
+ result_str = iks_string(NULL, result);
+ fst_check_string_equals(nlsml_dtmf_result, result_str);
+ iks_free(result_str);
+}
+FST_TEST_END()
+
+
+/**
+ * Test creating DTMF match result with instance interpretation
+ */
+FST_TEST_BEGIN(create_dtmf_instance)
+{
+ iks *result = nlsml_create_dtmf_match("1", "foo");
+ char *result_str;
+ fst_requires(result);
+ result_str = iks_string(NULL, result);
+ fst_check_string_equals(nlsml_dtmf_instance_result, result_str);
+ iks_free(result_str);
+}
+FST_TEST_END()
+
/**
* Test NLSML normalization
*/
-static void test_normalize(void)
+FST_TEST_BEGIN(normalize)
{
iks *result = nlsml_normalize(nlsml_good);
- ASSERT_NOT_NULL(result);
- ASSERT_STRING_EQUALS(nlsml_good_normalized, iks_string(NULL, result));
+ fst_requires(result);
+ fst_check_string_equals(nlsml_good_normalized, iks_string(NULL, result));
}
+FST_TEST_END()
-/**
- * main program
- */
-int main(int argc, char **argv)
-{
- const char *err;
- TEST_INIT
- nlsml_init();
- TEST(test_parse_nlsml_examples);
- TEST(test_create_dtmf_match);
- TEST(test_create_dtmf_instance);
- TEST(test_normalize);
- return 0;
-}
+FST_SUITE_END()
+
+FST_END()
diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/main.c b/src/mod/event_handlers/mod_rayo/test/test_srgs.c
similarity index 57%
rename from src/mod/event_handlers/mod_rayo/test_srgs/main.c
rename to src/mod/event_handlers/mod_rayo/test/test_srgs.c
index a8f8a944f7..97284639bb 100644
--- a/src/mod/event_handlers/mod_rayo/test_srgs/main.c
+++ b/src/mod/event_handlers/mod_rayo/test/test_srgs.c
@@ -1,8 +1,8 @@
#include
-#include "test.h"
-#include "srgs.h"
+#include
+#include
static const char *adhearsion_menu_grammar =
@@ -91,108 +91,6 @@ static const char *adhearsion_large_menu_grammar =
" \n"
"\n";
-/**
- * Test matching against adhearsion menu grammar
- */
-static void test_match_adhearsion_menu_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_menu_grammar)));
-
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_STRING_EQUALS("0", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_STRING_EQUALS("1", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_STRING_EQUALS("7", interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "715", &interpretation));
- ASSERT_STRING_EQUALS("4", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_STRING_EQUALS("3", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
- ASSERT_NULL(interpretation);
-
- srgs_parser_destroy(parser);
-}
-
-/**
- * Test matching against adhearsion menu grammar
- */
-static void test_match_adhearsion_large_menu_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_large_menu_grammar)));
-
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_STRING_EQUALS("0", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_STRING_EQUALS("1", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_STRING_EQUALS("2", interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "715", &interpretation));
- ASSERT_STRING_EQUALS("4", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_STRING_EQUALS("3", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "761", &interpretation));
- ASSERT_STRING_EQUALS("50", interpretation);
-
- srgs_parser_destroy(parser);
-}
-
static const char *duplicate_tag_grammar =
""
" \n"
@@ -205,54 +103,6 @@ static const char *duplicate_tag_grammar =
" \n"
"\n";
-/**
- * Test matching with duplicate tags
- */
-static void test_match_duplicate_tag_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, duplicate_tag_grammar)));
-
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_STRING_EQUALS("2", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_STRING_EQUALS("2", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_STRING_EQUALS("4", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_STRING_EQUALS("4", interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
- ASSERT_NULL(interpretation);
-
- srgs_parser_destroy(parser);
-}
-
static const char *adhearsion_ask_grammar =
""
@@ -274,38 +124,6 @@ static const char *adhearsion_ask_grammar =
" \n"
"\n";
-/**
- * Test matching against adhearsion ask grammar
- */
-static void test_match_adhearsion_ask_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_ask_grammar)));
-
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_NULL(interpretation);
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
-
- srgs_parser_destroy(parser);
-}
static const char *multi_digit_grammar =
""
@@ -328,37 +146,6 @@ static const char *multi_digit_grammar =
" \n"
"\n";
-/**
- * Test matching against grammar with multiple digits per item
- */
-static void test_match_multi_digit_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_digit_grammar)));
-
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
-
- srgs_parser_destroy(parser);
-}
static const char *multi_rule_grammar =
""
@@ -385,34 +172,6 @@ static const char *multi_rule_grammar =
" \n"
"\n";
-static void test_match_multi_rule_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_rule_grammar)));
-
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
-
- srgs_parser_destroy(parser);
-}
static const char *rayo_example_grammar =
"\n"
"\n";
-static void test_match_rayo_example_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, rayo_example_grammar)));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "4", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*9", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2321#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "27", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "223", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation));
-
- srgs_parser_destroy(parser);
-}
-
static const char *bad_ref_grammar =
"\n"
"\n";
-static void test_parse_grammar(void)
-{
- struct srgs_parser *parser;
-
- parser = srgs_parser_new("1234");
-
- ASSERT_NOT_NULL(srgs_parse(parser, adhearsion_ask_grammar));
- ASSERT_NULL(srgs_parse(parser, adhearsion_ask_grammar_bad));
- ASSERT_NULL(srgs_parse(parser, NULL));
- ASSERT_NULL(srgs_parse(NULL, adhearsion_ask_grammar));
- ASSERT_NULL(srgs_parse(NULL, adhearsion_ask_grammar_bad));
- ASSERT_NULL(srgs_parse(parser, bad_ref_grammar));
-
- srgs_parser_destroy(parser);
-}
static const char *repeat_item_grammar_bad =
"\n"
"\n";
-static void test_repeat_item_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad));
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad2));
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad3));
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad4));
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad5));
- ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad6));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_grammar)));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_grammar)));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_optional_grammar)));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_plus_grammar)));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_star_grammar)));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation));
- ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation));
-
- srgs_parser_destroy(parser);
-}
static const char *repeat_item_range_ambiguous_grammar =
"\n"
"\n";
-static void test_repeat_item_range_ambiguous_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
-
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_ambiguous_grammar)));
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation));
-}
static const char *repeat_item_range_optional_pound_grammar =
"\n"
" \n"
"\n";
-static void test_repeat_item_range_optional_pound_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *interpretation;
- parser = srgs_parser_new("1234");
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_optional_pound_grammar)));
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "12#", &interpretation));
- ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation));
-}
/*
= please | kindly | oh mighty computer;
@@ -1045,25 +648,6 @@ static const char *rayo_test_srgs =
" \n"
"";
-static void test_jsgf(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- const char *jsgf;
- parser = srgs_parser_new("1234");
-
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_ask_grammar)));
- ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar)));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, voice_srgs1)));
- ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar)));
- ASSERT_STRING_EQUALS(voice_jsgf, jsgf);
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_rule_grammar)));
- ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar)));
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, rayo_test_srgs)));
- ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar)));
- ASSERT_NULL(srgs_grammar_to_jsgf(NULL));
- srgs_parser_destroy(parser);
-}
/* removed the ruleref to URL from example */
static const char *w3c_example_grammar =
@@ -1121,15 +705,6 @@ static const char *w3c_example_grammar =
"\n"
"";
-static void test_w3c_example_grammar(void)
-{
- struct srgs_parser *parser;
- struct srgs_grammar *grammar;
- parser = srgs_parser_new("1234");
-
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, w3c_example_grammar)));
- ASSERT_NOT_NULL(srgs_grammar_to_jsgf(grammar));
-}
static const char *metadata_grammar =
""
@@ -1193,38 +768,508 @@ static const char *metadata_grammar =
"\n"
"";
-static void test_metadata_grammar(void)
+
+FST_BEGIN()
+
+FST_SUITE_BEGIN(srgs)
+
+FST_SETUP_BEGIN()
+{
+ fst_requires(srgs_init());
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+/**
+ * Test matching against adhearsion menu grammar
+ */
+FST_TEST_BEGIN(match_adhearsion_menu_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, adhearsion_menu_grammar)));
+
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check_string_equals("0", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check_string_equals("1", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check_string_equals("7", interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "715", &interpretation));
+ fst_check_string_equals("4", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check_string_equals("3", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+ fst_check(NULL == interpretation);
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+/**
+ * Test matching against adhearsion menu grammar
+ */
+FST_TEST_BEGIN(match_adhearsion_large_menu_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, adhearsion_large_menu_grammar)));
+
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check_string_equals("0", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check_string_equals("1", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check_string_equals("2", interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "715", &interpretation));
+ fst_check_string_equals("4", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check_string_equals("3", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "761", &interpretation));
+ fst_check_string_equals("50", interpretation);
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+/**
+ * Test matching with duplicate tags
+ */
+FST_TEST_BEGIN(match_duplicate_tag_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, duplicate_tag_grammar)));
+
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check_string_equals("2", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check_string_equals("2", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check_string_equals("4", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check_string_equals("4", interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+ fst_check(NULL == interpretation);
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+
+/**
+ * Test matching against adhearsion ask grammar
+ */
+FST_TEST_BEGIN(match_adhearsion_ask_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, adhearsion_ask_grammar)));
+
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(NULL == interpretation);
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+/**
+ * Test matching against grammar with multiple digits per item
+ */
+FST_TEST_BEGIN(match_multi_digit_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, multi_digit_grammar)));
+
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(match_multi_rule_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, multi_rule_grammar)));
+
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(match_rayo_example_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, rayo_example_grammar)));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "4", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "*9", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "2321#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "27", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "223", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+
+FST_TEST_BEGIN(parse_grammar)
+{
+ struct srgs_parser *parser;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+
+ fst_check(srgs_parse(parser, adhearsion_ask_grammar));
+ fst_check(NULL == srgs_parse(parser, adhearsion_ask_grammar_bad));
+ fst_check(NULL == srgs_parse(parser, NULL));
+ fst_check(NULL == srgs_parse(NULL, adhearsion_ask_grammar));
+ fst_check(NULL == srgs_parse(NULL, adhearsion_ask_grammar_bad));
+ fst_check(NULL == srgs_parse(parser, bad_ref_grammar));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(repeat_item_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad));
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad2));
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad3));
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad4));
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad5));
+ fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad6));
+ fst_requires((grammar = srgs_parse(parser, repeat_item_grammar)));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115", &interpretation));
+ fst_requires((grammar = srgs_parse(parser, repeat_item_range_grammar)));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567", &interpretation));
+ fst_requires((grammar = srgs_parse(parser, repeat_item_optional_grammar)));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1234", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "111156#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "111156", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_requires((grammar = srgs_parse(parser, repeat_item_plus_grammar)));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111157#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111157", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+ fst_requires((grammar = srgs_parse(parser, repeat_item_star_grammar)));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111157#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111157", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation));
+ fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation));
+ fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation));
+
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(repeat_item_range_ambiguous_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, repeat_item_range_ambiguous_grammar)));
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "12", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "123", &interpretation));
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(repeat_item_range_optional_pound_grammar)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *interpretation;
+
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+ fst_requires((grammar = srgs_parse(parser, repeat_item_range_optional_pound_grammar)));
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "1", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation));
+ fst_check(SMT_MATCH == srgs_grammar_match(grammar, "12", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "12#", &interpretation));
+ fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "123", &interpretation));
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(jsgf)
+{
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ const char *jsgf;
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+
+ fst_requires((grammar = srgs_parse(parser, adhearsion_ask_grammar)));
+ fst_check((jsgf = srgs_grammar_to_jsgf(grammar)));
+ fst_requires((grammar = srgs_parse(parser, voice_srgs1)));
+ fst_check((jsgf = srgs_grammar_to_jsgf(grammar)));
+ fst_check_string_equals(voice_jsgf, jsgf);
+ fst_requires((grammar = srgs_parse(parser, multi_rule_grammar)));
+ fst_check((jsgf = srgs_grammar_to_jsgf(grammar)));
+ fst_requires((grammar = srgs_parse(parser, rayo_test_srgs)));
+ fst_check((jsgf = srgs_grammar_to_jsgf(grammar)));
+ fst_check(NULL == srgs_grammar_to_jsgf(NULL));
+ srgs_parser_destroy(parser);
+}
+FST_TEST_END()
+
+
+FST_TEST_BEGIN(w3c_example_grammar)
{
struct srgs_parser *parser;
struct srgs_grammar *grammar;
parser = srgs_parser_new("1234");
+ fst_requires(parser);
- ASSERT_NOT_NULL((grammar = srgs_parse(parser, metadata_grammar)));
- ASSERT_NOT_NULL(srgs_grammar_to_jsgf(grammar));
+ fst_requires((grammar = srgs_parse(parser, w3c_example_grammar)));
+ fst_check(srgs_grammar_to_jsgf(grammar));
}
+FST_TEST_END()
-/**
- * main program
- */
-int main(int argc, char **argv)
+
+FST_TEST_BEGIN(metadata_grammar)
{
- const char *err;
- TEST_INIT
- srgs_init();
- TEST(test_parse_grammar);
- TEST(test_match_adhearsion_menu_grammar);
- TEST(test_match_adhearsion_large_menu_grammar);
- TEST(test_match_duplicate_tag_grammar);
- TEST(test_match_adhearsion_ask_grammar);
- TEST(test_match_multi_digit_grammar);
- TEST(test_match_multi_rule_grammar);
- TEST(test_match_rayo_example_grammar);
- TEST(test_repeat_item_grammar);
- TEST(test_jsgf);
- TEST(test_w3c_example_grammar);
- TEST(test_metadata_grammar);
- TEST(test_repeat_item_range_ambiguous_grammar);
- TEST(test_repeat_item_range_optional_pound_grammar);
- return 0;
-}
+ struct srgs_parser *parser;
+ struct srgs_grammar *grammar;
+ parser = srgs_parser_new("1234");
+ fst_requires(parser);
+
+ fst_requires((grammar = srgs_parse(parser, metadata_grammar)));
+ fst_check(srgs_grammar_to_jsgf(grammar));
+}
+FST_TEST_END()
+
+FST_SUITE_END()
+
+FST_END()
diff --git a/src/mod/event_handlers/mod_rayo/test_iks/Makefile b/src/mod/event_handlers/mod_rayo/test_iks/Makefile
deleted file mode 100644
index d75a967feb..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_iks/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-BASE=../../../../..
-
-IKS_DIR=$(BASE)/libs/iksemel
-IKS_LA=$(IKS_DIR)/src/libiksemel.la
-LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include
-LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../iks_helpers.o
-LOCAL_SOURCES= main.c
-include $(BASE)/build/modmake.rules
-
-$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update
- @cd $(IKS_DIR) && $(MAKE)
- @$(TOUCH_TARGET)
-
-local_all:
- libtool --mode=link gcc main.o ../iks_helpers.o -o test test_iks.la
-
-local_clean:
- -rm test
diff --git a/src/mod/event_handlers/mod_rayo/test_iks/main.c b/src/mod/event_handlers/mod_rayo/test_iks/main.c
deleted file mode 100644
index 09a368dc4b..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_iks/main.c
+++ /dev/null
@@ -1,185 +0,0 @@
-
-
-#include
-#include
-#include "test.h"
-#include "iks_helpers.h"
-
-static const char *voxeo_grammar =
- "";
-
-static void test_iks_cdata_bug(void)
-{
- iks *iq = NULL;
- iks *input = NULL;
- iksparser *p = iks_dom_new(&iq);
- const char *cdata;
- ASSERT_EQUALS(IKS_OK, iks_parse(p, voxeo_grammar, 0, 1));
- iks_parser_delete(p);
- ASSERT_NOT_NULL((input = iks_find(iq, "input")));
- ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar")));
- ASSERT_STRING_EQUALS("[1 DIGITS]", cdata);
- iks_delete(iq);
-}
-
-static const char *repeating_bracket =
- "]]]]]]]]] ]] ]]>";
-
-static void test_repeating_bracket(void)
-{
- iks *iq = NULL;
- iks *input = NULL;
- iksparser *p = iks_dom_new(&iq);
- const char *cdata;
- ASSERT_EQUALS(IKS_OK, iks_parse(p, repeating_bracket, 0, 1));
- iks_parser_delete(p);
- ASSERT_NOT_NULL((input = iks_find(iq, "input")));
- ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar")));
- ASSERT_STRING_EQUALS("[1 DIGITS]>]]]]]]]]] ]] ", cdata);
- iks_delete(iq);
-}
-
-static const char *normal_cdata =
- "";
-
-static void test_normal_cdata(void)
-{
- iks *iq = NULL;
- iks *input = NULL;
- iksparser *p = iks_dom_new(&iq);
- const char *cdata;
- ASSERT_EQUALS(IKS_OK, iks_parse(p, normal_cdata, 0, 1));
- iks_parser_delete(p);
- ASSERT_NOT_NULL((input = iks_find(iq, "input")));
- ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar")));
- ASSERT_STRING_EQUALS("1 DIGITS", cdata);
- iks_delete(iq);
-}
-
-static const char *empty_cdata =
- "";
-
-static void test_empty_cdata(void)
-{
- iks *iq = NULL;
- iks *input = NULL;
- iksparser *p = iks_dom_new(&iq);
- const char *cdata;
- ASSERT_EQUALS(IKS_OK, iks_parse(p, empty_cdata, 0, 1));
- iks_parser_delete(p);
- ASSERT_NOT_NULL((input = iks_find(iq, "input")));
- ASSERT_NULL((cdata = iks_find_cdata(input, "grammar")));
- iks_delete(iq);
-}
-
-static const char *rayo_test_srgs =
- "\n"
- " \n"
- " \n"
- " - \n"
- "
- need a
\n"
- " - i need a
\n"
- " \n"
- " - clue
\n"
- " \n"
- " out.concept = \"clue\";\n"
- " \n"
- " - \n"
- "
- have an
\n"
- " - i have an
\n"
- " \n"
- " - answer
\n"
- " \n"
- " out.concept = \"answer\";\n"
- " \n"
- " \n"
- " \n"
- "";
-
-static void test_rayo_test_srgs(void)
-{
- iks *grammar = NULL;
- iksparser *p = iks_dom_new(&grammar);
- ASSERT_EQUALS(IKS_OK, iks_parse(p, rayo_test_srgs, 0, 1));
- iks_parser_delete(p);
- iks_delete(grammar);
-}
-
-#define MATCH 1
-#define NO_MATCH 0
-
-static void test_iks_helper_value_matches(void)
-{
- ASSERT_EQUALS(MATCH, value_matches("1", "1,2,3"));
- ASSERT_EQUALS(MATCH, value_matches("2", "1,2,3"));
- ASSERT_EQUALS(MATCH, value_matches("3", "1,2,3"));
- ASSERT_EQUALS(NO_MATCH, value_matches("4", "1,2,3"));
- ASSERT_EQUALS(NO_MATCH, value_matches("1,2", "1,2,3"));
- ASSERT_EQUALS(NO_MATCH, value_matches(NULL, "1,2,3"));
- ASSERT_EQUALS(NO_MATCH, value_matches(NULL, NULL));
- ASSERT_EQUALS(NO_MATCH, value_matches("1", NULL));
- ASSERT_EQUALS(NO_MATCH, value_matches("", "1,2,3"));
- ASSERT_EQUALS(NO_MATCH, value_matches("", ""));
- ASSERT_EQUALS(NO_MATCH, value_matches("1", ""));
- ASSERT_EQUALS(MATCH, value_matches("duplex", "duplex,send,recv"));
- ASSERT_EQUALS(MATCH, value_matches("send", "duplex,send,recv"));
- ASSERT_EQUALS(MATCH, value_matches("recv", "duplex,send,recv"));
- ASSERT_EQUALS(NO_MATCH, value_matches("sendrecv", "duplex,send,recv"));
- ASSERT_EQUALS(MATCH, value_matches("duplex1", "duplex1,duplex2,duplex3"));
- ASSERT_EQUALS(MATCH, value_matches("duplex2", "duplex1,duplex2,duplex3"));
- ASSERT_EQUALS(MATCH, value_matches("duplex3", "duplex1,duplex2,duplex3"));
- ASSERT_EQUALS(NO_MATCH, value_matches("duplex4", "duplex1,duplex2,duplex3"));
- ASSERT_EQUALS(NO_MATCH, value_matches("duplex", "duplex1,duplex2,duplex3"));
-}
-
-static void test_dialback_key(void)
-{
- ASSERT_STRING_EQUALS("37c69b1cf07a3f67c04a5ef5902fa5114f2c76fe4a2686482ba5b89323075643", iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("", "xmpp.example.com", "example.org", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "", "example.org", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", ""));
- ASSERT_NULL(iks_server_dialback_key(NULL, "xmpp.example.com", "example.org", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", NULL, "example.org", "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", NULL, "D60000229F"));
- ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", NULL));
-}
-
-static void test_validate_dtmf(void)
-{
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("1"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("A"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("a"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("D"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("d"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("*"));
- ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("#"));
- ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit("E"));
- ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit(NULL));
- ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit(""));
- ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit("11"));
- ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "A"));
- ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "1"));
- ASSERT_EQUALS(SWITCH_FALSE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "Z"));
- ASSERT_EQUALS(SWITCH_FALSE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "11"));
- ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, NULL));
- ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, ""));
-}
-
-/**
- * main program
- */
-int main(int argc, char **argv)
-{
- const char *err;
- TEST_INIT
- TEST(test_iks_cdata_bug);
- TEST(test_repeating_bracket);
- TEST(test_normal_cdata);
- TEST(test_empty_cdata);
- TEST(test_rayo_test_srgs);
- TEST(test_iks_helper_value_matches);
- TEST(test_dialback_key);
- TEST(test_validate_dtmf);
- return 0;
-}
diff --git a/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c b/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c
deleted file mode 100644
index a0953207de..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c
+++ /dev/null
@@ -1,6 +0,0 @@
-int dummy(int i)
-{
- return 0;
-}
-
-
diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile b/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile
deleted file mode 100644
index f363f55590..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-BASE=../../../../..
-
-IKS_DIR=$(BASE)/libs/iksemel
-IKS_LA=$(IKS_DIR)/src/libiksemel.la
-LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include
-LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../nlsml.o
-LOCAL_SOURCES= main.c
-include $(BASE)/build/modmake.rules
-
-$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update
- @cd $(IKS_DIR) && $(MAKE)
- @$(TOUCH_TARGET)
-
-local_all:
- libtool --mode=link gcc main.o ../nlsml.o -o test test_nlsml.la
-
-local_clean:
- -rm test
diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c b/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c
deleted file mode 100644
index a0953207de..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c
+++ /dev/null
@@ -1,6 +0,0 @@
-int dummy(int i)
-{
- return 0;
-}
-
-
diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/Makefile b/src/mod/event_handlers/mod_rayo/test_srgs/Makefile
deleted file mode 100644
index d8f4666c3b..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_srgs/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-BASE=../../../../..
-
-IKS_DIR=$(BASE)/libs/iksemel
-IKS_LA=$(IKS_DIR)/src/libiksemel.la
-LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include
-LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../srgs.o
-LOCAL_SOURCES= main.c
-include $(BASE)/build/modmake.rules
-
-$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update
- @cd $(IKS_DIR) && $(MAKE)
- @$(TOUCH_TARGET)
-
-local_all:
- libtool --mode=link gcc main.o ../srgs.o -o test test_srgs.la
-
-local_clean:
- -rm test
diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c b/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c
deleted file mode 100644
index a0953207de..0000000000
--- a/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c
+++ /dev/null
@@ -1,6 +0,0 @@
-int dummy(int i)
-{
- return 0;
-}
-
-
diff --git a/src/mod/event_handlers/mod_rayo/xmpp_streams.h b/src/mod/event_handlers/mod_rayo/xmpp_streams.h
index 242f392543..b7ee04383b 100644
--- a/src/mod/event_handlers/mod_rayo/xmpp_streams.h
+++ b/src/mod/event_handlers/mod_rayo/xmpp_streams.h
@@ -1,6 +1,6 @@
/*
* mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2013-2015, Grasshopper
+ * Copyright (C) 2013-2018, Grasshopper
*
* Version: MPL 1.1
*
@@ -37,22 +37,22 @@ typedef int (* xmpp_stream_ready_callback)(struct xmpp_stream *stream);
typedef void (* xmpp_stream_recv_callback)(struct xmpp_stream *stream, iks *stanza);
typedef void (* xmpp_stream_destroy_callback)(struct xmpp_stream *stream);
-extern struct xmpp_stream_context *xmpp_stream_context_create(const char *domain, const char *domain_secret, xmpp_stream_bind_callback bind_cb, xmpp_stream_ready_callback ready, xmpp_stream_recv_callback recv, xmpp_stream_destroy_callback destroy);
-extern void xmpp_stream_context_add_cert(struct xmpp_stream_context *context, const char *cert_pem_file);
-extern void xmpp_stream_context_add_key(struct xmpp_stream_context *context, const char *key_pem_file);
-extern void xmpp_stream_context_add_user(struct xmpp_stream_context *context, const char *user, const char *password);
-extern void xmpp_stream_context_dump(struct xmpp_stream_context *context, switch_stream_handle_t *stream);
-extern void xmpp_stream_context_destroy(struct xmpp_stream_context *context);
-extern void xmpp_stream_context_send(struct xmpp_stream_context *context, const char *jid, iks *stanza);
+SWITCH_DECLARE(struct xmpp_stream_context *) xmpp_stream_context_create(const char *domain, const char *domain_secret, xmpp_stream_bind_callback bind_cb, xmpp_stream_ready_callback ready, xmpp_stream_recv_callback recv, xmpp_stream_destroy_callback destroy);
+SWITCH_DECLARE(void) xmpp_stream_context_add_cert(struct xmpp_stream_context *context, const char *cert_pem_file);
+SWITCH_DECLARE(void) xmpp_stream_context_add_key(struct xmpp_stream_context *context, const char *key_pem_file);
+SWITCH_DECLARE(void) xmpp_stream_context_add_user(struct xmpp_stream_context *context, const char *user, const char *password);
+SWITCH_DECLARE(void) xmpp_stream_context_dump(struct xmpp_stream_context *context, switch_stream_handle_t *stream);
+SWITCH_DECLARE(void) xmpp_stream_context_destroy(struct xmpp_stream_context *context);
+SWITCH_DECLARE(void) xmpp_stream_context_send(struct xmpp_stream_context *context, const char *jid, iks *stanza);
-extern switch_status_t xmpp_stream_context_listen(struct xmpp_stream_context *context, const char *addr, int port, int is_s2s, const char *acl);
-extern switch_status_t xmpp_stream_context_connect(struct xmpp_stream_context *context, const char *peer_domain, const char *peer_address, int peer_port);
+SWITCH_DECLARE(switch_status_t) xmpp_stream_context_listen(struct xmpp_stream_context *context, const char *addr, int port, int is_s2s, const char *acl);
+SWITCH_DECLARE(switch_status_t) xmpp_stream_context_connect(struct xmpp_stream_context *context, const char *peer_domain, const char *peer_address, int peer_port);
-extern int xmpp_stream_is_s2s(struct xmpp_stream *stream);
-extern int xmpp_stream_is_incoming(struct xmpp_stream *stream);
-extern const char *xmpp_stream_get_jid(struct xmpp_stream *stream);
-extern void xmpp_stream_set_private(struct xmpp_stream *stream, void *user_private);
-extern void *xmpp_stream_get_private(struct xmpp_stream *stream);
+SWITCH_DECLARE(int) xmpp_stream_is_s2s(struct xmpp_stream *stream);
+SWITCH_DECLARE(int) xmpp_stream_is_incoming(struct xmpp_stream *stream);
+SWITCH_DECLARE(const char *) xmpp_stream_get_jid(struct xmpp_stream *stream);
+SWITCH_DECLARE(void) xmpp_stream_set_private(struct xmpp_stream *stream, void *user_private);
+SWITCH_DECLARE(void *) xmpp_stream_get_private(struct xmpp_stream *stream);
#endif
diff --git a/src/mod/formats/mod_local_stream/mod_local_stream.c b/src/mod/formats/mod_local_stream/mod_local_stream.c
index 8edba9aa94..d07bfb34f3 100644
--- a/src/mod/formats/mod_local_stream/mod_local_stream.c
+++ b/src/mod/formats/mod_local_stream/mod_local_stream.c
@@ -529,10 +529,11 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
source->has_video = 1;
if (source->total) {
if (switch_queue_trypush(source->video_q, vid_frame.img) == SWITCH_STATUS_SUCCESS) {
+ vid_frame.img = NULL;
flush = 0;
}
}
-
+
if (flush) {
switch_img_free(&vid_frame.img);
flush_video_queue(source->video_q);
@@ -645,13 +646,15 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
if (!pop) break;
img = (switch_image_t *) pop;
-
+
switch_mutex_lock(source->mutex);
if (source->context_list) {
if (source->total == 1) {
- if (switch_queue_trypush(source->context_list->video_q, img) != SWITCH_STATUS_SUCCESS) {
+ if (!switch_test_flag(source->context_list->handle, SWITCH_FILE_FLAG_VIDEO)) {
flush_video_queue(source->context_list->video_q);
-
+ } else if (switch_queue_trypush(source->context_list->video_q, img) != SWITCH_STATUS_SUCCESS) {
+ flush_video_queue(source->context_list->video_q);
+
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Flushing video queue\n");
if (++source->context_list->video_flushes > 1) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Disconnecting file\n");
@@ -659,6 +662,7 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
}
} else {
source->context_list->video_flushes = 0;
+ img = NULL;
}
} else {
for (cp = source->context_list; cp && RUNNING; cp = cp->next) {
@@ -671,7 +675,9 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
imgcp = NULL;
switch_img_copy(img, &imgcp);
if (imgcp) {
- if (switch_queue_trypush(cp->video_q, imgcp) != SWITCH_STATUS_SUCCESS) {
+ if (!switch_test_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO)) {
+ flush_video_queue(cp->video_q);
+ } else if (switch_queue_trypush(cp->video_q, imgcp) != SWITCH_STATUS_SUCCESS) {
flush_video_queue(cp->video_q);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Flushing video queue\n");
if (++cp->video_flushes > 1) {
@@ -684,10 +690,10 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
}
}
}
- switch_img_free(&img);
}
}
switch_mutex_unlock(source->mutex);
+ switch_img_free(&img);
}
}
}
@@ -887,7 +893,7 @@ static switch_status_t local_stream_file_open(switch_file_handle_t *handle, cons
context->pool = pool;
- switch_queue_create(&context->video_q, 500, context->pool);
+ switch_queue_create(&context->video_q, 40, context->pool);
handle->samples = 0;
handle->samplerate = source->rate;
@@ -907,7 +913,7 @@ static switch_status_t local_stream_file_open(switch_file_handle_t *handle, cons
goto end;
}
- if (!switch_core_has_video() ||
+ if (!switch_core_has_video() || !source->has_video ||
(switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO) && !source->has_video && !source->blank_img && !source->cover_art && !source->banner_txt)) {
switch_clear_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO);
}
@@ -1037,7 +1043,7 @@ static switch_status_t local_stream_file_read_video(switch_file_handle_t *handle
buf_qsize = 1;
}
- while(context->ready && context->source->ready && (flags & SVR_FLUSH) && switch_queue_size(context->video_q) > min_qsize) {
+ while(context->ready && context->source->ready && switch_queue_size(context->video_q) > min_qsize) {
if (switch_queue_trypop(context->video_q, &pop) == SWITCH_STATUS_SUCCESS) {
switch_image_t *img = (switch_image_t *) pop;
switch_img_free(&img);
@@ -1151,11 +1157,7 @@ static switch_status_t local_stream_file_read(switch_file_handle_t *handle, void
return SWITCH_STATUS_FALSE;
}
- if (context->source->has_video) {
- if (!switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) {
- switch_set_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO);
- }
- } else {
+ if (!context->source->has_video) {
if (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) {
switch_clear_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO);
}
diff --git a/src/mod/languages/mod_java/freeswitch_java.cpp b/src/mod/languages/mod_java/freeswitch_java.cpp
index d8508e145c..d71d212b45 100644
--- a/src/mod/languages/mod_java/freeswitch_java.cpp
+++ b/src/mod/languages/mod_java/freeswitch_java.cpp
@@ -14,7 +14,7 @@ SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler)
if ( stateHandler != NULL && originate_state_handler != NULL ) {
const char* errorMessage = "Originate state handler is already registered";
jclass exceptionClass = env->FindClass("java/util/TooManyListenersException");
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s", errorMessage);
env->ThrowNew(exceptionClass, errorMessage);
} else if ( stateHandler == NULL && originate_state_handler != NULL ) {
env->DeleteGlobalRef(originate_state_handler);
@@ -24,7 +24,7 @@ SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler)
if ( originate_state_handler == NULL ) {
const char* errorMessage = "Unable to create global reference for state handler";
jclass exceptionClass = env->FindClass("java/lang/OutOfMemoryError");
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s", errorMessage);
env->ThrowNew(exceptionClass, errorMessage);
}
}
diff --git a/src/mod/languages/mod_lua/mod_lua.cpp b/src/mod/languages/mod_lua/mod_lua.cpp
index 47d14c6d48..63aaf25fc0 100644
--- a/src/mod/languages/mod_lua/mod_lua.cpp
+++ b/src/mod/languages/mod_lua/mod_lua.cpp
@@ -118,7 +118,6 @@ int docall(lua_State * L, int narg, int nresults, int perror, int fatal)
static lua_State *lua_init(void)
{
lua_State *L = luaL_newstate();
- int error = 0;
if (L) {
const char *buff = "os.exit = function() freeswitch.consoleLog(\"err\", \"Surely you jest! exiting is a bad plan....\\n\") end";
@@ -127,7 +126,7 @@ static lua_State *lua_init(void)
luaopen_freeswitch(L);
lua_gc(L, LUA_GCRESTART, 0);
lua_atpanic(L, panic);
- error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1);
+ luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1);
}
return L;
}
diff --git a/src/switch_core.c b/src/switch_core.c
index 22b35ed63b..ca87b5f8cd 100644
--- a/src/switch_core.c
+++ b/src/switch_core.c
@@ -58,6 +58,11 @@
#include
#endif
+#ifdef WIN32
+#define popen _popen
+#define pclose _pclose
+#endif
+
SWITCH_DECLARE_DATA switch_directories SWITCH_GLOBAL_dirs = { 0 };
SWITCH_DECLARE_DATA switch_filenames SWITCH_GLOBAL_filenames = { 0 };
@@ -3253,45 +3258,7 @@ SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait)
SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_handle_t *stream)
{
-#ifdef WIN32
- return switch_system(cmd, SWITCH_TRUE);
-#else
- int fds[2], pid = 0;
-
- if (pipe(fds)) {
- goto end;
- } else { /* good to go */
- pid = switch_fork();
-
- if (pid < 0) { /* ok maybe not */
- close(fds[0]);
- close(fds[1]);
- goto end;
- } else if (pid) { /* parent */
- char buf[1024] = "";
- int bytes;
- close(fds[1]);
- while ((bytes = read(fds[0], buf, sizeof(buf))) > 0) {
- stream->raw_write_function(stream, (unsigned char *)buf, bytes);
- }
- close(fds[0]);
- waitpid(pid, NULL, 0);
- } else { /* child */
- switch_close_extra_files(fds, 2);
- close(fds[0]);
- dup2(fds[1], STDOUT_FILENO);
- switch_system(cmd, SWITCH_TRUE);
- close(fds[1]);
- exit(0);
- }
- }
-
- end:
-
- return 0;
-
-#endif
-
+ return switch_stream_system(cmd, stream);
}
SWITCH_DECLARE(switch_status_t) switch_core_get_stacksizes(switch_size_t *cur, switch_size_t *max)
@@ -3320,13 +3287,26 @@ SWITCH_DECLARE(switch_status_t) switch_core_get_stacksizes(switch_size_t *cur, s
SWITCH_DECLARE(int) switch_stream_system(const char *cmd, switch_stream_handle_t *stream)
{
-#ifdef WIN32
- stream->write_function(stream, "Capturing output not supported.\n");
- return switch_system(cmd, SWITCH_TRUE);
-#else
- return switch_stream_system_fork(cmd, stream);
-#endif
+ char buffer[128];
+ size_t bytes;
+ FILE* pipe = popen(cmd, "r");
+ if (!pipe) return 1;
+ while (!feof(pipe)) {
+ while ((bytes = fread(buffer, 1, 128, pipe)) > 0) {
+ if (stream != NULL) {
+ stream->raw_write_function(stream, (unsigned char *)buffer, bytes);
+ }
+ }
+ }
+
+ if (ferror(pipe)) {
+ pclose(pipe);
+ return 1;
+ }
+
+ pclose(pipe);
+ return 0;
}
SWITCH_DECLARE(uint16_t) switch_core_get_rtp_port_range_start_port()
diff --git a/src/switch_core_file.c b/src/switch_core_file.c
index 4cd4600c48..8fc0008b78 100644
--- a/src/switch_core_file.c
+++ b/src/switch_core_file.c
@@ -81,10 +81,13 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file,
}
fh->samples_in = 0;
- fh->samplerate = 0;
- fh->native_rate = 0;
- fh->channels = 0;
- fh->real_channels = 0;
+
+ if (!(flags & SWITCH_FILE_FLAG_WRITE)) {
+ fh->samplerate = 0;
+ fh->native_rate = 0;
+ fh->channels = 0;
+ fh->real_channels = 0;
+ }
if (!fh->samplerate) {
if (!(fh->samplerate = rate)) {
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index fbd7e7b771..4df391da54 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -1,6 +1,6 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2005-2014, Anthony Minessale II
+ * Copyright (C) 2005-2018, Anthony Minessale II
*
* Version: MPL 1.1
*
@@ -10580,6 +10580,9 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess
}
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=end-of-candidates\r\n");
+ if (switch_true(switch_channel_get_variable(session->channel, "ice_lite"))) {
+ switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ice-lite\r\n");
+ }
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u cname:%s\r\n", a_engine->ssrc, smh->cname);
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u msid:%s a0\r\n", a_engine->ssrc, smh->msid);
diff --git a/src/switch_core_session.c b/src/switch_core_session.c
index 23307bf81a..a27b4ce284 100644
--- a/src/switch_core_session.c
+++ b/src/switch_core_session.c
@@ -772,6 +772,7 @@ static const char *message_names[] = {
"REDIRECT_AUDIO",
"TRANSMIT_TEXT",
"ANSWER",
+ "ACKNOWLEDGE_CALL",
"PROGRESS",
"BRIDGE",
"UNBRIDGE",
diff --git a/src/switch_cpp.cpp b/src/switch_cpp.cpp
index d703bbdc31..d2a7a531f8 100644
--- a/src/switch_cpp.cpp
+++ b/src/switch_cpp.cpp
@@ -1278,6 +1278,7 @@ SWITCH_DECLARE(int) CoreSession::recordFile(char *file_name, int time_limit, int
this_check(-1);
sanity_check(-1);
+ if (!file_name) return 0;
memset(&local_fh, 0, sizeof(local_fh));
fhp = &local_fh;
local_fh.thresh = silence_threshold;
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index 6722371776..f318fd9874 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -1145,6 +1145,7 @@ struct record_helper {
uint32_t writes;
uint32_t vwrites;
const char *completion_cause;
+ int start_event_sent;
};
/**
@@ -1188,6 +1189,7 @@ static void send_record_stop_event(switch_channel_t *channel, switch_codec_imple
{
switch_event_t *event;
+ rh->start_event_sent = 0;
if (rh->fh) {
switch_channel_set_variable_printf(channel, "record_samples", "%d", rh->fh->samples_out);
if (read_impl->actual_samples_per_second) {
@@ -1304,10 +1306,13 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
}
}
- if (switch_event_create(&event, SWITCH_EVENT_RECORD_START) == SWITCH_STATUS_SUCCESS) {
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Record-File-Path", rh->file);
- switch_channel_event_set_data(channel, event);
- switch_event_fire(&event);
+ if(rh->start_event_sent == 0) {
+ rh->start_event_sent = 1;
+ if (switch_event_create(&event, SWITCH_EVENT_RECORD_START) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_event_set_data(channel, event);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Record-File-Path", rh->file);
+ switch_event_fire(&event);
+ }
}
rh->silence_time = switch_micro_time_now();
@@ -1316,11 +1321,12 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
rh->completion_cause = NULL;
switch_core_session_get_read_impl(session, &rh->read_impl);
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->read_impl.actual_samples_per_second);
- rh->fh->native_rate = rh->read_impl.actual_samples_per_second;
-
- if (rh->fh && switch_core_file_has_video(rh->fh, SWITCH_TRUE)) {
- switch_core_media_bug_set_media_params(bug, &rh->fh->mm);
+ if (rh->fh) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->fh->samplerate);
+ rh->fh->native_rate = rh->read_impl.actual_samples_per_second;
+ if (switch_core_file_has_video(rh->fh, SWITCH_TRUE)) {
+ switch_core_media_bug_set_media_params(bug, &rh->fh->mm);
+ }
}
}
diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c
index 911d557796..abc028852d 100644
--- a/src/switch_ivr_play_say.c
+++ b/src/switch_ivr_play_say.c
@@ -390,6 +390,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *se
return SWITCH_STATUS_FALSE;
}
+ if (!file) {
+ return SWITCH_STATUS_FALSE;
+ }
+
prefix = switch_channel_get_variable(channel, "sound_prefix");
if (!prefix) {
diff --git a/src/switch_msrp.c b/src/switch_msrp.c
index 665b848984..5ba0e88b92 100644
--- a/src/switch_msrp.c
+++ b/src/switch_msrp.c
@@ -103,13 +103,14 @@ static switch_bool_t msrp_check_success_report(switch_msrp_msg_t *msrp_msg)
static void msrp_deinit_ssl()
{
+ globals.ssl_ready = 0;
if (globals.ssl_ctx) {
SSL_CTX_free(globals.ssl_ctx);
globals.ssl_ctx = NULL;
}
}
-static int msrp_init_ssl()
+static void msrp_init_ssl()
{
const char *err = "";
@@ -175,15 +176,11 @@ static int msrp_init_ssl()
SSL_CTX_set_cipher_list(globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH");
- return 1;
+ return;
fail:
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL ERR: %s\n", err);
-
- globals.ssl_ready = 0;
msrp_deinit_ssl();
-
- return 0;
}
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_ip, globals.ip);
@@ -1147,6 +1144,11 @@ static void *SWITCH_THREAD_FUNC msrp_worker(switch_thread_t *thread, void *obj)
switch_os_socket_t sockdes = SWITCH_SOCK_INVALID;
int code = 0;
+ if (globals.ssl_ready != 1) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL not ready\n");
+ goto end;
+ }
+
switch_os_sock_get(&sockdes, csock->sock);
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "socket: %d\n", sockdes);
switch_assert(sockdes != SWITCH_SOCK_INVALID);
diff --git a/src/switch_xml.c b/src/switch_xml.c
index a815c92039..37400a13b5 100644
--- a/src/switch_xml.c
+++ b/src/switch_xml.c
@@ -124,7 +124,7 @@ static void preprocess_exec_set(char *keyval)
if (key && val) {
switch_stream_handle_t exec_result = { 0 };
SWITCH_STANDARD_STREAM(exec_result);
- if (switch_stream_system_fork(val, &exec_result) == 0) {
+ if (switch_stream_system(val, &exec_result) == 0) {
if (!zstr(exec_result.data)) {
char *tmp = (char *) exec_result.data;
tmp = &tmp[strlen(tmp)-1];
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
new file mode 100644
index 0000000000..76f757ed82
--- /dev/null
+++ b/tests/unit/Makefile.am
@@ -0,0 +1,9 @@
+include $(top_srcdir)/build/modmake.rulesam
+
+bin_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core
+AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS)
+AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+AM_CFLAGS = $(SWITCH_AM_CPPFLAGS)
+AM_CPPFLAGS = $(SWITCH_AM_CPPFLAGS)
+
+TESTS = $(bin_PROGRAMS)
diff --git a/tests/unit/README b/tests/unit/README
index 681d460488..4bdd19c2cf 100644
--- a/tests/unit/README
+++ b/tests/unit/README
@@ -3,29 +3,6 @@ benchmarks testing functionality exposed through libfreeswitch.
Requirements for a new unit tests:
-1. Tests must use TAP(Test Anything Protocol) output format, and must
-print to stderr the summary statistics of the test before exiting.
-
-2. Each test must return 0 on successful completion, or a non-zero
-result in case of a failure.
-
-3. Benchmarking stats should be output as a TAP note at the end of the
-test in a human and machine(regex) parsable format
-
-Use libtap from https://github.com/zorgnax/libtap
-cd /usr/local/src/
-git clone https://github.com/zorgnax/libtap.git
-make PREFIX=/usr install
+1. Tests must use switch_test.h framework
-
-To run a benchmark version of a unit test, update the loops count, and
-make sure to uncomment the 'BENCHMARK' define line. Then you can run
-the benchmark with:
-
-perf record ./.libs/switch_hash
-
-Once that is completed you can view the results with:
-
-perf report
-
diff --git a/tests/unit/conf/freeswitch.xml b/tests/unit/conf/freeswitch.xml
new file mode 100644
index 0000000000..87e5233600
--- /dev/null
+++ b/tests/unit/conf/freeswitch.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/unit/switch_core.c b/tests/unit/switch_core.c
new file mode 100644
index 0000000000..05b3b7f60d
--- /dev/null
+++ b/tests/unit/switch_core.c
@@ -0,0 +1,88 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Rienzo
+ * Seven Du
+ *
+ *
+ * switch_core.c -- tests core functions
+ *
+ */
+#include
+#include
+
+#include
+
+FST_CORE_BEGIN("./conf")
+{
+ FST_SUITE_BEGIN(switch_ivr_originate)
+ {
+ FST_SETUP_BEGIN()
+ {
+ }
+ FST_SETUP_END()
+
+ FST_TEARDOWN_BEGIN()
+ {
+ }
+ FST_TEARDOWN_END()
+
+#ifndef WIN32
+ FST_TEST_BEGIN(test_fork)
+ {
+ switch_stream_handle_t exec_result = { 0 };
+ SWITCH_STANDARD_STREAM(exec_result);
+ fst_requires(switch_stream_system_fork("ip ad sh", &exec_result) == 0);
+ fst_requires(!zstr(exec_result.data));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s\n", (char *)exec_result.data);
+
+ fst_requires(switch_stream_system_fork("ip ad sh | grep link", &exec_result) == 0);
+ fst_requires(!zstr(exec_result.data));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s\n", (char *)exec_result.data);
+
+ switch_safe_free(exec_result.data);
+ }
+ FST_TEST_END()
+#endif
+
+ FST_TEST_BEGIN(test_non_fork_exec_set)
+ {
+ char *var_test = switch_core_get_variable_dup("test");
+ char *var_default_password = switch_core_get_variable_dup("default_password");
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "global_getvar test: %s\n", switch_str_nil(var_test));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "global_getvar default_password: %s\n", switch_str_nil(var_default_password));
+
+ fst_check_string_not_equals(var_test, "");
+ fst_check_string_not_equals(var_default_password, "");
+ fst_check_string_equals(var_test, var_default_password);
+
+ switch_safe_free(var_test);
+ switch_safe_free(var_default_password);
+ }
+ FST_TEST_END()
+ }
+ FST_SUITE_END()
+}
+FST_CORE_END()
diff --git a/tests/unit/switch_event.c b/tests/unit/switch_event.c
index a893d493fb..c11dfc24d3 100644
--- a/tests/unit/switch_event.c
+++ b/tests/unit/switch_event.c
@@ -1,10 +1,25 @@
#include
#include
-#include
+#include
// #define BENCHMARK 1
-int main () {
+FST_MINCORE_BEGIN()
+
+FST_SUITE_BEGIN(switch_event)
+
+FST_SETUP_BEGIN()
+{
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+FST_TEST_BEGIN(benchmark)
+{
switch_event_t *event = NULL;
switch_bool_t verbose = SWITCH_TRUE;
const char *err = NULL;
@@ -18,18 +33,8 @@ int main () {
#ifdef BENCHMARK
switch_time_t small_start_ts, small_end_ts;
-
- plan(2);
-#else
- plan(2 + ( 2 * loops));
#endif
- status = switch_core_init(SCF_MINIMAL, verbose, &err);
-
- if ( !ok( status == SWITCH_STATUS_SUCCESS, "Initialize FreeSWITCH core\n")) {
- bail_out(0, "Bail due to failure to initialize FreeSWITCH[%s]", err);
- }
-
index = calloc(loops, sizeof(char *));
for ( x = 0; x < loops; x++) {
index[x] = switch_mprintf("%d", x);
@@ -39,18 +44,18 @@ int main () {
start_ts = switch_time_now();
status = switch_event_create(&event, SWITCH_EVENT_MESSAGE);
- ok( status == SWITCH_STATUS_SUCCESS,"Create Event");
+ fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to create event");
#ifndef BENCHMARK
for ( x = 0; x < loops; x++) {
status = switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, index[x], index[x]);
- ok( status == SWITCH_STATUS_SUCCESS,"Add header to event");
+ fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to add header to event");
}
#else
small_start_ts = switch_time_now();
for ( x = 0; x < loops; x++) {
if ( switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, index[x], index[x]) != SWITCH_STATUS_SUCCESS) {
- fail("Failed to add header to event");
+ fst_fail("Failed to add header to event");
}
}
small_end_ts = switch_time_now();
@@ -58,20 +63,20 @@ int main () {
micro_total = small_end_ts - small_start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- note("switch_event add_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_event add_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
#endif
#ifndef BENCHMARK
for ( x = 0; x < loops; x++) {
- is(switch_event_get_header(event, index[x]), index[x], "correct header value returned");
+ fst_check_string_equals(switch_event_get_header(event, index[x]), index[x]);
}
#else
small_start_ts = switch_time_now();
for ( x = 0; x < loops; x++) {
if ( !switch_event_get_header(event, index[x])) {
- fail("Failed to lookup event header value");
+ fst_fail("Failed to lookup event header value");
}
}
small_end_ts = switch_time_now();
@@ -79,11 +84,10 @@ int main () {
micro_total = small_end_ts - small_start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- note("switch_event get_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_event get_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
#endif
-
switch_event_destroy(&event);
/* END LOOPS */
@@ -97,10 +101,15 @@ int main () {
micro_total = end_ts - start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- diag("switch_event Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_event Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
- switch_core_destroy();
-
- done_testing();
}
+FST_TEST_END()
+
+FST_SUITE_END()
+
+FST_MINCORE_END()
+
+
+
diff --git a/tests/unit/switch_hash.c b/tests/unit/switch_hash.c
index 522ca6ea1c..a8d57c527c 100644
--- a/tests/unit/switch_hash.c
+++ b/tests/unit/switch_hash.c
@@ -1,11 +1,25 @@
#include
#include
-#include
+#include
// #define BENCHMARK 1
-int main () {
+FST_MINCORE_BEGIN()
+FST_SUITE_BEGIN(switch_hash)
+
+FST_SETUP_BEGIN()
+{
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+FST_TEST_BEGIN(benchmark)
+{
switch_event_t *event = NULL;
switch_bool_t verbose = SWITCH_TRUE;
const char *err = NULL;
@@ -24,23 +38,7 @@ int main () {
char **index = NULL;
switch_hash_t *hash = NULL;
-#ifndef BENCHMARK
- plan(2 + ( 5 * loops));
-#else
- plan(2);
-#endif
-
- status = switch_core_init(SCF_MINIMAL, verbose, &err);
-
- if ( !ok( status == SWITCH_STATUS_SUCCESS, "Initialize FreeSWITCH core\n")) {
- bail_out(0, "Bail due to failure to initialize FreeSWITCH[%s]", err);
- }
-
- status = switch_core_hash_init(&hash);
-
- if ( !ok(status == SWITCH_STATUS_SUCCESS, "Create a new hash")) {
- bail_out(0, "Bail due to failure to create hash");
- }
+ fst_requires(switch_core_hash_init(&hash) == SWITCH_STATUS_SUCCESS);
index = calloc(loops, sizeof(char *));
for ( x = 0; x < loops; x++) {
@@ -54,7 +52,7 @@ int main () {
#ifndef BENCHMARK
for ( x = 0; x < loops; x++) {
status = switch_core_hash_insert(hash, index[x], (void *) index[x]);
- ok(status == SWITCH_STATUS_SUCCESS, "Insert into the hash");
+ fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to insert into the hash");
}
#else
small_start_ts = switch_time_now();
@@ -66,7 +64,7 @@ int main () {
micro_total = small_end_ts - small_start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- note("switch_hash insert: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_hash insert: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
#endif
@@ -76,14 +74,14 @@ int main () {
for ( x = 0; x < loops; x++) {
char *data = NULL;
data = switch_core_hash_find(hash, index[x]);
- ok(data != NULL, "Successful lookup");
- is( index[x], data, "Returned correct data");
+ fst_xcheck(data != NULL, "Lookup failed");
+ fst_check_string_equals( index[x], data);
}
#else
small_start_ts = switch_time_now();
for ( x = 0; x < loops; x++) {
if ( ! switch_core_hash_find(hash, index[x])) {
- fail("Failed to properly locate one of the values");
+ fst_fail("Failed to properly locate one of the values");
}
}
small_end_ts = switch_time_now();
@@ -91,7 +89,7 @@ int main () {
micro_total = small_end_ts - small_start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- note("switch_hash find: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_hash find: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
#endif
@@ -101,14 +99,14 @@ int main () {
for ( x = 0; x < loops; x++) {
char *data = NULL;
data = switch_core_hash_delete(hash, index[x]);
- ok(data != NULL, "Create a new hash");
- is( index[x], data, "Returned correct data");
+ fst_xcheck(data != NULL, "Delete from the hash");
+ fst_check_string_equals( index[x], data );
}
#else
small_start_ts = switch_time_now();
for ( x = 0; x < loops; x++) {
if ( !switch_core_hash_delete(hash, index[x])) {
- fail("Failed to delete and return the value");
+ fst_fail("Failed to delete and return the value");
}
}
small_end_ts = switch_time_now();
@@ -116,7 +114,7 @@ int main () {
micro_total = small_end_ts - small_start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- note("switch_hash delete: Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_hash delete: Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
#endif
@@ -133,10 +131,12 @@ int main () {
micro_total = end_ts - start_ts;
micro_per = micro_total / (double) loops;
rate_per_sec = 1000000 / micro_per;
- diag("switch_hash Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
+ printf("switch_hash Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n",
micro_total, loops, micro_per, rate_per_sec);
-
- switch_core_destroy();
-
- done_testing();
}
+FST_TEST_END()
+
+FST_SUITE_END()
+
+FST_MINCORE_END()
+
diff --git a/tests/unit/switch_ivr_originate.c b/tests/unit/switch_ivr_originate.c
new file mode 100644
index 0000000000..3b2cb4154b
--- /dev/null
+++ b/tests/unit/switch_ivr_originate.c
@@ -0,0 +1,139 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Chris Rienzo
+ * Seven Du
+ *
+ *
+ * switch_ivr_originate.c -- tests originate
+ *
+ */
+#include
+#include
+
+#include
+
+int reporting = 0;
+int destroy = 0;
+
+static switch_status_t my_on_reporting(switch_core_session_t *session)
+{
+ switch_assert(session);
+ reporting++;
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "session reporting %d\n", reporting);
+}
+
+static switch_status_t my_on_destroy(switch_core_session_t *session)
+{
+ switch_assert(session);
+ destroy++;
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "session destroy %d\n", destroy);
+}
+
+static switch_state_handler_table_t state_handlers = {
+ /*.on_init */ NULL,
+ /*.on_routing */ NULL,
+ /*.on_execute */ NULL,
+ /*.on_hangup */ NULL,
+ /*.on_exchange_media */ NULL,
+ /*.on_soft_execute */ NULL,
+ /*.on_consume_media */ NULL,
+ /*.on_hibernate */ NULL,
+ /*.on_reset */ NULL,
+ /*.on_park */ NULL,
+ /*.on_reporting */ my_on_reporting,
+ /*.on_destroy */ my_on_destroy,
+ SSH_FLAG_STICKY
+};
+
+FST_CORE_BEGIN("./conf")
+{
+ FST_SUITE_BEGIN(switch_ivr_originate)
+ {
+ FST_SETUP_BEGIN()
+ {
+ fst_requires_module("mod_loopback");
+ }
+ FST_SETUP_END()
+
+ FST_TEARDOWN_BEGIN()
+ {
+ }
+ FST_TEARDOWN_END()
+
+ FST_TEST_BEGIN(originate_test_early_state_handler)
+ {
+ switch_core_session_t *session = NULL;
+ switch_channel_t *channel = NULL;
+ switch_status_t status;
+ switch_call_cause_t cause;
+
+ status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, NULL);
+ fst_requires(session);
+ fst_check(status == SWITCH_STATUS_SUCCESS);
+
+ channel = switch_core_session_get_channel(session);
+ fst_requires(channel);
+
+ switch_channel_add_state_handler(channel, &state_handlers);
+ switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+ fst_check(!switch_channel_ready(channel));
+
+ switch_core_session_rwunlock(session);
+
+ switch_sleep(1000000);
+ fst_check(reporting == 1);
+ fst_check(destroy == 1);
+ }
+ FST_TEST_END()
+
+ FST_TEST_BEGIN(originate_test_late_state_handler)
+ {
+ switch_core_session_t *session = NULL;
+ switch_channel_t *channel = NULL;
+ switch_status_t status;
+ switch_call_cause_t cause;
+
+ status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, NULL);
+ fst_requires(session);
+ fst_check(status == SWITCH_STATUS_SUCCESS);
+
+ channel = switch_core_session_get_channel(session);
+ fst_requires(channel);
+
+ switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+ switch_sleep(1000000);
+ switch_channel_add_state_handler(channel, &state_handlers);
+
+ switch_core_session_rwunlock(session);
+
+ switch_sleep(1000000);
+ fst_check(reporting == 1);
+ fst_check(destroy == 2);
+ }
+ FST_TEST_END()
+ }
+ FST_SUITE_END()
+}
+FST_CORE_END()
diff --git a/tests/unit/switch_utils.c b/tests/unit/switch_utils.c
new file mode 100644
index 0000000000..177d14c6ba
--- /dev/null
+++ b/tests/unit/switch_utils.c
@@ -0,0 +1,79 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2018, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Seven Du
+ *
+ *
+ * switch_utils.c -- tests switch_utils
+ *
+ */
+
+#include
+#include
+#include
+
+FST_MINCORE_BEGIN()
+
+FST_SUITE_BEGIN(switch_hash)
+
+FST_SETUP_BEGIN()
+{
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+FST_TEST_BEGIN(benchmark)
+{
+ char encoded[1024];
+ char *s = "ABCD";
+
+ switch_url_encode(s, encoded, sizeof(encoded));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "encoded: [%s]\n", encoded);
+ fst_check_string_equals(encoded, "ABCD");
+
+ s = "&bryän#!杜金房";
+ switch_url_encode(s, encoded, sizeof(encoded));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "encoded: [%s]\n", encoded);
+ fst_check_string_equals(encoded, "%26bry%C3%A4n%23!%E6%9D%9C%E9%87%91%E6%88%BF");
+}
+FST_TEST_END()
+
+FST_SUITE_END()
+
+FST_MINCORE_END()
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
+ */
diff --git a/tests/unit/test_switch_core.2017.vcxproj b/tests/unit/test_switch_core.2017.vcxproj
new file mode 100644
index 0000000000..c12e24a5e7
--- /dev/null
+++ b/tests/unit/test_switch_core.2017.vcxproj
@@ -0,0 +1,203 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ test_switch_core
+ test_switch_core
+ Win32Proj
+ 10.0.17134.0
+ {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}
+
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+ Application
+ MultiByte
+ v141
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(PlatformName)\$(Configuration)\
+ false
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)$(PlatformName)\$(Configuration)\
+ $(PlatformName)\$(Configuration)\
+ false
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
+ false
+
+
+
+ $(SolutionDir)src\include;%(AdditionalIncludeDirectories)
+ SWITCH_TEST_BASE_DIR_FOR_CONF="..\\..\\tests\\unit\\";%(PreprocessorDefinitions)
+
+
+
+
+
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebugDLL
+
+
+ Level4
+ ProgramDatabase
+ true
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+
+
+ MachineX86
+
+
+
+
+
+ X64
+
+
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebugDLL
+
+
+ Level4
+ ProgramDatabase
+ true
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+
+
+ MachineX64
+
+
+
+
+
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreadedDLL
+
+
+ Level4
+ ProgramDatabase
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+ true
+
+
+ MachineX86
+
+
+
+
+
+ X64
+
+
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreadedDLL
+
+
+ Level4
+ ProgramDatabase
+ 6031;6340;6246;6011;6387;%(DisableSpecificWarnings)
+
+
+ $(OutDir);%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+ true
+
+
+ MachineX64
+
+
+
+
+
+
+
+ {202d7a4e-760d-4d0e-afa1-d7459ced30ff}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/unit/unit.mk b/tests/unit/unit.mk
deleted file mode 100644
index 68cd2e5d39..0000000000
--- a/tests/unit/unit.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-FSLD = $(top_builddir)/libfreeswitch.la $(top_builddir)/libs/apr/libapr-1.la $(top_builddir)/libs/apr-util/libaprutil-1.la
-
-check_PROGRAMS += tests/unit/switch_event
-
-tests_unit_switch_event_SOURCES = tests/unit/switch_event.c
-tests_unit_switch_event_CFLAGS = $(SWITCH_AM_CFLAGS)
-tests_unit_switch_event_LDADD = $(FSLD)
-tests_unit_switch_event_LDFLAGS = $(SWITCH_AM_LDFLAGS) -ltap
-
-check_PROGRAMS += tests/unit/switch_hash
-
-tests_unit_switch_hash_SOURCES = tests/unit/switch_hash.c
-tests_unit_switch_hash_CFLAGS = $(SWITCH_AM_CFLAGS)
-tests_unit_switch_hash_LDADD = $(FSLD)
-tests_unit_switch_hash_LDFLAGS = $(SWITCH_AM_LDFLAGS) -ltap
-
diff --git a/w32/Setup/Setup.2017.wixproj b/w32/Setup/Setup.2017.wixproj
index 0017c5acef..cb65aa947c 100644
--- a/w32/Setup/Setup.2017.wixproj
+++ b/w32/Setup/Setup.2017.wixproj
@@ -293,6 +293,14 @@
Binaries;Content;Satellites
INSTALLFOLDER
+
+ mod_signalwire
+ {b19ae6fc-bfff-428d-b483-3bbeaeccc618}
+ True
+ True
+ Binaries;Content;Satellites
+ INSTALLFOLDER
+
mod_sms
{2469b306-b027-4ff2-8815-c9c1ea2cae79}
diff --git a/w32/ffmpeg-version.props b/w32/ffmpeg-version.props
index a4b02d4434..012af42ccb 100644
--- a/w32/ffmpeg-version.props
+++ b/w32/ffmpeg-version.props
@@ -4,7 +4,7 @@
- 3.4.4
+ 4.1
true
diff --git a/w32/ffmpeg.props b/w32/ffmpeg.props
index 23b473ae54..4963a9e668 100644
--- a/w32/ffmpeg.props
+++ b/w32/ffmpeg.props
@@ -19,7 +19,7 @@
HAVE_FFMPEG;FFMPEG_STATICLIB;HAVE_AV_CONFIG_H;_ISOC99_SOURCE;_FILE_OFFSET_BITS=64;_LARGEFILE_SOURCE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)
- Secur32.lib;%(AdditionalDependencies)
+ Bcrypt.lib;Secur32.lib;%(AdditionalDependencies)
diff --git a/w32/libks-version.props b/w32/libks-version.props
new file mode 100644
index 0000000000..3b9fe4b776
--- /dev/null
+++ b/w32/libks-version.props
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ 0.1.1
+
+
+ true
+
+
+
+
+
+ $(libksVersion)
+
+
+
diff --git a/w32/libks.props b/w32/libks.props
new file mode 100644
index 0000000000..c2e2565172
--- /dev/null
+++ b/w32/libks.props
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+ true
+
+
+
+ $(BaseDir)libs\libks-$(libksVersion)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(libksDir)\src\include;%(AdditionalIncludeDirectories)
+ __PRETTY_FUNCTION__=__FUNCSIG__;WIN32;_WINDOWS;SWCLT_VERSION_MAJOR=1;SWCLT_VERSION_MINOR=0;SWCLT_VERSION_REVISION=0;_WIN32_WINNT=0x0600;_WINSOCK_DEPRECATED_NO_WARNINGS=1;WIN32_LEAN_AND_MEAN=1;KS_PLAT_WIN=1;NOMAXMIN=1;_CRT_SECURE_NO_WARNINGS=1;SWCLT_EXPORTS;%(PreprocessorDefinitions)
+
+
+ $(libksDir)\binaries\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories)
+ ks.lib;%(AdditionalDependencies)
+
+
+
diff --git a/w32/signalwire-client-c-version.props b/w32/signalwire-client-c-version.props
new file mode 100644
index 0000000000..0b0de97606
--- /dev/null
+++ b/w32/signalwire-client-c-version.props
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ 1.0.0
+
+
+ true
+
+
+
+
+
+ $(signalwire-client-cVersion)
+
+
+
diff --git a/w32/signalwire-client-c.props b/w32/signalwire-client-c.props
new file mode 100644
index 0000000000..e7e40e2c4a
--- /dev/null
+++ b/w32/signalwire-client-c.props
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+ true
+
+
+
+ $(BaseDir)libs\signalwire-client-c-$(signalwire-client-cVersion)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(signalwire-client-cDir)\include;%(AdditionalIncludeDirectories)
+ %(PreprocessorDefinitions)
+
+
+ $(signalwire-client-cDir)\binaries\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories)
+ signalwire_client.lib;%(AdditionalDependencies)
+
+
+