From bf70e0217635c3949a94250c82bac5a050413c29 Mon Sep 17 00:00:00 2001 From: "mihail.yartsev" Date: Mon, 30 Apr 2018 22:55:30 +0300 Subject: [PATCH 001/681] MTC-56 Removed not needed parts --- MarginTrading.sln | 23 - .../IAccountsApi.cs | 9 - .../MarginTrading.Backend.Contracts.csproj | 2 +- src/MarginTrading.Client/Bot/BotClient.cs | 608 -- src/MarginTrading.Client/Bot/BotConsole.cs | 353 - src/MarginTrading.Client/Bot/BotHost.cs | 253 - src/MarginTrading.Client/Bot/BotTest.cs | 310 - src/MarginTrading.Client/Bot/MtUserHelper.cs | 73 - .../Bot/OperationResult.cs | 14 - src/MarginTrading.Client/ClientEnv.cs | 10 - src/MarginTrading.Client/Dockerfile | 4 - .../EventArgs/LogEventArgs.cs | 22 - .../JsonResults/ApiAuthResult.cs | 12 - .../JsonResults/AuthError.cs | 14 - .../JsonResults/AuthResult.cs | 17 - .../MarginTrading.Client.csproj | 23 - src/MarginTrading.Client/MtClient.cs | 320 - src/MarginTrading.Client/Program.cs | 78 - .../Settings/MtTradingBotSettings.cs | 14 - .../Settings/MtTradingBotTestSettings.cs | 8 - .../Settings/TestBotUserSettings.cs | 9 - .../Settings/TradingBotSettings.cs | 7 - .../Wamp/IRpcMtFrontend.cs | 54 - src/MarginTrading.Client/Wamp/RealmNames.cs | 7 - src/MarginTrading.Client/bottest01.json | 28 - src/MarginTrading.Client/bottest02.json | 28 - src/MarginTrading.Client/bottest03.json | 19 - src/MarginTrading.Client/bottest04.json | 15 - src/MarginTrading.Client/devUsers.csv | 1001 --- src/MarginTrading.Client/docker-compose.yml | 16 - src/MarginTrading.Client/prodUsers.csv | 1001 --- src/MarginTrading.Client/testUsers.csv | 1001 --- .../AccountAssetPairsController.cs | 58 - .../Controllers/AccountGroupsController.cs | 60 - .../Controllers/AccountsController.cs | 66 +- .../Controllers/AssetPairsController.cs | 53 - .../Controllers/DictionariesController.cs | 61 - .../Controllers/RoutesController.cs | 71 - .../Controllers/SettingsController.cs | 32 - .../TradingConditionsController.cs | 53 - src/MarginTrading.Frontend/Application.cs | 55 - .../ConnectedService.json | 7 - .../Controllers/AccountsHistoryController.cs | 54 - .../Controllers/HomeController.cs | 25 - .../Controllers/InitController.cs | 174 - .../Controllers/IsAliveController.cs | 65 - .../Controllers/OrderBookController.cs | 30 - .../Controllers/OrdersController.cs | 160 - .../Controllers/UserController.cs | 40 - .../Controllers/WatchListsController.cs | 103 - src/MarginTrading.Frontend/Dockerfile | 4 - .../Extensions/ControllerExtensions.cs | 24 - .../AddAuthorizationHeaderParameter.cs | 35 - .../MarginTrading.Frontend.csproj | 71 - .../GlobalErrorHandlerMiddleware.cs | 69 - .../Middleware/MiddlewareExtensions.cs | 17 - .../Middleware/OptionsRequestsMiddleware.cs | 38 - .../Models/ResponseModel.cs | 99 - .../Models/TerminalInfo.cs | 16 - .../Models/TokenModel.cs | 7 - .../Models/WampDescriptionModels.cs | 10 - .../Models/WatchList.cs | 11 - .../Modules/FrontendExternalServicesModule.cs | 38 - .../Modules/FrontendModule.cs | 169 - src/MarginTrading.Frontend/Program.cs | 43 - .../Properties/AssemblyInfo.cs | 18 - src/MarginTrading.Frontend/RabbitMqHandler.cs | 247 - .../Repositories/Contract/IMaintenanceInfo.cs | 20 - .../Contract/IMaintenanceInfoRepository.cs | 9 - .../Contract/IMarginTradingWatchList.cs | 37 - .../IMarginTradingWatchListRepository.cs | 14 - .../Entities/MaintenanceInfoEntity.cs | 29 - .../Entities/MarginTradingWatchListEntity.cs | 46 - .../Entities/OperationLogEntity.cs | 32 - .../Repositories/MaintenanceInfoRepository.cs | 29 - .../MarginTradingOperationsLogRepository.cs | 24 - .../MarginTradingWatchListsRepository.cs | 57 - src/MarginTrading.Frontend/RpcMtFrontend.cs | 214 - .../Services/ClientTokenService.cs | 28 - .../Services/ClientTokenValidator.cs | 33 - .../Services/HttpRequestService.cs | 156 - .../Services/IClientTokenService.cs | 9 - .../Services/IHttpRequestService.cs | 20 - .../Services/ITerminalInfoService.cs | 9 - .../Services/IWatchListService.cs | 32 - .../Services/MaintenanceException.cs | 14 - .../Services/RpcFacade.cs | 355 - .../Services/TerminalInfoService.cs | 48 - .../Services/WampSessionsService.cs | 7 - .../Services/WatchListService.cs | 164 - .../Settings/ApplicationSettings.cs | 91 - .../Settings/MtDataReaderClientSettings.cs | 8 - src/MarginTrading.Frontend/Startup.cs | 314 - .../Views/Home/Index.cshtml | 36 - .../Views/Shared/MethodsListPartial.cshtml | 63 - .../Views/Shared/TypesListParial.cshtml | 11 - .../Wamp/AnonymousWampAuthorizer.cs | 28 - .../Wamp/AnonymousWampSessionAuthenticator.cs | 27 - .../Wamp/IRpcMtFrontend.cs | 68 - src/MarginTrading.Frontend/Wamp/IWampTopic.cs | 24 - .../Wamp/WampConstants.cs | 11 - .../Wamp/WampSessionAuthenticatorFactory.cs | 14 - src/MarginTrading.Frontend/docker-compose.yml | 20 - src/MarginTrading.Frontend/web.config | 14 - .../wwwroot/css/bootstrap.css | 6757 ----------------- .../wwwroot/css/highlight-vs.css | 68 - .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../wwwroot/images/favicon.png | Bin 3487 -> 0 bytes .../wwwroot/js/bootstrap.min.js | 7 - .../wwwroot/js/highlight.pack.js | 2 - .../wwwroot/js/jquery.min.js | 5 - 115 files changed, 2 insertions(+), 16676 deletions(-) delete mode 100644 src/MarginTrading.Client/Bot/BotClient.cs delete mode 100644 src/MarginTrading.Client/Bot/BotConsole.cs delete mode 100644 src/MarginTrading.Client/Bot/BotHost.cs delete mode 100644 src/MarginTrading.Client/Bot/BotTest.cs delete mode 100644 src/MarginTrading.Client/Bot/MtUserHelper.cs delete mode 100644 src/MarginTrading.Client/Bot/OperationResult.cs delete mode 100644 src/MarginTrading.Client/ClientEnv.cs delete mode 100644 src/MarginTrading.Client/Dockerfile delete mode 100644 src/MarginTrading.Client/EventArgs/LogEventArgs.cs delete mode 100644 src/MarginTrading.Client/JsonResults/ApiAuthResult.cs delete mode 100644 src/MarginTrading.Client/JsonResults/AuthError.cs delete mode 100644 src/MarginTrading.Client/JsonResults/AuthResult.cs delete mode 100644 src/MarginTrading.Client/MarginTrading.Client.csproj delete mode 100644 src/MarginTrading.Client/MtClient.cs delete mode 100644 src/MarginTrading.Client/Program.cs delete mode 100644 src/MarginTrading.Client/Settings/MtTradingBotSettings.cs delete mode 100644 src/MarginTrading.Client/Settings/MtTradingBotTestSettings.cs delete mode 100644 src/MarginTrading.Client/Settings/TestBotUserSettings.cs delete mode 100644 src/MarginTrading.Client/Settings/TradingBotSettings.cs delete mode 100644 src/MarginTrading.Client/Wamp/IRpcMtFrontend.cs delete mode 100644 src/MarginTrading.Client/Wamp/RealmNames.cs delete mode 100644 src/MarginTrading.Client/bottest01.json delete mode 100644 src/MarginTrading.Client/bottest02.json delete mode 100644 src/MarginTrading.Client/bottest03.json delete mode 100644 src/MarginTrading.Client/bottest04.json delete mode 100644 src/MarginTrading.Client/devUsers.csv delete mode 100644 src/MarginTrading.Client/docker-compose.yml delete mode 100644 src/MarginTrading.Client/prodUsers.csv delete mode 100644 src/MarginTrading.Client/testUsers.csv delete mode 100644 src/MarginTrading.DataReader/Controllers/AccountAssetPairsController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/AccountGroupsController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/AssetPairsController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/DictionariesController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/RoutesController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/SettingsController.cs delete mode 100644 src/MarginTrading.DataReader/Controllers/TradingConditionsController.cs delete mode 100644 src/MarginTrading.Frontend/Application.cs delete mode 100644 src/MarginTrading.Frontend/Connected Services/Application Insights/ConnectedService.json delete mode 100644 src/MarginTrading.Frontend/Controllers/AccountsHistoryController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/HomeController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/InitController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/IsAliveController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/OrderBookController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/OrdersController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/UserController.cs delete mode 100644 src/MarginTrading.Frontend/Controllers/WatchListsController.cs delete mode 100644 src/MarginTrading.Frontend/Dockerfile delete mode 100644 src/MarginTrading.Frontend/Extensions/ControllerExtensions.cs delete mode 100644 src/MarginTrading.Frontend/Infrastructure/AddAuthorizationHeaderParameter.cs delete mode 100644 src/MarginTrading.Frontend/MarginTrading.Frontend.csproj delete mode 100644 src/MarginTrading.Frontend/Middleware/GlobalErrorHandlerMiddleware.cs delete mode 100644 src/MarginTrading.Frontend/Middleware/MiddlewareExtensions.cs delete mode 100644 src/MarginTrading.Frontend/Middleware/OptionsRequestsMiddleware.cs delete mode 100644 src/MarginTrading.Frontend/Models/ResponseModel.cs delete mode 100644 src/MarginTrading.Frontend/Models/TerminalInfo.cs delete mode 100644 src/MarginTrading.Frontend/Models/TokenModel.cs delete mode 100644 src/MarginTrading.Frontend/Models/WampDescriptionModels.cs delete mode 100644 src/MarginTrading.Frontend/Models/WatchList.cs delete mode 100644 src/MarginTrading.Frontend/Modules/FrontendExternalServicesModule.cs delete mode 100644 src/MarginTrading.Frontend/Modules/FrontendModule.cs delete mode 100644 src/MarginTrading.Frontend/Program.cs delete mode 100644 src/MarginTrading.Frontend/Properties/AssemblyInfo.cs delete mode 100644 src/MarginTrading.Frontend/RabbitMqHandler.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfo.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfoRepository.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchList.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchListRepository.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Entities/MaintenanceInfoEntity.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Entities/MarginTradingWatchListEntity.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/Entities/OperationLogEntity.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/MaintenanceInfoRepository.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/MarginTradingOperationsLogRepository.cs delete mode 100644 src/MarginTrading.Frontend/Repositories/MarginTradingWatchListsRepository.cs delete mode 100644 src/MarginTrading.Frontend/RpcMtFrontend.cs delete mode 100644 src/MarginTrading.Frontend/Services/ClientTokenService.cs delete mode 100644 src/MarginTrading.Frontend/Services/ClientTokenValidator.cs delete mode 100644 src/MarginTrading.Frontend/Services/HttpRequestService.cs delete mode 100644 src/MarginTrading.Frontend/Services/IClientTokenService.cs delete mode 100644 src/MarginTrading.Frontend/Services/IHttpRequestService.cs delete mode 100644 src/MarginTrading.Frontend/Services/ITerminalInfoService.cs delete mode 100644 src/MarginTrading.Frontend/Services/IWatchListService.cs delete mode 100644 src/MarginTrading.Frontend/Services/MaintenanceException.cs delete mode 100644 src/MarginTrading.Frontend/Services/RpcFacade.cs delete mode 100644 src/MarginTrading.Frontend/Services/TerminalInfoService.cs delete mode 100644 src/MarginTrading.Frontend/Services/WampSessionsService.cs delete mode 100644 src/MarginTrading.Frontend/Services/WatchListService.cs delete mode 100644 src/MarginTrading.Frontend/Settings/ApplicationSettings.cs delete mode 100644 src/MarginTrading.Frontend/Settings/MtDataReaderClientSettings.cs delete mode 100644 src/MarginTrading.Frontend/Startup.cs delete mode 100644 src/MarginTrading.Frontend/Views/Home/Index.cshtml delete mode 100644 src/MarginTrading.Frontend/Views/Shared/MethodsListPartial.cshtml delete mode 100644 src/MarginTrading.Frontend/Views/Shared/TypesListParial.cshtml delete mode 100644 src/MarginTrading.Frontend/Wamp/AnonymousWampAuthorizer.cs delete mode 100644 src/MarginTrading.Frontend/Wamp/AnonymousWampSessionAuthenticator.cs delete mode 100644 src/MarginTrading.Frontend/Wamp/IRpcMtFrontend.cs delete mode 100644 src/MarginTrading.Frontend/Wamp/IWampTopic.cs delete mode 100644 src/MarginTrading.Frontend/Wamp/WampConstants.cs delete mode 100644 src/MarginTrading.Frontend/Wamp/WampSessionAuthenticatorFactory.cs delete mode 100644 src/MarginTrading.Frontend/docker-compose.yml delete mode 100644 src/MarginTrading.Frontend/web.config delete mode 100644 src/MarginTrading.Frontend/wwwroot/css/bootstrap.css delete mode 100644 src/MarginTrading.Frontend/wwwroot/css/highlight-vs.css delete mode 100644 src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.eot delete mode 100644 src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.svg delete mode 100644 src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.ttf delete mode 100644 src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.woff delete mode 100644 src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 src/MarginTrading.Frontend/wwwroot/images/favicon.png delete mode 100644 src/MarginTrading.Frontend/wwwroot/js/bootstrap.min.js delete mode 100644 src/MarginTrading.Frontend/wwwroot/js/highlight.pack.js delete mode 100644 src/MarginTrading.Frontend/wwwroot/js/jquery.min.js diff --git a/MarginTrading.sln b/MarginTrading.sln index 28654502a..d30b3e7e4 100644 --- a/MarginTrading.sln +++ b/MarginTrading.sln @@ -17,8 +17,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Common", "src\MarginTrading.Common\MarginTrading.Common.csproj", "{28D8D798-8EF9-48BC-9F10-6E7823343CC9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Frontend", "src\MarginTrading.Frontend\MarginTrading.Frontend.csproj", "{23988B46-8A81-4324-B1F8-0FD2F5EFDD24}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Backend", "src\MarginTrading.Backend\MarginTrading.Backend.csproj", "{E6A712C9-78F1-4573-B3A4-318FA4A6BA0D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Backend.Services", "src\MarginTrading.Backend.Services\MarginTrading.Backend.Services.csproj", "{5030E6AA-4DDE-41EC-AE8A-609C2D7D5D37}" @@ -29,10 +27,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Backend.Core" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.AzureRepositories", "src\MarginTrading.AzureRepositories\MarginTrading.AzureRepositories.csproj", "{C78B5B26-4078-47FE-BCD1-CF6F9886A4FC}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "5. Wamp test client", "5. Wamp test client", "{18A6F48C-BAC6-4D92-A9AD-764E4F8BEB82}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.Client", "src\MarginTrading.Client\MarginTrading.Client.csproj", "{47A3C5B2-289D-41B9-8B73-F2C5995227A9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "6. Brokers", "6. Brokers", "{E74A349A-3D48-4345-80E7-FD4C462864F0}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MarginTrading.AccountHistoryBroker", "src\MarginTrading.Brokers\MarginTrading.AccountHistoryBroker\MarginTrading.AccountHistoryBroker.csproj", "{08FFD2CD-50C4-4B84-BA9E-27667677E20C}" @@ -53,8 +47,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarginTrading.Backend.Core. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarginTrading.AccountReportsBroker", "src\MarginTrading.Brokers\MarginTrading.AccountReportsBroker\MarginTrading.AccountReportsBroker.csproj", "{9595DED9-58C9-4732-87B1-891AFC2282B1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarginTrading.Frontend.Tests", "tests\MarginTrading.Frontend.Tests\MarginTrading.Frontend.Tests.csproj", "{FE2B7AD8-4085-410A-8855-75F9FC650EFB}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarginTrading.Backend.Contracts", "src\MarginTrading.Backend.Contracts\MarginTrading.Backend.Contracts.csproj", "{5EC22A63-BA3F-41A2-A70F-216B7E809390}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3. Backend", "3. Backend", "{1EA2FA6D-0FEA-47D9-B8CE-EF31A1C54DCD}" @@ -77,10 +69,6 @@ Global {28D8D798-8EF9-48BC-9F10-6E7823343CC9}.Debug|Any CPU.Build.0 = Debug|Any CPU {28D8D798-8EF9-48BC-9F10-6E7823343CC9}.Release|Any CPU.ActiveCfg = Release|Any CPU {28D8D798-8EF9-48BC-9F10-6E7823343CC9}.Release|Any CPU.Build.0 = Release|Any CPU - {23988B46-8A81-4324-B1F8-0FD2F5EFDD24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23988B46-8A81-4324-B1F8-0FD2F5EFDD24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23988B46-8A81-4324-B1F8-0FD2F5EFDD24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23988B46-8A81-4324-B1F8-0FD2F5EFDD24}.Release|Any CPU.Build.0 = Release|Any CPU {E6A712C9-78F1-4573-B3A4-318FA4A6BA0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6A712C9-78F1-4573-B3A4-318FA4A6BA0D}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6A712C9-78F1-4573-B3A4-318FA4A6BA0D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -101,10 +89,6 @@ Global {C78B5B26-4078-47FE-BCD1-CF6F9886A4FC}.Debug|Any CPU.Build.0 = Debug|Any CPU {C78B5B26-4078-47FE-BCD1-CF6F9886A4FC}.Release|Any CPU.ActiveCfg = Release|Any CPU {C78B5B26-4078-47FE-BCD1-CF6F9886A4FC}.Release|Any CPU.Build.0 = Release|Any CPU - {47A3C5B2-289D-41B9-8B73-F2C5995227A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47A3C5B2-289D-41B9-8B73-F2C5995227A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47A3C5B2-289D-41B9-8B73-F2C5995227A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47A3C5B2-289D-41B9-8B73-F2C5995227A9}.Release|Any CPU.Build.0 = Release|Any CPU {08FFD2CD-50C4-4B84-BA9E-27667677E20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08FFD2CD-50C4-4B84-BA9E-27667677E20C}.Debug|Any CPU.Build.0 = Debug|Any CPU {08FFD2CD-50C4-4B84-BA9E-27667677E20C}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -141,10 +125,6 @@ Global {9595DED9-58C9-4732-87B1-891AFC2282B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {9595DED9-58C9-4732-87B1-891AFC2282B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {9595DED9-58C9-4732-87B1-891AFC2282B1}.Release|Any CPU.Build.0 = Release|Any CPU - {FE2B7AD8-4085-410A-8855-75F9FC650EFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE2B7AD8-4085-410A-8855-75F9FC650EFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE2B7AD8-4085-410A-8855-75F9FC650EFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE2B7AD8-4085-410A-8855-75F9FC650EFB}.Release|Any CPU.Build.0 = Release|Any CPU {5EC22A63-BA3F-41A2-A70F-216B7E809390}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5EC22A63-BA3F-41A2-A70F-216B7E809390}.Debug|Any CPU.Build.0 = Debug|Any CPU {5EC22A63-BA3F-41A2-A70F-216B7E809390}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -171,10 +151,8 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {28D8D798-8EF9-48BC-9F10-6E7823343CC9} = {84F3857F-CE2C-4A87-ACB2-809570092CF6} - {23988B46-8A81-4324-B1F8-0FD2F5EFDD24} = {A1366CA2-DF4A-4E38-BD6C-895A399118B4} {AFC440C0-68F0-447F-9C04-7614E6323B22} = {F9EA3679-8D3F-4DC2-B0A9-08801E02EE70} {C78B5B26-4078-47FE-BCD1-CF6F9886A4FC} = {5AD188EF-3F19-4527-816C-A361746EE9C2} - {47A3C5B2-289D-41B9-8B73-F2C5995227A9} = {18A6F48C-BAC6-4D92-A9AD-764E4F8BEB82} {08FFD2CD-50C4-4B84-BA9E-27667677E20C} = {E74A349A-3D48-4345-80E7-FD4C462864F0} {02819188-B172-400E-9DBA-9A7E5C4F6266} = {E74A349A-3D48-4345-80E7-FD4C462864F0} {BE0E8F09-2A68-426E-B457-5AA929CD998F} = {E74A349A-3D48-4345-80E7-FD4C462864F0} @@ -183,7 +161,6 @@ Global {88F0B500-1119-4292-A721-15B13BB1A4BA} = {A1366CA2-DF4A-4E38-BD6C-895A399118B4} {08346EF4-8525-4CE0-93C4-CCE510D27D88} = {84F3857F-CE2C-4A87-ACB2-809570092CF6} {9595DED9-58C9-4732-87B1-891AFC2282B1} = {E74A349A-3D48-4345-80E7-FD4C462864F0} - {FE2B7AD8-4085-410A-8855-75F9FC650EFB} = {F9EA3679-8D3F-4DC2-B0A9-08801E02EE70} {5EC22A63-BA3F-41A2-A70F-216B7E809390} = {1EA2FA6D-0FEA-47D9-B8CE-EF31A1C54DCD} {A3E8A724-1ACD-4C92-AC1E-91D4AFFD17FE} = {1EA2FA6D-0FEA-47D9-B8CE-EF31A1C54DCD} {41948BD6-0CD9-4A2B-BAA3-02AD065AD52B} = {1EA2FA6D-0FEA-47D9-B8CE-EF31A1C54DCD} diff --git a/src/MarginTrading.Backend.Contracts/IAccountsApi.cs b/src/MarginTrading.Backend.Contracts/IAccountsApi.cs index e90bf5941..2365cb1fc 100644 --- a/src/MarginTrading.Backend.Contracts/IAccountsApi.cs +++ b/src/MarginTrading.Backend.Contracts/IAccountsApi.cs @@ -7,16 +7,7 @@ namespace MarginTrading.Backend.Contracts { public interface IAccountsApi { - [Get("/api/accounts/")] - Task> GetAllAccounts(); - [Get("/api/accounts/stats")] Task> GetAllAccountStats(); - - [Get("/api/accounts/byClient/{clientId}")] - Task> GetAccountsByClientId(string clientId); - - [Get("/api/accounts/byId/{id}")] - Task GetAccountById(string id); } } \ No newline at end of file diff --git a/src/MarginTrading.Backend.Contracts/MarginTrading.Backend.Contracts.csproj b/src/MarginTrading.Backend.Contracts/MarginTrading.Backend.Contracts.csproj index f7bb7c008..489046b5e 100644 --- a/src/MarginTrading.Backend.Contracts/MarginTrading.Backend.Contracts.csproj +++ b/src/MarginTrading.Backend.Contracts/MarginTrading.Backend.Contracts.csproj @@ -2,7 +2,7 @@ netstandard2.0 1.0.1 - Lykke.MarginTrading.Backend.Contracts + Lykke.MarginTrading.BackendSnow.Contracts 7.1 true diff --git a/src/MarginTrading.Client/Bot/BotClient.cs b/src/MarginTrading.Client/Bot/BotClient.cs deleted file mode 100644 index 4ac543c11..000000000 --- a/src/MarginTrading.Client/Bot/BotClient.cs +++ /dev/null @@ -1,608 +0,0 @@ -using Flurl.Http; -using MarginTrading.Client.JsonResults; -using MarginTrading.Client.Settings; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Common; -using MarginTrading.Client.EventArgs; -using MarginTrading.Client.Wamp; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Contract.ClientContracts; -using WampSharp.V2; -using WampSharp.V2.Client; - -namespace MarginTrading.Client.Bot -{ - class BotClient : IDisposable - { - public event EventHandler LogEvent; - - #region vars - private readonly TestBotUserSettings _settings; - - private Timer _transactionTimer; - private Timer _connectTimer; - private bool _isDisposing; - private string _authorizationAddress; - private IDisposable _notificationSubscription; - private readonly Random _random; - private string _serverAddress; - private IWampChannel _channel; - private IWampRealmProxy _realmProxy; - private string _token; - private IRpcMtFrontend _service; - private string _notificationId; - - private readonly Dictionary _priceSubscription; - private readonly Dictionary _subscriptionHistory; - - #endregion - - #region Properties - public int Id => _settings.Number; - public string Email => _settings.Email; - public string Password => _settings.Password; - - public int ActionScriptInterval { get; private set; } - public int TransactionFrequencyMin { get; private set; } - public int TransactionFrequencyMax { get; private set; } - public bool Initialized { get; private set; } - #endregion - - public BotClient(TestBotUserSettings settings) - { - _settings = settings; - Initialized = false; - _priceSubscription = new Dictionary(); - _subscriptionHistory = new Dictionary(); - _random = new Random(); - } - - #region Methods - private void Connect() - { - var factory = new DefaultWampChannelFactory(); - _channel = factory.CreateJsonChannel(_serverAddress, "mtcrossbar"); - var tries = 0; - while (!_channel.RealmProxy.Monitor.IsConnected) - { - try - { - tries++; - LogInfo($"Trying to connect to server {_serverAddress }..."); - _channel.Open().Wait(); - } - catch (Exception ex) - { - LogError(ex); - if (tries > 5) - throw; - LogInfo("Retrying in 5 sec..."); - - } - } - LogInfo($"Connected to server {_serverAddress}"); - - _realmProxy = _channel.RealmProxy; - _service = _realmProxy.Services.GetCalleeProxy(); - - // Subscribe Notifications - _notificationSubscription = _realmProxy.Services.GetSubject($"user.updates.{_notificationId}").Subscribe(NotificationReceived); - } - private void Disconnect() - { - LogInfo($"Disconnecting from server {_serverAddress}"); - _channel.Close(); - } - public async Task Initialize(string serverAddress, string authorizationAddress, int actionScriptInterval, int transactionFrequencyMin, int transactionFrequencyMax) - { - - LogInfo($"Initializing bot {_settings.Number} ({_settings.Email}). AquireTokenData..."); - _serverAddress = serverAddress; - _authorizationAddress = authorizationAddress; - ActionScriptInterval = actionScriptInterval; - TransactionFrequencyMin = transactionFrequencyMin; - TransactionFrequencyMax = transactionFrequencyMax; - - try - { - var res = await AquireTokenData(); - _token = res.token; - _notificationId = res.notificationsId; - Initialized = true; - } - catch (Exception ex) - { - LogError(ex); - throw; - } - - Connect(); - } - public void Reconnect() - { - Disconnect(); - Thread.Sleep(2000); - Connect(); - } - - public void IsAlive() - { - try - { - var data = _service.IsAlive(); - LogInfo($"IsAlive:{data.ToJson()}"); - } - catch (Exception ex) - { - LogError(ex); - } - } - public async Task InitData() - { - try - { - var res = new OperationResult - { - Operation = "InitData", - StartDate = DateTime.UtcNow - }; - var initData = await _service.InitData(_token); - res.EndDate = DateTime.UtcNow; - res.Result = initData; - LogInfo($";{res.Duration};InitData: Assets={initData.Assets.Length} Prices={initData.Prices.Count}"); - - return res; - } - catch (Exception ex) - { - LogError(ex); - return null; - } - } - public async Task InitAccounts() - { - try - { - var res = new OperationResult - { - Operation = "InitAccounts", - StartDate = DateTime.UtcNow - }; - var initAccounts = await _service.InitAccounts(_token); - res.EndDate = DateTime.UtcNow; - res.Result = initAccounts; - LogInfo($";{res.Duration};InitAccounts: Demo={initAccounts.Demo.Length} Live={initAccounts.Live.Length}"); - return res; - } - catch (Exception ex) - { - LogError(ex); - return null; - } - } - - public async Task InitGraph() - { - try - { - var res = new OperationResult - { - Operation = "InitGraph", - StartDate = DateTime.UtcNow - }; - var chartData = await _service.InitGraph(); - res.EndDate = DateTime.UtcNow; - res.Result = chartData; - LogInfo($";{res.Duration};InitGraph: ChartData={chartData.ChartData.Count}"); - return res; - } - catch (Exception ex) - { - LogError(ex); - return null; - } - - } - public async Task GetAccountHistory() - { - try - { - var res = new OperationResult - { - Operation = "GetAccountHistory", - StartDate = DateTime.UtcNow - }; - - var request = new AccountHistoryRpcClientRequest - { - Token = _token - }; - var result = await _service.GetAccountHistory(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = result; - LogInfo($";{res.Duration};GetAccountHistory: Accounts={result.Account.Length}, OpenPositions={result.OpenPositions.Length}, PositionsHistory={result.PositionsHistory.Length}"); - return res; - } - catch (Exception ex) - { - LogError(ex); - return null; - } - } - - public async Task GetHistory() - { - var res = new OperationResult - { - Operation = "GetHistory", - StartDate = DateTime.UtcNow - }; - - var request = new AccountHistoryRpcClientRequest - { - Token = _token - }; - var result = await _service.GetHistory(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = result; - LogInfo($";{res.Duration};GetHistory: Items={result.Length}"); - return res; - } - public async Task GetOpenPositionsFromDemo() - { - var res = new OperationResult - { - Operation = "GetOpenPositions", - StartDate = DateTime.UtcNow - }; - - var result = await _service.GetOpenPositions(_token); - res.EndDate = DateTime.UtcNow; - res.Result = result.Demo; - LogInfo($";{res.Duration};GetOpenPositionsFromDemo: Items={result.Demo.Length}"); - return res; - } - public async Task GetAccountOpenPositions(string accountId) - { - var res = new OperationResult - { - Operation = "GetAccountOpenPositions", - StartDate = DateTime.UtcNow - }; - var request = new AccountTokenClientRequest - { - Token = _token, - AccountId = accountId - }; - var result = await _service.GetAccountOpenPositions(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = result; - LogInfo($";{res.Duration};GetAccountOpenPositions: OpenPositions={result.Length}"); - return res; - } - public async Task GetClientOrders() - { - var res = new OperationResult - { - Operation = "GetClientOrders", - StartDate = DateTime.UtcNow - }; - - var result = await _service.GetClientOrders(_token); - res.EndDate = DateTime.UtcNow; - res.Result = result; - LogInfo($";{res.Duration};GetClientOrders: Orders={result.Demo.Orders.Length}, Positions={result.Demo.Positions.Length}"); - return res; - } - - public async Task> PlaceOrders(string accountId, string instrument, int numOrders) - { - var operations = new List(); - for (var i = 0; i < numOrders; i++) - { - try - { - var request = new OpenOrderRpcClientRequest - { - Token = _token, - Order = new NewOrderClientContract - { - AccountId = accountId, - FillType = OrderFillTypeContract.FillOrKill, - Instrument = instrument, - Volume = 1 - } - }; - LogInfo($"Placing order {i+1}/{numOrders}: [{instrument}]"); - - var res = new OperationResult - { - Operation = "PlaceOrders", - StartDate = DateTime.UtcNow - }; - var order = await _service.PlaceOrder(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = order.Result; - operations.Add(res); - - LogInfo(order.Result.Status == 3 - ? $";{res.Duration};Order rejected: {order.Result.RejectReason} -> {order.Result.RejectReasonText}" - : $";{res.Duration};Order placed: {order.Result.Id} -> Status={order.Result.Status}"); - } - catch (Exception ex) - { - LogError(ex); - } - // Sleep TransactionFrequency - Thread.Sleep(GetRandomTransactionInterval()); - } - return operations; - } - public async Task> PlacePendingOrders(string accountId, string instrument, int numOrders, decimal currentBid) - { - - var operations = new List(); - for (var i = 0; i < numOrders; i++) - { - try - { - var request = new OpenOrderRpcClientRequest - { - Token = _token, - Order = new NewOrderClientContract - { - AccountId = accountId, - FillType = OrderFillTypeContract.FillOrKill, - Instrument = instrument, - Volume = 1, - ExpectedOpenPrice = currentBid * 0.9m - } - }; - - LogInfo($"Placing order {i + 1}/{numOrders}: [{instrument}]"); - var res = new OperationResult - { - Operation = "PlacePendingOrders", - StartDate = DateTime.UtcNow - }; - var order = await _service.PlaceOrder(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = order.Result; - operations.Add(res); - - LogInfo(order.Result.Status == 3 - ? $";{res.Duration};Order rejected: {order.Result.RejectReason} -> {order.Result.RejectReasonText}" - : $";{res.Duration};Order placed: {order.Result.Id} -> Status={order.Result.Status}"); - } - catch (Exception ex) - { - LogError(ex); - } - // Sleep TransactionFrequency - Thread.Sleep(GetRandomTransactionInterval()); - } - return operations; - } - public async Task> CloseOrders(string accountId, string instrument, int numOrders) - { - var operations = new List(); - var resGetOpenPositions = await GetOpenPositionsFromDemo(); - operations.Add(resGetOpenPositions); - - var orders = ((OrderClientContract[])resGetOpenPositions.Result) - .Where(x => x.AccountId == accountId && x.Instrument == instrument).ToList(); - var processed = 0; - foreach (var order in orders) - { - if (processed >= numOrders) - break; - try - { - LogInfo($"Closing order {processed + 1}/{numOrders}: [{instrument}] Id={order.Id} Fpl={order.Fpl}"); - var res = new OperationResult - { - Operation = "CloseOrders", - StartDate = DateTime.UtcNow - }; - var request = new CloseOrderRpcClientRequest - { - OrderId = order.Id, - AccountId = order.AccountId, - Token = _token - }; - var orderClosed = await _service.CloseOrder(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = orderClosed; - operations.Add(res); - - LogInfo(orderClosed.Result - ? $";{res.Duration};Order Closed Id={order.Id}" - : $";{res.Duration};Order Close Failed Id={order.Id} Message:{orderClosed.Message}"); - } - catch (Exception ex) - { - LogError(ex); - } - processed++; - // Sleep TransactionFrequency - Thread.Sleep(GetRandomTransactionInterval()); - } - - if (processed < numOrders) - LogWarning($"Not enough orders to close requested amount {numOrders}"); - - return operations; - } - public async Task> CancelOrders(string accountId, string instrument, int numOrders) - { - var operations = new List(); - var resGetOpenPositions = await GetOpenPositionsFromDemo(); - operations.Add(resGetOpenPositions); - - var orders = ((OrderClientContract[])resGetOpenPositions.Result) - .Where(x => x.AccountId == accountId && x.Instrument == instrument && x.Status==0).ToList(); - var processed = 0; - foreach (var order in orders) - { - if (processed >= numOrders) - break; - try - { - LogInfo($"Canceling order {processed + 1}/{numOrders}: [{instrument}] Id={order.Id} Fpl={order.Fpl}"); - var res = new OperationResult - { - Operation = "CancelOrders", - StartDate = DateTime.UtcNow - }; - var request = new CloseOrderRpcClientRequest - { - OrderId = order.Id, - AccountId = order.AccountId, - Token = _token - }; - var ordercanceled = await _service.CancelOrder(request.ToJson()); - res.EndDate = DateTime.UtcNow; - res.Result = ordercanceled; - operations.Add(res); - - LogInfo(ordercanceled.Result - ? $";{res.Duration};Order Canceled Id={order.Id}" - : $";{res.Duration};Order Cancel Failed Id={order.Id} Message:{ordercanceled.Message}"); - } - catch (Exception ex) - { - LogError(ex); - } - processed++; - // Sleep TransactionFrequency - Thread.Sleep(GetRandomTransactionInterval()); - } - - if (processed < numOrders) - LogWarning($"Not enough orders to close requested amount {numOrders}"); - - return operations; - } - - public void SubscribePrice(string instrument) - { - var topicName = !string.IsNullOrEmpty(instrument) ? $"prices.update.{instrument}" : "prices.update"; - var subscription = _realmProxy.Services.GetSubject(topicName) - .Subscribe(PriceReceived); - - _priceSubscription.Add(instrument, subscription); - LogInfo($"SubscribePrice: Instrument={instrument}"); - - //subscription.Dispose(); - } - public void UnsubscribePrice(string instrument) - { - var subscription = _priceSubscription[instrument]; - subscription?.Dispose(); - - if (_subscriptionHistory.ContainsKey(instrument)) - { - var received = _subscriptionHistory[instrument]; - LogInfo($"UnsubscribePrice: Instrument={instrument}. Entries received:{received}"); - _subscriptionHistory.Remove(instrument); - } - } - - private async Task<(string token, string notificationsId)> AquireTokenData() - { - var address = $"{_authorizationAddress}/Auth"; - var result = await address.PostJsonAsync(new - { - _settings.Email, - _settings.Password - }) - .ReceiveJson(); - if (result.Error != null) - throw new Exception(result.Error.Message); - - return (token: result.Result.Token, notificationsId: result.Result.NotificationsId); - } - - private int GetRandomTransactionInterval() - { - return _random.Next(TransactionFrequencyMin, TransactionFrequencyMax); - } - - public void Dispose() - { - if (_isDisposing) - return; - _isDisposing = true; - - _notificationSubscription?.Dispose(); - _channel?.Close(); - - if (_transactionTimer != null) - { - _transactionTimer.Dispose(); - _transactionTimer = null; - } - - if (_connectTimer != null) - { - _connectTimer.Dispose(); - _connectTimer = null; - } - } - - - #region CallBacks - private void PriceReceived(InstrumentBidAskPairContract price) - { - if (!_subscriptionHistory.ContainsKey(price.Id)) - _subscriptionHistory.Add(price.Id, 0); - - var received = _subscriptionHistory[price.Id]; - _subscriptionHistory[price.Id] = received + 1; - - //LogInfo($"Price received:{price.Instrument} Ask/Bid:{price.Ask}/{price.Bid}"); - } - private void NotificationReceived(NotifyResponse info) - { - if (info.Account != null) - LogInfo($"Notification received: Account changed={info.Account.Id} Balance:{info.Account.Balance}"); - - if (info.Order != null) - LogInfo($"Notification received: Order changed={info.Order.Id} Open:{info.Order.OpenDate} Close:{info.Order.CloseDate} Fpl:{info.Order.Fpl}"); - - if (info.AccountStopout != null) - LogInfo($"Notification received: Account stopout={info.AccountStopout.AccountId}"); - - if (info.UserUpdate != null) - LogInfo($"Notification received: User update={info.UserUpdate.UpdateAccountAssetPairs}, accounts = {info.UserUpdate.UpdateAccounts}"); - - } - #endregion - - #region Logging - private void LogInfo(string message) - { - OnLog(new LogEventArgs(DateTime.UtcNow, $"Bot:[{_settings.Number}]", "info", $"Thread[{ Thread.CurrentThread.ManagedThreadId.ToString() }] {message}", null)); - } - private void LogWarning(string message) - { - OnLog(new LogEventArgs(DateTime.UtcNow, $"Bot:[{_settings.Number}]", "warning", $"Thread[{ Thread.CurrentThread.ManagedThreadId.ToString() }] {message}", null)); - } - private void LogError(Exception error) - { - OnLog(new LogEventArgs(DateTime.UtcNow, $"Bot:[{_settings.Number}]", "error", $"Thread[{ Thread.CurrentThread.ManagedThreadId.ToString() }] {error.Message}", error)); - } - private void OnLog(LogEventArgs e) - { - LogEvent?.Invoke(this, e); - } - #endregion - - #endregion - } - -} diff --git a/src/MarginTrading.Client/Bot/BotConsole.cs b/src/MarginTrading.Client/Bot/BotConsole.cs deleted file mode 100644 index 67106d3c2..000000000 --- a/src/MarginTrading.Client/Bot/BotConsole.cs +++ /dev/null @@ -1,353 +0,0 @@ -using Flurl.Http; -using MarginTrading.Client.Settings; -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Client.EventArgs; - -namespace MarginTrading.Client.Bot -{ - static class BotConsole - { - #region Vars - private static BotHost _botHost; - private static string _sessionLogFile; - private static bool _isAutoRun; - private static MtTradingBotSettings _settings; - private static MtTradingBotTestSettings _testSettings; - - private static readonly object LogLock = new object(); - private static Queue _logQueue; - - private static bool _isRunningTests; - #endregion - - private static void LoadSettings(string testScriptFile) - { - var config = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile("appsettings.dev.json", true, true) - .AddEnvironmentVariables() - .Build(); - - var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - // If it's Development environment load local settings file, else load settings from Lykke.Settings - var mtSettings = (env == "Development") ? - config.Get() : - Lykke.SettingsReader.SettingsProcessor.Process(config["SettingsUrl"].GetStringAsync().Result); - - _settings = mtSettings.MtTradingBot; - - string script; - if (!string.IsNullOrEmpty(_settings.TestFile)) - script = _settings.TestFile; - else if (!string.IsNullOrEmpty(testScriptFile)) - script = testScriptFile; - else - throw new Exception("Invalid configuration file"); - - var testFile = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), script)); - if (!testFile.Exists) - throw new FileNotFoundException($"Script file not found: {testFile.Name}"); - - config = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile("appsettings.dev.json", true, true) - .AddJsonFile(script, true, true) - .AddEnvironmentVariables() - .Build(); - - _testSettings = config.Get(); - - if (string.IsNullOrEmpty(_settings?.MTAuthorizationAddress) || string.IsNullOrEmpty(_settings.MTServerAddress)) - throw new Exception("Invalid configuration file"); - LogInfo("LoadSettings", $"Configuration Loaded: {script}"); - - } - internal static void StartBotHost(string configFile, bool autorun) - { - _isAutoRun = autorun; - _sessionLogFile = Path.Combine(Path.GetTempPath(), "MTLOG_"+ DateTime.UtcNow.ToString("yyyyMMdd_HHmm") + ".log"); - - LoadSettings(configFile); - if (!string.IsNullOrEmpty(_settings.TestFile)) - _isAutoRun = true; - - _botHost = new BotHost(); - _botHost.LogEvent += Bot_LogEvent; - _botHost.TestFinished += BotHost_TestFinished; - _botHost.Start(_settings, _testSettings); - - LogInfo("BotConsole.StartBot", $"Log session file: {_sessionLogFile}"); - if (_isAutoRun) - Run(); - string input; - do - { - input = Console.ReadLine(); - switch (input) - { - case "exit": - break; - case "bots": - ShowBots(); - break; - case "help": - ShowHelp(); - break; - case "isalive": - IsAlive(); - break; - case "initdata": - InitData(); - break; - case "initaccounts": - InitAccounts(); - break; - case "run": - Run(); - break; - case "appinfo": - AppInfo(); - break; - case "verifyemail": - VerifyEmail(); - break; - case "register": - RegisterUser(); - break; - } - - } while (input != "exit"); - _botHost.Stop(); - _botHost.LogEvent -= Bot_LogEvent; - _botHost.TestFinished -= BotHost_TestFinished; - FlushLog(); - } - private static string RequestBot() - { - Console.Write("\tSelect bot [(#)bot number / (a)all]: "); - var input = Console.ReadLine(); - if (input == "all" || input == "a") - return "all"; - - if (int.TryParse(input, out var botId)) - { - - var bot = _botHost.Bots.FirstOrDefault(x => x.Id == botId); - if (bot == null) - return null; - else - return input; - - - } - else - return null; - } - - #region Console Commands - private static void Run() - { - if (_isRunningTests) - LogInfo("Run", "Test is already running. Cannot run again"); - _isRunningTests = true; - _botHost.RunScript(); - } - - private static async void AppInfo() - { - try - { - await MtUserHelper.ApplicationInfo(_settings.MTAuthorizationAddress); - } - catch (Exception ex) - { - LogError("MtUserHelper.EmailVerification", ex); - } - } - private static async void VerifyEmail() - { - try - { - await MtUserHelper.EmailVerification("nem@dev.com", _settings.MTAuthorizationAddress); - } - catch (Exception ex) - { - LogError("MtUserHelper.EmailVerification", ex); - } - } - private static async void RegisterUser() - { - Console.Write("Email: "); - var email = Console.ReadLine(); - try - { - await MtUserHelper.EmailVerification(email, _settings.MTAuthorizationAddress); - } - catch (Exception ex) - { - LogError("MtUserHelper.EmailVerification", ex); - return; - } - - Console.Write("Password: "); - var pass = Console.ReadLine(); - - await MtUserHelper.Registration(email, pass, _settings.MTAuthorizationAddress); - } - private static void ShowBots() - { - Console.WriteLine(" ===== Bots ===== "); - foreach (var bot in _botHost.Bots) - { - Console.WriteLine(" Bot Id: {0} > {1}", bot.Id, bot.Email); - } - Console.WriteLine(" ===== ==== ===== "); - } - private static void ShowHelp() - { - Console.WriteLine(" ===== HELP ===== "); - Console.WriteLine(" bots - Show active bots "); - Console.WriteLine(" isalive - Perform IsAlive call for 1 or all bots "); - Console.WriteLine(" initdata - Perform InitData call for 1 or all bots "); - Console.WriteLine(" initaccounts - Perform InitAccounts call for 1 or all bots "); - Console.WriteLine(" run - Run actions script "); - Console.WriteLine(" exit - Stops bot application "); - Console.WriteLine(" ===== ==== ===== "); - } - private static void IsAlive() - { - var botid = RequestBot(); - if (botid == null) - Console.WriteLine("Invalid bot id"); - else if (botid == "all") - { - foreach (var bot in _botHost.Bots) - { - Task.Run(() => bot.IsAlive()); - } - } - else - { - var bot = _botHost.Bots.FirstOrDefault(x => x.Id.ToString() == botid); - bot?.IsAlive(); - } - } - private static void InitData() - { - var botid = RequestBot(); - switch (botid) - { - case null: - Console.WriteLine("Invalid bot id"); - break; - case "all": - foreach (var b in _botHost.Bots) - { - Task.Run(() => b.InitData()); - } - break; - default: - var bot = _botHost.Bots.FirstOrDefault(x => x.Id.ToString() == botid); - bot?.InitData(); - break; - } - } - private static void InitAccounts() - { - var botid = RequestBot(); - if (botid == null) - Console.WriteLine("Invalid bot id"); - else if (botid == "all") - { - foreach (var bot in _botHost.Bots) - { - Task.Run(() => bot.InitAccounts()); - } - } - else - { - var bot = _botHost.Bots.FirstOrDefault(x => x.Id.ToString() == botid); - bot?.InitAccounts(); - } - } - #endregion - - #region Logging - private static void LogInfo(string origin, string message) - { - Log(new LogEventArgs(DateTime.UtcNow, origin, "info", message, null)); - } - - private static void LogError(string origin, Exception error) - { - Log(new LogEventArgs(DateTime.UtcNow, origin, "error", error.Message, error)); - } - - private static void Log(LogEventArgs e) - { - LogEventArgs[] currentLogBuffer = null; - - lock (LogLock) - { - if (_logQueue == null) - _logQueue = new Queue(); - - _logQueue.Enqueue(e); - if (_logQueue.Count >= 64) - { - currentLogBuffer = _logQueue.ToArray(); - _logQueue.Clear(); - } - } - - var msg = $"{e.Date:HH:mm:ss.fff};{e.Origin};{e.Type};{e.Message}"; - if (e.Exception != null) - msg += $"\n\r{e.Exception.GetBaseException().Message}\n\rSTACK:[{e.Exception.GetBaseException().StackTrace}]"; - Console.WriteLine(msg); - - if (currentLogBuffer != null) - FlushLog(currentLogBuffer); - } - private static void FlushLog() - { - LogEventArgs[] buffer; - lock (LogLock) - { - buffer = _logQueue.ToArray(); - _logQueue.Clear(); - } - FlushLog(buffer); - } - private static void FlushLog(LogEventArgs[] logBuffer) - { - using (var fs = new FileStream(_sessionLogFile, FileMode.Append, FileAccess.Write)) - using (var sw = new StreamWriter(fs)) - { - foreach (var logitem in logBuffer) - { - sw.WriteLine("{0};{1};{2};{3}", logitem.Date.ToString("HH:mm:ss.fff"), logitem.Origin, logitem.Type, logitem.Message); - if (logitem.Exception != null) - sw.WriteLine($"{logitem.Exception.GetBaseException().Message}\n\rSTACK:[{logitem.Exception.GetBaseException().StackTrace}]"); - } - } - } - #endregion - - #region Event Handlers - private static void BotHost_TestFinished(object sender, System.EventArgs e) - { - FlushLog(); - _isRunningTests = false; - } - private static void Bot_LogEvent(object sender, LogEventArgs e) - { - Log(e); - } - #endregion - } -} diff --git a/src/MarginTrading.Client/Bot/BotHost.cs b/src/MarginTrading.Client/Bot/BotHost.cs deleted file mode 100644 index dbc527862..000000000 --- a/src/MarginTrading.Client/Bot/BotHost.cs +++ /dev/null @@ -1,253 +0,0 @@ -using MarginTrading.Client.Settings; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Client.EventArgs; - -namespace MarginTrading.Client.Bot -{ - class BotHost - { - public event EventHandler LogEvent; - public event EventHandler TestFinished; - - #region vars - private MtTradingBotSettings _settings; - private MtTradingBotTestSettings _testSettings; - - private List _runningTests; - private List _finishedTests; - #endregion - - #region Properties - public List Bots { get; private set; } - #endregion - - #region Methods - public void Start(MtTradingBotSettings settings, MtTradingBotTestSettings testSettings) - { - _settings = settings; - _testSettings = testSettings; - - // Create Bots - try { CreateBots(); } - catch (Exception ex01) - { - LogError("CreateEnvironment", ex01); - throw; - } - - // Initialize Bots - Task.Run(async () => await StartBots()) - .Wait(); - } - public void Stop() - { - if (Bots != null && Bots.Count > 0) - { - foreach (var bot in Bots) - { - bot.Dispose(); - } - } - } - - private void CreateBots() - { - - Bots = new List(); - - if (string.IsNullOrEmpty(_settings.UsersFile)) - { - if (_settings.NumberOfUsers > _testSettings.Users.Length) - throw new IndexOutOfRangeException("User array does not have enough users for requested NumberOfUsers "); - - // Load Users Json Array - var userSettings = _testSettings.Users.OrderBy(x => x.Number).ToArray(); - for (var i = 0; i < _settings.NumberOfUsers; i++) - { - var bot = new BotClient(userSettings[i]); - bot.LogEvent += Bot_LogEvent; - Bots.Add(bot); - } - } - else - { - // Load Users from CSV File - var file = new FileInfo(_settings.UsersFile); - if (!file.Exists) - throw new FileNotFoundException(file.FullName); - - using (var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) - using (var sr = new StreamReader(fs)) - { - //Read Header - sr.ReadLine(); - var ctr = 0; - do - { - if (ctr >= _settings.NumberOfUsers) - break; - // read csv line - var line = sr.ReadLine(); - var values = line.Split(';'); - var email = values[0]; - var pass = values[1]; - - var bot = new BotClient(new TestBotUserSettings() { Number = ++ctr, Email = email, Password = pass }); - bot.LogEvent += Bot_LogEvent; - Bots.Add(bot); - - } while (!sr.EndOfStream); - } - } - } - private async Task StartBots() - { - foreach (var bot in Bots) - { - var tryCount = 0; - while (true) - { - if (tryCount >= 3) - break; - tryCount++; - - var createUser = false; - try - { - await bot.Initialize(_settings.MTServerAddress, _settings.MTAuthorizationAddress, _settings.ActionScriptInterval, _settings.TransactionFrequencyMin, _settings.TransactionFrequencyMax); - break; - } - catch (Exception ex) - { - if (ex.Message == "Invalid username or password") - createUser = true; - } - if (createUser) - { - LogInfo("StartBots", $"Creating user: {bot.Email}"); - try - { - await MtUserHelper.Registration(bot.Email, bot.Password, _settings.MTAuthorizationAddress); - LogInfo("StartBots", $"User {bot.Email} created successfully"); - System.Threading.Thread.Sleep(1000); - } - catch (Exception ex01) - { - LogError("MtUserHelper.Registration", ex01); - break; - } - } - } - - } - } - - public void RunScript() - { - _runningTests = new List(); - _finishedTests = new List(); - foreach (var bot in Bots) - { - if (bot.Initialized) - { - var test = new BotTest(bot, _testSettings.Actions); - test.LogEvent += Test_LogEvent; - test.TestFinished += Test_TestFinished; - _runningTests.Add(test); - LogInfo($"Bot:[{bot.Id}]", $"Starting test for Bot: {bot.Email}"); - test.RunScriptAsync(); - } - else - { - LogWarning($"Bot:[{bot.Id}]", $"Bot initialization failed: {bot.Email}. Not running tests"); - } - } - } - - private void PrintSummary() - { - LogInfo("BotHost", ";BOT;OPERATION;COUNT;AVERAGE"); - - var totalOperations = new List(); - foreach (var item in _finishedTests) - { - totalOperations.AddRange(item.Operations); - var grouped = item.Operations.GroupBy(x => x.Operation); - foreach (var group in grouped) - { - var line = $";{item.Bot.Id};{group.Key};{group.Count()};{group.Average(x => x.Duration.TotalSeconds)}"; - LogInfo("BotHost", line); - } - } - - LogInfo("BotHost", " === Total Averages === "); - LogInfo("BotHost", "OPERATION;COUNT;AVERAGE"); - var totalgrouped = totalOperations.GroupBy(x => x.Operation); - foreach (var group in totalgrouped) - { - var line = $";{group.Key};{group.Count()};{group.Average(x => x.Duration.TotalSeconds)}"; - LogInfo("BotHost", line); - } - LogInfo("BotHost", " === Total Averages === "); - } - - private void LogInfo(string origin, string message) - { - OnLog(this, new LogEventArgs(DateTime.UtcNow, origin, "info", message, null)); - } - private void LogWarning(string origin, string message) - { - OnLog(this, new LogEventArgs(DateTime.UtcNow, origin, "warning", message, null)); - } - private void LogError(string origin, Exception error) - { - OnLog(this, new LogEventArgs(DateTime.UtcNow, origin, "error", error.Message, error)); - } - #endregion - - #region Event Raising - private void OnTestFinished(object sender, System.EventArgs e) - { - TestFinished?.Invoke(sender, e); - } - private void OnLog(object sender, LogEventArgs e) - { - LogEvent?.Invoke(sender, e); - } - #endregion - - #region Event Handlers - private void Test_LogEvent(object sender, LogEventArgs e) - { - OnLog(sender, e); - } - private void Bot_LogEvent(object sender, LogEventArgs e) - { - OnLog(sender, e); - } - private void Test_TestFinished(object sender, System.EventArgs e) - { - var sdr = sender as BotTest; - LogInfo($"Bot:[{sdr?.Bot.Id}]", $"Test Finished! Bot: {sdr?.Bot.Email}"); - _runningTests.Remove(sdr); - _finishedTests.Add(sdr); - if (_runningTests.Count == 0) - { - PrintSummary(); - OnTestFinished(this, new System.EventArgs()); - } - } - #endregion - - } - - - - - - -} diff --git a/src/MarginTrading.Client/Bot/BotTest.cs b/src/MarginTrading.Client/Bot/BotTest.cs deleted file mode 100644 index 3f70ecd63..000000000 --- a/src/MarginTrading.Client/Bot/BotTest.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using MarginTrading.Client.EventArgs; -using MarginTrading.Contract.ClientContracts; - -#pragma warning disable 4014 - -namespace MarginTrading.Client.Bot -{ - class BotTest - { - public event EventHandler LogEvent; - public event EventHandler TestFinished; - - readonly List _operations; - private string[] _processedScript; - - int _currentAction; - readonly Timer _actionTimer; - - private InitDataLiveDemoClientResponse _initData; - private InitChartDataClientResponse _initGraph; - - public BotClient Bot { get; } - public string[] Actions { get; } - public bool IsFinished{ get; private set; } - - public List Operations => _operations; - - public BotTest(BotClient bot, string[] actions) - { - IsFinished = false; - Bot = bot; - Actions = actions; - _actionTimer = new Timer(NextActionTimerCall, null, -1, -1); - _operations = new List(); - } - - public void RunScriptAsync() - { - var t = new Thread(RunScript); - t.Start(); - } - private void RunScript() - { - _currentAction = 0; - if (Actions == null || Actions.Length < 1) - throw new ArgumentException("Actions"); - - // Pre-process script - var pscript = new List(); - for (var i = 0; i < Actions.Length; i++) - { - if (Actions[i].ToLower().StartsWith("repeat")) - { - //do repeat stuff - if (Actions[i].Split(' ').Length <= 1) - continue; - - var rcount = Actions[i].Split(' ')[1]; - if (rcount.ToLower() == "all") - { - var repeated = new List(); - for (var j = 0; j < i; j++) - { - repeated.Add(Actions[j]); - } - - var repeatAllCount = 1; - if (Actions[i].Split(' ').Length > 2) - int.TryParse(Actions[i].Split(' ')[2], out repeatAllCount); - - for (var k = 0; k < repeatAllCount; k++) - { - pscript.AddRange(repeated); - } - } - else - { - int.TryParse(rcount, out var repeatCount); - var pos = -repeatCount; - var repeatActions = new List(); - while (pos < 0) - { - repeatActions.Add(Actions[i + pos]); - pos++; - } - pscript.AddRange(repeatActions); - } - } - else - pscript.Add(Actions[i]); - } - _processedScript = pscript.ToArray(); - - Execute(_processedScript[_currentAction]); - } - - private async Task Execute(string action, bool restartTimer = true) - { - // do action - LogInfo($"Action: {action}"); - - var command = action.Split(' ')[0].ToLower(); - - switch (command) - { - case "initdata": - var resinitdata = await Bot.InitData(); - _initData = (InitDataLiveDemoClientResponse)resinitdata.Result; - _operations.Add(resinitdata); - break; - case "initaccounts": - var resinitaccounts = await Bot.InitAccounts(); - _operations.Add(resinitaccounts); - break; - case "initgraph": - var resinitGraph = await Bot.InitGraph(); - _initGraph = (InitChartDataClientResponse)resinitGraph.Result; - _operations.Add(resinitGraph); - foreach (var graphRow in _initGraph.ChartData) - { - LogInfo($"ChartRow: {graphRow.Key}:{graphRow.Value}"); - } - - break; - case "subscribe": - var subscribeInstrument = action.Split(' ')[1].ToUpper(); - Bot.SubscribePrice(subscribeInstrument); - break; - case "unsubscribe": - var unsubscribeInstrument = action.Split(' ')[1].ToUpper(); - Bot.UnsubscribePrice(unsubscribeInstrument); - break; - case "placeorder": - #region placeorder - if (_initData == null) - { - LogInfo("PlaceOrder Failed. InitData not performed, please call InitData before placing orders"); - } - else - { - var placeOrderInstrument = action.Split(' ')[1].ToUpper(); - int placeOrderCount; - if (action.Split(' ').Length > 2) - { - var orderCount = action.Split(' ')[2].ToUpper(); - if (!int.TryParse(orderCount, out placeOrderCount)) - placeOrderCount = 1; - } - else - placeOrderCount = 1; - - var result = await Bot.PlaceOrders(_initData.Demo.Accounts[0].Id, placeOrderInstrument, placeOrderCount); - _operations.AddRange(result); - } - #endregion - break; - case "closeorder": - #region closeorder - if (_initData == null) - { - LogInfo("CloseOrder Failed. InitData not performed, please call InitData before closing orders"); - } - else - { - var closeOrderInstrument = action.Split(' ')[1].ToUpper(); - int closeOrderCount; - if (action.Split(' ').Length > 2) - { - var orderCount = action.Split(' ')[2].ToUpper(); - if (!int.TryParse(orderCount, out closeOrderCount)) - closeOrderCount = 1; - } - else - closeOrderCount = 1; - - var result = await Bot.CloseOrders(_initData.Demo.Accounts[0].Id, closeOrderInstrument, closeOrderCount); - _operations.AddRange(result); - } - #endregion - break; - case "cancelorder": - #region cancelorder - if (_initData == null) - { - LogInfo("CancelOrder Failed. InitData not performed, please call InitData before canceling orders"); - } - else - { - var cancelOrderInstrument = action.Split(' ')[1].ToUpper(); - int cancelOrderCount; - if (action.Split(' ').Length > 2) - { - var orderCount = action.Split(' ')[2].ToUpper(); - if (!int.TryParse(orderCount, out cancelOrderCount)) - cancelOrderCount = 1; - } - else - cancelOrderCount = 1; - - var result = await Bot.CancelOrders(_initData.Demo.Accounts[0].Id, cancelOrderInstrument, cancelOrderCount); - _operations.AddRange(result); - } - #endregion - break; - case "gethistory": - var resgethistory = await Bot.GetHistory(); - _operations.Add(resgethistory); - break; - case "getaccounthistory": - var resgetaccounthistory = await Bot.GetAccountHistory(); - _operations.Add(resgetaccounthistory); - break; - case "getaccountopenpositions": - if (_initData == null) - { - LogInfo("GetAccountOpenPositions Failed. InitData not performed, please call InitData before placing orders"); - } - else - { - var result = await Bot.GetAccountOpenPositions(_initData.Demo.Accounts[0].Id); - _operations.Add(result); - } - break; - case "getclientorders": - var getClientOrdersResult = await Bot.GetClientOrders(); - _operations.Add(getClientOrdersResult); - break; - case "reconnect": - Bot.Reconnect(); - LogInfo("Reconnected..."); - break; - case "placependingorder": - #region placependingorder - if (_initData == null) - { - LogInfo("PlaceOrder Failed. InitData not performed, please call InitData before placing orders"); - } - else - { - var placeOrderInstrument = action.Split(' ')[1].ToUpper(); - int placeOrderCount; - if (action.Split(' ').Length > 2) - { - var orderCount = action.Split(' ')[2].ToUpper(); - if (!int.TryParse(orderCount, out placeOrderCount)) - placeOrderCount = 1; - } - else - placeOrderCount = 1; - var currentBid = _initData.Prices[placeOrderInstrument].Bid; - var result = await Bot.PlacePendingOrders(_initData.Demo.Accounts[0].Id, placeOrderInstrument, placeOrderCount, currentBid); - _operations.AddRange(result); - } - #endregion - break; - } - - - // Wait for next action - if (restartTimer) - _actionTimer.Change(Bot.ActionScriptInterval, 0); - } - private void NextActionTimerCall(object status) - { - _actionTimer.Change(-1, -1); - _currentAction++; - if (_currentAction >= _processedScript.Length) - { - IsFinished = true; - PrintTestOperations(); - //script finished - OnTestFinished(new System.EventArgs()); } - else - { - Execute(_processedScript[_currentAction]); - } - } - - private void PrintTestOperations() - { - var distinct = _operations.GroupBy(x => x.Operation); - Console.WriteLine(distinct); - LogInfo($" == Test Finished for Bot {Bot.Id} =="); - foreach (var group in distinct) - { - LogInfo($"{group.Key}=>Count:{group.Count()} Average Time:{group.Average(x => x.Duration.TotalSeconds)}"); - } - LogInfo(" == =="); - } - - private void LogInfo(string message) - { - OnLog(new LogEventArgs(DateTime.UtcNow, $"Bot:[{Bot.Id}]", "info", $"Thread[{ Thread.CurrentThread.ManagedThreadId.ToString() }] {message}", null)); - } - - private void OnLog(LogEventArgs e) - { - LogEvent?.Invoke(this, e); - } - private void OnTestFinished(System.EventArgs e) - { - TestFinished?.Invoke(this, e); - } - } -} diff --git a/src/MarginTrading.Client/Bot/MtUserHelper.cs b/src/MarginTrading.Client/Bot/MtUserHelper.cs deleted file mode 100644 index 2a56b62cb..000000000 --- a/src/MarginTrading.Client/Bot/MtUserHelper.cs +++ /dev/null @@ -1,73 +0,0 @@ -using Flurl.Http; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace MarginTrading.Client.Bot -{ - internal static class MtUserHelper - { - public static async Task ApplicationInfo(string apiAddress) - { - var address = $"{apiAddress}/ApplicationInfo"; - - var result = await address.GetJsonAsync(); - if (result.Error != null) - throw new Exception(result.Error.Message); - } - public static async Task EmailVerification(string email, string apiAddress) - { - var address = $"{apiAddress}/EmailVerification"; - var Email = email; - - var result = await address.PostJsonAsync( - new - { - Email - }).ReceiveJson(); - if (result.Error != null) - throw new Exception(result.Error.Message); - } - public static async Task Registration(string email, string password, string apiAddress) - { - var address = $"{apiAddress}/Registration"; - - var ClientInfo = "MT Test Bot"; - var ContactPhone = ""; - var Email = email; - var FullName = ""; - var Hint = "MtBotHint"; - var Password = HashPass(password); - var result = await address.PostJsonAsync( - new - { - ClientInfo, - ContactPhone, - Email, - FullName, - Hint, - Password - }).ReceiveJson(); - if (result.Error != null) - throw new Exception(result.Error.Message); - - } - - private static string HashPass(string password) - { - using (var sha256 = System.Security.Cryptography.SHA256.Create()) - { - // Send text to hash. - var hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password)); - - // Get the hashed string. - var hash = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower(); - - // Print the string. - Console.WriteLine(hash); - return hash; - } - } - } -} diff --git a/src/MarginTrading.Client/Bot/OperationResult.cs b/src/MarginTrading.Client/Bot/OperationResult.cs deleted file mode 100644 index 618d53b47..000000000 --- a/src/MarginTrading.Client/Bot/OperationResult.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace MarginTrading.Client.Bot -{ - public class OperationResult - { - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - public string Operation { get; set; } - public object Result { get; set; } - - public TimeSpan Duration => EndDate - StartDate; - } -} diff --git a/src/MarginTrading.Client/ClientEnv.cs b/src/MarginTrading.Client/ClientEnv.cs deleted file mode 100644 index e809a1ec6..000000000 --- a/src/MarginTrading.Client/ClientEnv.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MarginTrading.Client -{ - public enum ClientEnv - { - Local, - Dev, - Test, - Prod - } -} diff --git a/src/MarginTrading.Client/Dockerfile b/src/MarginTrading.Client/Dockerfile deleted file mode 100644 index 0b4077057..000000000 --- a/src/MarginTrading.Client/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM microsoft/aspnetcore:2.0 -WORKDIR /app -COPY . . -ENTRYPOINT ["dotnet", "MarginTrading.Client.dll"] diff --git a/src/MarginTrading.Client/EventArgs/LogEventArgs.cs b/src/MarginTrading.Client/EventArgs/LogEventArgs.cs deleted file mode 100644 index ff4bc2cef..000000000 --- a/src/MarginTrading.Client/EventArgs/LogEventArgs.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace MarginTrading.Client.EventArgs -{ - public class LogEventArgs : System.EventArgs - { - public LogEventArgs(DateTime date, string origin, string type, string message, Exception exception) - { - Date = date; - Origin = origin; - Type = type; - Message = message; - Exception = exception; - } - - public DateTime Date { get; } - public string Origin { get; } - public string Type { get; } - public string Message { get; } - public Exception Exception { get; } - } -} diff --git a/src/MarginTrading.Client/JsonResults/ApiAuthResult.cs b/src/MarginTrading.Client/JsonResults/ApiAuthResult.cs deleted file mode 100644 index 7c288f941..000000000 --- a/src/MarginTrading.Client/JsonResults/ApiAuthResult.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Newtonsoft.Json; - -namespace MarginTrading.Client.JsonResults -{ - class ApiAuthResult - { - [JsonProperty("Result")] - public AuthResult Result { get; set; } - [JsonProperty("Error")] - public AuthError Error { get; set; } - } -} diff --git a/src/MarginTrading.Client/JsonResults/AuthError.cs b/src/MarginTrading.Client/JsonResults/AuthError.cs deleted file mode 100644 index c1377fa54..000000000 --- a/src/MarginTrading.Client/JsonResults/AuthError.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Newtonsoft.Json; - -namespace MarginTrading.Client.JsonResults -{ - class AuthError - { - [JsonProperty("Code")] - public int Code { get; set; } - [JsonProperty("Field ")] - public object Field { get; set; } - [JsonProperty("Message")] - public string Message { get; set; } - } -} diff --git a/src/MarginTrading.Client/JsonResults/AuthResult.cs b/src/MarginTrading.Client/JsonResults/AuthResult.cs deleted file mode 100644 index 90e6035be..000000000 --- a/src/MarginTrading.Client/JsonResults/AuthResult.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Newtonsoft.Json; - -namespace MarginTrading.Client.JsonResults -{ - class AuthResult - { - - [JsonProperty("KycStatus")] - public string KycStatus { get; set; } - [JsonProperty("PinIsEntered ")] - public bool PinIsEntered { get; set; } - [JsonProperty("Token")] - public string Token { get; set; } - [JsonProperty("NotificationsId")] - public string NotificationsId { get; set; } - } -} diff --git a/src/MarginTrading.Client/MarginTrading.Client.csproj b/src/MarginTrading.Client/MarginTrading.Client.csproj deleted file mode 100644 index 2dd333f7d..000000000 --- a/src/MarginTrading.Client/MarginTrading.Client.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - Exe - netcoreapp2.0 - 1.0.1 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MarginTrading.Client/MtClient.cs b/src/MarginTrading.Client/MtClient.cs deleted file mode 100644 index 82c138831..000000000 --- a/src/MarginTrading.Client/MtClient.cs +++ /dev/null @@ -1,320 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Common; -using MarginTrading.Client.Wamp; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Contract.ClientContracts; -using WampSharp.V2; -using WampSharp.V2.Client; -using Microsoft.Extensions.Configuration; - -namespace MarginTrading.Client -{ - public class MtClient - { - private string _token; - private string _notificationId; - private string _serverAddress; - private IWampRealmProxy _realmProxy; - private IRpcMtFrontend _service; - private IWampChannel _channel; - - public void Connect(ClientEnv env) - { - SetEnv(env); - var factory = new DefaultWampChannelFactory(); - _channel = factory.CreateJsonChannel(_serverAddress, "mtcrossbar"); - - while (!_channel.RealmProxy.Monitor.IsConnected) - { - try - { - Console.WriteLine($"Trying to connect to server {_serverAddress}..."); - _channel.Open().Wait(); - } - catch - { - Console.WriteLine("Retrying in 5 sec..."); - Thread.Sleep(5000); - } - } - Console.WriteLine($"Connected to server {_serverAddress}"); - - _realmProxy = _channel.RealmProxy; - _service = _realmProxy.Services.GetCalleeProxy(); - } - - public void Close() - { - _channel.Close(); - } - - public void SetEnv(ClientEnv env) - { - var config = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile("appsettings.json", true, true) - .AddJsonFile($"appsettings.{env.ToString().ToLower()}.json", true, true) - .Build(); - - _token = config["token"]; - _notificationId = config["notificationId"]; - _serverAddress = config["serverAddress"]; - } - - public void IsAlive() - { - var data = _service.IsAlive(); - Console.WriteLine(data.ToJson()); - } - - public async Task InitData() - { - var data = await _service.InitData(_token); - Console.WriteLine(data.ToJson()); - } - - public async Task InitAccounts() - { - var data = await _service.InitAccounts(_token); - Console.WriteLine(data.ToJson()); - } - - public async Task AccountInstruments() - { - var data = await _service.AccountInstruments(_token); - Console.WriteLine(data.ToJson()); - } - - public async Task InitGraph() - { - var data = await _service.InitGraph(); - Console.WriteLine(data.ChartData.Count); - } - - public async Task GetAccountHistory() - { - var request = new AccountHistoryRpcClientRequest - { - Token = _token - }; - - var result = await _service.GetAccountHistory(request.ToJson()); - } - - public async Task GetHistory() - { - var request = new AccountHistoryRpcClientRequest - { - Token = _token - }; - - var result = await _service.GetHistory(request.ToJson()); - } - - public async Task PlaceOrder() - { - var subscription = _realmProxy.Services.GetSubject($"user.updates.{_notificationId}") - .Subscribe(info => - { - if (info.Account != null) - Console.WriteLine("Account changed"); - - if (info.Order != null) - Console.WriteLine("Order changed"); - - if (info.AccountStopout != null) - Console.WriteLine("Account stopout"); - - if (info.UserUpdate != null) - Console.WriteLine($"User update: accountAssetPairs = {info.UserUpdate.UpdateAccountAssetPairs}, accounts = {info.UserUpdate.UpdateAccounts}"); - }); - - var data = await _service.InitData(_token); - - try - { - var request = new OpenOrderRpcClientRequest - { - Token = _token, - Order = new NewOrderClientContract - { - AccountId = data.Demo.Accounts[0].Id, - FillType = OrderFillTypeContract.FillOrKill, - Instrument = "BTCUSD", - Volume = 1 - } - }; - - var order = await _service.PlaceOrder(request.ToJson()); - - if (order.Result.Status == 3) - { - Console.WriteLine($"Order rejected: {order.Result.RejectReason} -> {order.Result.RejectReasonText}"); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - - Console.WriteLine("Press enter"); - Console.ReadLine(); - subscription.Dispose(); - } - - public async Task CloseOrder(bool closeAnyFpl) - { - var subscription = _realmProxy.Services.GetSubject($"user.updates.{_notificationId}") - .Subscribe(info => - { - if (info.Order != null) - { - Console.WriteLine($"Order pnl: {info.Order.Fpl}"); - } - }); - - while (true) - { - var orders = await _service.GetOpenPositions(_token); - - if (orders.Demo.Any(item => item.Fpl > 0) || closeAnyFpl) - { - var order = orders.Demo.First(); - - var request = new CloseOrderRpcClientRequest - { - OrderId = order.Id, - AccountId = order.AccountId, - Token = _token - }; - - var result = await _service.CloseOrder(request.ToJson()); - break; - } - - Thread.Sleep(200); - } - - Console.WriteLine("Press enter"); - Console.ReadLine(); - subscription.Dispose(); - } - - public async Task CancelOrder() - { - var subscription = _realmProxy.Services.GetSubject($"user.updates.{_notificationId}") - .Subscribe(info => - { - if (info.Order != null) - { - Console.WriteLine($"Order status: {info.Order.Status}"); - } - }); - - while (true) - { - var orders = await _service.GetOpenPositions(_token); - - if (orders.Demo.Any()) - { - var order = orders.Demo.First(); - - var request = new CloseOrderRpcClientRequest - { - OrderId = order.Id, - Token = _token - }; - - var result = _service.CancelOrder(request.ToJson()); - break; - } - - Thread.Sleep(200); - } - - Console.WriteLine("Press enter"); - Console.ReadLine(); - subscription.Dispose(); - } - - public async Task GetOpenPositions() - { - var result = await _service.GetOpenPositions(_token); - } - - public async Task GetAccountOpenPositions() - { - var data = await _service.InitData(_token); - - var request = new AccountTokenClientRequest - { - Token = _token, - AccountId = data.Demo.Accounts[0].Id - }; - - var result = await _service.GetAccountOpenPositions(request.ToJson()); - } - - public async Task GetClientOrders() - { - var result = await _service.GetClientOrders(_token); - } - - public async Task ChangeOrderLimits() - { - var request = new ChangeOrderLimitsRpcClientRequest - { - Token = _token, - OrderId = "" - }; - - var result = await _service.ChangeOrderLimits(request.ToJson()); - Console.WriteLine($"result = {result.Result}, message = {result.Message}"); - } - - public void Prices(string instrument = null) - { - var topicName = !string.IsNullOrEmpty(instrument) ? $"prices.update.{instrument}" : "prices.update"; - var subscription = _realmProxy.Services.GetSubject(topicName) - .Subscribe(info => - { - Console.WriteLine($"{info.Id} {info.Bid}/{info.Ask}"); - }); - - - Console.ReadLine(); - subscription.Dispose(); - } - - public void Trades() - { - var subscription = _realmProxy.Services.GetSubject("trades") - .Subscribe(info => - { - Console.WriteLine($"{info.ToJson()}"); - }); - - - Console.ReadLine(); - subscription.Dispose(); - } - - public void UserUpdates() - { - var subscription = _realmProxy.Services.GetSubject($"user.updates.{_notificationId}") - .Subscribe(info => - { - if (info.UserUpdate != null) - Console.WriteLine($"assets = {info.UserUpdate.UpdateAccountAssetPairs}, accounts = {info.UserUpdate.UpdateAccounts}"); - }); - - - Console.ReadLine(); - subscription.Dispose(); - } - } -} diff --git a/src/MarginTrading.Client/Program.cs b/src/MarginTrading.Client/Program.cs deleted file mode 100644 index d6b8aaf8a..000000000 --- a/src/MarginTrading.Client/Program.cs +++ /dev/null @@ -1,78 +0,0 @@ -using MarginTrading.Client.Bot; -using System; - -namespace MarginTrading.Client -{ - public class Program - { - public static void Main(string[] args) - { - var testBot = false; - string testBotSettingsFile = null; - var autorun = false; - for (var i = 0; i< args.Length; i++) - { - - if (args[i].ToLower() == "-h" || args[i].ToLower() == "--help") - { - Console.WriteLine("-h\t--help Show this help"); - Console.WriteLine("-b\t--bot Run test bot. Usage: -b [json configuration file]"); - Console.ReadKey(); - return; - } - if (args[i].ToLower() == "-a" || args[i].ToLower() == "--autorun") - { - autorun = true; - } - if (args[i].ToLower() == "-b" || args[i].ToLower() == "--bot") - { - testBot = true; - if (args.Length > i + 1 && !args[i + 1].StartsWith('-')) - { - try { testBotSettingsFile = args[++i]; } - catch { testBotSettingsFile = ""; } - } - } - } - if (testBot) - { - BotConsole.StartBotHost(testBotSettingsFile, autorun); - } - else - { - for (var i = 0; i < 1; i++) - { - var client = new MtClient(); - - client.Connect(ClientEnv.Dev); - - client.IsAlive(); - //client.InitData().Wait(); - //client.InitAccounts(); - //client.AccountInstruments(); - //client.InitGraph().Wait(); - - //client.AccountDeposit().Wait(); - //client.AccountWithdraw(); - //client.SetActiveAccount(); - //client.GetAccountHistory(); - //client.GetHistory(); - - //client.PlaceOrder().Wait(); - //client.CloseOrder(true).Wait(); - //client.CancelOrder(); - //client.GetAccountOpenPositions().Wait(); - //client.GetOpenPositions().Wait(); - //client.GetClientOrders(); - //client.ChangeOrderLimits(); - - client.Prices("BTCUSD"); - //client.UserUpdates(); - client.Trades(); - - client.Close(); - } - } - } - } -} diff --git a/src/MarginTrading.Client/Settings/MtTradingBotSettings.cs b/src/MarginTrading.Client/Settings/MtTradingBotSettings.cs deleted file mode 100644 index 4a6d6a7f1..000000000 --- a/src/MarginTrading.Client/Settings/MtTradingBotSettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MarginTrading.Client.Settings -{ - class MtTradingBotSettings - { - public string MTServerAddress { get; set; } - public string MTAuthorizationAddress { get; set; } - public int NumberOfUsers { get; set; } - public int ActionScriptInterval { get; set; } - public int TransactionFrequencyMin { get; set; } - public int TransactionFrequencyMax { get; set; } - public string UsersFile { get; set; } = null; - public string TestFile { get; set; } = null; - } -} diff --git a/src/MarginTrading.Client/Settings/MtTradingBotTestSettings.cs b/src/MarginTrading.Client/Settings/MtTradingBotTestSettings.cs deleted file mode 100644 index 456262371..000000000 --- a/src/MarginTrading.Client/Settings/MtTradingBotTestSettings.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MarginTrading.Client.Settings -{ - class MtTradingBotTestSettings - { - public TestBotUserSettings[] Users { get; set; } - public string[] Actions { get; set; } - } -} diff --git a/src/MarginTrading.Client/Settings/TestBotUserSettings.cs b/src/MarginTrading.Client/Settings/TestBotUserSettings.cs deleted file mode 100644 index 413a1d422..000000000 --- a/src/MarginTrading.Client/Settings/TestBotUserSettings.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MarginTrading.Client.Settings -{ - class TestBotUserSettings - { - public int Number { get; set; } - public string Email { get; set; } - public string Password { get; set; } - } -} diff --git a/src/MarginTrading.Client/Settings/TradingBotSettings.cs b/src/MarginTrading.Client/Settings/TradingBotSettings.cs deleted file mode 100644 index 5dba4e0b8..000000000 --- a/src/MarginTrading.Client/Settings/TradingBotSettings.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MarginTrading.Client.Settings -{ - class TradingBotSettings - { - public MtTradingBotSettings MtTradingBot { get; set; } - } -} diff --git a/src/MarginTrading.Client/Wamp/IRpcMtFrontend.cs b/src/MarginTrading.Client/Wamp/IRpcMtFrontend.cs deleted file mode 100644 index 8e52ea819..000000000 --- a/src/MarginTrading.Client/Wamp/IRpcMtFrontend.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Contract.ClientContracts; -using WampSharp.V2.Rpc; - -namespace MarginTrading.Client.Wamp -{ - public interface IRpcMtFrontend - { - [WampProcedure("is.alive")] - IsAliveResponse IsAlive(); - - [WampProcedure("init.data")] - Task InitData(string token); - - [WampProcedure("init.accounts")] - Task InitAccounts(string token); - - [WampProcedure("init.accountinstruments")] - Task AccountInstruments(string token = null); - - [WampProcedure("init.graph")] - Task InitGraph(string token = null, string[] assetIds = null); - - [WampProcedure("account.history")] - Task GetAccountHistory(string requestJson); - - [WampProcedure("account.history.new")] - Task GetHistory(string requestJson); - - [WampProcedure("order.place")] - Task> PlaceOrder(string requestJson); - - [WampProcedure("order.close")] - Task> CloseOrder(string requestJson); - - [WampProcedure("order.cancel")] - Task> CancelOrder(string requestJson); - - [WampProcedure("order.list")] - Task GetOpenPositions(string token); - - [WampProcedure("order.account.list")] - Task GetAccountOpenPositions(string requestJson); - - [WampProcedure("order.positions")] - Task GetClientOrders(string token); - - [WampProcedure("order.changeLimits")] - Task> ChangeOrderLimits(string requestJson); - - [WampProcedure("orderbooks")] - Task GetOrderBook(string instrument); - } -} diff --git a/src/MarginTrading.Client/Wamp/RealmNames.cs b/src/MarginTrading.Client/Wamp/RealmNames.cs deleted file mode 100644 index ec722d9cf..000000000 --- a/src/MarginTrading.Client/Wamp/RealmNames.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MarginTrading.Client.Wamp -{ - public static class RealmNames - { - public const string FrontEnd = "mtcrossbar"; - } -} diff --git a/src/MarginTrading.Client/bottest01.json b/src/MarginTrading.Client/bottest01.json deleted file mode 100644 index 94ee3ef2c..000000000 --- a/src/MarginTrading.Client/bottest01.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Actions": [ - "InitData", - "InitAccounts", - "InitGraph", - "Subscribe BTCUSD", - "GetAccountHistory", - "PlaceOrder BTCUSD 10", - "CloseOrder BTCUSD 10", - "PlacePendingOrder BTCUSD 10", - "PlaceOrder BTCUSD 10", - "Reconnect", - "InitData", - "GetClientOrders", - "CancelOrder BTCUSD 10", - "CloseOrder BTCUSD 10", - "GetAccountOpenPositions", - "Unsubscribe BTCUSD" - ], - "Users": [ - { - "Number": 1, - "Email": "nuno@dev.com", - "Password": "123456" - } - ] -} - diff --git a/src/MarginTrading.Client/bottest02.json b/src/MarginTrading.Client/bottest02.json deleted file mode 100644 index 1009fe2d4..000000000 --- a/src/MarginTrading.Client/bottest02.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Actions": [ - "InitData", - "InitAccounts", - "InitGraph", - "Subscribe BTCUSD", - "GetAccountHistory", - "PlaceOrder BTCUSD 100", - "CloseOrder BTCUSD 100", - "PlacePendingOrder BTCUSD 10", - "PlaceOrder BTCUSD 100", - "Reconnect", - "InitData", - "GetClientOrders", - "CancelOrder BTCUSD 10", - "CloseOrder BTCUSD 100", - "GetAccountOpenPositions", - "Unsubscribe BTCUSD" - ], - "Users": [ - { - "Number": 1, - "Email": "nuno@dev.com", - "Password": "123456" - } - ] -} - diff --git a/src/MarginTrading.Client/bottest03.json b/src/MarginTrading.Client/bottest03.json deleted file mode 100644 index cd55b8a2c..000000000 --- a/src/MarginTrading.Client/bottest03.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "Actions": [ - "InitData", - "InitAccounts", - "InitGraph", - "PlaceOrder BTCUSD 1", - "Reconnect", - "InitData", - "CloseOrder BTCUSD 1" - ], - "Users": [ - { - "Number": 1, - "Email": "nuno@dev.com", - "Password": "123456" - } - ] -} - diff --git a/src/MarginTrading.Client/bottest04.json b/src/MarginTrading.Client/bottest04.json deleted file mode 100644 index ed2c1695e..000000000 --- a/src/MarginTrading.Client/bottest04.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Actions": [ - "InitData", - "PlaceOrder BTCUSD 5", - "CloseOrder BTCUSD 5" - ], - "Users": [ - { - "Number": 1, - "Email": "nuno@dev.com", - "Password": "123456" - } - ] -} - diff --git a/src/MarginTrading.Client/devUsers.csv b/src/MarginTrading.Client/devUsers.csv deleted file mode 100644 index 6d3a3d6e0..000000000 --- a/src/MarginTrading.Client/devUsers.csv +++ /dev/null @@ -1,1001 +0,0 @@ -Email;Password -bot0001@dev.com;P123456P -bot0002@dev.com;P123456P -bot0003@dev.com;P123456P -bot0004@dev.com;P123456P -bot0005@dev.com;P123456P -bot0006@dev.com;P123456P -bot0007@dev.com;P123456P -bot0008@dev.com;P123456P -bot0009@dev.com;P123456P -bot0010@dev.com;P123456P -bot0011@dev.com;P123456P -bot0012@dev.com;P123456P -bot0013@dev.com;P123456P -bot0014@dev.com;P123456P -bot0015@dev.com;P123456P -bot0016@dev.com;P123456P -bot0017@dev.com;P123456P -bot0018@dev.com;P123456P -bot0019@dev.com;P123456P -bot0020@dev.com;P123456P -bot0021@dev.com;P123456P -bot0022@dev.com;P123456P -bot0023@dev.com;P123456P -bot0024@dev.com;P123456P -bot0025@dev.com;P123456P -bot0026@dev.com;P123456P -bot0027@dev.com;P123456P -bot0028@dev.com;P123456P -bot0029@dev.com;P123456P -bot0030@dev.com;P123456P -bot0031@dev.com;P123456P -bot0032@dev.com;P123456P -bot0033@dev.com;P123456P -bot0034@dev.com;P123456P -bot0035@dev.com;P123456P -bot0036@dev.com;P123456P -bot0037@dev.com;P123456P -bot0038@dev.com;P123456P -bot0039@dev.com;P123456P -bot0040@dev.com;P123456P -bot0041@dev.com;P123456P -bot0042@dev.com;P123456P -bot0043@dev.com;P123456P -bot0044@dev.com;P123456P -bot0045@dev.com;P123456P -bot0046@dev.com;P123456P -bot0047@dev.com;P123456P -bot0048@dev.com;P123456P -bot0049@dev.com;P123456P -bot0050@dev.com;P123456P -bot0051@dev.com;P123456P -bot0052@dev.com;P123456P -bot0053@dev.com;P123456P -bot0054@dev.com;P123456P -bot0055@dev.com;P123456P -bot0056@dev.com;P123456P -bot0057@dev.com;P123456P -bot0058@dev.com;P123456P -bot0059@dev.com;P123456P -bot0060@dev.com;P123456P -bot0061@dev.com;P123456P -bot0062@dev.com;P123456P -bot0063@dev.com;P123456P -bot0064@dev.com;P123456P -bot0065@dev.com;P123456P -bot0066@dev.com;P123456P -bot0067@dev.com;P123456P -bot0068@dev.com;P123456P -bot0069@dev.com;P123456P -bot0070@dev.com;P123456P -bot0071@dev.com;P123456P -bot0072@dev.com;P123456P -bot0073@dev.com;P123456P -bot0074@dev.com;P123456P -bot0075@dev.com;P123456P -bot0076@dev.com;P123456P -bot0077@dev.com;P123456P -bot0078@dev.com;P123456P -bot0079@dev.com;P123456P -bot0080@dev.com;P123456P -bot0081@dev.com;P123456P -bot0082@dev.com;P123456P -bot0083@dev.com;P123456P -bot0084@dev.com;P123456P -bot0085@dev.com;P123456P -bot0086@dev.com;P123456P -bot0087@dev.com;P123456P -bot0088@dev.com;P123456P -bot0089@dev.com;P123456P -bot0090@dev.com;P123456P -bot0091@dev.com;P123456P -bot0092@dev.com;P123456P -bot0093@dev.com;P123456P -bot0094@dev.com;P123456P -bot0095@dev.com;P123456P -bot0096@dev.com;P123456P -bot0097@dev.com;P123456P -bot0098@dev.com;P123456P -bot0099@dev.com;P123456P -bot0100@dev.com;P123456P -bot0101@dev.com;P123456P -bot0102@dev.com;P123456P -bot0103@dev.com;P123456P -bot0104@dev.com;P123456P -bot0105@dev.com;P123456P -bot0106@dev.com;P123456P -bot0107@dev.com;P123456P -bot0108@dev.com;P123456P -bot0109@dev.com;P123456P -bot0110@dev.com;P123456P -bot0111@dev.com;P123456P -bot0112@dev.com;P123456P -bot0113@dev.com;P123456P -bot0114@dev.com;P123456P -bot0115@dev.com;P123456P -bot0116@dev.com;P123456P -bot0117@dev.com;P123456P -bot0118@dev.com;P123456P -bot0119@dev.com;P123456P -bot0120@dev.com;P123456P -bot0121@dev.com;P123456P -bot0122@dev.com;P123456P -bot0123@dev.com;P123456P -bot0124@dev.com;P123456P -bot0125@dev.com;P123456P -bot0126@dev.com;P123456P -bot0127@dev.com;P123456P -bot0128@dev.com;P123456P -bot0129@dev.com;P123456P -bot0130@dev.com;P123456P -bot0131@dev.com;P123456P -bot0132@dev.com;P123456P -bot0133@dev.com;P123456P -bot0134@dev.com;P123456P -bot0135@dev.com;P123456P -bot0136@dev.com;P123456P -bot0137@dev.com;P123456P -bot0138@dev.com;P123456P -bot0139@dev.com;P123456P -bot0140@dev.com;P123456P -bot0141@dev.com;P123456P -bot0142@dev.com;P123456P -bot0143@dev.com;P123456P -bot0144@dev.com;P123456P -bot0145@dev.com;P123456P -bot0146@dev.com;P123456P -bot0147@dev.com;P123456P -bot0148@dev.com;P123456P -bot0149@dev.com;P123456P -bot0150@dev.com;P123456P -bot0151@dev.com;P123456P -bot0152@dev.com;P123456P -bot0153@dev.com;P123456P -bot0154@dev.com;P123456P -bot0155@dev.com;P123456P -bot0156@dev.com;P123456P -bot0157@dev.com;P123456P -bot0158@dev.com;P123456P -bot0159@dev.com;P123456P -bot0160@dev.com;P123456P -bot0161@dev.com;P123456P -bot0162@dev.com;P123456P -bot0163@dev.com;P123456P -bot0164@dev.com;P123456P -bot0165@dev.com;P123456P -bot0166@dev.com;P123456P -bot0167@dev.com;P123456P -bot0168@dev.com;P123456P -bot0169@dev.com;P123456P -bot0170@dev.com;P123456P -bot0171@dev.com;P123456P -bot0172@dev.com;P123456P -bot0173@dev.com;P123456P -bot0174@dev.com;P123456P -bot0175@dev.com;P123456P -bot0176@dev.com;P123456P -bot0177@dev.com;P123456P -bot0178@dev.com;P123456P -bot0179@dev.com;P123456P -bot0180@dev.com;P123456P -bot0181@dev.com;P123456P -bot0182@dev.com;P123456P -bot0183@dev.com;P123456P -bot0184@dev.com;P123456P -bot0185@dev.com;P123456P -bot0186@dev.com;P123456P -bot0187@dev.com;P123456P -bot0188@dev.com;P123456P -bot0189@dev.com;P123456P -bot0190@dev.com;P123456P -bot0191@dev.com;P123456P -bot0192@dev.com;P123456P -bot0193@dev.com;P123456P -bot0194@dev.com;P123456P -bot0195@dev.com;P123456P -bot0196@dev.com;P123456P -bot0197@dev.com;P123456P -bot0198@dev.com;P123456P -bot0199@dev.com;P123456P -bot0200@dev.com;P123456P -bot0201@dev.com;P123456P -bot0202@dev.com;P123456P -bot0203@dev.com;P123456P -bot0204@dev.com;P123456P -bot0205@dev.com;P123456P -bot0206@dev.com;P123456P -bot0207@dev.com;P123456P -bot0208@dev.com;P123456P -bot0209@dev.com;P123456P -bot0210@dev.com;P123456P -bot0211@dev.com;P123456P -bot0212@dev.com;P123456P -bot0213@dev.com;P123456P -bot0214@dev.com;P123456P -bot0215@dev.com;P123456P -bot0216@dev.com;P123456P -bot0217@dev.com;P123456P -bot0218@dev.com;P123456P -bot0219@dev.com;P123456P -bot0220@dev.com;P123456P -bot0221@dev.com;P123456P -bot0222@dev.com;P123456P -bot0223@dev.com;P123456P -bot0224@dev.com;P123456P -bot0225@dev.com;P123456P -bot0226@dev.com;P123456P -bot0227@dev.com;P123456P -bot0228@dev.com;P123456P -bot0229@dev.com;P123456P -bot0230@dev.com;P123456P -bot0231@dev.com;P123456P -bot0232@dev.com;P123456P -bot0233@dev.com;P123456P -bot0234@dev.com;P123456P -bot0235@dev.com;P123456P -bot0236@dev.com;P123456P -bot0237@dev.com;P123456P -bot0238@dev.com;P123456P -bot0239@dev.com;P123456P -bot0240@dev.com;P123456P -bot0241@dev.com;P123456P -bot0242@dev.com;P123456P -bot0243@dev.com;P123456P -bot0244@dev.com;P123456P -bot0245@dev.com;P123456P -bot0246@dev.com;P123456P -bot0247@dev.com;P123456P -bot0248@dev.com;P123456P -bot0249@dev.com;P123456P -bot0250@dev.com;P123456P -bot0251@dev.com;P123456P -bot0252@dev.com;P123456P -bot0253@dev.com;P123456P -bot0254@dev.com;P123456P -bot0255@dev.com;P123456P -bot0256@dev.com;P123456P -bot0257@dev.com;P123456P -bot0258@dev.com;P123456P -bot0259@dev.com;P123456P -bot0260@dev.com;P123456P -bot0261@dev.com;P123456P -bot0262@dev.com;P123456P -bot0263@dev.com;P123456P -bot0264@dev.com;P123456P -bot0265@dev.com;P123456P -bot0266@dev.com;P123456P -bot0267@dev.com;P123456P -bot0268@dev.com;P123456P -bot0269@dev.com;P123456P -bot0270@dev.com;P123456P -bot0271@dev.com;P123456P -bot0272@dev.com;P123456P -bot0273@dev.com;P123456P -bot0274@dev.com;P123456P -bot0275@dev.com;P123456P -bot0276@dev.com;P123456P -bot0277@dev.com;P123456P -bot0278@dev.com;P123456P -bot0279@dev.com;P123456P -bot0280@dev.com;P123456P -bot0281@dev.com;P123456P -bot0282@dev.com;P123456P -bot0283@dev.com;P123456P -bot0284@dev.com;P123456P -bot0285@dev.com;P123456P -bot0286@dev.com;P123456P -bot0287@dev.com;P123456P -bot0288@dev.com;P123456P -bot0289@dev.com;P123456P -bot0290@dev.com;P123456P -bot0291@dev.com;P123456P -bot0292@dev.com;P123456P -bot0293@dev.com;P123456P -bot0294@dev.com;P123456P -bot0295@dev.com;P123456P -bot0296@dev.com;P123456P -bot0297@dev.com;P123456P -bot0298@dev.com;P123456P -bot0299@dev.com;P123456P -bot0300@dev.com;P123456P -bot0301@dev.com;P123456P -bot0302@dev.com;P123456P -bot0303@dev.com;P123456P -bot0304@dev.com;P123456P -bot0305@dev.com;P123456P -bot0306@dev.com;P123456P -bot0307@dev.com;P123456P -bot0308@dev.com;P123456P -bot0309@dev.com;P123456P -bot0310@dev.com;P123456P -bot0311@dev.com;P123456P -bot0312@dev.com;P123456P -bot0313@dev.com;P123456P -bot0314@dev.com;P123456P -bot0315@dev.com;P123456P -bot0316@dev.com;P123456P -bot0317@dev.com;P123456P -bot0318@dev.com;P123456P -bot0319@dev.com;P123456P -bot0320@dev.com;P123456P -bot0321@dev.com;P123456P -bot0322@dev.com;P123456P -bot0323@dev.com;P123456P -bot0324@dev.com;P123456P -bot0325@dev.com;P123456P -bot0326@dev.com;P123456P -bot0327@dev.com;P123456P -bot0328@dev.com;P123456P -bot0329@dev.com;P123456P -bot0330@dev.com;P123456P -bot0331@dev.com;P123456P -bot0332@dev.com;P123456P -bot0333@dev.com;P123456P -bot0334@dev.com;P123456P -bot0335@dev.com;P123456P -bot0336@dev.com;P123456P -bot0337@dev.com;P123456P -bot0338@dev.com;P123456P -bot0339@dev.com;P123456P -bot0340@dev.com;P123456P -bot0341@dev.com;P123456P -bot0342@dev.com;P123456P -bot0343@dev.com;P123456P -bot0344@dev.com;P123456P -bot0345@dev.com;P123456P -bot0346@dev.com;P123456P -bot0347@dev.com;P123456P -bot0348@dev.com;P123456P -bot0349@dev.com;P123456P -bot0350@dev.com;P123456P -bot0351@dev.com;P123456P -bot0352@dev.com;P123456P -bot0353@dev.com;P123456P -bot0354@dev.com;P123456P -bot0355@dev.com;P123456P -bot0356@dev.com;P123456P -bot0357@dev.com;P123456P -bot0358@dev.com;P123456P -bot0359@dev.com;P123456P -bot0360@dev.com;P123456P -bot0361@dev.com;P123456P -bot0362@dev.com;P123456P -bot0363@dev.com;P123456P -bot0364@dev.com;P123456P -bot0365@dev.com;P123456P -bot0366@dev.com;P123456P -bot0367@dev.com;P123456P -bot0368@dev.com;P123456P -bot0369@dev.com;P123456P -bot0370@dev.com;P123456P -bot0371@dev.com;P123456P -bot0372@dev.com;P123456P -bot0373@dev.com;P123456P -bot0374@dev.com;P123456P -bot0375@dev.com;P123456P -bot0376@dev.com;P123456P -bot0377@dev.com;P123456P -bot0378@dev.com;P123456P -bot0379@dev.com;P123456P -bot0380@dev.com;P123456P -bot0381@dev.com;P123456P -bot0382@dev.com;P123456P -bot0383@dev.com;P123456P -bot0384@dev.com;P123456P -bot0385@dev.com;P123456P -bot0386@dev.com;P123456P -bot0387@dev.com;P123456P -bot0388@dev.com;P123456P -bot0389@dev.com;P123456P -bot0390@dev.com;P123456P -bot0391@dev.com;P123456P -bot0392@dev.com;P123456P -bot0393@dev.com;P123456P -bot0394@dev.com;P123456P -bot0395@dev.com;P123456P -bot0396@dev.com;P123456P -bot0397@dev.com;P123456P -bot0398@dev.com;P123456P -bot0399@dev.com;P123456P -bot0400@dev.com;P123456P -bot0401@dev.com;P123456P -bot0402@dev.com;P123456P -bot0403@dev.com;P123456P -bot0404@dev.com;P123456P -bot0405@dev.com;P123456P -bot0406@dev.com;P123456P -bot0407@dev.com;P123456P -bot0408@dev.com;P123456P -bot0409@dev.com;P123456P -bot0410@dev.com;P123456P -bot0411@dev.com;P123456P -bot0412@dev.com;P123456P -bot0413@dev.com;P123456P -bot0414@dev.com;P123456P -bot0415@dev.com;P123456P -bot0416@dev.com;P123456P -bot0417@dev.com;P123456P -bot0418@dev.com;P123456P -bot0419@dev.com;P123456P -bot0420@dev.com;P123456P -bot0421@dev.com;P123456P -bot0422@dev.com;P123456P -bot0423@dev.com;P123456P -bot0424@dev.com;P123456P -bot0425@dev.com;P123456P -bot0426@dev.com;P123456P -bot0427@dev.com;P123456P -bot0428@dev.com;P123456P -bot0429@dev.com;P123456P -bot0430@dev.com;P123456P -bot0431@dev.com;P123456P -bot0432@dev.com;P123456P -bot0433@dev.com;P123456P -bot0434@dev.com;P123456P -bot0435@dev.com;P123456P -bot0436@dev.com;P123456P -bot0437@dev.com;P123456P -bot0438@dev.com;P123456P -bot0439@dev.com;P123456P -bot0440@dev.com;P123456P -bot0441@dev.com;P123456P -bot0442@dev.com;P123456P -bot0443@dev.com;P123456P -bot0444@dev.com;P123456P -bot0445@dev.com;P123456P -bot0446@dev.com;P123456P -bot0447@dev.com;P123456P -bot0448@dev.com;P123456P -bot0449@dev.com;P123456P -bot0450@dev.com;P123456P -bot0451@dev.com;P123456P -bot0452@dev.com;P123456P -bot0453@dev.com;P123456P -bot0454@dev.com;P123456P -bot0455@dev.com;P123456P -bot0456@dev.com;P123456P -bot0457@dev.com;P123456P -bot0458@dev.com;P123456P -bot0459@dev.com;P123456P -bot0460@dev.com;P123456P -bot0461@dev.com;P123456P -bot0462@dev.com;P123456P -bot0463@dev.com;P123456P -bot0464@dev.com;P123456P -bot0465@dev.com;P123456P -bot0466@dev.com;P123456P -bot0467@dev.com;P123456P -bot0468@dev.com;P123456P -bot0469@dev.com;P123456P -bot0470@dev.com;P123456P -bot0471@dev.com;P123456P -bot0472@dev.com;P123456P -bot0473@dev.com;P123456P -bot0474@dev.com;P123456P -bot0475@dev.com;P123456P -bot0476@dev.com;P123456P -bot0477@dev.com;P123456P -bot0478@dev.com;P123456P -bot0479@dev.com;P123456P -bot0480@dev.com;P123456P -bot0481@dev.com;P123456P -bot0482@dev.com;P123456P -bot0483@dev.com;P123456P -bot0484@dev.com;P123456P -bot0485@dev.com;P123456P -bot0486@dev.com;P123456P -bot0487@dev.com;P123456P -bot0488@dev.com;P123456P -bot0489@dev.com;P123456P -bot0490@dev.com;P123456P -bot0491@dev.com;P123456P -bot0492@dev.com;P123456P -bot0493@dev.com;P123456P -bot0494@dev.com;P123456P -bot0495@dev.com;P123456P -bot0496@dev.com;P123456P -bot0497@dev.com;P123456P -bot0498@dev.com;P123456P -bot0499@dev.com;P123456P -bot0500@dev.com;P123456P -bot0501@dev.com;P123456P -bot0502@dev.com;P123456P -bot0503@dev.com;P123456P -bot0504@dev.com;P123456P -bot0505@dev.com;P123456P -bot0506@dev.com;P123456P -bot0507@dev.com;P123456P -bot0508@dev.com;P123456P -bot0509@dev.com;P123456P -bot0510@dev.com;P123456P -bot0511@dev.com;P123456P -bot0512@dev.com;P123456P -bot0513@dev.com;P123456P -bot0514@dev.com;P123456P -bot0515@dev.com;P123456P -bot0516@dev.com;P123456P -bot0517@dev.com;P123456P -bot0518@dev.com;P123456P -bot0519@dev.com;P123456P -bot0520@dev.com;P123456P -bot0521@dev.com;P123456P -bot0522@dev.com;P123456P -bot0523@dev.com;P123456P -bot0524@dev.com;P123456P -bot0525@dev.com;P123456P -bot0526@dev.com;P123456P -bot0527@dev.com;P123456P -bot0528@dev.com;P123456P -bot0529@dev.com;P123456P -bot0530@dev.com;P123456P -bot0531@dev.com;P123456P -bot0532@dev.com;P123456P -bot0533@dev.com;P123456P -bot0534@dev.com;P123456P -bot0535@dev.com;P123456P -bot0536@dev.com;P123456P -bot0537@dev.com;P123456P -bot0538@dev.com;P123456P -bot0539@dev.com;P123456P -bot0540@dev.com;P123456P -bot0541@dev.com;P123456P -bot0542@dev.com;P123456P -bot0543@dev.com;P123456P -bot0544@dev.com;P123456P -bot0545@dev.com;P123456P -bot0546@dev.com;P123456P -bot0547@dev.com;P123456P -bot0548@dev.com;P123456P -bot0549@dev.com;P123456P -bot0550@dev.com;P123456P -bot0551@dev.com;P123456P -bot0552@dev.com;P123456P -bot0553@dev.com;P123456P -bot0554@dev.com;P123456P -bot0555@dev.com;P123456P -bot0556@dev.com;P123456P -bot0557@dev.com;P123456P -bot0558@dev.com;P123456P -bot0559@dev.com;P123456P -bot0560@dev.com;P123456P -bot0561@dev.com;P123456P -bot0562@dev.com;P123456P -bot0563@dev.com;P123456P -bot0564@dev.com;P123456P -bot0565@dev.com;P123456P -bot0566@dev.com;P123456P -bot0567@dev.com;P123456P -bot0568@dev.com;P123456P -bot0569@dev.com;P123456P -bot0570@dev.com;P123456P -bot0571@dev.com;P123456P -bot0572@dev.com;P123456P -bot0573@dev.com;P123456P -bot0574@dev.com;P123456P -bot0575@dev.com;P123456P -bot0576@dev.com;P123456P -bot0577@dev.com;P123456P -bot0578@dev.com;P123456P -bot0579@dev.com;P123456P -bot0580@dev.com;P123456P -bot0581@dev.com;P123456P -bot0582@dev.com;P123456P -bot0583@dev.com;P123456P -bot0584@dev.com;P123456P -bot0585@dev.com;P123456P -bot0586@dev.com;P123456P -bot0587@dev.com;P123456P -bot0588@dev.com;P123456P -bot0589@dev.com;P123456P -bot0590@dev.com;P123456P -bot0591@dev.com;P123456P -bot0592@dev.com;P123456P -bot0593@dev.com;P123456P -bot0594@dev.com;P123456P -bot0595@dev.com;P123456P -bot0596@dev.com;P123456P -bot0597@dev.com;P123456P -bot0598@dev.com;P123456P -bot0599@dev.com;P123456P -bot0600@dev.com;P123456P -bot0601@dev.com;P123456P -bot0602@dev.com;P123456P -bot0603@dev.com;P123456P -bot0604@dev.com;P123456P -bot0605@dev.com;P123456P -bot0606@dev.com;P123456P -bot0607@dev.com;P123456P -bot0608@dev.com;P123456P -bot0609@dev.com;P123456P -bot0610@dev.com;P123456P -bot0611@dev.com;P123456P -bot0612@dev.com;P123456P -bot0613@dev.com;P123456P -bot0614@dev.com;P123456P -bot0615@dev.com;P123456P -bot0616@dev.com;P123456P -bot0617@dev.com;P123456P -bot0618@dev.com;P123456P -bot0619@dev.com;P123456P -bot0620@dev.com;P123456P -bot0621@dev.com;P123456P -bot0622@dev.com;P123456P -bot0623@dev.com;P123456P -bot0624@dev.com;P123456P -bot0625@dev.com;P123456P -bot0626@dev.com;P123456P -bot0627@dev.com;P123456P -bot0628@dev.com;P123456P -bot0629@dev.com;P123456P -bot0630@dev.com;P123456P -bot0631@dev.com;P123456P -bot0632@dev.com;P123456P -bot0633@dev.com;P123456P -bot0634@dev.com;P123456P -bot0635@dev.com;P123456P -bot0636@dev.com;P123456P -bot0637@dev.com;P123456P -bot0638@dev.com;P123456P -bot0639@dev.com;P123456P -bot0640@dev.com;P123456P -bot0641@dev.com;P123456P -bot0642@dev.com;P123456P -bot0643@dev.com;P123456P -bot0644@dev.com;P123456P -bot0645@dev.com;P123456P -bot0646@dev.com;P123456P -bot0647@dev.com;P123456P -bot0648@dev.com;P123456P -bot0649@dev.com;P123456P -bot0650@dev.com;P123456P -bot0651@dev.com;P123456P -bot0652@dev.com;P123456P -bot0653@dev.com;P123456P -bot0654@dev.com;P123456P -bot0655@dev.com;P123456P -bot0656@dev.com;P123456P -bot0657@dev.com;P123456P -bot0658@dev.com;P123456P -bot0659@dev.com;P123456P -bot0660@dev.com;P123456P -bot0661@dev.com;P123456P -bot0662@dev.com;P123456P -bot0663@dev.com;P123456P -bot0664@dev.com;P123456P -bot0665@dev.com;P123456P -bot0666@dev.com;P123456P -bot0667@dev.com;P123456P -bot0668@dev.com;P123456P -bot0669@dev.com;P123456P -bot0670@dev.com;P123456P -bot0671@dev.com;P123456P -bot0672@dev.com;P123456P -bot0673@dev.com;P123456P -bot0674@dev.com;P123456P -bot0675@dev.com;P123456P -bot0676@dev.com;P123456P -bot0677@dev.com;P123456P -bot0678@dev.com;P123456P -bot0679@dev.com;P123456P -bot0680@dev.com;P123456P -bot0681@dev.com;P123456P -bot0682@dev.com;P123456P -bot0683@dev.com;P123456P -bot0684@dev.com;P123456P -bot0685@dev.com;P123456P -bot0686@dev.com;P123456P -bot0687@dev.com;P123456P -bot0688@dev.com;P123456P -bot0689@dev.com;P123456P -bot0690@dev.com;P123456P -bot0691@dev.com;P123456P -bot0692@dev.com;P123456P -bot0693@dev.com;P123456P -bot0694@dev.com;P123456P -bot0695@dev.com;P123456P -bot0696@dev.com;P123456P -bot0697@dev.com;P123456P -bot0698@dev.com;P123456P -bot0699@dev.com;P123456P -bot0700@dev.com;P123456P -bot0701@dev.com;P123456P -bot0702@dev.com;P123456P -bot0703@dev.com;P123456P -bot0704@dev.com;P123456P -bot0705@dev.com;P123456P -bot0706@dev.com;P123456P -bot0707@dev.com;P123456P -bot0708@dev.com;P123456P -bot0709@dev.com;P123456P -bot0710@dev.com;P123456P -bot0711@dev.com;P123456P -bot0712@dev.com;P123456P -bot0713@dev.com;P123456P -bot0714@dev.com;P123456P -bot0715@dev.com;P123456P -bot0716@dev.com;P123456P -bot0717@dev.com;P123456P -bot0718@dev.com;P123456P -bot0719@dev.com;P123456P -bot0720@dev.com;P123456P -bot0721@dev.com;P123456P -bot0722@dev.com;P123456P -bot0723@dev.com;P123456P -bot0724@dev.com;P123456P -bot0725@dev.com;P123456P -bot0726@dev.com;P123456P -bot0727@dev.com;P123456P -bot0728@dev.com;P123456P -bot0729@dev.com;P123456P -bot0730@dev.com;P123456P -bot0731@dev.com;P123456P -bot0732@dev.com;P123456P -bot0733@dev.com;P123456P -bot0734@dev.com;P123456P -bot0735@dev.com;P123456P -bot0736@dev.com;P123456P -bot0737@dev.com;P123456P -bot0738@dev.com;P123456P -bot0739@dev.com;P123456P -bot0740@dev.com;P123456P -bot0741@dev.com;P123456P -bot0742@dev.com;P123456P -bot0743@dev.com;P123456P -bot0744@dev.com;P123456P -bot0745@dev.com;P123456P -bot0746@dev.com;P123456P -bot0747@dev.com;P123456P -bot0748@dev.com;P123456P -bot0749@dev.com;P123456P -bot0750@dev.com;P123456P -bot0751@dev.com;P123456P -bot0752@dev.com;P123456P -bot0753@dev.com;P123456P -bot0754@dev.com;P123456P -bot0755@dev.com;P123456P -bot0756@dev.com;P123456P -bot0757@dev.com;P123456P -bot0758@dev.com;P123456P -bot0759@dev.com;P123456P -bot0760@dev.com;P123456P -bot0761@dev.com;P123456P -bot0762@dev.com;P123456P -bot0763@dev.com;P123456P -bot0764@dev.com;P123456P -bot0765@dev.com;P123456P -bot0766@dev.com;P123456P -bot0767@dev.com;P123456P -bot0768@dev.com;P123456P -bot0769@dev.com;P123456P -bot0770@dev.com;P123456P -bot0771@dev.com;P123456P -bot0772@dev.com;P123456P -bot0773@dev.com;P123456P -bot0774@dev.com;P123456P -bot0775@dev.com;P123456P -bot0776@dev.com;P123456P -bot0777@dev.com;P123456P -bot0778@dev.com;P123456P -bot0779@dev.com;P123456P -bot0780@dev.com;P123456P -bot0781@dev.com;P123456P -bot0782@dev.com;P123456P -bot0783@dev.com;P123456P -bot0784@dev.com;P123456P -bot0785@dev.com;P123456P -bot0786@dev.com;P123456P -bot0787@dev.com;P123456P -bot0788@dev.com;P123456P -bot0789@dev.com;P123456P -bot0790@dev.com;P123456P -bot0791@dev.com;P123456P -bot0792@dev.com;P123456P -bot0793@dev.com;P123456P -bot0794@dev.com;P123456P -bot0795@dev.com;P123456P -bot0796@dev.com;P123456P -bot0797@dev.com;P123456P -bot0798@dev.com;P123456P -bot0799@dev.com;P123456P -bot0800@dev.com;P123456P -bot0801@dev.com;P123456P -bot0802@dev.com;P123456P -bot0803@dev.com;P123456P -bot0804@dev.com;P123456P -bot0805@dev.com;P123456P -bot0806@dev.com;P123456P -bot0807@dev.com;P123456P -bot0808@dev.com;P123456P -bot0809@dev.com;P123456P -bot0810@dev.com;P123456P -bot0811@dev.com;P123456P -bot0812@dev.com;P123456P -bot0813@dev.com;P123456P -bot0814@dev.com;P123456P -bot0815@dev.com;P123456P -bot0816@dev.com;P123456P -bot0817@dev.com;P123456P -bot0818@dev.com;P123456P -bot0819@dev.com;P123456P -bot0820@dev.com;P123456P -bot0821@dev.com;P123456P -bot0822@dev.com;P123456P -bot0823@dev.com;P123456P -bot0824@dev.com;P123456P -bot0825@dev.com;P123456P -bot0826@dev.com;P123456P -bot0827@dev.com;P123456P -bot0828@dev.com;P123456P -bot0829@dev.com;P123456P -bot0830@dev.com;P123456P -bot0831@dev.com;P123456P -bot0832@dev.com;P123456P -bot0833@dev.com;P123456P -bot0834@dev.com;P123456P -bot0835@dev.com;P123456P -bot0836@dev.com;P123456P -bot0837@dev.com;P123456P -bot0838@dev.com;P123456P -bot0839@dev.com;P123456P -bot0840@dev.com;P123456P -bot0841@dev.com;P123456P -bot0842@dev.com;P123456P -bot0843@dev.com;P123456P -bot0844@dev.com;P123456P -bot0845@dev.com;P123456P -bot0846@dev.com;P123456P -bot0847@dev.com;P123456P -bot0848@dev.com;P123456P -bot0849@dev.com;P123456P -bot0850@dev.com;P123456P -bot0851@dev.com;P123456P -bot0852@dev.com;P123456P -bot0853@dev.com;P123456P -bot0854@dev.com;P123456P -bot0855@dev.com;P123456P -bot0856@dev.com;P123456P -bot0857@dev.com;P123456P -bot0858@dev.com;P123456P -bot0859@dev.com;P123456P -bot0860@dev.com;P123456P -bot0861@dev.com;P123456P -bot0862@dev.com;P123456P -bot0863@dev.com;P123456P -bot0864@dev.com;P123456P -bot0865@dev.com;P123456P -bot0866@dev.com;P123456P -bot0867@dev.com;P123456P -bot0868@dev.com;P123456P -bot0869@dev.com;P123456P -bot0870@dev.com;P123456P -bot0871@dev.com;P123456P -bot0872@dev.com;P123456P -bot0873@dev.com;P123456P -bot0874@dev.com;P123456P -bot0875@dev.com;P123456P -bot0876@dev.com;P123456P -bot0877@dev.com;P123456P -bot0878@dev.com;P123456P -bot0879@dev.com;P123456P -bot0880@dev.com;P123456P -bot0881@dev.com;P123456P -bot0882@dev.com;P123456P -bot0883@dev.com;P123456P -bot0884@dev.com;P123456P -bot0885@dev.com;P123456P -bot0886@dev.com;P123456P -bot0887@dev.com;P123456P -bot0888@dev.com;P123456P -bot0889@dev.com;P123456P -bot0890@dev.com;P123456P -bot0891@dev.com;P123456P -bot0892@dev.com;P123456P -bot0893@dev.com;P123456P -bot0894@dev.com;P123456P -bot0895@dev.com;P123456P -bot0896@dev.com;P123456P -bot0897@dev.com;P123456P -bot0898@dev.com;P123456P -bot0899@dev.com;P123456P -bot0900@dev.com;P123456P -bot0901@dev.com;P123456P -bot0902@dev.com;P123456P -bot0903@dev.com;P123456P -bot0904@dev.com;P123456P -bot0905@dev.com;P123456P -bot0906@dev.com;P123456P -bot0907@dev.com;P123456P -bot0908@dev.com;P123456P -bot0909@dev.com;P123456P -bot0910@dev.com;P123456P -bot0911@dev.com;P123456P -bot0912@dev.com;P123456P -bot0913@dev.com;P123456P -bot0914@dev.com;P123456P -bot0915@dev.com;P123456P -bot0916@dev.com;P123456P -bot0917@dev.com;P123456P -bot0918@dev.com;P123456P -bot0919@dev.com;P123456P -bot0920@dev.com;P123456P -bot0921@dev.com;P123456P -bot0922@dev.com;P123456P -bot0923@dev.com;P123456P -bot0924@dev.com;P123456P -bot0925@dev.com;P123456P -bot0926@dev.com;P123456P -bot0927@dev.com;P123456P -bot0928@dev.com;P123456P -bot0929@dev.com;P123456P -bot0930@dev.com;P123456P -bot0931@dev.com;P123456P -bot0932@dev.com;P123456P -bot0933@dev.com;P123456P -bot0934@dev.com;P123456P -bot0935@dev.com;P123456P -bot0936@dev.com;P123456P -bot0937@dev.com;P123456P -bot0938@dev.com;P123456P -bot0939@dev.com;P123456P -bot0940@dev.com;P123456P -bot0941@dev.com;P123456P -bot0942@dev.com;P123456P -bot0943@dev.com;P123456P -bot0944@dev.com;P123456P -bot0945@dev.com;P123456P -bot0946@dev.com;P123456P -bot0947@dev.com;P123456P -bot0948@dev.com;P123456P -bot0949@dev.com;P123456P -bot0950@dev.com;P123456P -bot0951@dev.com;P123456P -bot0952@dev.com;P123456P -bot0953@dev.com;P123456P -bot0954@dev.com;P123456P -bot0955@dev.com;P123456P -bot0956@dev.com;P123456P -bot0957@dev.com;P123456P -bot0958@dev.com;P123456P -bot0959@dev.com;P123456P -bot0960@dev.com;P123456P -bot0961@dev.com;P123456P -bot0962@dev.com;P123456P -bot0963@dev.com;P123456P -bot0964@dev.com;P123456P -bot0965@dev.com;P123456P -bot0966@dev.com;P123456P -bot0967@dev.com;P123456P -bot0968@dev.com;P123456P -bot0969@dev.com;P123456P -bot0970@dev.com;P123456P -bot0971@dev.com;P123456P -bot0972@dev.com;P123456P -bot0973@dev.com;P123456P -bot0974@dev.com;P123456P -bot0975@dev.com;P123456P -bot0976@dev.com;P123456P -bot0977@dev.com;P123456P -bot0978@dev.com;P123456P -bot0979@dev.com;P123456P -bot0980@dev.com;P123456P -bot0981@dev.com;P123456P -bot0982@dev.com;P123456P -bot0983@dev.com;P123456P -bot0984@dev.com;P123456P -bot0985@dev.com;P123456P -bot0986@dev.com;P123456P -bot0987@dev.com;P123456P -bot0988@dev.com;P123456P -bot0989@dev.com;P123456P -bot0990@dev.com;P123456P -bot0991@dev.com;P123456P -bot0992@dev.com;P123456P -bot0993@dev.com;P123456P -bot0994@dev.com;P123456P -bot0995@dev.com;P123456P -bot0996@dev.com;P123456P -bot0997@dev.com;P123456P -bot0998@dev.com;P123456P -bot0999@dev.com;P123456P -bot1000@dev.com;P123456P \ No newline at end of file diff --git a/src/MarginTrading.Client/docker-compose.yml b/src/MarginTrading.Client/docker-compose.yml deleted file mode 100644 index fe358a0ef..000000000 --- a/src/MarginTrading.Client/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: '2' -services: - margintradingclient: - image: lykkedev/margintradingclient - container_name: margintradingclient - command: -b - environment: - - SettingsUrl=${SettingsUrl} - networks: - mynet: - aliases: - - margintradingclient - -networks: - mynet: - driver: bridge diff --git a/src/MarginTrading.Client/prodUsers.csv b/src/MarginTrading.Client/prodUsers.csv deleted file mode 100644 index 6d3a3d6e0..000000000 --- a/src/MarginTrading.Client/prodUsers.csv +++ /dev/null @@ -1,1001 +0,0 @@ -Email;Password -bot0001@dev.com;P123456P -bot0002@dev.com;P123456P -bot0003@dev.com;P123456P -bot0004@dev.com;P123456P -bot0005@dev.com;P123456P -bot0006@dev.com;P123456P -bot0007@dev.com;P123456P -bot0008@dev.com;P123456P -bot0009@dev.com;P123456P -bot0010@dev.com;P123456P -bot0011@dev.com;P123456P -bot0012@dev.com;P123456P -bot0013@dev.com;P123456P -bot0014@dev.com;P123456P -bot0015@dev.com;P123456P -bot0016@dev.com;P123456P -bot0017@dev.com;P123456P -bot0018@dev.com;P123456P -bot0019@dev.com;P123456P -bot0020@dev.com;P123456P -bot0021@dev.com;P123456P -bot0022@dev.com;P123456P -bot0023@dev.com;P123456P -bot0024@dev.com;P123456P -bot0025@dev.com;P123456P -bot0026@dev.com;P123456P -bot0027@dev.com;P123456P -bot0028@dev.com;P123456P -bot0029@dev.com;P123456P -bot0030@dev.com;P123456P -bot0031@dev.com;P123456P -bot0032@dev.com;P123456P -bot0033@dev.com;P123456P -bot0034@dev.com;P123456P -bot0035@dev.com;P123456P -bot0036@dev.com;P123456P -bot0037@dev.com;P123456P -bot0038@dev.com;P123456P -bot0039@dev.com;P123456P -bot0040@dev.com;P123456P -bot0041@dev.com;P123456P -bot0042@dev.com;P123456P -bot0043@dev.com;P123456P -bot0044@dev.com;P123456P -bot0045@dev.com;P123456P -bot0046@dev.com;P123456P -bot0047@dev.com;P123456P -bot0048@dev.com;P123456P -bot0049@dev.com;P123456P -bot0050@dev.com;P123456P -bot0051@dev.com;P123456P -bot0052@dev.com;P123456P -bot0053@dev.com;P123456P -bot0054@dev.com;P123456P -bot0055@dev.com;P123456P -bot0056@dev.com;P123456P -bot0057@dev.com;P123456P -bot0058@dev.com;P123456P -bot0059@dev.com;P123456P -bot0060@dev.com;P123456P -bot0061@dev.com;P123456P -bot0062@dev.com;P123456P -bot0063@dev.com;P123456P -bot0064@dev.com;P123456P -bot0065@dev.com;P123456P -bot0066@dev.com;P123456P -bot0067@dev.com;P123456P -bot0068@dev.com;P123456P -bot0069@dev.com;P123456P -bot0070@dev.com;P123456P -bot0071@dev.com;P123456P -bot0072@dev.com;P123456P -bot0073@dev.com;P123456P -bot0074@dev.com;P123456P -bot0075@dev.com;P123456P -bot0076@dev.com;P123456P -bot0077@dev.com;P123456P -bot0078@dev.com;P123456P -bot0079@dev.com;P123456P -bot0080@dev.com;P123456P -bot0081@dev.com;P123456P -bot0082@dev.com;P123456P -bot0083@dev.com;P123456P -bot0084@dev.com;P123456P -bot0085@dev.com;P123456P -bot0086@dev.com;P123456P -bot0087@dev.com;P123456P -bot0088@dev.com;P123456P -bot0089@dev.com;P123456P -bot0090@dev.com;P123456P -bot0091@dev.com;P123456P -bot0092@dev.com;P123456P -bot0093@dev.com;P123456P -bot0094@dev.com;P123456P -bot0095@dev.com;P123456P -bot0096@dev.com;P123456P -bot0097@dev.com;P123456P -bot0098@dev.com;P123456P -bot0099@dev.com;P123456P -bot0100@dev.com;P123456P -bot0101@dev.com;P123456P -bot0102@dev.com;P123456P -bot0103@dev.com;P123456P -bot0104@dev.com;P123456P -bot0105@dev.com;P123456P -bot0106@dev.com;P123456P -bot0107@dev.com;P123456P -bot0108@dev.com;P123456P -bot0109@dev.com;P123456P -bot0110@dev.com;P123456P -bot0111@dev.com;P123456P -bot0112@dev.com;P123456P -bot0113@dev.com;P123456P -bot0114@dev.com;P123456P -bot0115@dev.com;P123456P -bot0116@dev.com;P123456P -bot0117@dev.com;P123456P -bot0118@dev.com;P123456P -bot0119@dev.com;P123456P -bot0120@dev.com;P123456P -bot0121@dev.com;P123456P -bot0122@dev.com;P123456P -bot0123@dev.com;P123456P -bot0124@dev.com;P123456P -bot0125@dev.com;P123456P -bot0126@dev.com;P123456P -bot0127@dev.com;P123456P -bot0128@dev.com;P123456P -bot0129@dev.com;P123456P -bot0130@dev.com;P123456P -bot0131@dev.com;P123456P -bot0132@dev.com;P123456P -bot0133@dev.com;P123456P -bot0134@dev.com;P123456P -bot0135@dev.com;P123456P -bot0136@dev.com;P123456P -bot0137@dev.com;P123456P -bot0138@dev.com;P123456P -bot0139@dev.com;P123456P -bot0140@dev.com;P123456P -bot0141@dev.com;P123456P -bot0142@dev.com;P123456P -bot0143@dev.com;P123456P -bot0144@dev.com;P123456P -bot0145@dev.com;P123456P -bot0146@dev.com;P123456P -bot0147@dev.com;P123456P -bot0148@dev.com;P123456P -bot0149@dev.com;P123456P -bot0150@dev.com;P123456P -bot0151@dev.com;P123456P -bot0152@dev.com;P123456P -bot0153@dev.com;P123456P -bot0154@dev.com;P123456P -bot0155@dev.com;P123456P -bot0156@dev.com;P123456P -bot0157@dev.com;P123456P -bot0158@dev.com;P123456P -bot0159@dev.com;P123456P -bot0160@dev.com;P123456P -bot0161@dev.com;P123456P -bot0162@dev.com;P123456P -bot0163@dev.com;P123456P -bot0164@dev.com;P123456P -bot0165@dev.com;P123456P -bot0166@dev.com;P123456P -bot0167@dev.com;P123456P -bot0168@dev.com;P123456P -bot0169@dev.com;P123456P -bot0170@dev.com;P123456P -bot0171@dev.com;P123456P -bot0172@dev.com;P123456P -bot0173@dev.com;P123456P -bot0174@dev.com;P123456P -bot0175@dev.com;P123456P -bot0176@dev.com;P123456P -bot0177@dev.com;P123456P -bot0178@dev.com;P123456P -bot0179@dev.com;P123456P -bot0180@dev.com;P123456P -bot0181@dev.com;P123456P -bot0182@dev.com;P123456P -bot0183@dev.com;P123456P -bot0184@dev.com;P123456P -bot0185@dev.com;P123456P -bot0186@dev.com;P123456P -bot0187@dev.com;P123456P -bot0188@dev.com;P123456P -bot0189@dev.com;P123456P -bot0190@dev.com;P123456P -bot0191@dev.com;P123456P -bot0192@dev.com;P123456P -bot0193@dev.com;P123456P -bot0194@dev.com;P123456P -bot0195@dev.com;P123456P -bot0196@dev.com;P123456P -bot0197@dev.com;P123456P -bot0198@dev.com;P123456P -bot0199@dev.com;P123456P -bot0200@dev.com;P123456P -bot0201@dev.com;P123456P -bot0202@dev.com;P123456P -bot0203@dev.com;P123456P -bot0204@dev.com;P123456P -bot0205@dev.com;P123456P -bot0206@dev.com;P123456P -bot0207@dev.com;P123456P -bot0208@dev.com;P123456P -bot0209@dev.com;P123456P -bot0210@dev.com;P123456P -bot0211@dev.com;P123456P -bot0212@dev.com;P123456P -bot0213@dev.com;P123456P -bot0214@dev.com;P123456P -bot0215@dev.com;P123456P -bot0216@dev.com;P123456P -bot0217@dev.com;P123456P -bot0218@dev.com;P123456P -bot0219@dev.com;P123456P -bot0220@dev.com;P123456P -bot0221@dev.com;P123456P -bot0222@dev.com;P123456P -bot0223@dev.com;P123456P -bot0224@dev.com;P123456P -bot0225@dev.com;P123456P -bot0226@dev.com;P123456P -bot0227@dev.com;P123456P -bot0228@dev.com;P123456P -bot0229@dev.com;P123456P -bot0230@dev.com;P123456P -bot0231@dev.com;P123456P -bot0232@dev.com;P123456P -bot0233@dev.com;P123456P -bot0234@dev.com;P123456P -bot0235@dev.com;P123456P -bot0236@dev.com;P123456P -bot0237@dev.com;P123456P -bot0238@dev.com;P123456P -bot0239@dev.com;P123456P -bot0240@dev.com;P123456P -bot0241@dev.com;P123456P -bot0242@dev.com;P123456P -bot0243@dev.com;P123456P -bot0244@dev.com;P123456P -bot0245@dev.com;P123456P -bot0246@dev.com;P123456P -bot0247@dev.com;P123456P -bot0248@dev.com;P123456P -bot0249@dev.com;P123456P -bot0250@dev.com;P123456P -bot0251@dev.com;P123456P -bot0252@dev.com;P123456P -bot0253@dev.com;P123456P -bot0254@dev.com;P123456P -bot0255@dev.com;P123456P -bot0256@dev.com;P123456P -bot0257@dev.com;P123456P -bot0258@dev.com;P123456P -bot0259@dev.com;P123456P -bot0260@dev.com;P123456P -bot0261@dev.com;P123456P -bot0262@dev.com;P123456P -bot0263@dev.com;P123456P -bot0264@dev.com;P123456P -bot0265@dev.com;P123456P -bot0266@dev.com;P123456P -bot0267@dev.com;P123456P -bot0268@dev.com;P123456P -bot0269@dev.com;P123456P -bot0270@dev.com;P123456P -bot0271@dev.com;P123456P -bot0272@dev.com;P123456P -bot0273@dev.com;P123456P -bot0274@dev.com;P123456P -bot0275@dev.com;P123456P -bot0276@dev.com;P123456P -bot0277@dev.com;P123456P -bot0278@dev.com;P123456P -bot0279@dev.com;P123456P -bot0280@dev.com;P123456P -bot0281@dev.com;P123456P -bot0282@dev.com;P123456P -bot0283@dev.com;P123456P -bot0284@dev.com;P123456P -bot0285@dev.com;P123456P -bot0286@dev.com;P123456P -bot0287@dev.com;P123456P -bot0288@dev.com;P123456P -bot0289@dev.com;P123456P -bot0290@dev.com;P123456P -bot0291@dev.com;P123456P -bot0292@dev.com;P123456P -bot0293@dev.com;P123456P -bot0294@dev.com;P123456P -bot0295@dev.com;P123456P -bot0296@dev.com;P123456P -bot0297@dev.com;P123456P -bot0298@dev.com;P123456P -bot0299@dev.com;P123456P -bot0300@dev.com;P123456P -bot0301@dev.com;P123456P -bot0302@dev.com;P123456P -bot0303@dev.com;P123456P -bot0304@dev.com;P123456P -bot0305@dev.com;P123456P -bot0306@dev.com;P123456P -bot0307@dev.com;P123456P -bot0308@dev.com;P123456P -bot0309@dev.com;P123456P -bot0310@dev.com;P123456P -bot0311@dev.com;P123456P -bot0312@dev.com;P123456P -bot0313@dev.com;P123456P -bot0314@dev.com;P123456P -bot0315@dev.com;P123456P -bot0316@dev.com;P123456P -bot0317@dev.com;P123456P -bot0318@dev.com;P123456P -bot0319@dev.com;P123456P -bot0320@dev.com;P123456P -bot0321@dev.com;P123456P -bot0322@dev.com;P123456P -bot0323@dev.com;P123456P -bot0324@dev.com;P123456P -bot0325@dev.com;P123456P -bot0326@dev.com;P123456P -bot0327@dev.com;P123456P -bot0328@dev.com;P123456P -bot0329@dev.com;P123456P -bot0330@dev.com;P123456P -bot0331@dev.com;P123456P -bot0332@dev.com;P123456P -bot0333@dev.com;P123456P -bot0334@dev.com;P123456P -bot0335@dev.com;P123456P -bot0336@dev.com;P123456P -bot0337@dev.com;P123456P -bot0338@dev.com;P123456P -bot0339@dev.com;P123456P -bot0340@dev.com;P123456P -bot0341@dev.com;P123456P -bot0342@dev.com;P123456P -bot0343@dev.com;P123456P -bot0344@dev.com;P123456P -bot0345@dev.com;P123456P -bot0346@dev.com;P123456P -bot0347@dev.com;P123456P -bot0348@dev.com;P123456P -bot0349@dev.com;P123456P -bot0350@dev.com;P123456P -bot0351@dev.com;P123456P -bot0352@dev.com;P123456P -bot0353@dev.com;P123456P -bot0354@dev.com;P123456P -bot0355@dev.com;P123456P -bot0356@dev.com;P123456P -bot0357@dev.com;P123456P -bot0358@dev.com;P123456P -bot0359@dev.com;P123456P -bot0360@dev.com;P123456P -bot0361@dev.com;P123456P -bot0362@dev.com;P123456P -bot0363@dev.com;P123456P -bot0364@dev.com;P123456P -bot0365@dev.com;P123456P -bot0366@dev.com;P123456P -bot0367@dev.com;P123456P -bot0368@dev.com;P123456P -bot0369@dev.com;P123456P -bot0370@dev.com;P123456P -bot0371@dev.com;P123456P -bot0372@dev.com;P123456P -bot0373@dev.com;P123456P -bot0374@dev.com;P123456P -bot0375@dev.com;P123456P -bot0376@dev.com;P123456P -bot0377@dev.com;P123456P -bot0378@dev.com;P123456P -bot0379@dev.com;P123456P -bot0380@dev.com;P123456P -bot0381@dev.com;P123456P -bot0382@dev.com;P123456P -bot0383@dev.com;P123456P -bot0384@dev.com;P123456P -bot0385@dev.com;P123456P -bot0386@dev.com;P123456P -bot0387@dev.com;P123456P -bot0388@dev.com;P123456P -bot0389@dev.com;P123456P -bot0390@dev.com;P123456P -bot0391@dev.com;P123456P -bot0392@dev.com;P123456P -bot0393@dev.com;P123456P -bot0394@dev.com;P123456P -bot0395@dev.com;P123456P -bot0396@dev.com;P123456P -bot0397@dev.com;P123456P -bot0398@dev.com;P123456P -bot0399@dev.com;P123456P -bot0400@dev.com;P123456P -bot0401@dev.com;P123456P -bot0402@dev.com;P123456P -bot0403@dev.com;P123456P -bot0404@dev.com;P123456P -bot0405@dev.com;P123456P -bot0406@dev.com;P123456P -bot0407@dev.com;P123456P -bot0408@dev.com;P123456P -bot0409@dev.com;P123456P -bot0410@dev.com;P123456P -bot0411@dev.com;P123456P -bot0412@dev.com;P123456P -bot0413@dev.com;P123456P -bot0414@dev.com;P123456P -bot0415@dev.com;P123456P -bot0416@dev.com;P123456P -bot0417@dev.com;P123456P -bot0418@dev.com;P123456P -bot0419@dev.com;P123456P -bot0420@dev.com;P123456P -bot0421@dev.com;P123456P -bot0422@dev.com;P123456P -bot0423@dev.com;P123456P -bot0424@dev.com;P123456P -bot0425@dev.com;P123456P -bot0426@dev.com;P123456P -bot0427@dev.com;P123456P -bot0428@dev.com;P123456P -bot0429@dev.com;P123456P -bot0430@dev.com;P123456P -bot0431@dev.com;P123456P -bot0432@dev.com;P123456P -bot0433@dev.com;P123456P -bot0434@dev.com;P123456P -bot0435@dev.com;P123456P -bot0436@dev.com;P123456P -bot0437@dev.com;P123456P -bot0438@dev.com;P123456P -bot0439@dev.com;P123456P -bot0440@dev.com;P123456P -bot0441@dev.com;P123456P -bot0442@dev.com;P123456P -bot0443@dev.com;P123456P -bot0444@dev.com;P123456P -bot0445@dev.com;P123456P -bot0446@dev.com;P123456P -bot0447@dev.com;P123456P -bot0448@dev.com;P123456P -bot0449@dev.com;P123456P -bot0450@dev.com;P123456P -bot0451@dev.com;P123456P -bot0452@dev.com;P123456P -bot0453@dev.com;P123456P -bot0454@dev.com;P123456P -bot0455@dev.com;P123456P -bot0456@dev.com;P123456P -bot0457@dev.com;P123456P -bot0458@dev.com;P123456P -bot0459@dev.com;P123456P -bot0460@dev.com;P123456P -bot0461@dev.com;P123456P -bot0462@dev.com;P123456P -bot0463@dev.com;P123456P -bot0464@dev.com;P123456P -bot0465@dev.com;P123456P -bot0466@dev.com;P123456P -bot0467@dev.com;P123456P -bot0468@dev.com;P123456P -bot0469@dev.com;P123456P -bot0470@dev.com;P123456P -bot0471@dev.com;P123456P -bot0472@dev.com;P123456P -bot0473@dev.com;P123456P -bot0474@dev.com;P123456P -bot0475@dev.com;P123456P -bot0476@dev.com;P123456P -bot0477@dev.com;P123456P -bot0478@dev.com;P123456P -bot0479@dev.com;P123456P -bot0480@dev.com;P123456P -bot0481@dev.com;P123456P -bot0482@dev.com;P123456P -bot0483@dev.com;P123456P -bot0484@dev.com;P123456P -bot0485@dev.com;P123456P -bot0486@dev.com;P123456P -bot0487@dev.com;P123456P -bot0488@dev.com;P123456P -bot0489@dev.com;P123456P -bot0490@dev.com;P123456P -bot0491@dev.com;P123456P -bot0492@dev.com;P123456P -bot0493@dev.com;P123456P -bot0494@dev.com;P123456P -bot0495@dev.com;P123456P -bot0496@dev.com;P123456P -bot0497@dev.com;P123456P -bot0498@dev.com;P123456P -bot0499@dev.com;P123456P -bot0500@dev.com;P123456P -bot0501@dev.com;P123456P -bot0502@dev.com;P123456P -bot0503@dev.com;P123456P -bot0504@dev.com;P123456P -bot0505@dev.com;P123456P -bot0506@dev.com;P123456P -bot0507@dev.com;P123456P -bot0508@dev.com;P123456P -bot0509@dev.com;P123456P -bot0510@dev.com;P123456P -bot0511@dev.com;P123456P -bot0512@dev.com;P123456P -bot0513@dev.com;P123456P -bot0514@dev.com;P123456P -bot0515@dev.com;P123456P -bot0516@dev.com;P123456P -bot0517@dev.com;P123456P -bot0518@dev.com;P123456P -bot0519@dev.com;P123456P -bot0520@dev.com;P123456P -bot0521@dev.com;P123456P -bot0522@dev.com;P123456P -bot0523@dev.com;P123456P -bot0524@dev.com;P123456P -bot0525@dev.com;P123456P -bot0526@dev.com;P123456P -bot0527@dev.com;P123456P -bot0528@dev.com;P123456P -bot0529@dev.com;P123456P -bot0530@dev.com;P123456P -bot0531@dev.com;P123456P -bot0532@dev.com;P123456P -bot0533@dev.com;P123456P -bot0534@dev.com;P123456P -bot0535@dev.com;P123456P -bot0536@dev.com;P123456P -bot0537@dev.com;P123456P -bot0538@dev.com;P123456P -bot0539@dev.com;P123456P -bot0540@dev.com;P123456P -bot0541@dev.com;P123456P -bot0542@dev.com;P123456P -bot0543@dev.com;P123456P -bot0544@dev.com;P123456P -bot0545@dev.com;P123456P -bot0546@dev.com;P123456P -bot0547@dev.com;P123456P -bot0548@dev.com;P123456P -bot0549@dev.com;P123456P -bot0550@dev.com;P123456P -bot0551@dev.com;P123456P -bot0552@dev.com;P123456P -bot0553@dev.com;P123456P -bot0554@dev.com;P123456P -bot0555@dev.com;P123456P -bot0556@dev.com;P123456P -bot0557@dev.com;P123456P -bot0558@dev.com;P123456P -bot0559@dev.com;P123456P -bot0560@dev.com;P123456P -bot0561@dev.com;P123456P -bot0562@dev.com;P123456P -bot0563@dev.com;P123456P -bot0564@dev.com;P123456P -bot0565@dev.com;P123456P -bot0566@dev.com;P123456P -bot0567@dev.com;P123456P -bot0568@dev.com;P123456P -bot0569@dev.com;P123456P -bot0570@dev.com;P123456P -bot0571@dev.com;P123456P -bot0572@dev.com;P123456P -bot0573@dev.com;P123456P -bot0574@dev.com;P123456P -bot0575@dev.com;P123456P -bot0576@dev.com;P123456P -bot0577@dev.com;P123456P -bot0578@dev.com;P123456P -bot0579@dev.com;P123456P -bot0580@dev.com;P123456P -bot0581@dev.com;P123456P -bot0582@dev.com;P123456P -bot0583@dev.com;P123456P -bot0584@dev.com;P123456P -bot0585@dev.com;P123456P -bot0586@dev.com;P123456P -bot0587@dev.com;P123456P -bot0588@dev.com;P123456P -bot0589@dev.com;P123456P -bot0590@dev.com;P123456P -bot0591@dev.com;P123456P -bot0592@dev.com;P123456P -bot0593@dev.com;P123456P -bot0594@dev.com;P123456P -bot0595@dev.com;P123456P -bot0596@dev.com;P123456P -bot0597@dev.com;P123456P -bot0598@dev.com;P123456P -bot0599@dev.com;P123456P -bot0600@dev.com;P123456P -bot0601@dev.com;P123456P -bot0602@dev.com;P123456P -bot0603@dev.com;P123456P -bot0604@dev.com;P123456P -bot0605@dev.com;P123456P -bot0606@dev.com;P123456P -bot0607@dev.com;P123456P -bot0608@dev.com;P123456P -bot0609@dev.com;P123456P -bot0610@dev.com;P123456P -bot0611@dev.com;P123456P -bot0612@dev.com;P123456P -bot0613@dev.com;P123456P -bot0614@dev.com;P123456P -bot0615@dev.com;P123456P -bot0616@dev.com;P123456P -bot0617@dev.com;P123456P -bot0618@dev.com;P123456P -bot0619@dev.com;P123456P -bot0620@dev.com;P123456P -bot0621@dev.com;P123456P -bot0622@dev.com;P123456P -bot0623@dev.com;P123456P -bot0624@dev.com;P123456P -bot0625@dev.com;P123456P -bot0626@dev.com;P123456P -bot0627@dev.com;P123456P -bot0628@dev.com;P123456P -bot0629@dev.com;P123456P -bot0630@dev.com;P123456P -bot0631@dev.com;P123456P -bot0632@dev.com;P123456P -bot0633@dev.com;P123456P -bot0634@dev.com;P123456P -bot0635@dev.com;P123456P -bot0636@dev.com;P123456P -bot0637@dev.com;P123456P -bot0638@dev.com;P123456P -bot0639@dev.com;P123456P -bot0640@dev.com;P123456P -bot0641@dev.com;P123456P -bot0642@dev.com;P123456P -bot0643@dev.com;P123456P -bot0644@dev.com;P123456P -bot0645@dev.com;P123456P -bot0646@dev.com;P123456P -bot0647@dev.com;P123456P -bot0648@dev.com;P123456P -bot0649@dev.com;P123456P -bot0650@dev.com;P123456P -bot0651@dev.com;P123456P -bot0652@dev.com;P123456P -bot0653@dev.com;P123456P -bot0654@dev.com;P123456P -bot0655@dev.com;P123456P -bot0656@dev.com;P123456P -bot0657@dev.com;P123456P -bot0658@dev.com;P123456P -bot0659@dev.com;P123456P -bot0660@dev.com;P123456P -bot0661@dev.com;P123456P -bot0662@dev.com;P123456P -bot0663@dev.com;P123456P -bot0664@dev.com;P123456P -bot0665@dev.com;P123456P -bot0666@dev.com;P123456P -bot0667@dev.com;P123456P -bot0668@dev.com;P123456P -bot0669@dev.com;P123456P -bot0670@dev.com;P123456P -bot0671@dev.com;P123456P -bot0672@dev.com;P123456P -bot0673@dev.com;P123456P -bot0674@dev.com;P123456P -bot0675@dev.com;P123456P -bot0676@dev.com;P123456P -bot0677@dev.com;P123456P -bot0678@dev.com;P123456P -bot0679@dev.com;P123456P -bot0680@dev.com;P123456P -bot0681@dev.com;P123456P -bot0682@dev.com;P123456P -bot0683@dev.com;P123456P -bot0684@dev.com;P123456P -bot0685@dev.com;P123456P -bot0686@dev.com;P123456P -bot0687@dev.com;P123456P -bot0688@dev.com;P123456P -bot0689@dev.com;P123456P -bot0690@dev.com;P123456P -bot0691@dev.com;P123456P -bot0692@dev.com;P123456P -bot0693@dev.com;P123456P -bot0694@dev.com;P123456P -bot0695@dev.com;P123456P -bot0696@dev.com;P123456P -bot0697@dev.com;P123456P -bot0698@dev.com;P123456P -bot0699@dev.com;P123456P -bot0700@dev.com;P123456P -bot0701@dev.com;P123456P -bot0702@dev.com;P123456P -bot0703@dev.com;P123456P -bot0704@dev.com;P123456P -bot0705@dev.com;P123456P -bot0706@dev.com;P123456P -bot0707@dev.com;P123456P -bot0708@dev.com;P123456P -bot0709@dev.com;P123456P -bot0710@dev.com;P123456P -bot0711@dev.com;P123456P -bot0712@dev.com;P123456P -bot0713@dev.com;P123456P -bot0714@dev.com;P123456P -bot0715@dev.com;P123456P -bot0716@dev.com;P123456P -bot0717@dev.com;P123456P -bot0718@dev.com;P123456P -bot0719@dev.com;P123456P -bot0720@dev.com;P123456P -bot0721@dev.com;P123456P -bot0722@dev.com;P123456P -bot0723@dev.com;P123456P -bot0724@dev.com;P123456P -bot0725@dev.com;P123456P -bot0726@dev.com;P123456P -bot0727@dev.com;P123456P -bot0728@dev.com;P123456P -bot0729@dev.com;P123456P -bot0730@dev.com;P123456P -bot0731@dev.com;P123456P -bot0732@dev.com;P123456P -bot0733@dev.com;P123456P -bot0734@dev.com;P123456P -bot0735@dev.com;P123456P -bot0736@dev.com;P123456P -bot0737@dev.com;P123456P -bot0738@dev.com;P123456P -bot0739@dev.com;P123456P -bot0740@dev.com;P123456P -bot0741@dev.com;P123456P -bot0742@dev.com;P123456P -bot0743@dev.com;P123456P -bot0744@dev.com;P123456P -bot0745@dev.com;P123456P -bot0746@dev.com;P123456P -bot0747@dev.com;P123456P -bot0748@dev.com;P123456P -bot0749@dev.com;P123456P -bot0750@dev.com;P123456P -bot0751@dev.com;P123456P -bot0752@dev.com;P123456P -bot0753@dev.com;P123456P -bot0754@dev.com;P123456P -bot0755@dev.com;P123456P -bot0756@dev.com;P123456P -bot0757@dev.com;P123456P -bot0758@dev.com;P123456P -bot0759@dev.com;P123456P -bot0760@dev.com;P123456P -bot0761@dev.com;P123456P -bot0762@dev.com;P123456P -bot0763@dev.com;P123456P -bot0764@dev.com;P123456P -bot0765@dev.com;P123456P -bot0766@dev.com;P123456P -bot0767@dev.com;P123456P -bot0768@dev.com;P123456P -bot0769@dev.com;P123456P -bot0770@dev.com;P123456P -bot0771@dev.com;P123456P -bot0772@dev.com;P123456P -bot0773@dev.com;P123456P -bot0774@dev.com;P123456P -bot0775@dev.com;P123456P -bot0776@dev.com;P123456P -bot0777@dev.com;P123456P -bot0778@dev.com;P123456P -bot0779@dev.com;P123456P -bot0780@dev.com;P123456P -bot0781@dev.com;P123456P -bot0782@dev.com;P123456P -bot0783@dev.com;P123456P -bot0784@dev.com;P123456P -bot0785@dev.com;P123456P -bot0786@dev.com;P123456P -bot0787@dev.com;P123456P -bot0788@dev.com;P123456P -bot0789@dev.com;P123456P -bot0790@dev.com;P123456P -bot0791@dev.com;P123456P -bot0792@dev.com;P123456P -bot0793@dev.com;P123456P -bot0794@dev.com;P123456P -bot0795@dev.com;P123456P -bot0796@dev.com;P123456P -bot0797@dev.com;P123456P -bot0798@dev.com;P123456P -bot0799@dev.com;P123456P -bot0800@dev.com;P123456P -bot0801@dev.com;P123456P -bot0802@dev.com;P123456P -bot0803@dev.com;P123456P -bot0804@dev.com;P123456P -bot0805@dev.com;P123456P -bot0806@dev.com;P123456P -bot0807@dev.com;P123456P -bot0808@dev.com;P123456P -bot0809@dev.com;P123456P -bot0810@dev.com;P123456P -bot0811@dev.com;P123456P -bot0812@dev.com;P123456P -bot0813@dev.com;P123456P -bot0814@dev.com;P123456P -bot0815@dev.com;P123456P -bot0816@dev.com;P123456P -bot0817@dev.com;P123456P -bot0818@dev.com;P123456P -bot0819@dev.com;P123456P -bot0820@dev.com;P123456P -bot0821@dev.com;P123456P -bot0822@dev.com;P123456P -bot0823@dev.com;P123456P -bot0824@dev.com;P123456P -bot0825@dev.com;P123456P -bot0826@dev.com;P123456P -bot0827@dev.com;P123456P -bot0828@dev.com;P123456P -bot0829@dev.com;P123456P -bot0830@dev.com;P123456P -bot0831@dev.com;P123456P -bot0832@dev.com;P123456P -bot0833@dev.com;P123456P -bot0834@dev.com;P123456P -bot0835@dev.com;P123456P -bot0836@dev.com;P123456P -bot0837@dev.com;P123456P -bot0838@dev.com;P123456P -bot0839@dev.com;P123456P -bot0840@dev.com;P123456P -bot0841@dev.com;P123456P -bot0842@dev.com;P123456P -bot0843@dev.com;P123456P -bot0844@dev.com;P123456P -bot0845@dev.com;P123456P -bot0846@dev.com;P123456P -bot0847@dev.com;P123456P -bot0848@dev.com;P123456P -bot0849@dev.com;P123456P -bot0850@dev.com;P123456P -bot0851@dev.com;P123456P -bot0852@dev.com;P123456P -bot0853@dev.com;P123456P -bot0854@dev.com;P123456P -bot0855@dev.com;P123456P -bot0856@dev.com;P123456P -bot0857@dev.com;P123456P -bot0858@dev.com;P123456P -bot0859@dev.com;P123456P -bot0860@dev.com;P123456P -bot0861@dev.com;P123456P -bot0862@dev.com;P123456P -bot0863@dev.com;P123456P -bot0864@dev.com;P123456P -bot0865@dev.com;P123456P -bot0866@dev.com;P123456P -bot0867@dev.com;P123456P -bot0868@dev.com;P123456P -bot0869@dev.com;P123456P -bot0870@dev.com;P123456P -bot0871@dev.com;P123456P -bot0872@dev.com;P123456P -bot0873@dev.com;P123456P -bot0874@dev.com;P123456P -bot0875@dev.com;P123456P -bot0876@dev.com;P123456P -bot0877@dev.com;P123456P -bot0878@dev.com;P123456P -bot0879@dev.com;P123456P -bot0880@dev.com;P123456P -bot0881@dev.com;P123456P -bot0882@dev.com;P123456P -bot0883@dev.com;P123456P -bot0884@dev.com;P123456P -bot0885@dev.com;P123456P -bot0886@dev.com;P123456P -bot0887@dev.com;P123456P -bot0888@dev.com;P123456P -bot0889@dev.com;P123456P -bot0890@dev.com;P123456P -bot0891@dev.com;P123456P -bot0892@dev.com;P123456P -bot0893@dev.com;P123456P -bot0894@dev.com;P123456P -bot0895@dev.com;P123456P -bot0896@dev.com;P123456P -bot0897@dev.com;P123456P -bot0898@dev.com;P123456P -bot0899@dev.com;P123456P -bot0900@dev.com;P123456P -bot0901@dev.com;P123456P -bot0902@dev.com;P123456P -bot0903@dev.com;P123456P -bot0904@dev.com;P123456P -bot0905@dev.com;P123456P -bot0906@dev.com;P123456P -bot0907@dev.com;P123456P -bot0908@dev.com;P123456P -bot0909@dev.com;P123456P -bot0910@dev.com;P123456P -bot0911@dev.com;P123456P -bot0912@dev.com;P123456P -bot0913@dev.com;P123456P -bot0914@dev.com;P123456P -bot0915@dev.com;P123456P -bot0916@dev.com;P123456P -bot0917@dev.com;P123456P -bot0918@dev.com;P123456P -bot0919@dev.com;P123456P -bot0920@dev.com;P123456P -bot0921@dev.com;P123456P -bot0922@dev.com;P123456P -bot0923@dev.com;P123456P -bot0924@dev.com;P123456P -bot0925@dev.com;P123456P -bot0926@dev.com;P123456P -bot0927@dev.com;P123456P -bot0928@dev.com;P123456P -bot0929@dev.com;P123456P -bot0930@dev.com;P123456P -bot0931@dev.com;P123456P -bot0932@dev.com;P123456P -bot0933@dev.com;P123456P -bot0934@dev.com;P123456P -bot0935@dev.com;P123456P -bot0936@dev.com;P123456P -bot0937@dev.com;P123456P -bot0938@dev.com;P123456P -bot0939@dev.com;P123456P -bot0940@dev.com;P123456P -bot0941@dev.com;P123456P -bot0942@dev.com;P123456P -bot0943@dev.com;P123456P -bot0944@dev.com;P123456P -bot0945@dev.com;P123456P -bot0946@dev.com;P123456P -bot0947@dev.com;P123456P -bot0948@dev.com;P123456P -bot0949@dev.com;P123456P -bot0950@dev.com;P123456P -bot0951@dev.com;P123456P -bot0952@dev.com;P123456P -bot0953@dev.com;P123456P -bot0954@dev.com;P123456P -bot0955@dev.com;P123456P -bot0956@dev.com;P123456P -bot0957@dev.com;P123456P -bot0958@dev.com;P123456P -bot0959@dev.com;P123456P -bot0960@dev.com;P123456P -bot0961@dev.com;P123456P -bot0962@dev.com;P123456P -bot0963@dev.com;P123456P -bot0964@dev.com;P123456P -bot0965@dev.com;P123456P -bot0966@dev.com;P123456P -bot0967@dev.com;P123456P -bot0968@dev.com;P123456P -bot0969@dev.com;P123456P -bot0970@dev.com;P123456P -bot0971@dev.com;P123456P -bot0972@dev.com;P123456P -bot0973@dev.com;P123456P -bot0974@dev.com;P123456P -bot0975@dev.com;P123456P -bot0976@dev.com;P123456P -bot0977@dev.com;P123456P -bot0978@dev.com;P123456P -bot0979@dev.com;P123456P -bot0980@dev.com;P123456P -bot0981@dev.com;P123456P -bot0982@dev.com;P123456P -bot0983@dev.com;P123456P -bot0984@dev.com;P123456P -bot0985@dev.com;P123456P -bot0986@dev.com;P123456P -bot0987@dev.com;P123456P -bot0988@dev.com;P123456P -bot0989@dev.com;P123456P -bot0990@dev.com;P123456P -bot0991@dev.com;P123456P -bot0992@dev.com;P123456P -bot0993@dev.com;P123456P -bot0994@dev.com;P123456P -bot0995@dev.com;P123456P -bot0996@dev.com;P123456P -bot0997@dev.com;P123456P -bot0998@dev.com;P123456P -bot0999@dev.com;P123456P -bot1000@dev.com;P123456P \ No newline at end of file diff --git a/src/MarginTrading.Client/testUsers.csv b/src/MarginTrading.Client/testUsers.csv deleted file mode 100644 index 6d3a3d6e0..000000000 --- a/src/MarginTrading.Client/testUsers.csv +++ /dev/null @@ -1,1001 +0,0 @@ -Email;Password -bot0001@dev.com;P123456P -bot0002@dev.com;P123456P -bot0003@dev.com;P123456P -bot0004@dev.com;P123456P -bot0005@dev.com;P123456P -bot0006@dev.com;P123456P -bot0007@dev.com;P123456P -bot0008@dev.com;P123456P -bot0009@dev.com;P123456P -bot0010@dev.com;P123456P -bot0011@dev.com;P123456P -bot0012@dev.com;P123456P -bot0013@dev.com;P123456P -bot0014@dev.com;P123456P -bot0015@dev.com;P123456P -bot0016@dev.com;P123456P -bot0017@dev.com;P123456P -bot0018@dev.com;P123456P -bot0019@dev.com;P123456P -bot0020@dev.com;P123456P -bot0021@dev.com;P123456P -bot0022@dev.com;P123456P -bot0023@dev.com;P123456P -bot0024@dev.com;P123456P -bot0025@dev.com;P123456P -bot0026@dev.com;P123456P -bot0027@dev.com;P123456P -bot0028@dev.com;P123456P -bot0029@dev.com;P123456P -bot0030@dev.com;P123456P -bot0031@dev.com;P123456P -bot0032@dev.com;P123456P -bot0033@dev.com;P123456P -bot0034@dev.com;P123456P -bot0035@dev.com;P123456P -bot0036@dev.com;P123456P -bot0037@dev.com;P123456P -bot0038@dev.com;P123456P -bot0039@dev.com;P123456P -bot0040@dev.com;P123456P -bot0041@dev.com;P123456P -bot0042@dev.com;P123456P -bot0043@dev.com;P123456P -bot0044@dev.com;P123456P -bot0045@dev.com;P123456P -bot0046@dev.com;P123456P -bot0047@dev.com;P123456P -bot0048@dev.com;P123456P -bot0049@dev.com;P123456P -bot0050@dev.com;P123456P -bot0051@dev.com;P123456P -bot0052@dev.com;P123456P -bot0053@dev.com;P123456P -bot0054@dev.com;P123456P -bot0055@dev.com;P123456P -bot0056@dev.com;P123456P -bot0057@dev.com;P123456P -bot0058@dev.com;P123456P -bot0059@dev.com;P123456P -bot0060@dev.com;P123456P -bot0061@dev.com;P123456P -bot0062@dev.com;P123456P -bot0063@dev.com;P123456P -bot0064@dev.com;P123456P -bot0065@dev.com;P123456P -bot0066@dev.com;P123456P -bot0067@dev.com;P123456P -bot0068@dev.com;P123456P -bot0069@dev.com;P123456P -bot0070@dev.com;P123456P -bot0071@dev.com;P123456P -bot0072@dev.com;P123456P -bot0073@dev.com;P123456P -bot0074@dev.com;P123456P -bot0075@dev.com;P123456P -bot0076@dev.com;P123456P -bot0077@dev.com;P123456P -bot0078@dev.com;P123456P -bot0079@dev.com;P123456P -bot0080@dev.com;P123456P -bot0081@dev.com;P123456P -bot0082@dev.com;P123456P -bot0083@dev.com;P123456P -bot0084@dev.com;P123456P -bot0085@dev.com;P123456P -bot0086@dev.com;P123456P -bot0087@dev.com;P123456P -bot0088@dev.com;P123456P -bot0089@dev.com;P123456P -bot0090@dev.com;P123456P -bot0091@dev.com;P123456P -bot0092@dev.com;P123456P -bot0093@dev.com;P123456P -bot0094@dev.com;P123456P -bot0095@dev.com;P123456P -bot0096@dev.com;P123456P -bot0097@dev.com;P123456P -bot0098@dev.com;P123456P -bot0099@dev.com;P123456P -bot0100@dev.com;P123456P -bot0101@dev.com;P123456P -bot0102@dev.com;P123456P -bot0103@dev.com;P123456P -bot0104@dev.com;P123456P -bot0105@dev.com;P123456P -bot0106@dev.com;P123456P -bot0107@dev.com;P123456P -bot0108@dev.com;P123456P -bot0109@dev.com;P123456P -bot0110@dev.com;P123456P -bot0111@dev.com;P123456P -bot0112@dev.com;P123456P -bot0113@dev.com;P123456P -bot0114@dev.com;P123456P -bot0115@dev.com;P123456P -bot0116@dev.com;P123456P -bot0117@dev.com;P123456P -bot0118@dev.com;P123456P -bot0119@dev.com;P123456P -bot0120@dev.com;P123456P -bot0121@dev.com;P123456P -bot0122@dev.com;P123456P -bot0123@dev.com;P123456P -bot0124@dev.com;P123456P -bot0125@dev.com;P123456P -bot0126@dev.com;P123456P -bot0127@dev.com;P123456P -bot0128@dev.com;P123456P -bot0129@dev.com;P123456P -bot0130@dev.com;P123456P -bot0131@dev.com;P123456P -bot0132@dev.com;P123456P -bot0133@dev.com;P123456P -bot0134@dev.com;P123456P -bot0135@dev.com;P123456P -bot0136@dev.com;P123456P -bot0137@dev.com;P123456P -bot0138@dev.com;P123456P -bot0139@dev.com;P123456P -bot0140@dev.com;P123456P -bot0141@dev.com;P123456P -bot0142@dev.com;P123456P -bot0143@dev.com;P123456P -bot0144@dev.com;P123456P -bot0145@dev.com;P123456P -bot0146@dev.com;P123456P -bot0147@dev.com;P123456P -bot0148@dev.com;P123456P -bot0149@dev.com;P123456P -bot0150@dev.com;P123456P -bot0151@dev.com;P123456P -bot0152@dev.com;P123456P -bot0153@dev.com;P123456P -bot0154@dev.com;P123456P -bot0155@dev.com;P123456P -bot0156@dev.com;P123456P -bot0157@dev.com;P123456P -bot0158@dev.com;P123456P -bot0159@dev.com;P123456P -bot0160@dev.com;P123456P -bot0161@dev.com;P123456P -bot0162@dev.com;P123456P -bot0163@dev.com;P123456P -bot0164@dev.com;P123456P -bot0165@dev.com;P123456P -bot0166@dev.com;P123456P -bot0167@dev.com;P123456P -bot0168@dev.com;P123456P -bot0169@dev.com;P123456P -bot0170@dev.com;P123456P -bot0171@dev.com;P123456P -bot0172@dev.com;P123456P -bot0173@dev.com;P123456P -bot0174@dev.com;P123456P -bot0175@dev.com;P123456P -bot0176@dev.com;P123456P -bot0177@dev.com;P123456P -bot0178@dev.com;P123456P -bot0179@dev.com;P123456P -bot0180@dev.com;P123456P -bot0181@dev.com;P123456P -bot0182@dev.com;P123456P -bot0183@dev.com;P123456P -bot0184@dev.com;P123456P -bot0185@dev.com;P123456P -bot0186@dev.com;P123456P -bot0187@dev.com;P123456P -bot0188@dev.com;P123456P -bot0189@dev.com;P123456P -bot0190@dev.com;P123456P -bot0191@dev.com;P123456P -bot0192@dev.com;P123456P -bot0193@dev.com;P123456P -bot0194@dev.com;P123456P -bot0195@dev.com;P123456P -bot0196@dev.com;P123456P -bot0197@dev.com;P123456P -bot0198@dev.com;P123456P -bot0199@dev.com;P123456P -bot0200@dev.com;P123456P -bot0201@dev.com;P123456P -bot0202@dev.com;P123456P -bot0203@dev.com;P123456P -bot0204@dev.com;P123456P -bot0205@dev.com;P123456P -bot0206@dev.com;P123456P -bot0207@dev.com;P123456P -bot0208@dev.com;P123456P -bot0209@dev.com;P123456P -bot0210@dev.com;P123456P -bot0211@dev.com;P123456P -bot0212@dev.com;P123456P -bot0213@dev.com;P123456P -bot0214@dev.com;P123456P -bot0215@dev.com;P123456P -bot0216@dev.com;P123456P -bot0217@dev.com;P123456P -bot0218@dev.com;P123456P -bot0219@dev.com;P123456P -bot0220@dev.com;P123456P -bot0221@dev.com;P123456P -bot0222@dev.com;P123456P -bot0223@dev.com;P123456P -bot0224@dev.com;P123456P -bot0225@dev.com;P123456P -bot0226@dev.com;P123456P -bot0227@dev.com;P123456P -bot0228@dev.com;P123456P -bot0229@dev.com;P123456P -bot0230@dev.com;P123456P -bot0231@dev.com;P123456P -bot0232@dev.com;P123456P -bot0233@dev.com;P123456P -bot0234@dev.com;P123456P -bot0235@dev.com;P123456P -bot0236@dev.com;P123456P -bot0237@dev.com;P123456P -bot0238@dev.com;P123456P -bot0239@dev.com;P123456P -bot0240@dev.com;P123456P -bot0241@dev.com;P123456P -bot0242@dev.com;P123456P -bot0243@dev.com;P123456P -bot0244@dev.com;P123456P -bot0245@dev.com;P123456P -bot0246@dev.com;P123456P -bot0247@dev.com;P123456P -bot0248@dev.com;P123456P -bot0249@dev.com;P123456P -bot0250@dev.com;P123456P -bot0251@dev.com;P123456P -bot0252@dev.com;P123456P -bot0253@dev.com;P123456P -bot0254@dev.com;P123456P -bot0255@dev.com;P123456P -bot0256@dev.com;P123456P -bot0257@dev.com;P123456P -bot0258@dev.com;P123456P -bot0259@dev.com;P123456P -bot0260@dev.com;P123456P -bot0261@dev.com;P123456P -bot0262@dev.com;P123456P -bot0263@dev.com;P123456P -bot0264@dev.com;P123456P -bot0265@dev.com;P123456P -bot0266@dev.com;P123456P -bot0267@dev.com;P123456P -bot0268@dev.com;P123456P -bot0269@dev.com;P123456P -bot0270@dev.com;P123456P -bot0271@dev.com;P123456P -bot0272@dev.com;P123456P -bot0273@dev.com;P123456P -bot0274@dev.com;P123456P -bot0275@dev.com;P123456P -bot0276@dev.com;P123456P -bot0277@dev.com;P123456P -bot0278@dev.com;P123456P -bot0279@dev.com;P123456P -bot0280@dev.com;P123456P -bot0281@dev.com;P123456P -bot0282@dev.com;P123456P -bot0283@dev.com;P123456P -bot0284@dev.com;P123456P -bot0285@dev.com;P123456P -bot0286@dev.com;P123456P -bot0287@dev.com;P123456P -bot0288@dev.com;P123456P -bot0289@dev.com;P123456P -bot0290@dev.com;P123456P -bot0291@dev.com;P123456P -bot0292@dev.com;P123456P -bot0293@dev.com;P123456P -bot0294@dev.com;P123456P -bot0295@dev.com;P123456P -bot0296@dev.com;P123456P -bot0297@dev.com;P123456P -bot0298@dev.com;P123456P -bot0299@dev.com;P123456P -bot0300@dev.com;P123456P -bot0301@dev.com;P123456P -bot0302@dev.com;P123456P -bot0303@dev.com;P123456P -bot0304@dev.com;P123456P -bot0305@dev.com;P123456P -bot0306@dev.com;P123456P -bot0307@dev.com;P123456P -bot0308@dev.com;P123456P -bot0309@dev.com;P123456P -bot0310@dev.com;P123456P -bot0311@dev.com;P123456P -bot0312@dev.com;P123456P -bot0313@dev.com;P123456P -bot0314@dev.com;P123456P -bot0315@dev.com;P123456P -bot0316@dev.com;P123456P -bot0317@dev.com;P123456P -bot0318@dev.com;P123456P -bot0319@dev.com;P123456P -bot0320@dev.com;P123456P -bot0321@dev.com;P123456P -bot0322@dev.com;P123456P -bot0323@dev.com;P123456P -bot0324@dev.com;P123456P -bot0325@dev.com;P123456P -bot0326@dev.com;P123456P -bot0327@dev.com;P123456P -bot0328@dev.com;P123456P -bot0329@dev.com;P123456P -bot0330@dev.com;P123456P -bot0331@dev.com;P123456P -bot0332@dev.com;P123456P -bot0333@dev.com;P123456P -bot0334@dev.com;P123456P -bot0335@dev.com;P123456P -bot0336@dev.com;P123456P -bot0337@dev.com;P123456P -bot0338@dev.com;P123456P -bot0339@dev.com;P123456P -bot0340@dev.com;P123456P -bot0341@dev.com;P123456P -bot0342@dev.com;P123456P -bot0343@dev.com;P123456P -bot0344@dev.com;P123456P -bot0345@dev.com;P123456P -bot0346@dev.com;P123456P -bot0347@dev.com;P123456P -bot0348@dev.com;P123456P -bot0349@dev.com;P123456P -bot0350@dev.com;P123456P -bot0351@dev.com;P123456P -bot0352@dev.com;P123456P -bot0353@dev.com;P123456P -bot0354@dev.com;P123456P -bot0355@dev.com;P123456P -bot0356@dev.com;P123456P -bot0357@dev.com;P123456P -bot0358@dev.com;P123456P -bot0359@dev.com;P123456P -bot0360@dev.com;P123456P -bot0361@dev.com;P123456P -bot0362@dev.com;P123456P -bot0363@dev.com;P123456P -bot0364@dev.com;P123456P -bot0365@dev.com;P123456P -bot0366@dev.com;P123456P -bot0367@dev.com;P123456P -bot0368@dev.com;P123456P -bot0369@dev.com;P123456P -bot0370@dev.com;P123456P -bot0371@dev.com;P123456P -bot0372@dev.com;P123456P -bot0373@dev.com;P123456P -bot0374@dev.com;P123456P -bot0375@dev.com;P123456P -bot0376@dev.com;P123456P -bot0377@dev.com;P123456P -bot0378@dev.com;P123456P -bot0379@dev.com;P123456P -bot0380@dev.com;P123456P -bot0381@dev.com;P123456P -bot0382@dev.com;P123456P -bot0383@dev.com;P123456P -bot0384@dev.com;P123456P -bot0385@dev.com;P123456P -bot0386@dev.com;P123456P -bot0387@dev.com;P123456P -bot0388@dev.com;P123456P -bot0389@dev.com;P123456P -bot0390@dev.com;P123456P -bot0391@dev.com;P123456P -bot0392@dev.com;P123456P -bot0393@dev.com;P123456P -bot0394@dev.com;P123456P -bot0395@dev.com;P123456P -bot0396@dev.com;P123456P -bot0397@dev.com;P123456P -bot0398@dev.com;P123456P -bot0399@dev.com;P123456P -bot0400@dev.com;P123456P -bot0401@dev.com;P123456P -bot0402@dev.com;P123456P -bot0403@dev.com;P123456P -bot0404@dev.com;P123456P -bot0405@dev.com;P123456P -bot0406@dev.com;P123456P -bot0407@dev.com;P123456P -bot0408@dev.com;P123456P -bot0409@dev.com;P123456P -bot0410@dev.com;P123456P -bot0411@dev.com;P123456P -bot0412@dev.com;P123456P -bot0413@dev.com;P123456P -bot0414@dev.com;P123456P -bot0415@dev.com;P123456P -bot0416@dev.com;P123456P -bot0417@dev.com;P123456P -bot0418@dev.com;P123456P -bot0419@dev.com;P123456P -bot0420@dev.com;P123456P -bot0421@dev.com;P123456P -bot0422@dev.com;P123456P -bot0423@dev.com;P123456P -bot0424@dev.com;P123456P -bot0425@dev.com;P123456P -bot0426@dev.com;P123456P -bot0427@dev.com;P123456P -bot0428@dev.com;P123456P -bot0429@dev.com;P123456P -bot0430@dev.com;P123456P -bot0431@dev.com;P123456P -bot0432@dev.com;P123456P -bot0433@dev.com;P123456P -bot0434@dev.com;P123456P -bot0435@dev.com;P123456P -bot0436@dev.com;P123456P -bot0437@dev.com;P123456P -bot0438@dev.com;P123456P -bot0439@dev.com;P123456P -bot0440@dev.com;P123456P -bot0441@dev.com;P123456P -bot0442@dev.com;P123456P -bot0443@dev.com;P123456P -bot0444@dev.com;P123456P -bot0445@dev.com;P123456P -bot0446@dev.com;P123456P -bot0447@dev.com;P123456P -bot0448@dev.com;P123456P -bot0449@dev.com;P123456P -bot0450@dev.com;P123456P -bot0451@dev.com;P123456P -bot0452@dev.com;P123456P -bot0453@dev.com;P123456P -bot0454@dev.com;P123456P -bot0455@dev.com;P123456P -bot0456@dev.com;P123456P -bot0457@dev.com;P123456P -bot0458@dev.com;P123456P -bot0459@dev.com;P123456P -bot0460@dev.com;P123456P -bot0461@dev.com;P123456P -bot0462@dev.com;P123456P -bot0463@dev.com;P123456P -bot0464@dev.com;P123456P -bot0465@dev.com;P123456P -bot0466@dev.com;P123456P -bot0467@dev.com;P123456P -bot0468@dev.com;P123456P -bot0469@dev.com;P123456P -bot0470@dev.com;P123456P -bot0471@dev.com;P123456P -bot0472@dev.com;P123456P -bot0473@dev.com;P123456P -bot0474@dev.com;P123456P -bot0475@dev.com;P123456P -bot0476@dev.com;P123456P -bot0477@dev.com;P123456P -bot0478@dev.com;P123456P -bot0479@dev.com;P123456P -bot0480@dev.com;P123456P -bot0481@dev.com;P123456P -bot0482@dev.com;P123456P -bot0483@dev.com;P123456P -bot0484@dev.com;P123456P -bot0485@dev.com;P123456P -bot0486@dev.com;P123456P -bot0487@dev.com;P123456P -bot0488@dev.com;P123456P -bot0489@dev.com;P123456P -bot0490@dev.com;P123456P -bot0491@dev.com;P123456P -bot0492@dev.com;P123456P -bot0493@dev.com;P123456P -bot0494@dev.com;P123456P -bot0495@dev.com;P123456P -bot0496@dev.com;P123456P -bot0497@dev.com;P123456P -bot0498@dev.com;P123456P -bot0499@dev.com;P123456P -bot0500@dev.com;P123456P -bot0501@dev.com;P123456P -bot0502@dev.com;P123456P -bot0503@dev.com;P123456P -bot0504@dev.com;P123456P -bot0505@dev.com;P123456P -bot0506@dev.com;P123456P -bot0507@dev.com;P123456P -bot0508@dev.com;P123456P -bot0509@dev.com;P123456P -bot0510@dev.com;P123456P -bot0511@dev.com;P123456P -bot0512@dev.com;P123456P -bot0513@dev.com;P123456P -bot0514@dev.com;P123456P -bot0515@dev.com;P123456P -bot0516@dev.com;P123456P -bot0517@dev.com;P123456P -bot0518@dev.com;P123456P -bot0519@dev.com;P123456P -bot0520@dev.com;P123456P -bot0521@dev.com;P123456P -bot0522@dev.com;P123456P -bot0523@dev.com;P123456P -bot0524@dev.com;P123456P -bot0525@dev.com;P123456P -bot0526@dev.com;P123456P -bot0527@dev.com;P123456P -bot0528@dev.com;P123456P -bot0529@dev.com;P123456P -bot0530@dev.com;P123456P -bot0531@dev.com;P123456P -bot0532@dev.com;P123456P -bot0533@dev.com;P123456P -bot0534@dev.com;P123456P -bot0535@dev.com;P123456P -bot0536@dev.com;P123456P -bot0537@dev.com;P123456P -bot0538@dev.com;P123456P -bot0539@dev.com;P123456P -bot0540@dev.com;P123456P -bot0541@dev.com;P123456P -bot0542@dev.com;P123456P -bot0543@dev.com;P123456P -bot0544@dev.com;P123456P -bot0545@dev.com;P123456P -bot0546@dev.com;P123456P -bot0547@dev.com;P123456P -bot0548@dev.com;P123456P -bot0549@dev.com;P123456P -bot0550@dev.com;P123456P -bot0551@dev.com;P123456P -bot0552@dev.com;P123456P -bot0553@dev.com;P123456P -bot0554@dev.com;P123456P -bot0555@dev.com;P123456P -bot0556@dev.com;P123456P -bot0557@dev.com;P123456P -bot0558@dev.com;P123456P -bot0559@dev.com;P123456P -bot0560@dev.com;P123456P -bot0561@dev.com;P123456P -bot0562@dev.com;P123456P -bot0563@dev.com;P123456P -bot0564@dev.com;P123456P -bot0565@dev.com;P123456P -bot0566@dev.com;P123456P -bot0567@dev.com;P123456P -bot0568@dev.com;P123456P -bot0569@dev.com;P123456P -bot0570@dev.com;P123456P -bot0571@dev.com;P123456P -bot0572@dev.com;P123456P -bot0573@dev.com;P123456P -bot0574@dev.com;P123456P -bot0575@dev.com;P123456P -bot0576@dev.com;P123456P -bot0577@dev.com;P123456P -bot0578@dev.com;P123456P -bot0579@dev.com;P123456P -bot0580@dev.com;P123456P -bot0581@dev.com;P123456P -bot0582@dev.com;P123456P -bot0583@dev.com;P123456P -bot0584@dev.com;P123456P -bot0585@dev.com;P123456P -bot0586@dev.com;P123456P -bot0587@dev.com;P123456P -bot0588@dev.com;P123456P -bot0589@dev.com;P123456P -bot0590@dev.com;P123456P -bot0591@dev.com;P123456P -bot0592@dev.com;P123456P -bot0593@dev.com;P123456P -bot0594@dev.com;P123456P -bot0595@dev.com;P123456P -bot0596@dev.com;P123456P -bot0597@dev.com;P123456P -bot0598@dev.com;P123456P -bot0599@dev.com;P123456P -bot0600@dev.com;P123456P -bot0601@dev.com;P123456P -bot0602@dev.com;P123456P -bot0603@dev.com;P123456P -bot0604@dev.com;P123456P -bot0605@dev.com;P123456P -bot0606@dev.com;P123456P -bot0607@dev.com;P123456P -bot0608@dev.com;P123456P -bot0609@dev.com;P123456P -bot0610@dev.com;P123456P -bot0611@dev.com;P123456P -bot0612@dev.com;P123456P -bot0613@dev.com;P123456P -bot0614@dev.com;P123456P -bot0615@dev.com;P123456P -bot0616@dev.com;P123456P -bot0617@dev.com;P123456P -bot0618@dev.com;P123456P -bot0619@dev.com;P123456P -bot0620@dev.com;P123456P -bot0621@dev.com;P123456P -bot0622@dev.com;P123456P -bot0623@dev.com;P123456P -bot0624@dev.com;P123456P -bot0625@dev.com;P123456P -bot0626@dev.com;P123456P -bot0627@dev.com;P123456P -bot0628@dev.com;P123456P -bot0629@dev.com;P123456P -bot0630@dev.com;P123456P -bot0631@dev.com;P123456P -bot0632@dev.com;P123456P -bot0633@dev.com;P123456P -bot0634@dev.com;P123456P -bot0635@dev.com;P123456P -bot0636@dev.com;P123456P -bot0637@dev.com;P123456P -bot0638@dev.com;P123456P -bot0639@dev.com;P123456P -bot0640@dev.com;P123456P -bot0641@dev.com;P123456P -bot0642@dev.com;P123456P -bot0643@dev.com;P123456P -bot0644@dev.com;P123456P -bot0645@dev.com;P123456P -bot0646@dev.com;P123456P -bot0647@dev.com;P123456P -bot0648@dev.com;P123456P -bot0649@dev.com;P123456P -bot0650@dev.com;P123456P -bot0651@dev.com;P123456P -bot0652@dev.com;P123456P -bot0653@dev.com;P123456P -bot0654@dev.com;P123456P -bot0655@dev.com;P123456P -bot0656@dev.com;P123456P -bot0657@dev.com;P123456P -bot0658@dev.com;P123456P -bot0659@dev.com;P123456P -bot0660@dev.com;P123456P -bot0661@dev.com;P123456P -bot0662@dev.com;P123456P -bot0663@dev.com;P123456P -bot0664@dev.com;P123456P -bot0665@dev.com;P123456P -bot0666@dev.com;P123456P -bot0667@dev.com;P123456P -bot0668@dev.com;P123456P -bot0669@dev.com;P123456P -bot0670@dev.com;P123456P -bot0671@dev.com;P123456P -bot0672@dev.com;P123456P -bot0673@dev.com;P123456P -bot0674@dev.com;P123456P -bot0675@dev.com;P123456P -bot0676@dev.com;P123456P -bot0677@dev.com;P123456P -bot0678@dev.com;P123456P -bot0679@dev.com;P123456P -bot0680@dev.com;P123456P -bot0681@dev.com;P123456P -bot0682@dev.com;P123456P -bot0683@dev.com;P123456P -bot0684@dev.com;P123456P -bot0685@dev.com;P123456P -bot0686@dev.com;P123456P -bot0687@dev.com;P123456P -bot0688@dev.com;P123456P -bot0689@dev.com;P123456P -bot0690@dev.com;P123456P -bot0691@dev.com;P123456P -bot0692@dev.com;P123456P -bot0693@dev.com;P123456P -bot0694@dev.com;P123456P -bot0695@dev.com;P123456P -bot0696@dev.com;P123456P -bot0697@dev.com;P123456P -bot0698@dev.com;P123456P -bot0699@dev.com;P123456P -bot0700@dev.com;P123456P -bot0701@dev.com;P123456P -bot0702@dev.com;P123456P -bot0703@dev.com;P123456P -bot0704@dev.com;P123456P -bot0705@dev.com;P123456P -bot0706@dev.com;P123456P -bot0707@dev.com;P123456P -bot0708@dev.com;P123456P -bot0709@dev.com;P123456P -bot0710@dev.com;P123456P -bot0711@dev.com;P123456P -bot0712@dev.com;P123456P -bot0713@dev.com;P123456P -bot0714@dev.com;P123456P -bot0715@dev.com;P123456P -bot0716@dev.com;P123456P -bot0717@dev.com;P123456P -bot0718@dev.com;P123456P -bot0719@dev.com;P123456P -bot0720@dev.com;P123456P -bot0721@dev.com;P123456P -bot0722@dev.com;P123456P -bot0723@dev.com;P123456P -bot0724@dev.com;P123456P -bot0725@dev.com;P123456P -bot0726@dev.com;P123456P -bot0727@dev.com;P123456P -bot0728@dev.com;P123456P -bot0729@dev.com;P123456P -bot0730@dev.com;P123456P -bot0731@dev.com;P123456P -bot0732@dev.com;P123456P -bot0733@dev.com;P123456P -bot0734@dev.com;P123456P -bot0735@dev.com;P123456P -bot0736@dev.com;P123456P -bot0737@dev.com;P123456P -bot0738@dev.com;P123456P -bot0739@dev.com;P123456P -bot0740@dev.com;P123456P -bot0741@dev.com;P123456P -bot0742@dev.com;P123456P -bot0743@dev.com;P123456P -bot0744@dev.com;P123456P -bot0745@dev.com;P123456P -bot0746@dev.com;P123456P -bot0747@dev.com;P123456P -bot0748@dev.com;P123456P -bot0749@dev.com;P123456P -bot0750@dev.com;P123456P -bot0751@dev.com;P123456P -bot0752@dev.com;P123456P -bot0753@dev.com;P123456P -bot0754@dev.com;P123456P -bot0755@dev.com;P123456P -bot0756@dev.com;P123456P -bot0757@dev.com;P123456P -bot0758@dev.com;P123456P -bot0759@dev.com;P123456P -bot0760@dev.com;P123456P -bot0761@dev.com;P123456P -bot0762@dev.com;P123456P -bot0763@dev.com;P123456P -bot0764@dev.com;P123456P -bot0765@dev.com;P123456P -bot0766@dev.com;P123456P -bot0767@dev.com;P123456P -bot0768@dev.com;P123456P -bot0769@dev.com;P123456P -bot0770@dev.com;P123456P -bot0771@dev.com;P123456P -bot0772@dev.com;P123456P -bot0773@dev.com;P123456P -bot0774@dev.com;P123456P -bot0775@dev.com;P123456P -bot0776@dev.com;P123456P -bot0777@dev.com;P123456P -bot0778@dev.com;P123456P -bot0779@dev.com;P123456P -bot0780@dev.com;P123456P -bot0781@dev.com;P123456P -bot0782@dev.com;P123456P -bot0783@dev.com;P123456P -bot0784@dev.com;P123456P -bot0785@dev.com;P123456P -bot0786@dev.com;P123456P -bot0787@dev.com;P123456P -bot0788@dev.com;P123456P -bot0789@dev.com;P123456P -bot0790@dev.com;P123456P -bot0791@dev.com;P123456P -bot0792@dev.com;P123456P -bot0793@dev.com;P123456P -bot0794@dev.com;P123456P -bot0795@dev.com;P123456P -bot0796@dev.com;P123456P -bot0797@dev.com;P123456P -bot0798@dev.com;P123456P -bot0799@dev.com;P123456P -bot0800@dev.com;P123456P -bot0801@dev.com;P123456P -bot0802@dev.com;P123456P -bot0803@dev.com;P123456P -bot0804@dev.com;P123456P -bot0805@dev.com;P123456P -bot0806@dev.com;P123456P -bot0807@dev.com;P123456P -bot0808@dev.com;P123456P -bot0809@dev.com;P123456P -bot0810@dev.com;P123456P -bot0811@dev.com;P123456P -bot0812@dev.com;P123456P -bot0813@dev.com;P123456P -bot0814@dev.com;P123456P -bot0815@dev.com;P123456P -bot0816@dev.com;P123456P -bot0817@dev.com;P123456P -bot0818@dev.com;P123456P -bot0819@dev.com;P123456P -bot0820@dev.com;P123456P -bot0821@dev.com;P123456P -bot0822@dev.com;P123456P -bot0823@dev.com;P123456P -bot0824@dev.com;P123456P -bot0825@dev.com;P123456P -bot0826@dev.com;P123456P -bot0827@dev.com;P123456P -bot0828@dev.com;P123456P -bot0829@dev.com;P123456P -bot0830@dev.com;P123456P -bot0831@dev.com;P123456P -bot0832@dev.com;P123456P -bot0833@dev.com;P123456P -bot0834@dev.com;P123456P -bot0835@dev.com;P123456P -bot0836@dev.com;P123456P -bot0837@dev.com;P123456P -bot0838@dev.com;P123456P -bot0839@dev.com;P123456P -bot0840@dev.com;P123456P -bot0841@dev.com;P123456P -bot0842@dev.com;P123456P -bot0843@dev.com;P123456P -bot0844@dev.com;P123456P -bot0845@dev.com;P123456P -bot0846@dev.com;P123456P -bot0847@dev.com;P123456P -bot0848@dev.com;P123456P -bot0849@dev.com;P123456P -bot0850@dev.com;P123456P -bot0851@dev.com;P123456P -bot0852@dev.com;P123456P -bot0853@dev.com;P123456P -bot0854@dev.com;P123456P -bot0855@dev.com;P123456P -bot0856@dev.com;P123456P -bot0857@dev.com;P123456P -bot0858@dev.com;P123456P -bot0859@dev.com;P123456P -bot0860@dev.com;P123456P -bot0861@dev.com;P123456P -bot0862@dev.com;P123456P -bot0863@dev.com;P123456P -bot0864@dev.com;P123456P -bot0865@dev.com;P123456P -bot0866@dev.com;P123456P -bot0867@dev.com;P123456P -bot0868@dev.com;P123456P -bot0869@dev.com;P123456P -bot0870@dev.com;P123456P -bot0871@dev.com;P123456P -bot0872@dev.com;P123456P -bot0873@dev.com;P123456P -bot0874@dev.com;P123456P -bot0875@dev.com;P123456P -bot0876@dev.com;P123456P -bot0877@dev.com;P123456P -bot0878@dev.com;P123456P -bot0879@dev.com;P123456P -bot0880@dev.com;P123456P -bot0881@dev.com;P123456P -bot0882@dev.com;P123456P -bot0883@dev.com;P123456P -bot0884@dev.com;P123456P -bot0885@dev.com;P123456P -bot0886@dev.com;P123456P -bot0887@dev.com;P123456P -bot0888@dev.com;P123456P -bot0889@dev.com;P123456P -bot0890@dev.com;P123456P -bot0891@dev.com;P123456P -bot0892@dev.com;P123456P -bot0893@dev.com;P123456P -bot0894@dev.com;P123456P -bot0895@dev.com;P123456P -bot0896@dev.com;P123456P -bot0897@dev.com;P123456P -bot0898@dev.com;P123456P -bot0899@dev.com;P123456P -bot0900@dev.com;P123456P -bot0901@dev.com;P123456P -bot0902@dev.com;P123456P -bot0903@dev.com;P123456P -bot0904@dev.com;P123456P -bot0905@dev.com;P123456P -bot0906@dev.com;P123456P -bot0907@dev.com;P123456P -bot0908@dev.com;P123456P -bot0909@dev.com;P123456P -bot0910@dev.com;P123456P -bot0911@dev.com;P123456P -bot0912@dev.com;P123456P -bot0913@dev.com;P123456P -bot0914@dev.com;P123456P -bot0915@dev.com;P123456P -bot0916@dev.com;P123456P -bot0917@dev.com;P123456P -bot0918@dev.com;P123456P -bot0919@dev.com;P123456P -bot0920@dev.com;P123456P -bot0921@dev.com;P123456P -bot0922@dev.com;P123456P -bot0923@dev.com;P123456P -bot0924@dev.com;P123456P -bot0925@dev.com;P123456P -bot0926@dev.com;P123456P -bot0927@dev.com;P123456P -bot0928@dev.com;P123456P -bot0929@dev.com;P123456P -bot0930@dev.com;P123456P -bot0931@dev.com;P123456P -bot0932@dev.com;P123456P -bot0933@dev.com;P123456P -bot0934@dev.com;P123456P -bot0935@dev.com;P123456P -bot0936@dev.com;P123456P -bot0937@dev.com;P123456P -bot0938@dev.com;P123456P -bot0939@dev.com;P123456P -bot0940@dev.com;P123456P -bot0941@dev.com;P123456P -bot0942@dev.com;P123456P -bot0943@dev.com;P123456P -bot0944@dev.com;P123456P -bot0945@dev.com;P123456P -bot0946@dev.com;P123456P -bot0947@dev.com;P123456P -bot0948@dev.com;P123456P -bot0949@dev.com;P123456P -bot0950@dev.com;P123456P -bot0951@dev.com;P123456P -bot0952@dev.com;P123456P -bot0953@dev.com;P123456P -bot0954@dev.com;P123456P -bot0955@dev.com;P123456P -bot0956@dev.com;P123456P -bot0957@dev.com;P123456P -bot0958@dev.com;P123456P -bot0959@dev.com;P123456P -bot0960@dev.com;P123456P -bot0961@dev.com;P123456P -bot0962@dev.com;P123456P -bot0963@dev.com;P123456P -bot0964@dev.com;P123456P -bot0965@dev.com;P123456P -bot0966@dev.com;P123456P -bot0967@dev.com;P123456P -bot0968@dev.com;P123456P -bot0969@dev.com;P123456P -bot0970@dev.com;P123456P -bot0971@dev.com;P123456P -bot0972@dev.com;P123456P -bot0973@dev.com;P123456P -bot0974@dev.com;P123456P -bot0975@dev.com;P123456P -bot0976@dev.com;P123456P -bot0977@dev.com;P123456P -bot0978@dev.com;P123456P -bot0979@dev.com;P123456P -bot0980@dev.com;P123456P -bot0981@dev.com;P123456P -bot0982@dev.com;P123456P -bot0983@dev.com;P123456P -bot0984@dev.com;P123456P -bot0985@dev.com;P123456P -bot0986@dev.com;P123456P -bot0987@dev.com;P123456P -bot0988@dev.com;P123456P -bot0989@dev.com;P123456P -bot0990@dev.com;P123456P -bot0991@dev.com;P123456P -bot0992@dev.com;P123456P -bot0993@dev.com;P123456P -bot0994@dev.com;P123456P -bot0995@dev.com;P123456P -bot0996@dev.com;P123456P -bot0997@dev.com;P123456P -bot0998@dev.com;P123456P -bot0999@dev.com;P123456P -bot1000@dev.com;P123456P \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/AccountAssetPairsController.cs b/src/MarginTrading.DataReader/Controllers/AccountAssetPairsController.cs deleted file mode 100644 index eab2a3237..000000000 --- a/src/MarginTrading.DataReader/Controllers/AccountAssetPairsController.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.AzureRepositories.Contract; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.AccountAssetPair; -using MarginTrading.Backend.Core; -using MarginTrading.Backend.Core.Messages; -using MarginTrading.Backend.Core.TradingConditions; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/accountAssetPairs")] - public class AccountAssetPairsController : Controller, IAccountAssetPairsReadingApi - { - private readonly IConvertService _convertService; - private readonly IAccountAssetPairsRepository _accountAssetPairsRepository; - - public AccountAssetPairsController(IAccountAssetPairsRepository accountAssetPairsRepository, IConvertService convertService) - { - _accountAssetPairsRepository = accountAssetPairsRepository; - _convertService = convertService; - } - - [HttpGet] - [Route("")] - public async Task> List() - { - return (await _accountAssetPairsRepository.GetAllAsync()).Select(Convert).ToList(); - } - - [HttpGet] - [Route("byAsset/{tradingConditionId}/{baseAssetId}")] - public async Task> Get(string tradingConditionId, string baseAssetId) - { - return (await _accountAssetPairsRepository.GetAllAsync(tradingConditionId, baseAssetId)).Select(Convert).ToList(); - } - - [HttpGet] - [Route("byAssetPair/{tradingConditionId}/{baseAssetId}/{assetPairId}")] - public async Task Get(string tradingConditionId, string baseAssetId, string assetPairId) - { - return Convert(await _accountAssetPairsRepository.GetAsync(tradingConditionId, baseAssetId, assetPairId) - ?? throw new Exception(string.Format(MtMessages.AccountAssetForTradingConditionNotFound, - tradingConditionId, baseAssetId, assetPairId))); - } - - private AccountAssetPairContract Convert(IAccountAssetPair settings) - { - return _convertService.Convert(settings); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/AccountGroupsController.cs b/src/MarginTrading.DataReader/Controllers/AccountGroupsController.cs deleted file mode 100644 index 92e574094..000000000 --- a/src/MarginTrading.DataReader/Controllers/AccountGroupsController.cs +++ /dev/null @@ -1,60 +0,0 @@ -using MarginTrading.AzureRepositories.Contract; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.TradingConditions; -using MarginTrading.Backend.Core.TradingConditions; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/accountGroups")] - public class AccountGroupsController : Controller, IAccountGroupsReadingApi - { - private readonly IAccountGroupRepository _accountGroupRepository; - private readonly IConvertService _convertService; - - public AccountGroupsController(IAccountGroupRepository accountGroupRepository, IConvertService convertService) - { - _accountGroupRepository = accountGroupRepository; - _convertService = convertService; - } - - - /// - /// Returns all account groups - /// - /// - [HttpGet] - [Route("")] - public async Task> List() - { - return (await _accountGroupRepository.GetAllAsync()) - .Select(Convert) - .ToList(); - } - - /// - /// Returns an account groups by and - /// - [HttpGet] - [Route("byBaseAsset/{tradingConditionId}/{baseAssetId}")] - [ProducesResponseType(typeof(AccountGroup), 200)] - [ProducesResponseType(typeof(AccountGroup), 204)] - public async Task GetByBaseAsset(string tradingConditionId, string baseAssetId) - { - var accountGroup = await _accountGroupRepository.GetAsync(tradingConditionId, baseAssetId); - - return accountGroup == null ? null : Convert(accountGroup); - } - - private AccountGroupContract Convert(IAccountGroup src) - { - return _convertService.Convert(src); - } - } -} diff --git a/src/MarginTrading.DataReader/Controllers/AccountsController.cs b/src/MarginTrading.DataReader/Controllers/AccountsController.cs index ca5b79d7e..bda282fb5 100644 --- a/src/MarginTrading.DataReader/Controllers/AccountsController.cs +++ b/src/MarginTrading.DataReader/Controllers/AccountsController.cs @@ -5,8 +5,6 @@ using MarginTrading.Backend.Contracts; using MarginTrading.Backend.Contracts.Account; using MarginTrading.Backend.Core; -using MarginTrading.Backend.Core.Exceptions; -using MarginTrading.DataReader.Settings; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -16,29 +14,13 @@ namespace MarginTrading.DataReader.Controllers [Route("api/accounts")] public class AccountsController : Controller, IAccountsApi { - private readonly DataReaderSettings _dataReaderSettings; - private readonly IMarginTradingAccountsRepository _accountsRepository; private readonly IMarginTradingAccountStatsRepository _accountStatsRepository; - public AccountsController(DataReaderSettings dataReaderSettings, IMarginTradingAccountsRepository accountsRepository, - IMarginTradingAccountStatsRepository accountStatsRepository) + public AccountsController(IMarginTradingAccountStatsRepository accountStatsRepository) { - _dataReaderSettings = dataReaderSettings; - _accountsRepository = accountsRepository; _accountStatsRepository = accountStatsRepository; } - /// - /// Returns all accounts - /// - [HttpGet] - [Route("")] - public async Task> GetAllAccounts() - { - return (await _accountsRepository.GetAllAsync()) - .Select(item => ToBackendContract(item, _dataReaderSettings.IsLive)); - } - /// /// Returns all account stats /// @@ -48,52 +30,6 @@ public async Task> GetAllAcco { return (await _accountStatsRepository.GetAllAsync()).Select(ToBackendContract); } - - /// - /// Returns all accounts by client - /// - /// - /// - [HttpGet] - [Route("byClient/{clientId}")] - public async Task> GetAccountsByClientId(string clientId) - { - return (await _accountsRepository.GetAllAsync(clientId)) - .Select(x => ToBackendContract(MarginTradingAccount.Create(x), _dataReaderSettings.IsLive)); - } - - /// - /// Returns account by it's Id - /// - /// - /// - /// - [HttpGet] - [Route("byId/{id}")] - public async Task GetAccountById(string id) - { - var account = await _accountsRepository.GetAsync(id); - - if (account == null) - throw new AccountNotFoundException(id, "Account was not found."); - - return ToBackendContract(MarginTradingAccount.Create(account), _dataReaderSettings.IsLive); - } - - private static DataReaderAccountBackendContract ToBackendContract(IMarginTradingAccount src, bool isLive) - { - return new DataReaderAccountBackendContract - { - Id = src.Id, - ClientId = src.ClientId, - TradingConditionId = src.TradingConditionId, - BaseAssetId = src.BaseAssetId, - Balance = src.Balance, - WithdrawTransferLimit = src.WithdrawTransferLimit, - IsLive = isLive, - LegalEntity = src.LegalEntity, - }; - } private static DataReaderAccountStatsBackendContract ToBackendContract(IMarginTradingAccountStats item) { diff --git a/src/MarginTrading.DataReader/Controllers/AssetPairsController.cs b/src/MarginTrading.DataReader/Controllers/AssetPairsController.cs deleted file mode 100644 index 93fd23fdd..000000000 --- a/src/MarginTrading.DataReader/Controllers/AssetPairsController.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.AzureRepositories.Contract; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.AssetPairSettings; -using MarginTrading.Backend.Core; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.DataReader.Controllers -{ - [Route("api/[controller]"), Authorize] - public class AssetPairsController : Controller, IAssetPairsReadingApi - { - private readonly IConvertService _convertService; - private readonly IAssetPairsRepository _assetPairsRepository; - - public AssetPairsController(IConvertService convertService, - IAssetPairsRepository assetPairsRepository) - { - _convertService = convertService; - _assetPairsRepository = assetPairsRepository; - } - - /// - /// Get pairs with optional filtering by LegalEntity and MatchingEngineMode - /// - [HttpGet, Route("")] - public async Task> List([FromQuery]string legalEntity, - [FromQuery]MatchingEngineModeContract? matchingEngineMode) - { - return (await _assetPairsRepository.GetAsync()).Select(Convert) - .Where(s => (matchingEngineMode == null || s.MatchingEngineMode == matchingEngineMode) && - (legalEntity == null || s.LegalEntity == legalEntity)).ToList(); - } - - /// - /// Get pair by id - /// - [HttpGet, Route("{assetPairId}")] - public async Task Get(string assetPairId) - { - return Convert(await _assetPairsRepository.GetAsync(assetPairId)); - } - - private AssetPairContract Convert(IAssetPair settings) - { - return _convertService.Convert(settings); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/DictionariesController.cs b/src/MarginTrading.DataReader/Controllers/DictionariesController.cs deleted file mode 100644 index 1f3d8e459..000000000 --- a/src/MarginTrading.DataReader/Controllers/DictionariesController.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.AzureRepositories.Contract; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.AssetPairSettings; -using MarginTrading.Backend.Core; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/dictionaries")] - public class DictionariesController : Controller, IDictionariesReadingApi - { - private readonly IAssetPairsRepository _assetPairsRepository; - private readonly IConvertService _convertService; - - public DictionariesController(IAssetPairsRepository assetPairsRepository, IConvertService convertService) - { - _assetPairsRepository = assetPairsRepository; - _convertService = convertService; - } - - [HttpGet] - [Route("assetPairs")] - public async Task> AssetPairs() - { - return (await _assetPairsRepository.GetAsync()).Select(Convert).ToList(); - } - - private AssetPairContract Convert(IAssetPair assetPair) - { - return _convertService.Convert(assetPair); - } - - [HttpGet] - [Route("matchingEngines")] - public Task> MatchingEngines() - { - //TODO: replace by Ids when ME infos will be stored in DB - return Task.FromResult((new[] - { - MatchingEngineConstants.LykkeVuMm, - MatchingEngineConstants.LykkeCyStp, - MatchingEngineConstants.Reject - }).ToList()); - } - - [HttpGet] - [Route("orderTypes")] - [ProducesResponseType(typeof(List), 200)] - public Task> OrderTypes() - { - return Task.FromResult(Enum.GetNames(typeof(OrderDirection)).ToList()); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/RoutesController.cs b/src/MarginTrading.DataReader/Controllers/RoutesController.cs deleted file mode 100644 index b0df222d9..000000000 --- a/src/MarginTrading.DataReader/Controllers/RoutesController.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.Routes; -using MarginTrading.Backend.Contracts.TradeMonitoring; -using MarginTrading.Backend.Core; -using MarginTrading.Backend.Core.MatchingEngines; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using MarginTrading.Common.Extensions; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/routes")] - public class RoutesController : Controller, IRoutesReadingApi - { - private readonly IMatchingEngineRoutesRepository _routesRepository; - - public RoutesController(IMatchingEngineRoutesRepository routesRepository) - { - _routesRepository = routesRepository; - } - - /// - /// Gets all routes - /// - [HttpGet] - [Route("")] - public async Task> List() - { - return (await _routesRepository.GetAllRoutesAsync()).Select(TransformRoute).ToList(); - } - - /// - /// Gets a route by - /// - [HttpGet] - [Route("{id}")] - public async Task GetById(string id) - { - return TransformRoute(await _routesRepository.GetRouteByIdAsync(id)); - } - - private static MatchingEngineRouteContract TransformRoute(IMatchingEngineRoute route) - { - string GetEmptyIfAny(string value) - { - const string AnyValue = "*"; - return value == AnyValue ? null : value; - } - OrderDirectionContract? GetDirection(OrderDirection? direction) - { - return direction?.ToType(); - } - - return new MatchingEngineRouteContract - { - Id = route.Id, - Rank = route.Rank, - MatchingEngineId = route.MatchingEngineId, - Asset = GetEmptyIfAny(route.Asset), - ClientId = GetEmptyIfAny(route.ClientId), - Instrument = GetEmptyIfAny(route.Instrument), - TradingConditionId = GetEmptyIfAny(route.TradingConditionId), - Type = GetDirection(route.Type) - }; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/SettingsController.cs b/src/MarginTrading.DataReader/Controllers/SettingsController.cs deleted file mode 100644 index 867d9154e..000000000 --- a/src/MarginTrading.DataReader/Controllers/SettingsController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Backend.Contracts; -using MarginTrading.Common.Services.Settings; -using MarginTrading.DataReader.Attributes; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/settings")] - public class SettingsController : Controller, ISettingsReadingApi - { - private readonly Settings.DataReaderSettings _dataReaderSettings; - private readonly IMarginTradingSettingsCacheService _marginTradingSettingsCacheService; - - public SettingsController(Settings.DataReaderSettings dataReaderSettings, - IMarginTradingSettingsCacheService marginTradingSettingsCacheService) - { - _dataReaderSettings = dataReaderSettings; - _marginTradingSettingsCacheService = marginTradingSettingsCacheService; - } - - [HttpGet] - [Route("enabled/{clientId}")] - [SkipMarginTradingEnabledCheck] - public Task IsMarginTradingEnabled(string clientId) - { - return _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId, _dataReaderSettings.IsLive); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.DataReader/Controllers/TradingConditionsController.cs b/src/MarginTrading.DataReader/Controllers/TradingConditionsController.cs deleted file mode 100644 index 500f90d09..000000000 --- a/src/MarginTrading.DataReader/Controllers/TradingConditionsController.cs +++ /dev/null @@ -1,53 +0,0 @@ -using MarginTrading.AzureRepositories.Contract; -using MarginTrading.Backend.Contracts; -using MarginTrading.Backend.Contracts.TradingConditions; -using MarginTrading.Backend.Core.TradingConditions; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MarginTrading.DataReader.Controllers -{ - [Authorize] - [Route("api/tradingConditions")] - public class TradingConditionsController : Controller, ITradingConditionsReadingApi - { - private readonly ITradingConditionRepository _conditionsRepository; - private readonly IConvertService _convertService; - - public TradingConditionsController(ITradingConditionRepository conditionsRepository, IConvertService convertService) - { - _conditionsRepository = conditionsRepository; - _convertService = convertService; - } - - /// - /// Returns all trading conditions - /// - [HttpGet] - [Route("")] - public async Task> List() - { - return (await _conditionsRepository.GetAllAsync()).Select(Convert).ToList(); - } - - /// - /// Returns trading condition by id - /// - [HttpGet] - [Route("{id}")] - public async Task Get(string id) - { - return Convert(await _conditionsRepository.GetAsync(id)); - } - - - private TradingConditionContract Convert(ITradingCondition tradingCondition) - { - return _convertService.Convert(tradingCondition); - } - } -} diff --git a/src/MarginTrading.Frontend/Application.cs b/src/MarginTrading.Frontend/Application.cs deleted file mode 100644 index b3c19bde6..000000000 --- a/src/MarginTrading.Frontend/Application.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Threading.Tasks; -using Autofac; -using Common.Log; -using MarginTrading.Frontend.Services; -using MarginTrading.Frontend.Wamp; -using WampSharp.V2.Realm; - -namespace MarginTrading.Frontend -{ - public class Application - { - private readonly IComponentContext _componentContext; - private readonly IConsole _consoleWriter; - private readonly ILog _logger; - private readonly WampSessionsService _wampSessionsService; - private const string ServiceName = "MarginTrading.Frontend"; - - public Application( - IComponentContext componentContext, - IConsole consoleWriter, - ILog logger, - WampSessionsService wampSessionsService) - { - _componentContext = componentContext; - _consoleWriter = consoleWriter; - _logger = logger; - _wampSessionsService = wampSessionsService; - } - - public async Task StartAsync() - { - _consoleWriter.WriteLine($"Staring {ServiceName}"); - await _logger.WriteInfoAsync(ServiceName, null, null, "Starting broker"); - try - { - var rpcMethods = _componentContext.Resolve(); - var realm = _componentContext.Resolve(); - realm.SessionCreated += (sender, args) => _wampSessionsService.OpenedSessionsCount++; - realm.SessionClosed += (sender, args) => _wampSessionsService.OpenedSessionsCount--; - await realm.Services.RegisterCallee(rpcMethods); - } - catch (Exception ex) - { - _consoleWriter.WriteLine($"{ServiceName} error: {ex.Message}"); - await _logger.WriteErrorAsync(ServiceName, "Application.RunAsync", null, ex); - } - } - - public void Stop() - { - _consoleWriter.WriteLine($"Closing {ServiceName}"); - } - } -} diff --git a/src/MarginTrading.Frontend/Connected Services/Application Insights/ConnectedService.json b/src/MarginTrading.Frontend/Connected Services/Application Insights/ConnectedService.json deleted file mode 100644 index f4580e22d..000000000 --- a/src/MarginTrading.Frontend/Connected Services/Application Insights/ConnectedService.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ProviderId": "Microsoft.ApplicationInsights.ConnectedService.ConnectedServiceProvider", - "Version": "8.6.404.2", - "GettingStartedDocument": { - "Uri": "https://go.microsoft.com/fwlink/?LinkID=798432" - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Controllers/AccountsHistoryController.cs b/src/MarginTrading.Frontend/Controllers/AccountsHistoryController.cs deleted file mode 100644 index 311e66e22..000000000 --- a/src/MarginTrading.Frontend/Controllers/AccountsHistoryController.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Extensions; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/accountshistory")] - [Authorize] - public class AccountsHistoryController : Controller - { - private readonly RpcFacade _rpcFacade; - - public AccountsHistoryController(RpcFacade rpcFacade) - { - _rpcFacade = rpcFacade; - } - - [Route("")] - [HttpGet] - public async Task> GetAccountHistory([FromQuery]AccountHistoryFiltersClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var history = await _rpcFacade.GetAccountHistory(clientId, request); - - return ResponseModel.CreateOk(history); - } - - [Route("timeline")] - [HttpGet] - public async Task> GetAccountHistoryTimeline([FromQuery]AccountHistoryFiltersClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var history = await _rpcFacade.GetAccountHistoryTimeline(clientId, request); - - return ResponseModel.CreateOk(history); - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/HomeController.cs b/src/MarginTrading.Frontend/Controllers/HomeController.cs deleted file mode 100644 index 1417b1ece..000000000 --- a/src/MarginTrading.Frontend/Controllers/HomeController.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MarginTrading.Common.Documentation; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Wamp; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [ApiExplorerSettings(IgnoreApi = true)] - public class HomeController : Controller - { - [Route("")] - [HttpGet] - public IActionResult Index() - { - var doc = new TypeDocGenerator(); - var model = new MethodInfoModel - { - Rpc = doc.GetDocumentation(typeof(IRpcMtFrontend)), - Topic = doc.GetDocumentation(typeof(IWampTopic)) - }; - - return View(model); - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/InitController.cs b/src/MarginTrading.Frontend/Controllers/InitController.cs deleted file mode 100644 index b82ace42c..000000000 --- a/src/MarginTrading.Frontend/Controllers/InitController.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Common.Services; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Extensions; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/init")] - [Authorize] - public class InitController : Controller - { - private readonly RpcFacade _rpcFacade; - private readonly IDateService _dateService; - - public InitController(RpcFacade rpcFacade, IDateService dateService) - { - _rpcFacade = rpcFacade; - _dateService = dateService; - } - - [Route("data")] - [HttpGet] - public async Task> InitData() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initData = await _rpcFacade.InitData(clientId); - - return ResponseModel.CreateOk(initData); - } - - [Route("accounts")] - [HttpGet] - public async Task> InitAccounts() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initAccounts = await _rpcFacade.InitAccounts(clientId); - - return ResponseModel.CreateOk(initAccounts); - } - - [Route("accountinstruments")] - [HttpGet] - public async Task> AccountInstruments() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initAccountInstruments = await _rpcFacade.AccountInstruments(clientId); - - return ResponseModel.CreateOk(initAccountInstruments); - } - - [Route("chart")] - [HttpGet] - public async Task> InitChart() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initGraph = await _rpcFacade.InitGraph(clientId); - - return ResponseModel.CreateOk(initGraph); - } - - [Route("chart/filtered")] - [HttpPost] - public async Task> InitChartFiltered([FromBody] InitChartDataClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initGraph = await _rpcFacade.InitGraph(clientId, request?.AssetIds); - - return ResponseModel.CreateOk(initGraph); - } - - [Route("prices")] - [HttpGet] - public async Task>> InitPrices() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError>(); - } - - - var initPrices = await _rpcFacade.InitPrices(clientId); - - return ResponseModel>.CreateOk(initPrices); - } - - [Route("prices/filtered")] - [HttpPost] - public async Task>> InitPricesWithFilter([FromBody] InitPricesFilteredRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError>(); - } - - var initPrices = await _rpcFacade.InitPrices(clientId, request?.AssetIds); - - return ResponseModel>.CreateOk(initPrices); - } - - [Route("~/api/v2/init/prices")] - [HttpGet] - public async Task> InitPricesV2() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initPrices = await _rpcFacade.InitPrices(clientId); - var result = new InitPricesResponse { Prices = initPrices.Values.ToArray(), ServerTime = _dateService.Now() }; - - return ResponseModel.CreateOk(result); - } - - [Route("~/api/v2/init/prices/filtered")] - [HttpPost] - public async Task> InitPricesWithFilterV2([FromBody] InitPricesFilteredRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var initPrices = await _rpcFacade.InitPrices(clientId, request?.AssetIds); - var result = new InitPricesResponse { Prices = initPrices.Values.ToArray(), ServerTime = _dateService.Now() }; - - return ResponseModel.CreateOk(result); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Controllers/IsAliveController.cs b/src/MarginTrading.Frontend/Controllers/IsAliveController.cs deleted file mode 100644 index ac03658ae..000000000 --- a/src/MarginTrading.Frontend/Controllers/IsAliveController.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Common.Services; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Services; -using MarginTrading.Frontend.Settings; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.PlatformAbstractions; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/isAlive")] - public class IsAliveController : Controller - { - private readonly MtFrontendSettings _setings; - private readonly IHttpRequestService _httpRequestService; - private readonly WampSessionsService _wampSessionsService; - private readonly IDateService _dateService; - - public IsAliveController(MtFrontendSettings setings, - IHttpRequestService httpRequestService, - WampSessionsService wampSessionsService, - IDateService dateService) - { - _setings = setings; - _httpRequestService = httpRequestService; - _wampSessionsService = wampSessionsService; - _dateService = dateService; - } - - [HttpGet] - public async Task Get() - { - var result = new IsAliveExtendedResponse - { - Version = PlatformServices.Default.Application.ApplicationVersion, - Env = _setings.MarginTradingFront.Env, - ServerTime = _dateService.Now() - }; - - result.LiveVersion = await GetBackendVersion(true); - result.DemoVersion = await GetBackendVersion(false); - result.WampOpened = _wampSessionsService.OpenedSessionsCount; - - return result; - } - - private async Task GetBackendVersion(bool isLive) - { - try - { - var responce = await _httpRequestService.GetAsync("isAlive", isLive, 3); - return responce.Version; - } - catch (MaintenanceException ex) - { - return $"Maintenance since {ex.EnabledAt}"; - } - catch - { - return "Error"; - } - - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/OrderBookController.cs b/src/MarginTrading.Frontend/Controllers/OrderBookController.cs deleted file mode 100644 index 33ccfae61..000000000 --- a/src/MarginTrading.Frontend/Controllers/OrderBookController.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/orderbook")] - [Authorize] - public class OrderBookController : Controller - { - private readonly RpcFacade _rpcFacade; - - public OrderBookController(RpcFacade rpcFacade) - { - _rpcFacade = rpcFacade; - } - - [HttpGet] - [Route("{instrument}")] - public async Task> GetOrderBook(string instrument) - { - var result = await _rpcFacade.GetOrderBook(instrument); - - return ResponseModel.CreateOk(result); - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/OrdersController.cs b/src/MarginTrading.Frontend/Controllers/OrdersController.cs deleted file mode 100644 index 63209c7a6..000000000 --- a/src/MarginTrading.Frontend/Controllers/OrdersController.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Common.Middleware; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Extensions; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/orders")] - [Authorize] - [MiddlewareFilter(typeof(RequestLoggingPipeline))] - public class OrdersController : Controller - { - private readonly RpcFacade _rpcFacade; - - public OrdersController(RpcFacade rpcFacade) - { - _rpcFacade = rpcFacade; - } - - [Route("place")] - [HttpPost] - public async Task> PlaceOrder([FromBody] NewOrderClientContract request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.PlaceOrder(clientId, request); - - if (result.IsError()) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, - result.Message); - } - - return ResponseModel.CreateOk(result.Result); - } - - [Route("close")] - [HttpPost] - public async Task> CloseOrder([FromBody] CloseOrderClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.CloseOrder(clientId, request); - - if (result.IsError() || !result.Result) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, - result.Message); - } - - return ResponseModel.CreateOk(result.Result); - } - - [Route("cancel")] - [HttpPost] - public async Task> CancelOrder([FromBody] CloseOrderClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.CancelOrder(clientId, request); - - if (result.IsError() || !result.Result) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, - result.Message); - } - - return ResponseModel.CreateOk(result.Result); - } - - [Route("positions")] - [HttpGet] - public async Task> GetOpenPositions() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.GetOpenPositions(clientId); - - return ResponseModel.CreateOk(result); - } - - [Route("positions/{accountId}")] - [HttpGet] - public async Task> GetAccountOpenPositions(string accountId) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.GetAccountOpenPositions(clientId, accountId); - - return ResponseModel.CreateOk(result); - } - - [Route("")] - [HttpGet] - public async Task> GetClientOrders() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.GetClientOrders(clientId); - - return ResponseModel.CreateOk(result); - } - - [Route("limits")] - [HttpPut] - public async Task> ChangeOrderLimits([FromBody] ChangeOrderLimitsClientRequest request) - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var result = await _rpcFacade.ChangeOrderLimits(clientId, request); - - if (result.IsError() || !result.Result) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, - result.Message); - } - - return ResponseModel.CreateOk(result.Result); - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/UserController.cs b/src/MarginTrading.Frontend/Controllers/UserController.cs deleted file mode 100644 index 67d130928..000000000 --- a/src/MarginTrading.Frontend/Controllers/UserController.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Common.Middleware; -using MarginTrading.Common.Services.Client; -using MarginTrading.Common.Settings; -using MarginTrading.Frontend.Extensions; -using MarginTrading.Frontend.Models; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/user")] - [Authorize] - [MiddlewareFilter(typeof(RequestLoggingPipeline))] - public class UserController: Controller - { - private readonly IClientAccountService _clientNotificationService; - - public UserController(IClientAccountService clientNotificationService) - { - _clientNotificationService = clientNotificationService; - } - - [Route("notificationId")] - [HttpGet] - public async Task> GetNotificationId() - { - var clientId = this.GetClientId(); - - if (clientId == null) - { - return this.UserNotFoundError(); - } - - var notificationId = await _clientNotificationService.GetNotificationId(clientId); - - return ResponseModel.CreateOk(notificationId); - } - } -} diff --git a/src/MarginTrading.Frontend/Controllers/WatchListsController.cs b/src/MarginTrading.Frontend/Controllers/WatchListsController.cs deleted file mode 100644 index df150cad7..000000000 --- a/src/MarginTrading.Frontend/Controllers/WatchListsController.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; -using AspNet.Security.OpenIdConnect.Extensions; -using MarginTrading.Common.Middleware; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Repositories; -using MarginTrading.Frontend.Repositories.Contract; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Controllers -{ - [Route("api/watchlists")] - [Authorize] - [MiddlewareFilter(typeof(RequestLoggingPipeline))] - public class WatchListsController : Controller - { - private readonly IWatchListService _watchListService; - - public WatchListsController(IWatchListService watchListService) - { - _watchListService = watchListService; - } - - [HttpGet] - [Route("")] - public async Task>> GetWatchLists() - { - var clientId = User.GetClaim(ClaimTypes.NameIdentifier); - - if (clientId == null) - { - return ResponseModel>.CreateFail(ResponseModel.ErrorCodeType.NoAccess, "Wrong token"); - } - - var result = new ResponseModel> - { - Result = await _watchListService.GetAllAsync(clientId) - }; - - return result; - } - - [HttpPost] - [Route("")] - public async Task> AddWatchList([FromBody]WatchList model) - { - var clientId = User.GetClaim(ClaimTypes.NameIdentifier); - - if (clientId == null) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.NoAccess, "Wrong token"); - } - - var result = new ResponseModel(); - - if (model.AssetIds == null || model.AssetIds.Count == 0) - { - return ResponseModel.CreateInvalidFieldError("AssetIds", "AssetIds should not be empty"); - } - - var addResult = await _watchListService.AddAsync(model.Id, clientId, model.Name, model.AssetIds); - - switch (addResult.Status) - { - case WatchListStatus.AssetNotFound: - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.AssetNotFound, $"Asset '{addResult.Message}' is not found or not allowed"); - case WatchListStatus.ReadOnly: - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, "This watch list is readonly"); - } - - result.Result = addResult.Result; - - return result; - } - - [HttpDelete] - [Route("{id}")] - public async Task DeleteWatchList(string id) - { - var clientId = User.GetClaim(ClaimTypes.NameIdentifier); - - if (clientId == null) - { - return ResponseModel>.CreateFail(ResponseModel.ErrorCodeType.NoAccess, "Wrong token"); - } - - var result = await _watchListService.DeleteAsync(clientId, id); - - switch (result.Status) - { - case WatchListStatus.NotFound: - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.NoData, "Watch list not found"); - case WatchListStatus.ReadOnly: - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.InconsistentData, "Readonly watch list can't be deleted"); - } - - return ResponseModel.CreateOk(); - } - } -} diff --git a/src/MarginTrading.Frontend/Dockerfile b/src/MarginTrading.Frontend/Dockerfile deleted file mode 100644 index 8a15508ac..000000000 --- a/src/MarginTrading.Frontend/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM microsoft/aspnetcore:2.0 -WORKDIR /app -COPY . . -ENTRYPOINT ["dotnet", "MarginTrading.Frontend.dll"] diff --git a/src/MarginTrading.Frontend/Extensions/ControllerExtensions.cs b/src/MarginTrading.Frontend/Extensions/ControllerExtensions.cs deleted file mode 100644 index 789f750c6..000000000 --- a/src/MarginTrading.Frontend/Extensions/ControllerExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; -using AspNet.Security.OpenIdConnect.Extensions; -using MarginTrading.Frontend.Models; -using Microsoft.AspNetCore.Mvc; - -namespace MarginTrading.Frontend.Extensions -{ - public static class ControllerExtensions - { - public static string GetClientId(this Controller controller) - { - return controller.User.GetClaim(ClaimTypes.NameIdentifier); - } - - public static ResponseModel UserNotFoundError(this Controller controller) - { - return ResponseModel.CreateFail(ResponseModel.ErrorCodeType.NoAccess, "User not found"); - } - } -} diff --git a/src/MarginTrading.Frontend/Infrastructure/AddAuthorizationHeaderParameter.cs b/src/MarginTrading.Frontend/Infrastructure/AddAuthorizationHeaderParameter.cs deleted file mode 100644 index 8c8a98ca9..000000000 --- a/src/MarginTrading.Frontend/Infrastructure/AddAuthorizationHeaderParameter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc.Authorization; -using Swashbuckle.Swagger.Model; -using Swashbuckle.SwaggerGen.Generator; - -namespace MarginTrading.Frontend.Infrastructure -{ - public class AddAuthorizationHeaderParameter : IOperationFilter - { - void IOperationFilter.Apply(Operation operation, OperationFilterContext context) - { - var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors; - var isAuthorized = filterPipeline.Select(f => f.Filter).Any(f => f is AuthorizeFilter); - var authorizationRequired = context.ApiDescription.GetControllerAttributes().Any(a => a is AuthorizeAttribute); - if (!authorizationRequired) authorizationRequired = context.ApiDescription.GetActionAttributes().Any(a => a is AuthorizeAttribute); - - if (isAuthorized && authorizationRequired) - { - if (operation.Parameters == null) - operation.Parameters = new List(); - - operation.Parameters.Add(new NonBodyParameter - { - Name = "Authorization", - In = "header", - Description = "Bearer Token", - Required = true, - Type = "string" - }); - } - } - } -} diff --git a/src/MarginTrading.Frontend/MarginTrading.Frontend.csproj b/src/MarginTrading.Frontend/MarginTrading.Frontend.csproj deleted file mode 100644 index bce626931..000000000 --- a/src/MarginTrading.Frontend/MarginTrading.Frontend.csproj +++ /dev/null @@ -1,71 +0,0 @@ - - - netcoreapp2.0 - true - MarginTrading.Frontend - Exe - MarginTrading.Frontend - false - false - false - 1.0.1 - - - - - - - PreserveNewest - - - - - {5EC22A63-BA3F-41A2-A70F-216B7E809390} - MarginTrading.Backend.Contracts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Middleware/GlobalErrorHandlerMiddleware.cs b/src/MarginTrading.Frontend/Middleware/GlobalErrorHandlerMiddleware.cs deleted file mode 100644 index 6f12f3501..000000000 --- a/src/MarginTrading.Frontend/Middleware/GlobalErrorHandlerMiddleware.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using Common; -using Common.Log; -using MarginTrading.Common.Extensions; -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Services; -using Microsoft.AspNetCore.Http; - -namespace MarginTrading.Frontend.Middleware -{ - public class GlobalErrorHandlerMiddleware - { - private readonly ILog _log; - private readonly RequestDelegate _next; - - public GlobalErrorHandlerMiddleware(RequestDelegate next, ILog log) - { - _log = log; - _next = next; - } - - public async Task Invoke(HttpContext context) - { - try - { - await _next.Invoke(context); - } - catch (MaintenanceException) - { - await SendMaintenanceError(context); - } - catch (Exception ex) - { - await LogError(context, ex); - - await SendError(context); - } - } - - private async Task LogError(HttpContext context, Exception ex) - { - using (var ms = new MemoryStream()) - { - context.Request.Body.CopyTo(ms); - ms.Seek(0, SeekOrigin.Begin); - await _log.LogPartFromStream(ms, "GlobalHandler", context.Request.GetUri().AbsoluteUri, ex); - } - } - - private async Task SendError(HttpContext ctx) - { - ctx.Response.ContentType = "application/json"; - ctx.Response.StatusCode = 500; - var response = ResponseModel.CreateFail(ResponseModel.ErrorCodeType.RuntimeProblem, "Technical problems"); - await ctx.Response.WriteAsync(response.ToJson()); - } - - private async Task SendMaintenanceError(HttpContext ctx) - { - ctx.Response.ContentType = "application/json"; - ctx.Response.StatusCode = 503; - var response = ResponseModel.CreateFail(ResponseModel.ErrorCodeType.MaintananceMode, - "Sorry, application is on maintenance. Please try again later."); - await ctx.Response.WriteAsync(response.ToJson()); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Middleware/MiddlewareExtensions.cs b/src/MarginTrading.Frontend/Middleware/MiddlewareExtensions.cs deleted file mode 100644 index caa96bc11..000000000 --- a/src/MarginTrading.Frontend/Middleware/MiddlewareExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore.Builder; - -namespace MarginTrading.Frontend.Middleware -{ - public static class MiddlewareExtensions - { - public static IApplicationBuilder UseOptions(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - - public static IApplicationBuilder UseGlobalErrorHandler(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Middleware/OptionsRequestsMiddleware.cs b/src/MarginTrading.Frontend/Middleware/OptionsRequestsMiddleware.cs deleted file mode 100644 index 67e2d475a..000000000 --- a/src/MarginTrading.Frontend/Middleware/OptionsRequestsMiddleware.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Frontend.Settings; -using Microsoft.AspNetCore.Http; - -namespace MarginTrading.Frontend.Middleware -{ - public class OptionsRequestsMiddleware - { - private readonly RequestDelegate _next; - private readonly CorsSettings _settings; - - public OptionsRequestsMiddleware(RequestDelegate next, CorsSettings settings) - { - _next = next; - _settings = settings; - } - - public async Task Invoke(HttpContext context) - { - if (_settings.HandleOptionsRequest && context.Request.Method == "OPTIONS") - { - context.Response.Headers.Add("Access-Control-Allow-Origin", _settings.AllowOrigins); - context.Response.Headers.Add("Access-Control-Allow-Headers", _settings.AllowHeaders); - context.Response.Headers.Add("Access-Control-Allow-Methods", _settings.AllowMethods); - - if (_settings.AllowCredentials) - context.Response.Headers.Add("Access-Control-Allow-Credentials", "true"); - - context.Response.StatusCode = 200; - await context.Response.WriteAsync("OK"); - } - else - { - await this._next.Invoke(context); - } - } - } -} diff --git a/src/MarginTrading.Frontend/Models/ResponseModel.cs b/src/MarginTrading.Frontend/Models/ResponseModel.cs deleted file mode 100644 index 471dfc00b..000000000 --- a/src/MarginTrading.Frontend/Models/ResponseModel.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace MarginTrading.Frontend.Models -{ - public class ResponseModel - { - public enum ErrorCodeType - { - MaintananceMode = 11, - - InconsistentData = 100, - InvalidInputField = 101, - - NoData = 200, - AssetNotFound = 201, - - NoAccess = 300, - - RuntimeProblem = 1000 - } - - public class ErrorModel - { - public ErrorCodeType Code { get; set; } - public string Field { get; set; } - public string Message { get; set; } - } - - public ErrorModel Error { get; set; } - - public static ResponseModel CreateInvalidFieldError(string field, string message) - { - return new ResponseModel - { - Error = new ErrorModel - { - Code = ErrorCodeType.InvalidInputField, - Field = field, - Message = message - } - }; - } - - public static ResponseModel CreateFail(ErrorCodeType errorCodeType, string message) - { - return new ResponseModel - { - Error = new ErrorModel - { - Code = errorCodeType, - Message = message - } - }; - } - - private static readonly ResponseModel OkInstance = new ResponseModel(); - - public static ResponseModel CreateOk() - { - return OkInstance; - } - } - - public class ResponseModel : ResponseModel - { - public T Result { get; set; } - - public static ResponseModel CreateOk(T result) - { - return new ResponseModel - { - Result = result - }; - } - - public new static ResponseModel CreateInvalidFieldError(string field, string message) - { - return new ResponseModel - { - Error = new ErrorModel - { - Code = ErrorCodeType.InvalidInputField, - Field = field, - Message = message - } - }; - } - - public new static ResponseModel CreateFail(ErrorCodeType errorCodeType, string message) - { - return new ResponseModel - { - Error = new ErrorModel - { - Code = errorCodeType, - Message = message - } - }; - } - } -} diff --git a/src/MarginTrading.Frontend/Models/TerminalInfo.cs b/src/MarginTrading.Frontend/Models/TerminalInfo.cs deleted file mode 100644 index 574e59ad5..000000000 --- a/src/MarginTrading.Frontend/Models/TerminalInfo.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MarginTrading.Frontend.Models -{ - public class TerminalInfo - { - public string Name { get; } - public bool DemoEnabled { get; } - public bool LiveEnabled { get; } - - public TerminalInfo(string name, bool demoEnabled, bool liveEnabled) - { - Name = name; - DemoEnabled = demoEnabled; - LiveEnabled = liveEnabled; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Models/TokenModel.cs b/src/MarginTrading.Frontend/Models/TokenModel.cs deleted file mode 100644 index d43ebfa6d..000000000 --- a/src/MarginTrading.Frontend/Models/TokenModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MarginTrading.Frontend.Models -{ - public class TokenModel - { - public string Token { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Models/WampDescriptionModels.cs b/src/MarginTrading.Frontend/Models/WampDescriptionModels.cs deleted file mode 100644 index 901c34444..000000000 --- a/src/MarginTrading.Frontend/Models/WampDescriptionModels.cs +++ /dev/null @@ -1,10 +0,0 @@ -using MarginTrading.Common.Documentation; - -namespace MarginTrading.Frontend.Models -{ - public class MethodInfoModel - { - public MethodDocInfo[] Rpc { get; set; } - public MethodDocInfo[] Topic { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Models/WatchList.cs b/src/MarginTrading.Frontend/Models/WatchList.cs deleted file mode 100644 index 86b6e76af..000000000 --- a/src/MarginTrading.Frontend/Models/WatchList.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; - -namespace MarginTrading.Frontend.Models -{ - public class WatchList - { - public string Id { get; set; } - public string Name { get; set; } - public List AssetIds { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Modules/FrontendExternalServicesModule.cs b/src/MarginTrading.Frontend/Modules/FrontendExternalServicesModule.cs deleted file mode 100644 index b7965d2a1..000000000 --- a/src/MarginTrading.Frontend/Modules/FrontendExternalServicesModule.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Autofac; -using Autofac.Extensions.DependencyInjection; -using Lykke.HttpClientGenerator; -using Lykke.HttpClientGenerator.Retries; -using Lykke.Service.ClientAccount.Client; -using Lykke.SettingsReader; -using MarginTrading.Backend.Contracts.DataReaderClient; -using MarginTrading.Frontend.Settings; -using Microsoft.Extensions.DependencyInjection; - -namespace MarginTrading.Frontend.Modules -{ - public class FrontendExternalServicesModule : Module - { - private readonly IReloadingManager _settings; - - public FrontendExternalServicesModule(IReloadingManager settings) - { - _settings = settings; - } - - protected override void Load(ContainerBuilder builder) - { - var services = new ServiceCollection(); - services.RegisterMtDataReaderClientsPair( - HttpClientGenerator.BuildForUrl(_settings.CurrentValue.MtDataReaderDemoServiceClient.ServiceUrl) - .WithApiKey(_settings.CurrentValue.MtDataReaderDemoServiceClient.ApiKey) - .Create(), - HttpClientGenerator.BuildForUrl(_settings.CurrentValue.MtDataReaderLiveServiceClient.ServiceUrl) - .WithApiKey(_settings.CurrentValue.MtDataReaderLiveServiceClient.ApiKey) - .Create()); - - builder.RegisterLykkeServiceClient(_settings.CurrentValue.ClientAccountServiceClient.ServiceUrl); - - builder.Populate(services); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Modules/FrontendModule.cs b/src/MarginTrading.Frontend/Modules/FrontendModule.cs deleted file mode 100644 index 7398b78d4..000000000 --- a/src/MarginTrading.Frontend/Modules/FrontendModule.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using Autofac; -using AzureStorage.Tables; -using Common.Log; -using Lykke.Common; -using Lykke.Service.Session; -using Lykke.SettingsReader; -using MarginTrading.Common.RabbitMq; -using MarginTrading.Common.Services; -using MarginTrading.Common.Services.Client; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Frontend.Repositories; -using MarginTrading.Frontend.Repositories.Contract; -using MarginTrading.Frontend.Repositories.Entities; -using MarginTrading.Frontend.Services; -using MarginTrading.Frontend.Settings; -using MarginTrading.Frontend.Wamp; -using Microsoft.AspNetCore.Http; -using Microsoft.IdentityModel.Tokens; -using Rocks.Caching; -using WampSharp.V2; -using WampSharp.V2.Realm; -using MarginTradingOperationsLogRepository = MarginTrading.Frontend.Repositories.MarginTradingOperationsLogRepository; -using OperationLogEntity = MarginTrading.Frontend.Repositories.Entities.OperationLogEntity; - -namespace MarginTrading.Frontend.Modules -{ - public class FrontendModule: Module - { - private readonly IReloadingManager _settings; - - public FrontendModule(IReloadingManager settings) - { - this._settings = settings; - } - - protected override void Load(ContainerBuilder builder) - { - var host = new WampAuthenticationHost(new WampSessionAuthenticatorFactory()); - var realm = host.RealmContainer.GetRealmByName(WampConstants.FrontEndRealmName); - - builder.RegisterInstance(host) - .As() - .SingleInstance(); - - builder.RegisterInstance(realm) - .As() - .SingleInstance(); - - builder.RegisterInstance(LogLocator.CommonLog) - .As() - .SingleInstance(); - - builder.Register(ctx => - new MarginTradingOperationsLogRepository(AzureTableStorage.Create( - _settings.Nested(s => s.MarginTradingFront.Db.LogsConnString), "MarginTradingFrontendOperationsLog", - LogLocator.CommonLog)) - ) - .SingleInstance(); - - builder.Register(ctx => - new MarginTradingWatchListsRepository(AzureTableStorage.Create( - _settings.Nested(s => s.MarginTradingFront.Db.MarginTradingConnString), - "MarginTradingWatchLists", LogLocator.CommonLog))); - - builder.Register(ctx => - new MaintenanceInfoRepository(_settings.Nested(s => s.MarginTradingFront.Db.MarginTradingConnString))); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - var consoleWriter = new ConsoleLWriter(Console.WriteLine); - - builder.RegisterInstance(consoleWriter) - .As() - .SingleInstance(); - - builder.RegisterType() - .AsSelf() - .SingleInstance(); - - builder.RegisterInstance(_settings.CurrentValue) - .SingleInstance(); - - builder.RegisterInstance(_settings.CurrentValue.MarginTradingFront) - .SingleInstance(); - - builder.RegisterInstance(_settings.CurrentValue.MarginTradingFront.RequestLoggerSettings) - .SingleInstance(); - - builder.RegisterInstance(_settings.CurrentValue.MarginTradingFront.CorsSettings) - .SingleInstance(); - - builder.RegisterInstance(_settings.CurrentValue.MarginTradingFront.TerminalsSettings) - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .SingleInstance(); - - builder.Register(ctx => - new ClientSessionsClient(_settings.CurrentValue.MarginTradingFront.SessionServiceApiUrl, LogLocator.CommonLog) - ).SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .AsSelf() - .SingleInstance(); - - - builder.RegisterType() - .AsSelf() - .SingleInstance(); - - builder.RegisterType() - .As() - .AsSelf() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - - builder.Register(c => new RabbitMqService(c.Resolve(), c.Resolve(), - null, _settings.CurrentValue.MarginTradingFront.Env)) - .As() - .SingleInstance(); - } - } -} diff --git a/src/MarginTrading.Frontend/Program.cs b/src/MarginTrading.Frontend/Program.cs deleted file mode 100644 index 238091c30..000000000 --- a/src/MarginTrading.Frontend/Program.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using MarginTrading.Common.Services; -using Microsoft.AspNetCore.Hosting; - -namespace MarginTrading.Frontend -{ - public class Program - { - public static void Main(string[] args) - { - var restartAttempsLeft = 5; - - while (restartAttempsLeft > 0) - { - try - { - var host = new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIISIntegration() - .UseUrls("http://*:5005") - .UseStartup() - .UseApplicationInsights() - .Build(); - - host.Run(); - - restartAttempsLeft = 0; - } - catch (Exception e) - { - Console.WriteLine($"Error: {e.Message}{Environment.NewLine}{e.StackTrace}{Environment.NewLine}Restarting..."); - LogLocator.CommonLog?.WriteFatalErrorAsync( - "MT Frontend", "Restart host", $"Attempts left: {restartAttempsLeft}", e); - restartAttempsLeft--; - Thread.Sleep(10000); - } - } - } - } -} diff --git a/src/MarginTrading.Frontend/Properties/AssemblyInfo.cs b/src/MarginTrading.Frontend/Properties/AssemblyInfo.cs deleted file mode 100644 index f7008501a..000000000 --- a/src/MarginTrading.Frontend/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Lykke")] -[assembly: AssemblyProduct("MarginTrading.Frontend")] -[assembly: AssemblyTrademark("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("23988b46-8a81-4324-b1f8-0fd2f5efdd24")] diff --git a/src/MarginTrading.Frontend/RabbitMqHandler.cs b/src/MarginTrading.Frontend/RabbitMqHandler.cs deleted file mode 100644 index 97ab8ebda..000000000 --- a/src/MarginTrading.Frontend/RabbitMqHandler.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Reactive.Subjects; -using System.Threading.Tasks; -using Common; -using Common.Log; -using MarginTrading.Common.Extensions; -using MarginTrading.Common.RabbitMq; -using MarginTrading.Common.Services; -using MarginTrading.Common.Services.Client; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Common.Settings; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Contract.Mappers; -using MarginTrading.Contract.RabbitMqMessageModels; -using MarginTrading.Frontend.Settings; -using MarginTrading.Frontend.Wamp; -using WampSharp.V2.Realm; - -namespace MarginTrading.Frontend -{ - public class RabbitMqHandler - { - private readonly IWampHostedRealm _realm; - private readonly IClientAccountService _clientNotificationService; - private readonly IMarginTradingOperationsLogService _operationsLog; - private readonly MtFrontendSettings _settings; - private readonly IConsole _consoleWriter; - private readonly ILog _log; - private readonly IMarginTradingSettingsCacheService _marginTradingSettingsCacheService; - private readonly ISubject _allPairsSubject; - private readonly ISubject _tradesSubject; - - private readonly ConcurrentDictionary> _priceSubjects = - new ConcurrentDictionary>(); - - public RabbitMqHandler( - IWampHostedRealm realm, - IClientAccountService clientNotificationService, - IMarginTradingOperationsLogService operationsLogService, - MtFrontendSettings settings, - IConsole consoleWriter, - ILog log, - IMarginTradingSettingsCacheService marginTradingSettingsCacheService) - { - _realm = realm; - _clientNotificationService = clientNotificationService; - _operationsLog = operationsLogService; - _settings = settings; - _consoleWriter = consoleWriter; - _log = log; - _marginTradingSettingsCacheService = marginTradingSettingsCacheService; - _allPairsSubject = realm.Services.GetSubject(WampConstants.PricesTopicPrefix); - _tradesSubject = realm.Services.GetSubject(WampConstants.TradesTopic); - } - - public Task ProcessPrices(BidAskPairRabbitMqContract bidAskPair) - { - try - { - _allPairsSubject.OnNext(bidAskPair); - GetInstrumentPriceSubject(bidAskPair.Instrument).OnNext(bidAskPair); - } - catch (Exception e) - { - _log.WriteWarning("RabbitMqHandler", "ProcessPrices", bidAskPair.ToJson(), e); - } - - return Task.CompletedTask; - } - - public async Task ProcessTrades(TradeContract trade) - { - var contract = new TradeClientContract - { - Id = trade.Id, - AssetPairId = trade.AssetPairId, - Date = trade.Date, - OrderId = trade.OrderId, - Price = trade.Price, - Type = trade.Type.ToType(), - Volume = trade.Volume - }; - - _tradesSubject.OnNext(contract); - await Task.FromResult(0); - } - - public async Task ProcessAccountChanged(AccountChangedMessage accountChangedMessage) - { - if (accountChangedMessage.EventType != AccountEventTypeEnum.Updated) - return; - - var account = accountChangedMessage.Account; - var queueName = QueueHelper.BuildQueueName(_settings.MarginTradingFront.RabbitMqQueues.AccountChanged.ExchangeName, _settings.MarginTradingFront.Env); - _consoleWriter.WriteLine($"Get account change from {queueName} queue for clientId = {account.ClientId}"); - var notificationId = await _clientNotificationService.GetNotificationId(account.ClientId); - var userTopic = _realm.Services.GetSubject>($"user.{notificationId}"); - - var notifyResponse = new NotifyResponse - { - Entity = account.ToClientContract(), - Type = NotifyEntityType.Account - }; - - userTopic.OnNext(notifyResponse); - - _operationsLog.AddLog($"topic user.{notificationId} (account changed)", account.ClientId, account.Id, null, notifyResponse.ToJson()); - _consoleWriter.WriteLine($"topic user.{notificationId} (account changed) for clientId = {account.ClientId}"); - - var userUpdateTopic = _realm.Services.GetSubject($"user.updates.{notificationId}"); - var userUpdateTopicResponse = new NotifyResponse { Account = notifyResponse.Entity, Order = null }; - - userUpdateTopic.OnNext(userUpdateTopicResponse); - - _operationsLog.AddLog($"topic user.updates.{notificationId} (account changed)", account.ClientId, - account.Id, null, userUpdateTopicResponse.ToJson()); - _consoleWriter.WriteLine($"topic user.updates.{notificationId} (account changed) for clientId = {account.ClientId}"); - } - - public async Task ProcessOrderChanged(OrderContract order) - { - var queueName = QueueHelper.BuildQueueName(_settings.MarginTradingFront.RabbitMqQueues.OrderChanged.ExchangeName, _settings.MarginTradingFront.Env); - _consoleWriter.WriteLine($"Get order change from {queueName} queue for clientId = {order.ClientId}"); - - var notificationId = await _clientNotificationService.GetNotificationId(order.ClientId); - var userTopic = _realm.Services.GetSubject>($"user.{notificationId}"); - - var notifyResponse = new NotifyResponse - { - Entity = order.ToClientContract(), - Type = NotifyEntityType.Order - }; - - userTopic.OnNext(notifyResponse); - - _operationsLog.AddLog($"topic user.{notificationId} (position changed)", order.ClientId, order.AccountId, null, notifyResponse.ToJson()); - _consoleWriter.WriteLine($"topic user.{notificationId} (order changed) for clientId = {order.ClientId}"); - - var userUpdateTopic = _realm.Services.GetSubject($"user.updates.{notificationId}"); - var userUpdateTopicResponse = new NotifyResponse { Account = null, Order = notifyResponse.Entity }; - - userUpdateTopic.OnNext(userUpdateTopicResponse); - - _operationsLog.AddLog($"topic user.updates.{notificationId} (position changed)", order.ClientId, notifyResponse.Entity.AccountId, null, userUpdateTopicResponse.ToJson()); - _consoleWriter.WriteLine($"topic user.updates.{notificationId} (order changed) for clientId = {order.ClientId}"); - } - - public async Task ProcessAccountStopout(AccountStopoutBackendContract stopout) - { - var queueName = QueueHelper.BuildQueueName(_settings.MarginTradingFront.RabbitMqQueues.AccountStopout.ExchangeName, _settings.MarginTradingFront.Env); - _consoleWriter.WriteLine($"Get account stopout from {queueName} queue for clientId = {stopout.ClientId}"); - - var notificationId = await _clientNotificationService.GetNotificationId(stopout.ClientId); - var userTopic = _realm.Services.GetSubject>($"user.{notificationId}"); - - var response = new NotifyResponse - { - Entity = stopout.ToClientContract(), - Type = NotifyEntityType.AccountStopout - }; - - userTopic.OnNext(response); - - _operationsLog.AddLog($"topic user.{notificationId} (account stopout)", stopout.ClientId, response.Entity.AccountId, null, response.ToJson()); - _consoleWriter.WriteLine($"topic user.{notificationId} (account stopout) for clientId = {stopout.ClientId}"); - - var userUpdateTopic = _realm.Services.GetSubject($"user.updates.{notificationId}"); - var userUpdateTopicResponse = new NotifyResponse { Account = null, Order = null, AccountStopout = response.Entity }; - - userUpdateTopic.OnNext(userUpdateTopicResponse); - - _operationsLog.AddLog($"topic user.updates.{notificationId} (account stopout)", stopout.ClientId, response.Entity.AccountId, null, userUpdateTopicResponse.ToJson()); - _consoleWriter.WriteLine($"topic user.updates.{notificationId} (account stopout) for clientId = {stopout.ClientId}"); - } - - public async Task ProcessUserUpdates(UserUpdateEntityBackendContract userUpdate) - { - var queueName = QueueHelper.BuildQueueName(_settings.MarginTradingFront.RabbitMqQueues.UserUpdates.ExchangeName, _settings.MarginTradingFront.Env); - _consoleWriter.WriteLine($"Get user update from {queueName} queue for {userUpdate.ClientIds.Length} clients"); - - foreach (var clientId in userUpdate.ClientIds) - { - try - { - var notificationId = await _clientNotificationService.GetNotificationId(clientId); - var userTopic = - _realm.Services.GetSubject>( - $"user.{notificationId}"); - - var response = new NotifyResponse - { - Entity = userUpdate.ToClientContract(), - Type = NotifyEntityType.UserUpdate - }; - - userTopic.OnNext(response); - - var eventType = string.Empty; - - if (userUpdate.UpdateAccountAssetPairs) - { - eventType = "account assets"; - } - - if (userUpdate.UpdateAccounts) - { - eventType = "accounts"; - } - - _operationsLog.AddLog($"topic user.{notificationId} ({eventType} changed)", clientId, null, null, - response.ToJson()); - _consoleWriter.WriteLine( - $"topic user.{notificationId} ({eventType} changed) for clientId = {clientId}"); - - var userUpdateTopic = _realm.Services.GetSubject($"user.updates.{notificationId}"); - var userUpdateTopicResponse = new NotifyResponse {UserUpdate = response.Entity}; - - userUpdateTopic.OnNext(userUpdateTopicResponse); - - _operationsLog.AddLog($"topic user.updates.{notificationId} ({eventType} changed)", clientId, null, - null, userUpdateTopicResponse.ToJson()); - _consoleWriter.WriteLine( - $"topic user.updates.{notificationId} (account assets changed) for clientId = {clientId}"); - } - catch (Exception ex) - { - await _log.WriteErrorAsync(nameof(RabbitMqHandler), nameof(ProcessUserUpdates), clientId, ex); - } - } - } - - private ISubject GetInstrumentPriceSubject(string instrument) - { - return _priceSubjects.GetOrAdd(instrument, - i => _realm.Services.GetSubject( - $"{WampConstants.PricesTopicPrefix}.{instrument}")); - } - - public Task ProcessMarginTradingEnabledChanged(MarginTradingEnabledChangedMessage message) - { - _marginTradingSettingsCacheService.OnMarginTradingEnabledChanged(message); - return Task.CompletedTask; - } - } -} diff --git a/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfo.cs b/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfo.cs deleted file mode 100644 index 431c48b81..000000000 --- a/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace MarginTrading.Frontend.Repositories.Contract -{ - public interface IMaintenanceInfo - { - bool IsEnabled { get; } - DateTime ChangedDate { get; } - string ChangedReason { get; } - string ChangedBy { get; } - } - - public class MaintenanceInfo : IMaintenanceInfo - { - public bool IsEnabled { get; set; } - public DateTime ChangedDate { get; set; } - public string ChangedReason { get; set; } - public string ChangedBy { get; set; } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfoRepository.cs b/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfoRepository.cs deleted file mode 100644 index 12d0d4f82..000000000 --- a/src/MarginTrading.Frontend/Repositories/Contract/IMaintenanceInfoRepository.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace MarginTrading.Frontend.Repositories.Contract -{ - public interface IMaintenanceInfoRepository - { - Task GetMaintenanceInfo(bool isLive); - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchList.cs b/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchList.cs deleted file mode 100644 index d8682d8b3..000000000 --- a/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchList.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; - -namespace MarginTrading.Frontend.Repositories.Contract -{ - public interface IMarginTradingWatchList - { - string Id { get; } - string ClientId { get; } - string Name { get; } - bool ReadOnly { get; set; } - int Order { get; } - List AssetIds { get; } - } - - public class MarginTradingWatchList : IMarginTradingWatchList - { - public string Id { get; set; } - public string ClientId { get; set; } - public string Name { get; set; } - public bool ReadOnly { get; set; } - public int Order { get; set; } - public List AssetIds { get; set; } - - public static MarginTradingWatchList Create(IMarginTradingWatchList src) - { - return new MarginTradingWatchList - { - Id = src.Id, - ClientId = src.ClientId, - AssetIds = src.AssetIds, - Order = src.Order, - Name = src.Name, - ReadOnly = src.ReadOnly - }; - } - } -} diff --git a/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchListRepository.cs b/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchListRepository.cs deleted file mode 100644 index 58f1e675f..000000000 --- a/src/MarginTrading.Frontend/Repositories/Contract/IMarginTradingWatchListRepository.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace MarginTrading.Frontend.Repositories.Contract -{ - public interface IMarginTradingWatchListRepository - { - Task AddAsync(IMarginTradingWatchList watchList); - Task ChangeAllAsync(IEnumerable watchLists); - Task> GetAllAsync(string accountId); - Task GetAsync(string accountId, string id); - Task DeleteAsync(string accountId, string id); - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/Entities/MaintenanceInfoEntity.cs b/src/MarginTrading.Frontend/Repositories/Entities/MaintenanceInfoEntity.cs deleted file mode 100644 index aa5023fd0..000000000 --- a/src/MarginTrading.Frontend/Repositories/Entities/MaintenanceInfoEntity.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using MarginTrading.Frontend.Repositories.Contract; -using Microsoft.WindowsAzure.Storage.Table; - -namespace MarginTrading.Frontend.Repositories.Entities -{ - public class MaintenanceInfoEntity : TableEntity, IMaintenanceInfo - { - public static string GetPartitionKey() - { - return "MaintenanceInfo"; - } - - public static string GetDemoRowKey() - { - return "Demo"; - } - - public static string GetLiveRowKey() - { - return "Live"; - } - - public bool IsEnabled { get; set; } - public DateTime ChangedDate { get; set; } - public string ChangedReason { get; set; } - public string ChangedBy { get; set; } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/Entities/MarginTradingWatchListEntity.cs b/src/MarginTrading.Frontend/Repositories/Entities/MarginTradingWatchListEntity.cs deleted file mode 100644 index 482ae6b5e..000000000 --- a/src/MarginTrading.Frontend/Repositories/Entities/MarginTradingWatchListEntity.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using MarginTrading.Frontend.Repositories.Contract; -using Microsoft.WindowsAzure.Storage.Table; - -namespace MarginTrading.Frontend.Repositories.Entities -{ - public class MarginTradingWatchListEntity : TableEntity, IMarginTradingWatchList - { - public string Id { get; set; } - public string ClientId { get; set; } - public string Name { get; set; } - public bool ReadOnly { get; set; } - public int Order { get; set; } - public string AssetIds { get; set; } - - List IMarginTradingWatchList.AssetIds - => AssetIds.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).ToList(); - - public static string GeneratePartitionKey(string accountId) - { - return accountId; - } - - public static string GenerateRowKey(string id) - { - return id; - } - - public static MarginTradingWatchListEntity Create(IMarginTradingWatchList src) - { - return new MarginTradingWatchListEntity - { - PartitionKey = GeneratePartitionKey(src.ClientId), - RowKey = GenerateRowKey(src.Id), - Id = src.Id, - ClientId = src.ClientId, - Name = src.Name, - ReadOnly = src.ReadOnly, - Order = src.Order, - AssetIds = string.Join(",", src.AssetIds) - }; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/Entities/OperationLogEntity.cs b/src/MarginTrading.Frontend/Repositories/Entities/OperationLogEntity.cs deleted file mode 100644 index e21bf6cd5..000000000 --- a/src/MarginTrading.Frontend/Repositories/Entities/OperationLogEntity.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MarginTrading.Common.Services; -using Microsoft.WindowsAzure.Storage.Table; - -namespace MarginTrading.Frontend.Repositories.Entities -{ - public class OperationLogEntity : TableEntity, IOperationLog - { - public string Name { get; set; } - public string ClientId { get; set; } - public string AccountId { get; set; } - public string Input { get; set; } - public string Data { get; set; } - - public static string GeneratePartitionKey(string clientId, string name) - { - return clientId ?? name; - } - - public static OperationLogEntity Create(IOperationLog src) - { - return new OperationLogEntity - { - PartitionKey = GeneratePartitionKey(src.ClientId, src.Name), - Name = src.Name, - Input = src.Input, - Data = src.Data, - AccountId = src.AccountId, - ClientId = src.ClientId - }; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/MaintenanceInfoRepository.cs b/src/MarginTrading.Frontend/Repositories/MaintenanceInfoRepository.cs deleted file mode 100644 index e03b7b237..000000000 --- a/src/MarginTrading.Frontend/Repositories/MaintenanceInfoRepository.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Threading.Tasks; -using AzureStorage; -using AzureStorage.Tables; -using Lykke.SettingsReader; -using MarginTrading.Common.Services; -using MarginTrading.Frontend.Repositories.Contract; -using MarginTrading.Frontend.Repositories.Entities; - -namespace MarginTrading.Frontend.Repositories -{ - public class MaintenanceInfoRepository : IMaintenanceInfoRepository - { - private readonly INoSQLTableStorage _tableStorage; - - public MaintenanceInfoRepository(IReloadingManager connectionStringManager) - { - _tableStorage = AzureTableStorage.Create(connectionStringManager, - "MaintenanceInfo", LogLocator.CommonLog); - } - - public async Task GetMaintenanceInfo(bool isLive) - { - var rk = isLive ? MaintenanceInfoEntity.GetLiveRowKey() : MaintenanceInfoEntity.GetDemoRowKey(); - - return (IMaintenanceInfo) await _tableStorage.GetDataAsync(MaintenanceInfoEntity.GetPartitionKey(), rk) ?? - new MaintenanceInfo(); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Repositories/MarginTradingOperationsLogRepository.cs b/src/MarginTrading.Frontend/Repositories/MarginTradingOperationsLogRepository.cs deleted file mode 100644 index 1b31e3b5f..000000000 --- a/src/MarginTrading.Frontend/Repositories/MarginTradingOperationsLogRepository.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Threading.Tasks; -using AzureStorage; -using MarginTrading.Common.Services; -using MarginTrading.Frontend.Repositories.Entities; - -namespace MarginTrading.Frontend.Repositories -{ - public class MarginTradingOperationsLogRepository : IMarginTradingOperationsLogRepository - { - private readonly INoSQLTableStorage _tableStorage; - - public MarginTradingOperationsLogRepository(INoSQLTableStorage tableStorage) - { - _tableStorage = tableStorage; - } - - public async Task AddLogAsync(IOperationLog logEntity) - { - var entity = OperationLogEntity.Create(logEntity); - await _tableStorage.InsertAndGenerateRowKeyAsTimeAsync(entity, DateTime.UtcNow); - } - } -} diff --git a/src/MarginTrading.Frontend/Repositories/MarginTradingWatchListsRepository.cs b/src/MarginTrading.Frontend/Repositories/MarginTradingWatchListsRepository.cs deleted file mode 100644 index de14bf41c..000000000 --- a/src/MarginTrading.Frontend/Repositories/MarginTradingWatchListsRepository.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AzureStorage; -using MarginTrading.Frontend.Repositories.Contract; -using MarginTrading.Frontend.Repositories.Entities; - -namespace MarginTrading.Frontend.Repositories -{ - public class MarginTradingWatchListsRepository : IMarginTradingWatchListRepository - { - private readonly INoSQLTableStorage _tableStorage; - - public MarginTradingWatchListsRepository(INoSQLTableStorage tableStorage) - { - _tableStorage = tableStorage; - } - - public async Task AddAsync(IMarginTradingWatchList watchList) - { - await _tableStorage.InsertOrReplaceAsync(MarginTradingWatchListEntity.Create(watchList)); - var entity = - await _tableStorage.GetDataAsync(MarginTradingWatchListEntity.GeneratePartitionKey(watchList.ClientId), - MarginTradingWatchListEntity.GenerateRowKey(watchList.Id)); - - return MarginTradingWatchList.Create(entity); - } - - public async Task> GetAllAsync(string accountId) - { - var entities = await _tableStorage.GetDataAsync(MarginTradingWatchListEntity.GeneratePartitionKey(accountId)); - - return entities.Select(MarginTradingWatchList.Create).OrderBy(item => item.Order); - } - - public async Task DeleteAsync(string accountId, string id) - { - await _tableStorage.DeleteAsync(MarginTradingWatchListEntity.GeneratePartitionKey(accountId), - MarginTradingWatchListEntity.GenerateRowKey(id)); - } - - public async Task GetAsync(string accountId, string id) - { - var entity = await _tableStorage.GetDataAsync(MarginTradingWatchListEntity.GeneratePartitionKey(accountId), - MarginTradingWatchListEntity.GenerateRowKey(id)); - - return entity == null - ? null - : MarginTradingWatchListEntity.Create(entity); - } - - public async Task ChangeAllAsync(IEnumerable watchLists) - { - await _tableStorage.InsertOrReplaceAsync(watchLists.Select(MarginTradingWatchListEntity.Create)); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/RpcMtFrontend.cs b/src/MarginTrading.Frontend/RpcMtFrontend.cs deleted file mode 100644 index 7fb66f78e..000000000 --- a/src/MarginTrading.Frontend/RpcMtFrontend.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Common.Services; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Frontend.Services; -using MarginTrading.Frontend.Settings; -using MarginTrading.Frontend.Wamp; -using Microsoft.Extensions.PlatformAbstractions; -using Newtonsoft.Json; - -namespace MarginTrading.Frontend -{ - public class RpcMtFrontend : IRpcMtFrontend - { - private readonly MtFrontendSettings _settings; - private readonly IClientTokenService _clientTokenService; - private readonly RpcFacade _rpcFacade; - private readonly IDateService _dateService; - - public RpcMtFrontend( - MtFrontendSettings settings, - IClientTokenService clientTokenService, - RpcFacade rpcFacade, - IDateService dateService) - { - _settings = settings; - _clientTokenService = clientTokenService; - _rpcFacade = rpcFacade; - _dateService = dateService; - } - - #region Service - - public IsAliveResponse IsAlive() - { - return new IsAliveResponse - { - Version = PlatformServices.Default.Application.ApplicationVersion, - Env = _settings.MarginTradingFront.Env, - ServerTime = _dateService.Now() - }; - } - - #endregion - - - #region Init data - - public async Task InitData(string token) - { - var clientId = await GetClientId(token); - - return await _rpcFacade.InitData(clientId); - } - - public async Task InitAccounts(string token) - { - var clientId = await GetClientId(token); - - return await _rpcFacade.InitAccounts(clientId); - } - - public async Task AccountInstruments(string token) - { - var clientId = await GetClientId(token); - - return await _rpcFacade.AccountInstruments(clientId); - } - - public async Task InitGraph(string token = null, string[] assetIds = null) - { - var clientId = string.IsNullOrEmpty(token) ? null : await GetClientId(token); - - return await _rpcFacade.InitGraph(clientId, assetIds); - } - - #endregion - - - #region Account - - public async Task GetAccountHistory(string requestJson) - { - var accountHistoryClientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(accountHistoryClientRequest.Token); - - return await _rpcFacade.GetAccountHistory(clientId, accountHistoryClientRequest); - } - - public async Task GetHistory(string requestJson) - { - var accountHistoryClientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(accountHistoryClientRequest.Token); - - return await _rpcFacade.GetAccountHistoryTimeline(clientId, accountHistoryClientRequest); - } - - #endregion - - - #region Order - - public async Task> PlaceOrder(string requestJson) - { - var clientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(clientRequest.Token); - - return await _rpcFacade.PlaceOrder(clientId, clientRequest.Order); - } - - public async Task> CloseOrder(string requestJson) - { - var clientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(clientRequest.Token); - - return await _rpcFacade.CloseOrder(clientId, clientRequest); - } - - public async Task> CancelOrder(string requestJson) - { - var clientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(clientRequest.Token); - - return await _rpcFacade.CancelOrder(clientId, clientRequest); - } - - public async Task GetOpenPositions(string token) - { - var clientId = await GetClientId(token); - - return await _rpcFacade.GetOpenPositions(clientId); - } - - public async Task GetAccountOpenPositions(string requestJson) - { - var clientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(clientRequest.Token); - - return await _rpcFacade.GetAccountOpenPositions(clientId, clientRequest.AccountId); - } - - public async Task GetClientOrders(string token) - { - var clientId = await GetClientId(token); - - return await _rpcFacade.GetClientOrders(clientId); - } - - public async Task> ChangeOrderLimits(string requestJson) - { - var clientRequest = DeserializeRequest(requestJson); - var clientId = await GetClientId(clientRequest.Token); - - return await _rpcFacade.ChangeOrderLimits(clientId, clientRequest); - } - - #endregion - - - #region Orderbook - - public Task GetOrderBook(string instrument) - { - return _rpcFacade.GetOrderBook(instrument); - } - - #endregion - - - #region Private methods - - private TRequestContract DeserializeRequest(string requestJson) - { - if (string.IsNullOrWhiteSpace(requestJson)) - throw new ArgumentNullException(nameof(requestJson)); - - var result = JsonConvert.DeserializeObject(requestJson); - - var validationContext = new ValidationContext(result); - var validationResults = new List(); - if (!Validator.TryValidateObject(result, validationContext, validationResults, true)) - { - var errorMessage = - validationResults.Where(x => !string.IsNullOrWhiteSpace(x.ErrorMessage)) - .Select(x => x.ErrorMessage) - .Aggregate((x, y) => x + "; " + y); - errorMessage = string.IsNullOrWhiteSpace(errorMessage) - ? $"Request {requestJson} contains validation errors" : - $"Request {requestJson} contains validation errors: {errorMessage}"; - throw new ValidationException(errorMessage); - } - - return result; - } - - private async Task GetClientId(string token) - { - if (string.IsNullOrEmpty(token)) - throw new Exception("Token is null or empty"); - - var clientId = await _clientTokenService.GetClientId(token); - - if (string.IsNullOrWhiteSpace(clientId)) - throw new KeyNotFoundException($"Can't find session by provided token '{token}'"); - - return clientId; - } - - #endregion - } -} diff --git a/src/MarginTrading.Frontend/Services/ClientTokenService.cs b/src/MarginTrading.Frontend/Services/ClientTokenService.cs deleted file mode 100644 index bb88225cc..000000000 --- a/src/MarginTrading.Frontend/Services/ClientTokenService.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Threading.Tasks; -using Lykke.Service.Session; - -namespace MarginTrading.Frontend.Services -{ - public class ClientTokenService : IClientTokenService - { - private readonly IClientsSessionsRepository _sessionService; - - public ClientTokenService(IClientsSessionsRepository sessionService) - { - _sessionService = sessionService; - } - - public async Task GetClientId(string token) - { - try - { - var sessionModel = await _sessionService.GetAsync(token); - return sessionModel?.ClientId; - } - catch - { - return null; - } - } - } -} diff --git a/src/MarginTrading.Frontend/Services/ClientTokenValidator.cs b/src/MarginTrading.Frontend/Services/ClientTokenValidator.cs deleted file mode 100644 index 22896a7ce..000000000 --- a/src/MarginTrading.Frontend/Services/ClientTokenValidator.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.IdentityModel.Tokens; - -namespace MarginTrading.Frontend.Services -{ - public class ClientTokenValidator : ISecurityTokenValidator - { - private readonly IClientTokenService _clientTokenService; - - public ClientTokenValidator(IClientTokenService clientTokenService) - { - _clientTokenService = clientTokenService; - } - - public bool CanReadToken(string securityToken) => true; - - public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) - { - validatedToken = null; - - var ls = new List(); - var clientId = _clientTokenService.GetClientId(securityToken).Result; - ls.Add(new Claim(ClaimTypes.NameIdentifier, clientId, ClaimValueTypes.String)); - var id = new ClaimsIdentity(ls, "magic"); - var principal = new ClaimsPrincipal(id); - return principal; - } - - public bool CanValidateToken => true; - public int MaximumTokenSizeInBytes { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Services/HttpRequestService.cs b/src/MarginTrading.Frontend/Services/HttpRequestService.cs deleted file mode 100644 index 8b0900e91..000000000 --- a/src/MarginTrading.Frontend/Services/HttpRequestService.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using System.Threading.Tasks; -using Common; -using Flurl.Http; -using MarginTrading.Common.Extensions; -using MarginTrading.Frontend.Settings; -using System.Linq; -using System.Net; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Frontend.Repositories.Contract; -using Rocks.Caching; - -namespace MarginTrading.Frontend.Services -{ - public class HttpRequestService : IHttpRequestService - { - private readonly MtFrontendSettings _settings; - private readonly ICacheProvider _cacheProvider; - private readonly IMaintenanceInfoRepository _maintenanceInfoRepository; - private readonly ITerminalInfoService _terminalInfoService; - - public HttpRequestService(MtFrontendSettings settings, - ICacheProvider cacheProvider, - IMaintenanceInfoRepository maintenanceInfoRepository, - ITerminalInfoService terminalInfoService) - { - _settings = settings; - _cacheProvider = cacheProvider; - _maintenanceInfoRepository = maintenanceInfoRepository; - _terminalInfoService = terminalInfoService; - } - - public async Task<(TResponse Demo, TResponse Live)> RequestIfAvailableAsync(object request, string action, Func defaultResult, EnabledMarginTradingTypes enabledMarginTradingTypes, string controller = "mt") - where TResponse : class - { - async Task Request(bool isLive, bool isTradingEnabled) - { - var maintenanceInfo = await GetMaintenance(isLive); - var terminalInfo = _terminalInfoService.Get(); - var enabledForTerminal = isLive ? terminalInfo.LiveEnabled : terminalInfo.DemoEnabled; - - if (!isTradingEnabled || maintenanceInfo.IsEnabled || !enabledForTerminal) - { - return defaultResult(); - } - - return await RequestWithRetriesAsync(request, action, isLive, controller) - .ContinueWith(t => t.IsFaulted ? defaultResult() : t.Result); - } - - return (Demo: await Request(false, enabledMarginTradingTypes.Demo), - Live: await Request(true, enabledMarginTradingTypes.Live)); - } - - public async Task RequestWithRetriesAsync(object request, string action, bool isLive = true, string controller = "mt") - { - await CheckMaintenance(isLive); - - try - { - var flurlClient = $"{(isLive ? _settings.MarginTradingLive.ApiRootUrl : _settings.MarginTradingDemo.ApiRootUrl)}/api/{controller}/{action}" - .WithHeader("api-key", isLive ? _settings.MarginTradingLive.ApiKey : _settings.MarginTradingDemo.ApiKey); - - return await ActionExtensions.RetryOnExceptionAsync( - () => flurlClient.PostJsonAsync(request).ReceiveJson(), - ex => ex is FlurlHttpException && !new int?[] {400, 500}.Contains((int?) ((FlurlHttpException) ex).Call.HttpStatus), - 6, - TimeSpan.FromSeconds(5)); - } - catch (Exception ex) - { - throw new Exception(GetErrorMessage(isLive, action, request.ToJson(), ex)); - } - } - - public async Task GetAsync(string path, bool isLive = true, int timeout = 30) - { - await CheckMaintenance(isLive); - - try - { - return await $"{(isLive ? _settings.MarginTradingLive.ApiRootUrl : _settings.MarginTradingDemo.ApiRootUrl)}/api/{path}" - .WithHeader("api-key", isLive ? _settings.MarginTradingLive.ApiKey : _settings.MarginTradingDemo.ApiKey) - .WithTimeout(timeout) - .GetJsonAsync(); - } - catch (Exception ex) - { - throw new Exception(GetErrorMessage(isLive, path, "GET", ex)); - } - } - - - #region Helpers - - private string GetErrorMessage(bool isLive, string path, string context, Exception ex) - { - path = $"{(isLive ? "Live: " : "Demo: ")}{path}"; - - var error = ex.Message; - - if (ex is FlurlHttpException flurException) - { - var responseBody = flurException.Call.ErrorResponseBody; - - if (!string.IsNullOrEmpty(responseBody)) - { - var response = responseBody.DeserializeJson>(); - if (!string.IsNullOrEmpty(response?.Message)) - { - error += " " + response.Message; - } - } - - if (flurException.Call.HttpStatus == HttpStatusCode.ServiceUnavailable) - { - ClearMaintenanceCache(isLive); - } - } - - return $"Backend {path} request failed. Error: {error}. Payload: {context}."; - } - - private async Task GetMaintenance(bool isLive) - { - var cacheKey = GetMaintenanceModeCacheKey(isLive); - - return await _cacheProvider.GetAsync(cacheKey, - async () => new CachableResult( - await _maintenanceInfoRepository.GetMaintenanceInfo(isLive), - CachingParameters.FromSeconds(15))); - } - - private async Task CheckMaintenance(bool isLive) - { - var maintenanceInfo = await GetMaintenance(isLive); - - if (maintenanceInfo?.IsEnabled == true) - throw new MaintenanceException(maintenanceInfo.ChangedDate); - } - - private string GetMaintenanceModeCacheKey(bool isLive) - { - return CacheKeyBuilder.Create(nameof(HttpRequestService), nameof(CheckMaintenance), isLive); - } - - private void ClearMaintenanceCache(bool isLive) - { - _cacheProvider.Remove(GetMaintenanceModeCacheKey(isLive)); - } - - #endregion - - } -} diff --git a/src/MarginTrading.Frontend/Services/IClientTokenService.cs b/src/MarginTrading.Frontend/Services/IClientTokenService.cs deleted file mode 100644 index 2eb5adb4d..000000000 --- a/src/MarginTrading.Frontend/Services/IClientTokenService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace MarginTrading.Frontend.Services -{ - public interface IClientTokenService - { - Task GetClientId(string token); - } -} diff --git a/src/MarginTrading.Frontend/Services/IHttpRequestService.cs b/src/MarginTrading.Frontend/Services/IHttpRequestService.cs deleted file mode 100644 index 8f2a117e2..000000000 --- a/src/MarginTrading.Frontend/Services/IHttpRequestService.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Threading.Tasks; -using MarginTrading.Common.Services.Settings; - -namespace MarginTrading.Frontend.Services -{ - public interface IHttpRequestService - { - Task RequestWithRetriesAsync(object request, string action, bool isLive = true, string controller = "mt"); - - Task GetAsync(string path, bool isLive = true, int timeout = 30); - - /// - /// Makes a post requests for available backends for client (live/demo) and gets results. - /// If a backend is not available for client or request fails - is returned instead. - /// - Task<(TResponse Demo, TResponse Live)> RequestIfAvailableAsync(object request, string action, Func defaultResult, EnabledMarginTradingTypes enabledMarginTradingTypes, string controller = "mt") - where TResponse : class; - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Services/ITerminalInfoService.cs b/src/MarginTrading.Frontend/Services/ITerminalInfoService.cs deleted file mode 100644 index d7b5743c5..000000000 --- a/src/MarginTrading.Frontend/Services/ITerminalInfoService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using MarginTrading.Frontend.Models; - -namespace MarginTrading.Frontend.Services -{ - public interface ITerminalInfoService - { - TerminalInfo Get(); - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Services/IWatchListService.cs b/src/MarginTrading.Frontend/Services/IWatchListService.cs deleted file mode 100644 index 86d81da1f..000000000 --- a/src/MarginTrading.Frontend/Services/IWatchListService.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using MarginTrading.Frontend.Repositories; -using MarginTrading.Frontend.Repositories.Contract; - -namespace MarginTrading.Frontend.Services -{ - public interface IWatchListService - { - Task> GetAllAsync(string clientId); - Task GetAsync(string clientId, string id); - Task> AddAsync(string id, string clientId, string name, List assetIds); - - Task> DeleteAsync(string clientId, string id); - } - - public class WatchListResult - { - public T Result { get; set; } - public WatchListStatus Status { get; set; } - public string Message { get; set; } - } - - public enum WatchListStatus - { - Ok, - NotFound, - AssetNotFound, - ReadOnly, - AlreadyDefault - } -} diff --git a/src/MarginTrading.Frontend/Services/MaintenanceException.cs b/src/MarginTrading.Frontend/Services/MaintenanceException.cs deleted file mode 100644 index c8907152c..000000000 --- a/src/MarginTrading.Frontend/Services/MaintenanceException.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace MarginTrading.Frontend.Services -{ - public class MaintenanceException : Exception - { - public DateTime EnabledAt { get; } - - public MaintenanceException(DateTime enabledAt) - { - EnabledAt = enabledAt; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Services/RpcFacade.cs b/src/MarginTrading.Frontend/Services/RpcFacade.cs deleted file mode 100644 index 039f0d05e..000000000 --- a/src/MarginTrading.Frontend/Services/RpcFacade.cs +++ /dev/null @@ -1,355 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Common; -using MarginTrading.Backend.Contracts.AccountHistory; -using MarginTrading.Backend.Contracts.DataReaderClient; -using MarginTrading.Backend.Contracts.Trading; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Contract.Mappers; -using MarginTrading.Frontend.Settings; -using AccountHistoryTypeContract = MarginTrading.Contract.BackendContracts.AccountHistoryTypeContract; - -namespace MarginTrading.Frontend.Services -{ - public class RpcFacade - { - private readonly MtFrontendSettings _settings; - private readonly IHttpRequestService _httpRequestService; - private readonly IMarginTradingSettingsCacheService _marginTradingSettingsCacheService; - private readonly IMtDataReaderClientsPair _dataReaderClients; - - public RpcFacade( - MtFrontendSettings settings, - IHttpRequestService httpRequestService, - IMarginTradingSettingsCacheService marginTradingSettingsCacheService, - IMtDataReaderClientsPair dataReaderClients) - { - _settings = settings; - _httpRequestService = httpRequestService; - _marginTradingSettingsCacheService = marginTradingSettingsCacheService; - _dataReaderClients = dataReaderClients; - } - - #region Init data - - public async Task InitData(string clientId) - { - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - if (!marginTradingEnabled.Demo && !marginTradingEnabled.Live) - { - throw new Exception("Margin trading is not available"); - } - - var initData = new InitDataLiveDemoClientResponse(); - var clientIdRequest = new ClientIdBackendRequest {ClientId = clientId}; - - var initDataResponses = await _httpRequestService.RequestIfAvailableAsync(clientIdRequest, "init.data", () => null, marginTradingEnabled); - initData.Live = initDataResponses.Live?.ToClientContract(); - initData.Demo = initDataResponses.Demo?.ToClientContract(); - - var initAssetsResponses = await _httpRequestService.RequestIfAvailableAsync(clientIdRequest, "init.assets", Array.Empty, marginTradingEnabled); - initData.Assets = initAssetsResponses.Live.Concat(initAssetsResponses.Demo).GroupBy(a => a.Id) - .Select(g => g.First().ToClientContract()).ToArray(); - - var initPricesResponse = - await _httpRequestService.RequestWithRetriesAsync>( - clientIdRequest, "init.prices"); - initData.Prices = initPricesResponse.ToDictionary(p => p.Key, p => p.Value.ToClientContract()); - - return initData; - } - - public async Task InitAccounts(string clientId) - { - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - var responses = await _httpRequestService.RequestIfAvailableAsync(new ClientIdBackendRequest { ClientId = clientId }, - "init.accounts", - Array.Empty, - marginTradingEnabled); - return new InitAccountsLiveDemoClientResponse - { - Live = responses.Live.Select(item => item.ToClientContract()).ToArray(), - Demo = responses.Demo.Select(item => item.ToClientContract()).ToArray(), - }; - } - - public async Task AccountInstruments(string clientId) - { - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - var responses = await _httpRequestService.RequestIfAvailableAsync(new ClientIdBackendRequest { ClientId = clientId }, - "init.accountinstruments", - InitAccountInstrumentsBackendResponse.CreateEmpty, - marginTradingEnabled); - - return new InitAccountInstrumentsLiveDemoClientResponse - { - Live = responses.Live.ToClientContract(), - Demo = responses.Demo.ToClientContract() - }; - } - - public async Task InitGraph(string clientId = null, string[] assetIds = null) - { - var request = new InitChartDataBackendRequest {ClientId = clientId, AssetIds = assetIds}; - - var initChartDataLiveResponse = await _httpRequestService.RequestWithRetriesAsync(request, "init.graph"); - - return initChartDataLiveResponse.ToClientContract(); - } - - public async Task> InitPrices(string clientId = null, string[] assetIds = null) - { - var request = new InitPricesBackendRequest {ClientId = clientId, AssetIds = assetIds}; - - var initPricesResponse = await _httpRequestService - .RequestWithRetriesAsync>(request, "init.prices"); - - return initPricesResponse.ToDictionary(p => p.Key, p => p.Value.ToClientContract()); - } - - #endregion - - - #region Account - - public async Task GetAccountHistory(string clientId, AccountHistoryFiltersClientRequest request) - { - var isLive = !string.IsNullOrEmpty(request.AccountId) - ? IsLiveAccount(request.AccountId) - : request.IsLive; - - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId, isLive); - if (!marginTradingEnabled) - { - return new AccountHistoryClientResponse - { - Account = Array.Empty(), - OpenPositions = Array.Empty(), - PositionsHistory = Array.Empty(), - }; - } - - var accountHistoryBackendResponse = await _dataReaderClients.Get(isLive).AccountHistory.ByTypes( - new AccountHistoryRequest - { - AccountId = request.AccountId, - ClientId = clientId, - From = request.From, - To = request.To - }); - return ToClientContract(accountHistoryBackendResponse); - } - - public async Task GetAccountHistoryTimeline(string clientId, AccountHistoryFiltersClientRequest request) - { - var isLive = !string.IsNullOrEmpty(request.AccountId) - ? IsLiveAccount(request.AccountId) - : request.IsLive; - - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId, isLive); - if (!marginTradingEnabled) - { - return Array.Empty(); - } - var accountHistoryBackendResponse = await _dataReaderClients.Get(isLive).AccountHistory.Timeline(new AccountHistoryRequest - { - AccountId = request.AccountId, - ClientId = clientId, - From = request.From, - To = request.To - }); - return ToClientContract(accountHistoryBackendResponse); - } - - #endregion - - - #region Order - - public async Task> PlaceOrder(string clientId, NewOrderClientContract request) - { - var backendRequest = request.ToBackendContract(clientId); - var backendResponse = await _httpRequestService.RequestWithRetriesAsync(backendRequest, "order.place", - IsLiveAccount(backendRequest.Order.AccountId)); - return backendResponse.ToClientContract(); - } - - public async Task> CloseOrder(string clientId, CloseOrderClientRequest request) - { - var backendRequest = new CloseOrderBackendRequest - { - ClientId = clientId, - OrderId = request.OrderId, - AccountId = request.AccountId - }; - - var backendResponse = await _httpRequestService.RequestWithRetriesAsync>(backendRequest, "order.close", - IsLiveAccount(backendRequest.AccountId)); - return backendResponse.ToClientContract(); - } - - public async Task> CancelOrder(string clientId, CloseOrderClientRequest request) - { - var backendRequest = new CloseOrderBackendRequest - { - ClientId = clientId, - OrderId = request.OrderId, - AccountId = request.AccountId - }; - - var backendResponse = await _httpRequestService.RequestWithRetriesAsync>(backendRequest, "order.cancel", - IsLiveAccount(backendRequest.AccountId)); - return backendResponse.ToClientContract(); - } - - public async Task GetOpenPositions(string clientId) - { - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - var responses = await _httpRequestService.RequestIfAvailableAsync(new ClientIdBackendRequest { ClientId = clientId }, - "order.list", - Array.Empty, - marginTradingEnabled); - - return new ClientOrdersLiveDemoClientResponse - { - Live = responses.Live.Select(item => item.ToClientContract()).ToArray(), - Demo = responses.Demo.Select(item => item.ToClientContract()).ToArray() - }; - } - - public async Task GetAccountOpenPositions(string clientId, string accountId) - { - var backendRequest = new AccountClientIdBackendRequest {AccountId = accountId, ClientId = clientId}; - var backendResponse = await _httpRequestService.RequestWithRetriesAsync(backendRequest, - "order.account.list", IsLiveAccount(backendRequest.AccountId)); - - return backendResponse.Select(item => item.ToClientContract()).ToArray(); - } - - public async Task GetClientOrders(string clientId) - { - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - var responses = await _httpRequestService.RequestIfAvailableAsync(new ClientIdBackendRequest { ClientId = clientId }, - "order.positions", - () => new ClientOrdersBackendResponse - { - Orders = Array.Empty(), - Positions = Array.Empty() - }, - marginTradingEnabled); - - return new ClientPositionsLiveDemoClientResponse - { - Live = responses.Live.ToClientContract(), - Demo = responses.Demo.ToClientContract() - }; - } - - public async Task> ChangeOrderLimits(string clientId, - ChangeOrderLimitsClientRequest request) - { - var backendRequest = request.ToBackendContract(clientId); - var backendResponse = await _httpRequestService.RequestWithRetriesAsync>(backendRequest, - "order.changeLimits", - IsLiveAccount(backendRequest.AccountId)); - return backendResponse.ToClientContract(); - } - - #endregion - - - #region Orderbook - - public async Task GetOrderBook(string instrument) - { - var backendResponse = - await _httpRequestService.RequestWithRetriesAsync( - new OrderbooksBackendRequest {Instrument = instrument}, "orderbooks"); - return backendResponse.Orderbook.ToClientContract(); - } - - #endregion - - - #region Private methods - - private bool IsLiveAccount(string accountId) - { - return !accountId.StartsWith(_settings.MarginTradingFront.DemoAccountIdPrefix); - } - - private static AccountHistoryClientResponse ToClientContract(AccountHistoryResponse src) - { - return new AccountHistoryClientResponse - { - Account = src.Account.Select(ToClientContract).OrderByDescending(item => item.Date).ToArray(), - OpenPositions = src.OpenPositions.Select(ToClientContract).ToArray(), - PositionsHistory = src.PositionsHistory.Select(ToClientContract).ToArray() - }; - } - - private static AccountHistoryClientContract ToClientContract(AccountHistoryContract src) - { - return new AccountHistoryClientContract - { - Id = src.Id, - Date = src.Date, - AccountId = src.AccountId, - ClientId = src.ClientId, - Amount = src.Amount, - Balance = src.Balance, - WithdrawTransferLimit = src.WithdrawTransferLimit, - Comment = src.Comment, - Type = ConvertEnum(src.Type), - LegalEnity = src.LegalEntity, - }; - } - - private static OrderHistoryClientContract ToClientContract(OrderHistoryContract src) - { - return new OrderHistoryClientContract - { - Id = src.Id, - AccountId = src.AccountId, - Instrument = src.Instrument, - AssetAccuracy = src.AssetAccuracy, - Type = ConvertEnum(src.Type), - Status = ConvertEnum(src.Status), - CloseReason = ConvertEnum(src.CloseReason), - OpenDate = src.OpenDate, - CloseDate = src.CloseDate, - OpenPrice = src.OpenPrice, - ClosePrice = src.ClosePrice, - Volume = src.Volume, - TakeProfit = src.TakeProfit, - StopLoss = src.StopLoss, - TotalPnL = src.TotalPnl, - PnL = src.Pnl, - InterestRateSwap = src.InterestRateSwap, - OpenCommission = src.OpenCommission, - CloseCommission = src.CloseCommission - }; - } - - public static AccountHistoryItemClient[] ToClientContract(AccountNewHistoryResponse src) - { - return src.HistoryItems.Select(i => new AccountHistoryItemClient - { - Date = i.Date, - Account = i.Account == null ? null : ToClientContract(i.Account), - Position = i.Position == null ? null : ToClientContract(i.Position) - }).ToArray(); - } - - private static TResult ConvertEnum(Enum e) - { - return e.ToString().ParseEnum(); - } - - #endregion - } -} diff --git a/src/MarginTrading.Frontend/Services/TerminalInfoService.cs b/src/MarginTrading.Frontend/Services/TerminalInfoService.cs deleted file mode 100644 index 5f854f240..000000000 --- a/src/MarginTrading.Frontend/Services/TerminalInfoService.cs +++ /dev/null @@ -1,48 +0,0 @@ -using MarginTrading.Frontend.Models; -using MarginTrading.Frontend.Settings; -using Microsoft.AspNetCore.Http; - -namespace MarginTrading.Frontend.Services -{ - /// - /// Gets terminal info from settings for terminal ID passed in corresponding request header - /// - public class TerminalInfoService : ITerminalInfoService - { - private readonly IHttpContextAccessor _httpContextAccessor; - private readonly TerminalsSettings _settings; - - public TerminalInfoService(IHttpContextAccessor httpContextAccessor, - TerminalsSettings settings) - { - _httpContextAccessor = httpContextAccessor; - _settings = settings; - } - - public TerminalInfo Get() - { - var context = _httpContextAccessor.HttpContext; - - string terminalId = string.Empty; - - if (context.Request.Headers.ContainsKey(_settings.TerminalIdHeaderName)) - { - terminalId = context.Request.Headers[_settings.TerminalIdHeaderName].ToString(); - } - - //try get settings for terminal ID passed in header (or for empty string if header is empty) - if (!_settings.Settings.TryGetValue(terminalId, out var terminalSettings)) - { - //if terminal ID was not empty but no settings exists for it, we try to get default settings - if (terminalId != string.Empty) - { - _settings.Settings.TryGetValue(string.Empty, out terminalSettings); - } - } - - return new TerminalInfo(terminalId, - terminalSettings?.DemoEnabled ?? false, - terminalSettings?.LiveEnabled ?? false); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Services/WampSessionsService.cs b/src/MarginTrading.Frontend/Services/WampSessionsService.cs deleted file mode 100644 index 65de2d621..000000000 --- a/src/MarginTrading.Frontend/Services/WampSessionsService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MarginTrading.Frontend.Services -{ - public class WampSessionsService - { - public int OpenedSessionsCount { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Services/WatchListService.cs b/src/MarginTrading.Frontend/Services/WatchListService.cs deleted file mode 100644 index e696887de..000000000 --- a/src/MarginTrading.Frontend/Services/WatchListService.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Common.Settings; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Frontend.Repositories; -using MarginTrading.Frontend.Repositories.Contract; - -namespace MarginTrading.Frontend.Services -{ - public class WatchListService : IWatchListService - { - private readonly IHttpRequestService _httpRequestService; - private readonly IMarginTradingWatchListRepository _watchListRepository; - private readonly IMarginTradingSettingsCacheService _marginTradingSettingsCacheService; - private const string AllAssetsWatchListId = "all_assets_watchlist"; - - public WatchListService( - IHttpRequestService httpRequestService, - IMarginTradingWatchListRepository watchListRepository, - IMarginTradingSettingsCacheService marginTradingSettingsCacheService) - { - _httpRequestService = httpRequestService; - _watchListRepository = watchListRepository; - _marginTradingSettingsCacheService = marginTradingSettingsCacheService; - } - - public async Task> GetAllAsync(string clientId) - { - return await GetWatchLists(clientId); - } - - public async Task GetAsync(string clientId, string id) - { - return id == AllAssetsWatchListId - ? await GetAllAssetsWatchList(clientId) - : await _watchListRepository.GetAsync(clientId, id); - } - - public async Task> AddAsync(string id, string clientId, string name, List assetIds) - { - var result = new WatchListResult(); - var isNew = string.IsNullOrEmpty(id); - var watchLists = (await GetWatchLists(clientId)).ToList(); - var allAssets = await GetAvailableAssetIds(clientId); - - foreach (var assetId in assetIds) - { - if (!allAssets.Contains(assetId)) - { - result.Status = WatchListStatus.AssetNotFound; - result.Message = assetId; - return result; - } - } - - var existing = watchLists.FirstOrDefault(item => item.Id == id); - - if (existing != null && existing.ReadOnly) - { - result.Status = WatchListStatus.ReadOnly; - result.Message = "This watch list is readonly"; - return result; - } - - var watchList = new MarginTradingWatchList - { - Id = isNew ? Guid.NewGuid().ToString("N") : id, - ClientId = clientId, - Name = name, - AssetIds = assetIds - }; - - if (isNew) - { - watchList.Order = watchLists.Count; - } - - if (existing != null) - { - watchList.Order = existing.Order; - } - - result.Result = await _watchListRepository.AddAsync(watchList); - return result; - } - - public async Task> DeleteAsync(string clientId, string id) - { - var result = new WatchListResult(); - - var watchList = await GetAsync(clientId, id); - - if (watchList == null) - { - result.Status = WatchListStatus.NotFound; - return result; - } - - if (watchList.ReadOnly) - { - result.Status = WatchListStatus.ReadOnly; - return result; - } - - await _watchListRepository.DeleteAsync(clientId, id); - - result.Result = true; - return result; - } - - private async Task> GetAvailableAssetIds(string clientId) - { - - var marginTradingEnabled = await _marginTradingSettingsCacheService.IsMarginTradingEnabled(clientId); - var responses = await _httpRequestService.RequestIfAvailableAsync(new ClientIdBackendRequest { ClientId = clientId }, - "init.availableassets", - () => new List(), - marginTradingEnabled); - return responses.Live.Concat(responses.Demo).Distinct().ToList(); - } - - private async Task> GetWatchLists(string clientId) - { - var availableAssets = await GetAvailableAssetIds(clientId); - - var result = new List(); - - var watchLists = (await _watchListRepository.GetAllAsync(clientId)).ToList(); - - if (watchLists.Any()) - { - foreach (var watchlist in watchLists) - { - watchlist.AssetIds.RemoveAll(item => !availableAssets.Contains(item)); - } - - result.AddRange(watchLists.Select(MarginTradingWatchList.Create)); - } - - var watchList = await GetAllAssetsWatchList(clientId); - - result.Insert(0, watchList); - - return result; - } - - private async Task GetAllAssetsWatchList(string clientId) - { - var allAssets = await GetAvailableAssetIds(clientId); - - return new MarginTradingWatchList - { - Id = AllAssetsWatchListId, - ClientId = clientId, - Name = "All assets", - AssetIds = allAssets, - ReadOnly = true - }; - } - } -} diff --git a/src/MarginTrading.Frontend/Settings/ApplicationSettings.cs b/src/MarginTrading.Frontend/Settings/ApplicationSettings.cs deleted file mode 100644 index cd4080372..000000000 --- a/src/MarginTrading.Frontend/Settings/ApplicationSettings.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Collections.Generic; -using Lykke.SettingsReader.Attributes; -using MarginTrading.Common.RabbitMq; -using MarginTrading.Common.Settings; - -namespace MarginTrading.Frontend.Settings -{ - public class ApplicationSettings - { - public MtFrontendSettings MtFrontend {get; set;} - public SlackNotificationSettings SlackNotifications { get; set; } - public ClientAccountServiceSettings ClientAccountServiceClient { get; set; } - public MtDataReaderClientSettings MtDataReaderLiveServiceClient { get; set; } - public MtDataReaderClientSettings MtDataReaderDemoServiceClient { get; set; } - } - - public class MtFrontendSettings - { - public MtSettings MarginTradingLive { get; set; } - public MtSettings MarginTradingDemo { get; set; } - public MtFrontSettings MarginTradingFront { get; set; } - } - - public class MtSettings - { - public string ApiRootUrl { get; set; } - public string ApiKey { get; set; } - - public string MtRabbitMqConnString { get; set; } - } - - public class DbSettings - { - public string LogsConnString { get; set; } - public string MarginTradingConnString { get; set; } - } - - public class MtQueues - { - public RabbitMqQueueInfo AccountChanged { get; set; } - public RabbitMqQueueInfo OrderChanged { get; set; } - public RabbitMqQueueInfo AccountStopout { get; set; } - public RabbitMqQueueInfo UserUpdates { get; set; } - public RabbitMqQueueInfo OrderbookPrices { get; set; } - public RabbitMqQueueInfo Trades { get; set; } - public RabbitMqQueueInfo MarginTradingEnabledChanged { get; set; } - } - - public class MtFrontSettings - { - public string SessionServiceApiUrl { get; set; } - public string DemoAccountIdPrefix { get; set; } - public CorsSettings CorsSettings { get; set; } - public DbSettings Db { get; set; } - public MtQueues RabbitMqQueues { get; set; } - public RequestLoggerSettings RequestLoggerSettings { get; set; } - public TerminalsSettings TerminalsSettings { get; set; } - - [Optional] - public string ApplicationInsightsKey { get; set; } - - #region From env variables - - [Optional] - public string Env { get; set; } - - #endregion - } - - public class TerminalsSettings - { - public string TerminalIdHeaderName { get; set; } - public Dictionary Settings { get; set; } - } - - public class TerminalSettings - { - public bool DemoEnabled { get; set; } - public bool LiveEnabled { get; set; } - } - - public class CorsSettings - { - public bool Enabled { get; set; } - public bool HandleOptionsRequest { get; set; } - public string AllowOrigins { get; set; } - public string AllowHeaders { get; set; } - public string AllowMethods { get; set; } - public bool AllowCredentials { get; set; } - } -} diff --git a/src/MarginTrading.Frontend/Settings/MtDataReaderClientSettings.cs b/src/MarginTrading.Frontend/Settings/MtDataReaderClientSettings.cs deleted file mode 100644 index 9dd2b0553..000000000 --- a/src/MarginTrading.Frontend/Settings/MtDataReaderClientSettings.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MarginTrading.Frontend.Settings -{ - public class MtDataReaderClientSettings - { - public string ServiceUrl { get; set; } - public string ApiKey { get; set; } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Startup.cs b/src/MarginTrading.Frontend/Startup.cs deleted file mode 100644 index 04b4e603b..000000000 --- a/src/MarginTrading.Frontend/Startup.cs +++ /dev/null @@ -1,314 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using Autofac; -using Autofac.Extensions.DependencyInjection; -using Common.Log; -using Lykke.AzureQueueIntegration; -using Lykke.Common.ApiLibrary.Swagger; -using Lykke.Logs; -using Lykke.SettingsReader; -using Lykke.SlackNotification.AzureQueue; -using MarginTrading.Common.Extensions; -using MarginTrading.Common.Json; -using MarginTrading.Common.Modules; -using MarginTrading.Common.RabbitMq; -using MarginTrading.Common.Services; -using MarginTrading.Common.Services.Settings; -using MarginTrading.Contract.BackendContracts; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Contract.RabbitMqMessageModels; -using MarginTrading.Frontend.Infrastructure; -using MarginTrading.Frontend.Middleware; -using MarginTrading.Frontend.Modules; -using MarginTrading.Frontend.Settings; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Tokens; -using Newtonsoft.Json; -using WampSharp.AspNetCore.WebSockets.Server; -using WampSharp.Binding; -using WampSharp.V2; -using WampSharp.V2.MetaApi; -using WampSharp.V2.Realm; -using LogLevel = Microsoft.Extensions.Logging.LogLevel; - -#pragma warning disable 1591 - -namespace MarginTrading.Frontend -{ - public class Startup - { - public IConfigurationRoot Configuration { get; } - public IHostingEnvironment Environment { get; } - public IContainer ApplicationContainer { get; set; } - - public Startup(IHostingEnvironment env) - { - Configuration = new ConfigurationBuilder() - .SetBasePath(env.ContentRootPath) - .AddDevJson(env) - .AddEnvironmentVariables() - .Build(); - - Environment = env; - } - - public IServiceProvider ConfigureServices(IServiceCollection services) - { - var loggerFactory = new LoggerFactory() - .AddConsole(LogLevel.Error) - .AddDebug(LogLevel.Error); - - services.AddSingleton(loggerFactory); - services.AddLogging(); - services.AddSingleton(Configuration); - services.AddMvc() - .AddJsonOptions(options => - { - options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); - options.SerializerSettings.Converters = SerializerSettings.GetDefaultConverters(); - }); - - services.AddSwaggerGen(options => - { - options.DefaultLykkeConfiguration("v1", "MarginTrading_Api"); - options.OperationFilter(); - }); - - services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddJwtBearer(options => - { - options.SecurityTokenValidators.Clear(); - options.SecurityTokenValidators.Add(ApplicationContainer.Resolve()); - }); - - var builder = new ContainerBuilder(); - - - var appSettings = Configuration.LoadSettings() - .Nested(s => - { - if (!string.IsNullOrEmpty(Configuration["Env"])) - { - s.MtFrontend.MarginTradingFront.Env = Configuration["Env"]; - } - - return s; - }); - - var settings = appSettings.Nested(s => s.MtFrontend); - - - Console.WriteLine($"Env: {settings.CurrentValue.MarginTradingFront.Env}"); - - SetupLoggers(services, appSettings); - - RegisterModules(builder, appSettings); - - builder.Populate(services); - - ApplicationContainer = builder.Build(); - - SetSubscribers(settings.CurrentValue); - - return new AutofacServiceProvider(ApplicationContainer); - } - - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime) - { - app.UseGlobalErrorHandler(); - app.UseOptions(); - - var settings = ApplicationContainer.Resolve(); - - if (settings.CorsSettings.Enabled) - { - app.UseCors(builder => - { - builder.WithOrigins(settings.CorsSettings.AllowOrigins) - .WithHeaders(settings.CorsSettings.AllowHeaders) - .WithMethods(settings.CorsSettings.AllowMethods); - - if (settings.CorsSettings.AllowCredentials) - builder.AllowCredentials(); - }); - } - - - var host = ApplicationContainer.Resolve(); - var realm = ApplicationContainer.Resolve(); - var realmMetaService = realm.HostMetaApiService(); - - app.UseAuthentication(); - - app.UseMvc(routes => - { - routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}"); - }); - - app.UseSwagger(); - app.UseSwaggerUi(); - app.UseStaticFiles(); - - app.Map("/ws", builder => - { - builder.UseWebSockets(new WebSocketOptions {KeepAliveInterval = TimeSpan.FromMinutes(1)}); - - var jsonSettings = - new JsonSerializerSettings() {Converters = SerializerSettings.GetDefaultConverters()}; - var jsonSerializer = JsonSerializer.Create(jsonSettings); - - host.RegisterTransport(new AspNetCoreWebSocketTransport(builder), - new JTokenJsonBinding(jsonSerializer), - new JTokenMsgpackBinding(jsonSerializer)); - }); - - appLifetime.ApplicationStopped.Register(() => ApplicationContainer.Dispose()); - - var application = app.ApplicationServices.GetService(); - - appLifetime.ApplicationStarted.Register(() => - { - if (!string.IsNullOrEmpty(settings.ApplicationInsightsKey)) - { - Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = - settings.ApplicationInsightsKey; - } - - application.StartAsync().Wait(); - - LogLocator.CommonLog?.WriteMonitorAsync("", "", settings.Env + " Started"); - }); - - appLifetime.ApplicationStopping.Register(() => - { - LogLocator.CommonLog?.WriteMonitorAsync("", "", settings.Env + " Terminating"); - realmMetaService.Dispose(); - application.Stop(); - } - ); - - host.Open(); - } - - private static void RegisterModules(ContainerBuilder builder, IReloadingManager appSettings) - { - var settings = appSettings.Nested(s => s.MtFrontend); - - builder.RegisterModule(new FrontendModule(settings)); - builder.RegisterModule(new MarginTradingCommonModule()); - builder.RegisterModule(new FrontendExternalServicesModule(appSettings)); - } - - private void SetSubscribers(MtFrontendSettings settings) - { - var rabbitMqService = ApplicationContainer.Resolve(); - var rabbitMqHandler = ApplicationContainer.Resolve(); - - // Best prices (only live) - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.OrderbookPrices.ExchangeName, rabbitMqHandler.ProcessPrices); - - // Account changes - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.AccountChanged.ExchangeName, - rabbitMqHandler.ProcessAccountChanged); - - Subscribe(rabbitMqService, settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.AccountChanged.ExchangeName, - rabbitMqHandler.ProcessAccountChanged); - - // Order changes - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.OrderChanged.ExchangeName, - rabbitMqHandler.ProcessOrderChanged); - - Subscribe(rabbitMqService, settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.OrderChanged.ExchangeName, - rabbitMqHandler.ProcessOrderChanged); - - // Stopout - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.AccountStopout.ExchangeName, - rabbitMqHandler.ProcessAccountStopout); - - Subscribe(rabbitMqService, settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.AccountStopout.ExchangeName, - rabbitMqHandler.ProcessAccountStopout); - - // User updates - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.UserUpdates.ExchangeName, - rabbitMqHandler.ProcessUserUpdates); - - Subscribe(rabbitMqService, settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.UserUpdates.ExchangeName, - rabbitMqHandler.ProcessUserUpdates); - - // Trades - - Subscribe(rabbitMqService, settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.Trades.ExchangeName, rabbitMqHandler.ProcessTrades); - - Subscribe(rabbitMqService, settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.Trades.ExchangeName, rabbitMqHandler.ProcessTrades); - - Subscribe(rabbitMqService, - settings.MarginTradingLive.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.MarginTradingEnabledChanged.ExchangeName, - rabbitMqHandler.ProcessMarginTradingEnabledChanged); - - Subscribe(rabbitMqService, - settings.MarginTradingDemo.MtRabbitMqConnString, - settings.MarginTradingFront.RabbitMqQueues.MarginTradingEnabledChanged.ExchangeName, - rabbitMqHandler.ProcessMarginTradingEnabledChanged); - } - - private static void SetupLoggers(IServiceCollection services, IReloadingManager settings) - { - var consoleLogger = new LogToConsole(); - - var azureQueue = new AzureQueueSettings - { - ConnectionString = settings.CurrentValue.SlackNotifications.AzureQueue.ConnectionString, - QueueName = settings.CurrentValue.SlackNotifications.AzureQueue.QueueName - }; - - var comonSlackService = - services.UseSlackNotificationsSenderViaAzureQueue(azureQueue, consoleLogger); - - var slackService = - new MtSlackNotificationsSender(comonSlackService, "MT Frontend", settings.CurrentValue.MtFrontend.MarginTradingFront.Env); - - // Order of logs registration is important - UseLogToAzureStorage() registers ILog in container. - // Last registration wins. - LogLocator.RequestsLog = services.UseLogToAzureStorage(settings.Nested(s => s.MtFrontend.MarginTradingFront.Db.LogsConnString), - slackService, "MarginTradingFrontendRequestsLog", consoleLogger); - - LogLocator.CommonLog = services.UseLogToAzureStorage(settings.Nested(s => s.MtFrontend.MarginTradingFront.Db.LogsConnString), - slackService, "MarginTradingFrontendLog", consoleLogger); - } - - private static void Subscribe(IRabbitMqService rabbitMqService, string connectionString, - string exchangeName, Func handler) - { - var settings = new RabbitMqSettings - { - ConnectionString = connectionString, - ExchangeName = exchangeName, - }; - - rabbitMqService.Subscribe(settings, false, handler, rabbitMqService.GetJsonDeserializer()); - } - } -} diff --git a/src/MarginTrading.Frontend/Views/Home/Index.cshtml b/src/MarginTrading.Frontend/Views/Home/Index.cshtml deleted file mode 100644 index b77627aba..000000000 --- a/src/MarginTrading.Frontend/Views/Home/Index.cshtml +++ /dev/null @@ -1,36 +0,0 @@ -@model MarginTrading.Frontend.Models.MethodInfoModel - - - Wamp documentation - - - - - - -
- -
-
- @Html.Partial("MethodsListPartial", Model.Rpc) -
-
- @Html.Partial("MethodsListPartial", Model.Topic) -
-
-
- - - - - - \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Views/Shared/MethodsListPartial.cshtml b/src/MarginTrading.Frontend/Views/Shared/MethodsListPartial.cshtml deleted file mode 100644 index 89e4522c9..000000000 --- a/src/MarginTrading.Frontend/Views/Shared/MethodsListPartial.cshtml +++ /dev/null @@ -1,63 +0,0 @@ -@model MarginTrading.Common.Documentation.MethodDocInfo[] -@{ - var guid = Guid.NewGuid().ToString(); -} - -
- @foreach (var rpc in Model) - { -
- -
-
- - - - - - - - - - - -
InputOutputDescription
- @if (rpc.InputTypes?.Length > 0) - { - -
- @Html.Partial("TypesListParial", rpc.InputTypes) -
- } - else - { - @rpc.Input - } -
- @if (rpc.OutputTypes?.Length > 0) - { - -
- @Html.Partial("TypesListParial", rpc.OutputTypes) -
- } - else - { - @rpc.Output - } -
@rpc.Description
-
-
-
- } -
\ No newline at end of file diff --git a/src/MarginTrading.Frontend/Views/Shared/TypesListParial.cshtml b/src/MarginTrading.Frontend/Views/Shared/TypesListParial.cshtml deleted file mode 100644 index dcb52015f..000000000 --- a/src/MarginTrading.Frontend/Views/Shared/TypesListParial.cshtml +++ /dev/null @@ -1,11 +0,0 @@ -@using MarginTrading.Common.Extensions -@model Type[] - -
-    
-        @foreach (var type in Model)
-        {
-            @type.GetTypeDefinition()
-        }
-    
-
\ No newline at end of file diff --git a/src/MarginTrading.Frontend/Wamp/AnonymousWampAuthorizer.cs b/src/MarginTrading.Frontend/Wamp/AnonymousWampAuthorizer.cs deleted file mode 100644 index 4dc66860c..000000000 --- a/src/MarginTrading.Frontend/Wamp/AnonymousWampAuthorizer.cs +++ /dev/null @@ -1,28 +0,0 @@ -using WampSharp.V2.Authentication; -using WampSharp.V2.Core.Contracts; - -namespace MarginTrading.Frontend.Wamp -{ - public class AnonymousWampAuthorizer : IWampAuthorizer - { - public bool CanRegister(RegisterOptions options, string procedure) - { - return false; - } - - public bool CanCall(CallOptions options, string procedure) - { - return true; - } - - public bool CanPublish(PublishOptions options, string topicUri) - { - return false; - } - - public bool CanSubscribe(SubscribeOptions options, string topicUri) - { - return string.IsNullOrEmpty(options?.Match) || options.Match == WampMatchPattern.Exact; - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Wamp/AnonymousWampSessionAuthenticator.cs b/src/MarginTrading.Frontend/Wamp/AnonymousWampSessionAuthenticator.cs deleted file mode 100644 index dd8be877d..000000000 --- a/src/MarginTrading.Frontend/Wamp/AnonymousWampSessionAuthenticator.cs +++ /dev/null @@ -1,27 +0,0 @@ -using WampSharp.V2.Authentication; -using WampSharp.V2.Core.Contracts; - -namespace MarginTrading.Frontend.Wamp -{ - public class AnonymousWampSessionAuthenticator : WampSessionAuthenticator - { - private readonly IWampAuthorizer _authorizer; - - public AnonymousWampSessionAuthenticator() - { - _authorizer = new AnonymousWampAuthorizer(); - } - - public override void Authenticate(string signature, AuthenticateExtraData extra) - { - } - - public override IWampAuthorizer Authorizer => _authorizer; - - public override bool IsAuthenticated => true; - - public override string AuthenticationId => "Anonymous"; - - public override string AuthenticationMethod => "None"; - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/Wamp/IRpcMtFrontend.cs b/src/MarginTrading.Frontend/Wamp/IRpcMtFrontend.cs deleted file mode 100644 index a26d628a0..000000000 --- a/src/MarginTrading.Frontend/Wamp/IRpcMtFrontend.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Threading.Tasks; -using MarginTrading.Common.Documentation; -using MarginTrading.Contract.ClientContracts; -using WampSharp.V2.Rpc; - -namespace MarginTrading.Frontend.Wamp -{ - public interface IRpcMtFrontend - { - [WampProcedure("is.alive")] - [DocMe(Name = "is.alive", Description = "Checks service isAlive")] - IsAliveResponse IsAlive(); - - [WampProcedure("init.data")] - [DocMe(Name = "init.data", Description = "Gets init data: client accounts and trading conditions")] - Task InitData(string token); - - [WampProcedure("init.accounts")] - [DocMe(Name = "init.accounts", Description = "Gets client accounts")] - Task InitAccounts(string token); - - [WampProcedure("init.accountinstruments")] - [DocMe(Name = "init.accountinstruments", Description = "Gets trading conditions")] - Task AccountInstruments(string token = null); - - [WampProcedure("init.graph")] - [DocMe(Name = "init.graph", Description = "Gets data for micrographics")] - Task InitGraph(string token = null, string[] assetIds = null); - - [WampProcedure("account.history")] - [DocMe(Name = "account.history", Description = "Gets account history", InputType = typeof(AccountHistoryRpcClientRequest))] - Task GetAccountHistory(string requestJson); - - [WampProcedure("account.history.new")] - [DocMe(Name = "account.history.new", Description = "Gets account history (different format)", InputType = typeof(AccountHistoryRpcClientRequest))] - Task GetHistory(string requestJson); - - [WampProcedure("order.place")] - [DocMe(Name = "order.place", Description = "Places order", InputType = typeof(OpenOrderRpcClientRequest))] - Task> PlaceOrder(string requestJson); - - [WampProcedure("order.close")] - [DocMe(Name = "order.close", Description = "Close order", InputType = typeof(CloseOrderRpcClientRequest))] - Task> CloseOrder(string requestJson); - - [WampProcedure("order.cancel")] - [DocMe(Name = "order.cancel", Description = "Cancel order", InputType = typeof(CloseOrderRpcClientRequest))] - Task> CancelOrder(string requestJson); - - [WampProcedure("order.list")] - [DocMe(Name = "order.list", Description = "Gets client open positions")] - Task GetOpenPositions(string token); - - [WampProcedure("order.account.list")] - [DocMe(Name = "order.account.list", Description = "Gets client account open positions", InputType = typeof(AccountTokenClientRequest))] - Task GetAccountOpenPositions(string requestJson); - - [WampProcedure("order.positions")] - Task GetClientOrders(string token); - - [WampProcedure("order.changeLimits")] - [DocMe(Name = "order.changeLimits", Description = "Sets order limits", InputType = typeof(ChangeOrderLimitsRpcClientRequest))] - Task> ChangeOrderLimits(string requestJson); - - [WampProcedure("orderbooks")] - Task GetOrderBook(string instrument); - } -} diff --git a/src/MarginTrading.Frontend/Wamp/IWampTopic.cs b/src/MarginTrading.Frontend/Wamp/IWampTopic.cs deleted file mode 100644 index 87a3e94ce..000000000 --- a/src/MarginTrading.Frontend/Wamp/IWampTopic.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MarginTrading.Common.Documentation; -using MarginTrading.Contract.ClientContracts; -using MarginTrading.Contract.RabbitMqMessageModels; - -namespace MarginTrading.Frontend.Wamp -{ - public interface IWampTopic - { - [DocMe(Name = "prices.update", Description = " [ Obsolete ] sends prices for all instruments")] - BidAskPairRabbitMqContract AllPricesUpdate(); - - [DocMe(Name = "prices.update.{instrumentId}", Description = "sends prices for specific instrument")] - BidAskPairRabbitMqContract InstumentPricesUpdate(); - - [DocMe(Name = "user.{notificationId}", Description = " [ Obsolete ] sends user updates on position, account changes and dictionaries")] - NotifyResponse UserUpdates(); - - [DocMe(Name = "user.updates.{notificationId}", Description = "sends user updates on position, account changes and dictionaries")] - NotifyResponse UserUpdates(); - - [DocMe(Name = "trades", Description = "sends trades info")] - TradeClientContract Trades(); - } -} diff --git a/src/MarginTrading.Frontend/Wamp/WampConstants.cs b/src/MarginTrading.Frontend/Wamp/WampConstants.cs deleted file mode 100644 index 9cf94abf2..000000000 --- a/src/MarginTrading.Frontend/Wamp/WampConstants.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MarginTrading.Frontend.Wamp -{ - public static class WampConstants - { - public const string FrontEndRealmName = "mtcrossbar"; - - public const string PricesTopicPrefix = "prices.update"; - public const string UserUpdatesTopicPrefix = "user"; - public const string TradesTopic = "trades"; - } -} diff --git a/src/MarginTrading.Frontend/Wamp/WampSessionAuthenticatorFactory.cs b/src/MarginTrading.Frontend/Wamp/WampSessionAuthenticatorFactory.cs deleted file mode 100644 index 1a9e21541..000000000 --- a/src/MarginTrading.Frontend/Wamp/WampSessionAuthenticatorFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -using WampSharp.V2.Authentication; - -namespace MarginTrading.Frontend.Wamp -{ - public class WampSessionAuthenticatorFactory : IWampSessionAuthenticatorFactory - { - public IWampSessionAuthenticator GetSessionAuthenticator - (WampPendingClientDetails details, - IWampSessionAuthenticator transportAuthenticator) - { - return new AnonymousWampSessionAuthenticator(); - } - } -} \ No newline at end of file diff --git a/src/MarginTrading.Frontend/docker-compose.yml b/src/MarginTrading.Frontend/docker-compose.yml deleted file mode 100644 index 7549b9d71..000000000 --- a/src/MarginTrading.Frontend/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '2' -services: - margintradingfront: - image: lykkex/margintradingfront - container_name: margintradingfront - environment: - - SettingsUrl=${SettingsUrl} - - IsLive=${IsLive} - - Env=${Env} - - KestrelThreadCount=${KestrelThreadCount} - ports: - - "5005:5005" - networks: - mynet: - aliases: - - margintradingfront - -networks: - mynet: - driver: bridge diff --git a/src/MarginTrading.Frontend/web.config b/src/MarginTrading.Frontend/web.config deleted file mode 100644 index a8d667275..000000000 --- a/src/MarginTrading.Frontend/web.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/src/MarginTrading.Frontend/wwwroot/css/bootstrap.css b/src/MarginTrading.Frontend/wwwroot/css/bootstrap.css deleted file mode 100644 index 6167622ce..000000000 --- a/src/MarginTrading.Frontend/wwwroot/css/bootstrap.css +++ /dev/null @@ -1,6757 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\002a"; -} -.glyphicon-plus:before { - content: "\002b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover, -a.text-info:focus { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - min-height: .01%; - overflow-x: auto; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - min-height: 34px; - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 11px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, -.btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, -.btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #337ab7; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #337ab7; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group .form-control:focus { - z-index: 3; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #337ab7; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 2; - color: #23527c; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 3; - color: #fff; - cursor: default; - background-color: #337ab7; - border-color: #337ab7; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - padding-right: 15px; - padding-left: 15px; - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border .2s ease-in-out; - -o-transition: border .2s ease-in-out; - transition: border .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - cursor: not-allowed; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-right: 15px; - padding-left: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - filter: alpha(opacity=0); - opacity: 0; - - line-break: auto; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - right: 5px; - bottom: 0; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - - line-break: auto; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: -o-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - background-color: rgba(0, 0, 0, 0); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - margin-top: -10px; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - font-family: serif; - line-height: 1; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -10px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -10px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -10px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-header:before, -.modal-header:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-header:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/src/MarginTrading.Frontend/wwwroot/css/highlight-vs.css b/src/MarginTrading.Frontend/wwwroot/css/highlight-vs.css deleted file mode 100644 index c5d07d311..000000000 --- a/src/MarginTrading.Frontend/wwwroot/css/highlight-vs.css +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Visual Studio-like style based on original C# coloring by Jason Diamond - -*/ -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: white; - color: black; -} - -.hljs-comment, -.hljs-quote, -.hljs-variable { - color: #008000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-built_in, -.hljs-name, -.hljs-tag { - color: #00f; -} - -.hljs-string, -.hljs-title, -.hljs-section, -.hljs-attribute, -.hljs-literal, -.hljs-template-tag, -.hljs-template-variable, -.hljs-type, -.hljs-addition { - color: #a31515; -} - -.hljs-deletion, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-meta { - color: #2b91af; -} - -.hljs-doctag { - color: #808080; -} - -.hljs-attr { - color: #f00; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: #00b0e8; -} - - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.eot b/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.ttf b/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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 G`u_lkUM?>H diff --git a/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.woff2 b/src/MarginTrading.Frontend/wwwroot/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 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 diff --git a/src/MarginTrading.Frontend/wwwroot/images/favicon.png b/src/MarginTrading.Frontend/wwwroot/images/favicon.png deleted file mode 100644 index 01c19e17ec5cc05f304adcb6cb9d531e722d63f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3487 zcmV;Q4Pf$#P)U5JD8lmbta^E9+AGCbas<{CmAJOEFQbR)c5fqy(A#KD`vQ-1hiAYcM~ z#1yhI-U6QX!+!{FW+=(@Qbu%$#(2vPXoMex_9#eLPwcu^U~d^XMZlW5x^k57t7LG2 z4l!^+0T)^*?>`cyX{8fFR&hQEJOO5;#_Nz%9D=xdQ^h6fO1+R$yeW7vS7#su6%Xd> zO;snZE`=mGW^0_P2hZw$SBDUE^{dM25TY^OVOEFVQC1ImSLa)}da&UvbhEkw7&NP+ zNm3{eXV8YLQz4wyp$T}atWI^kt4r%{lTWB;N^gzgZMu5rgP(`ju~`ZKC|U6*&{DAj zI(zj?M&cs09cYeb9ovzs3)CoZ)34x>k~Fvbx2LeWs)ea>)-V?52}~QVE>OeJ-G>D}L)RD4_Zy9EW>N>%ygrkU4Sz)e z&kDjJ)q|NzJ~pYFCjm1XW9TTk z_9wTqXiuVTK^xIU@I>P^M0t3tMRIEr-#n`YSG)zhCKE7D9~jP+0_A}lba9qIKY2Sm zmpfp<02n`hJg~(56eYSEexY){28`f@8md)Rx5xE>y7WQd9XbG{?q&d&7o6Egq1)HT zWeA}|z@VQYG%Z8ReJ$c0m5O5h8NCVoT(l3+Ms*qdPWKA9M<)d`w*v2dYzk1BQ$WWs zIKQEQ!6W_9I4C!51oPJaT??$-Ns_EI{p7@6n{wm1c+gG!>(VB_w`*xImOx@L4R{%h_wQv~jUf1YE6FL-Dg4zlhoR{i*g<4_phF!Lw6f zNnTi37^J4AQp=Vt`^IcGKe%-1(#gk;9os{}O)NHelq4Dr3(h4tKrKc${6GNB>ax6L zIxH16H8lsUR_g+E@vwgV`u&K|;dozm`Ae5BeO_2tIGvm~En2M>jvqe`2o$uUN zmMvR888~oY#=?aQXB<3u@UxpbWwpU{;x<|uyw78XeGW}aVx9tliC(quW#77KrQN%C zpMWo#iwVeq;TTSoChjf>0+>vuQ8Z0!Fg~08Bb|J{fB*iVZ5pv`+qNwm6(2os-n{8K zIXR!}^?LAlJU0it3T9#qQd(5`d5pWI*a4a*32%XB_Zi^c6n_$EArW2Eh^iVf7Uc>A z9)SVx$KiRZ+wDF{U`ZkBS5;L(ZfW7z_ZMhi$d;$flGK<^8X6j)xVRY5y`iY6h-73cDk|!6 z@;Oa1KFfkWDhdklv-t(Qww9%=a)JV+O^=qpGqpBz_5eU0ogY?%kVQr=h~TC5p0o@!rMkY&epW1LsOg z0&QXksW7I$yz8#JGG@)1^)M!~UBTY1%fL(F&(IjhR7cPOc&DC;(>&Op;y4ZnJaOrQ zf&v&ha-{6?L`ih-A+>h3}hZ$^gDR z590AML1hd-9X+(CJ0UT_oB)lASyHRoEK7hcK-}otmnB`K6b3CnqP5 zL+I&;4juZW!|6n4LSKYc@{onudpR!nuUhFgXLvgGCc}x@KhhTce02NKOqdSbrG-%b zdX66GYPoCU=Q@5T9;IGP%B`gP7>2{&*sNMnW z_px{$)#kf7rL4Nte~>)>pxLwJ5l30c+R7CVMP4|50h|H@eT~(LCiCqFbuJJ8R94n_ zgg!tiVF^%yb&w3Y4gx#{>l<4W6+Z$#RiIZ)42)jkGTUH}_M!)nOO*H7ITBR_L-R=IK z?yBT=8a9!y6Zc+$eYjXz#kEzO7y{_t!g_RDu0JfevLlJp(R^_ogK%>Zn#4?Gt5Bj! zVYA^sVD0IH9!W{ywpPJoMJFH{yQ#Qd1RX7chhiYnAc4r5Ajbx4Dr~kFRhP`~?IRn-DjXN}`0VFz(t3?pi#64UB-VjA6>T8;KL zaqmI!RGZJ;2-(tn$jHNISEG$N2c_CIu^)q&poTK1`*idand}gs*Z_fUAAztEGl}w5AlB)0ItrI2vs4`;@Rzh`kwY(!UJg+xo zStkvcYF#D>=Dw4|JiNmg&O!r6L4-;KD|$dZ=YrvC`}E}Qmalk<)=4)Cu0S!0wFT`E zWoUW>fgS>nU-k2cP?tPQ!+Rl(uAew4&XR)6mVYHA zB$$b7t5hmkWtYn(ue~E8BB1Z(1Z>3+Xb)%x!ehJbb1^ZqqXb^kB7B{%QTZB|1l58M zQpM^!hFHwsF=|bJ@dg!dPiYw%Uy8c}rd$hj8ba^GMM-oFE;`6+j6johxgWY`^=&Y< zd{VPERp=396{pf0KC$z@pqP^&$!G189vhXT(uNHeuLoRc z<3AV8p*7r{FzH$zn~VzYii?YjCMz-G-Zq;}PGkhyU@$;jRd;^Yg&EkAv01w(aA;HE zGM4-XR2^a3V3!Q9MvELy*;G)E@KKn0J#G$c=sgMEO7p;|$X$#|-HW{*#e)m=|DpnjSRaY-MeQy0T|wRa%3|^m=E2 z%g~@e-wmU$>3ImQ>(;GXWJ_qGG=awRUHSR>)AV4(IXlZM-d3NJ;euI;ezY%vPF-^9d{O;{`yAL7sbU_e&V_>X^&|9&+#n^7G(*BkA5=HoT z;YIk<(WCG&4t+w5C5z@Xhb10 zX_mhihF;gymuwdo7Z-9kG^e2kYy(@oLTF5w+BTUW{w#gyh&GbWMJRwvL;6x>hyonrCh^8~4&8P~{42 z_wT3xcOMMC@h#}8s(lD)!{io^9&i|y&f3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/src/MarginTrading.Frontend/wwwroot/js/highlight.pack.js b/src/MarginTrading.Frontend/wwwroot/js/highlight.pack.js deleted file mode 100644 index ef27d2f00..000000000 --- a/src/MarginTrading.Frontend/wwwroot/js/highlight.pack.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.11.0 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do decimal else enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while nameof add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},t=e.inherit(r,{i:/\n/}),a={cN:"subst",b:"{",e:"}",k:i},n=e.inherit(a,{i:/\n/}),c={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,n]},s={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},a]},o=e.inherit(s,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},n]});a.c=[s,c,r,e.ASM,e.QSM,e.CNM,e.CBCM],n.c=[o,c,t,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[s,c,r,e.ASM,e.QSM]},b=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+b+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}}); \ No newline at end of file diff --git a/src/MarginTrading.Frontend/wwwroot/js/jquery.min.js b/src/MarginTrading.Frontend/wwwroot/js/jquery.min.js deleted file mode 100644 index 0f60b7bd0..000000000 --- a/src/MarginTrading.Frontend/wwwroot/js/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("