From 2617faeb4f3ff2570075e473eb76694c250617cd Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 08:07:00 -0600 Subject: [PATCH 01/29] Version inicial de OracleStorage Provider --- .../MiniProfiler.Providers.Oracle.csproj | 15 + .../OracleBoolTypeHandler.cs | 20 + .../OracleGuidTypeHandler.cs | 36 ++ .../OracleStorage.cs | 474 ++++++++++++++++++ 4 files changed, 545 insertions(+) create mode 100644 src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj create mode 100644 src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleStorage.cs diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj new file mode 100644 index 000000000..82875e0ba --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -0,0 +1,15 @@ + + + MiniProfiler.Providers.Oracle + MiniProfiler.Providers.Oracle + MiniProfiler: Profiler storage for Oracle Database + Fernando Paz + Oracle;$(PackageBaseTags) + net461;netstandard2.0 + + + + + + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs new file mode 100644 index 000000000..b2bb189cc --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs @@ -0,0 +1,20 @@ +using System.Data; +using Dapper; + +namespace StackExchange.Profiling +{ + /// + /// Handle Bool to Integer conversions for Oracle Provider + /// + public class OracleBoolTypeHandler : SqlMapper.TypeHandler + { + /// + public override bool Parse(object value) => ((int)value) == 1; + + /// + public override void SetValue(IDbDataParameter parameter, bool value) + { + parameter.Value = value ? 1 : 0; + } + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs new file mode 100644 index 000000000..81c0d3a80 --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs @@ -0,0 +1,36 @@ +using System; +using System.Data; +using Dapper; + +namespace StackExchange.Profiling +{ + /// + /// Handle Guid to String conversions for Oracle Provider + /// + //public class OracleGuidTypeHandler : SqlMapper.TypeHandler + //{ + // /// + // public override Guid Parse(object value) => new Guid(value.ToString()); + + // /// + // public override void SetValue(IDbDataParameter parameter, Guid value) + // { + // parameter.Value = value.ToString(); + // } + //} + + /// + /// Handle Guid to String conversions for Oracle Provider + /// + public class OracleNullableGuidTypeHandler : SqlMapper.TypeHandler + { + /// + public override Guid? Parse(object value) => value == null ? (Guid?)null : new Guid(value.ToString()); + + /// + public override void SetValue(IDbDataParameter parameter, Guid? value) + { + parameter.Value = value?.ToString(); + } + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs new file mode 100644 index 000000000..af288e204 --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -0,0 +1,474 @@ +using Dapper; +using Oracle.ManagedDataAccess.Client; +using StackExchange.Profiling.Internal; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; + +namespace StackExchange.Profiling.Storage +{ + /// + /// Understands how to store a to a Oracle Database database. + /// + public class OracleStorage : DatabaseStorageBase + { + /// + /// Initializes a new instance of the class with the specified connection string. + /// + /// The connection string to use. + public OracleStorage(string connectionString) : base(connectionString) { /* base call */ } + + /// + /// Initializes a new instance of the class with the specified connection string + /// and the given table names to use. + /// + /// The connection string to use. + /// The table name to use for MiniProfilers. + /// The table name to use for MiniProfiler Timings. + /// The table name to use for MiniProfiler Client Timings. + public OracleStorage(string connectionString, string profilersTable, string timingsTable, string clientTimingsTable) + : base(connectionString, profilersTable, timingsTable, clientTimingsTable) { } + + private string _saveSql; + private string SaveSql => _saveSql ?? (_saveSql = $@" +INSERT INTO {MiniProfilersTable} + (""Id"", RootTimingId, ""Name"", Started, DurationMilliseconds, ""User"", HasUserViewed, MachineName, CustomLinksJson, ClientTimingsRedirectCount) +SELECT :pId, :pRootTimingId, :pName, :pStarted, :pDurationMilliseconds, :pUser, :pHasUserViewed, :pMachineName, :pCustomLinksJson, :pClientTimingsRedirectCount + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilersTable} WHERE ""Id"" = :pId)"); + + private string _saveTimingsSql; + private string SaveTimingsSql => _saveTimingsSql ?? (_saveTimingsSql = $@" +INSERT INTO {MiniProfilerTimingsTable} + (""Id"", MiniProfilerId, ParentTimingId, ""Name"", DurationMilliseconds, StartMilliseconds, IsRoot, ""Depth"", CustomTimingsJson) +SELECT :pId, :pMiniProfilerId, :pParentTimingId, :pName, :pDurationMilliseconds, :pStartMilliseconds, :pIsRoot, :pDepth, :pCustomTimingsJson + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerTimingsTable} WHERE ""Id"" = :pId)"); + + private string _saveClientTimingsSql; + private string SaveClientTimingsSql => _saveClientTimingsSql ?? (_saveClientTimingsSql = $@" +INSERT INTO {MiniProfilerClientTimingsTable} + (""Id"", MiniProfilerId, ""Name"", ""Start"", ""Duration"") +SELECT :pId, :pMiniProfilerId, :pName, :pStart, :pDuration + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerClientTimingsTable} WHERE ""Id"" = :pId)"); + + /// + /// Stores to dbo.MiniProfilers under its ; + /// + /// The to save. + public override void Save(MiniProfiler profiler) + { + using (var conn = GetConnection()) + { + conn.Execute(SaveSql, ToProfilerTiming(profiler)); + + var timings = new List(); + if (profiler.Root != null) + { + profiler.Root.MiniProfilerId = profiler.Id; + FlattenTimings(profiler.Root, timings); + } + + conn.Execute(SaveTimingsSql, timings.Select(timing => ToTiming(timing))); + + if (profiler.ClientTimings?.Timings?.Any() ?? false) + { + // set the profilerId (isn't needed unless we are storing it) + foreach (var timing in profiler.ClientTimings.Timings) + { + timing.MiniProfilerId = profiler.Id; + timing.Id = Guid.NewGuid(); + } + + conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))); + } + } + } + + /// + /// Asynchronously stores to dbo.MiniProfilers under its . + /// + /// The to save. + public override async Task SaveAsync(MiniProfiler profiler) + { + using (var conn = GetConnection()) + { + await conn.ExecuteAsync(SaveSql, ToProfilerTiming(profiler)).ConfigureAwait(false); + + var timings = new List(); + if (profiler.Root != null) + { + profiler.Root.MiniProfilerId = profiler.Id; + FlattenTimings(profiler.Root, timings); + } + + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => ToTiming(timing))).ConfigureAwait(false); + + if (profiler.ClientTimings?.Timings?.Any() ?? false) + { + // set the profilerId (isn't needed unless we are storing it) + foreach (var timing in profiler.ClientTimings.Timings) + { + timing.MiniProfilerId = profiler.Id; + timing.Id = Guid.NewGuid(); + } + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))).ConfigureAwait(false); + } + } + } + + private object ToProfilerTiming(MiniProfiler profiler) => new + { + pId = profiler.Id.ToString(), + pStarted = profiler.Started, + pName = profiler.Name.Truncate(200), + pUser = profiler.User.Truncate(100), + pRootTimingId = profiler.Root?.Id.ToString(), + pDurationMilliseconds = profiler.DurationMilliseconds, + pHasUserViewed = profiler.HasUserViewed ? 1 : 0, + pMachineName = profiler.MachineName.Truncate(100), + pCustomLinksJson = profiler.CustomLinksJson, + pClientTimingsRedirectCount = profiler.ClientTimings?.RedirectCount + }; + + private object ToTiming(Timing timing) => new + { + pId = timing.Id.ToString(), + pMiniProfilerId = timing.MiniProfilerId.ToString(), + pParentTimingId = timing.ParentTimingId.ToString(), + pName = timing.Name.Truncate(200), + pDurationMilliseconds = timing.DurationMilliseconds, + pStartMilliseconds = timing.StartMilliseconds, + pIsRoot = timing.IsRoot ? 1 : 0, + pDepth = timing.Depth, + pCustomTimingsJson = timing.CustomTimingsJson + }; + + private object ToClientTiming(ClientTiming timing) => new + { + pId = timing.Id.ToString(), + pMiniProfilerId = timing.MiniProfilerId.ToString(), + pName = timing.Name.Truncate(200), + pStart = timing.Start, + pDuration = timing.Duration + }; + + private string _loadSqlProfiler; + private string _loadSqlTimings; + private string _loadSqlClientTimings; + + private string LoadSqlProfiler => _loadSqlProfiler ?? (_loadSqlProfiler = $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"); + private string LoadSqlTimings => _loadSqlTimings ?? (_loadSqlTimings = $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"); + private string LoadSqlClientTimings => _loadSqlClientTimings ?? (_loadSqlClientTimings = $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""); + + /// + /// Loads the MiniProfiler identified by 'id' from the database. + /// + /// The profiler ID to load. + /// The loaded . + public override MiniProfiler Load(Guid id) + { + MiniProfiler result; + using (var conn = GetConnection()) + { + try + { + var dresult = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); + result = + + result = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); + var timings = conn.Query(LoadSqlTimings, new { pId = id.ToString() }).AsList(); + var clientTimings = conn.Query(LoadSqlClientTimings, new { pId = id.ToString() }).AsList(); + + ConnectTimings(result, timings, clientTimings); + } + catch (Exception ex) + { + throw; + } + } + + if (result != null) + { + // HACK: stored dates are UTC, but are pulled out as local time + result.Started = new DateTime(result.Started.Ticks, DateTimeKind.Utc); + } + return result; + } + + /// + /// Loads the MiniProfiler identified by 'id' from the database. + /// + /// The profiler ID to load. + /// The loaded . + public override async Task LoadAsync(Guid id) + { + MiniProfiler result; + using (var conn = GetConnection()) + { + result = (await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); + var timings = (await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + var clientTimings = (await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + + ConnectTimings(result, timings, clientTimings); + } + + if (result != null) + { + // HACK: stored dates are UTC, but are pulled out as local time + result.Started = new DateTime(result.Started.Ticks, DateTimeKind.Utc); + } + return result; + } + + /// + /// Sets a particular profiler session so it is considered "unviewed" + /// + /// The user to set this profiler ID as unviewed for. + /// The profiler ID to set unviewed. + public override void SetUnviewed(string user, Guid id) => ToggleViewed(user, id, false); + + /// + /// Asynchronously sets a particular profiler session so it is considered "unviewed" + /// + /// The user to set this profiler ID as unviewed for. + /// The profiler ID to set unviewed. + public override Task SetUnviewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, false); + + /// + /// Sets a particular profiler session to "viewed" + /// + /// The user to set this profiler ID as viewed for. + /// The profiler ID to set viewed. + public override void SetViewed(string user, Guid id) => ToggleViewed(user, id, true); + + /// + /// Asynchronously sets a particular profiler session to "viewed" + /// + /// The user to set this profiler ID as viewed for. + /// The profiler ID to set viewed. + public override Task SetViewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, true); + + private string _toggleViewedSql; + private string ToggleViewedSql => _toggleViewedSql ?? (_toggleViewedSql = $@" +Update {MiniProfilersTable} + Set HasUserViewed = :hasUserVeiwed + Where ""Id"" = :pId + And ""User"" = :user"); + + private void ToggleViewed(string user, Guid id, bool hasUserVeiwed) + { + using (var conn = GetConnection()) + { + conn.Execute(ToggleViewedSql, new { id, user, hasUserVeiwed }); + } + } + + private async Task ToggleViewedAsync(string user, Guid id, bool hasUserVeiwed) + { + using (var conn = GetConnection()) + { + await conn.ExecuteAsync(ToggleViewedSql, new { id, user, hasUserVeiwed }).ConfigureAwait(false); + } + } + + private string _getUnviewedIdsSql; + private string GetUnviewedIdsSql => _getUnviewedIdsSql ?? (_getUnviewedIdsSql = $@" + Select ""Id"" + From {MiniProfilersTable} + Where ""User"" = :pUser + And HasUserViewed = 0 +Order By Started"); + + /// + /// Returns a list of s that haven't been seen by . + /// + /// User identified by the current MiniProfilerOptions.UserProvider + /// The list of keys for the supplied user + public override List GetUnviewedIds(string user) + { + using (var conn = GetConnection()) + { + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); + } + } + + /// + /// Asynchronously returns a list of s that haven't been seen by . + /// + /// User identified by the current MiniProfilerOptions.UserProvider + /// The list of keys for the supplied user + public override async Task> GetUnviewedIdsAsync(string user) + { + using (var conn = GetConnection()) + { + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); + } + } + + /// + /// List the MiniProfiler Ids for the given search criteria. + /// + /// The max number of results + /// Search window start + /// Search window end + /// Result order + /// The list of GUID keys + public override IEnumerable List(int maxResults, DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + using (var conn = GetConnection()) + { + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); + } + } + + /// + /// Asynchronously returns the MiniProfiler Ids for the given search criteria. + /// + /// The max number of results + /// Search window start + /// Search window end + /// Result order + /// The list of GUID keys + public override async Task> ListAsync(int maxResults, DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + using (var conn = GetConnection()) + { + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); + } + } + + private string BuildListQuery(DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + var sb = StringBuilderCache.Get(); + sb.Append(@" +Select ""Id"" + From ").Append(MiniProfilersTable).Append(@" + Where rownum <= {=maxResults}"); + if (finish != null) + { + sb.AppendLine(" And Started < :finish"); + } + if (start != null) + { + sb.AppendLine(" And Started > :start"); + } + sb.Append(" Order By ").Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); + + return sb.ToStringRecycle(); + } + + /// + /// Returns a connection to Oracle Database. + /// + protected override DbConnection GetConnection() => new OracleConnection(ConnectionString); + + /// + /// SQL statements to create the Oracle Database tables. + /// + protected override IEnumerable GetTableCreationScripts() + { + yield return $@" +CREATE TABLE {MiniProfilersTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + RootTimingId VARCHAR2(36 CHAR) NULL, + ""Name"" VARCHAR2(200 CHAR) NULL, + Started DATE NOT NULL, + DurationMilliseconds NUMBER(15,1) NOT NULL, + ""User"" VARCHAR2(100 CHAR) NULL, + HasUserViewed NUMBER(1, 0) NOT NULL, + MachineName VARCHAR2(100 CHAR) NULL, + CustomLinksJson VARCHAR2(4000 CHAR), + ClientTimingsRedirectCount INTEGER NULL +); +ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); + +-- displaying results selects everything based on the main {MiniProfilersTable}.Id column +CREATE UNIQUE INDEX IX_{MiniProfilersTable}_1 ON {MiniProfilersTable} (""Id""); + +-- speeds up a query that is called on every .Stop() +CREATE INDEX IX_{MiniProfilersTable}_2 ON {MiniProfilersTable} (""User"", HasUserViewed); + +CREATE SEQUENCE {MiniProfilersTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilersTable}_IDT + BEFORE INSERT ON {MiniProfilersTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT MiniProfilers_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +/ + +---------------------------------------------------------------------------------------------- + +CREATE TABLE {MiniProfilerTimingsTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + MiniProfilerId VARCHAR2(36 CHAR) NOT NULL, + ParentTimingId VARCHAR2(36 CHAR) NULL, + ""Name"" VARCHAR2(200 CHAR) NOT NULL, + DurationMilliseconds NUMBER(15,3) NOT NULL, + StartMilliseconds NUMBER(15,3) NOT NULL, + IsRoot NUMBER(1, 0) NOT NULL, + ""Depth"" SMALLINT NOT NULL, + CustomTimingsJson VARCHAR2(4000 CHAR) NULL +); +ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); + +CREATE UNIQUE INDEX IX_{MiniProfilerTimingsTable}_1 ON {MiniProfilerTimingsTable} (""Id""); +CREATE INDEX IX_{MiniProfilerTimingsTable}_2 ON {MiniProfilerTimingsTable} (MiniProfilerId); + +CREATE SEQUENCE {MiniProfilerTimingsTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilerTimingsTable}_IDT + BEFORE INSERT ON {MiniProfilerTimingsTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT {MiniProfilerTimingsTable}_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +/ + +---------------------------------------------------------------------------------------------- + +CREATE TABLE {MiniProfilerClientTimingsTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + MiniProfilerId VARCHAR2(36 CHAR) NOT NULL, + ""Name"" VARCHAR2(200 CHAR) NOT NULL, + ""Start"" NUMBER(9, 3) NOT NULL, + ""Duration"" NUMBER(9, 3) NOT NULL +); +ALTER TABLE {MiniProfilerClientTimingsTable} ADD CONSTRAINT PK_{MiniProfilerClientTimingsTable} PRIMARY KEY (""RowId""); + +CREATE UNIQUE INDEX IX_{MiniProfilerClientTimingsTable}_1 on {MiniProfilerClientTimingsTable} (""Id""); +CREATE INDEX IX_{MiniProfilerClientTimingsTable}_2 on {MiniProfilerClientTimingsTable} (MiniProfilerId); + +CREATE SEQUENCE {MiniProfilerClientTimingsTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilerClientTimingsTable}_IDT + BEFORE INSERT ON {MiniProfilerClientTimingsTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT {MiniProfilerClientTimingsTable}_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +"; + } + } +} From 9cd89751acab8272ddff545f9ec84d7672912e87 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 16:31:16 -0600 Subject: [PATCH 02/29] Proveedor Oracle funcionando correctamente --- MiniProfiler.sln | 6 + .../MiniProfiler.Providers.Oracle.csproj | 1 + .../OracleBoolTypeHandler.cs | 20 -- .../OracleDynamicParameters.cs | 243 +++++++++++++ .../OracleGuidTypeHandler.cs | 36 -- .../OracleStorage.cs | 328 +++++++++++++----- 6 files changed, 499 insertions(+), 135 deletions(-) delete mode 100644 src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs delete mode 100644 src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 54aa4f487..44e31ebbb 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -95,6 +95,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ ProjectSection(SolutionItems) = preProject .github\workflows\main.yml = .github\workflows\main.yml EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{A14F7769-55E7-4045-B653-EC4DD44C339C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -210,6 +211,10 @@ Global {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -243,6 +248,7 @@ Global {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {D95A09CD-A291-42D0-AA41-8426090D0476} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A14EA029-60E2-485A-B757-3626511CF2C4} = {5C8ED0C0-7DBB-4660-836E-A760E25160A0} + {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9373F37A-A996-4545-A251-1902C8886E3F} diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 82875e0ba..d6971c6a6 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -10,6 +10,7 @@ + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs deleted file mode 100644 index b2bb189cc..000000000 --- a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Data; -using Dapper; - -namespace StackExchange.Profiling -{ - /// - /// Handle Bool to Integer conversions for Oracle Provider - /// - public class OracleBoolTypeHandler : SqlMapper.TypeHandler - { - /// - public override bool Parse(object value) => ((int)value) == 1; - - /// - public override void SetValue(IDbDataParameter parameter, bool value) - { - parameter.Value = value ? 1 : 0; - } - } -} diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs new file mode 100644 index 000000000..d4206075d --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -0,0 +1,243 @@ +using Dapper; +using Oracle.ManagedDataAccess.Client; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +public class OracleDynamicParameters : SqlMapper.IDynamicParameters +{ + private static Dictionary> paramReaderCache = new Dictionary>(); + + private Dictionary parameters = new Dictionary(); + private List templates; + + private class ParamInfo + { + + public string Name { get; set; } + + public object Value { get; set; } + + public ParameterDirection ParameterDirection { get; set; } + + public OracleDbType? DbType { get; set; } + + public int? Size { get; set; } + + public IDbDataParameter AttachedParam { get; set; } + } + + /// + /// construct a dynamic parameter bag + /// + public OracleDynamicParameters() + { + } + + /// + /// construct a dynamic parameter bag + /// + /// can be an anonymous type or a DynamicParameters bag + public OracleDynamicParameters(object template) + { + AddDynamicParams(template); + } + + /// + /// Append a whole object full of params to the dynamic + /// EG: AddDynamicParams(new {A = 1, B = 2}) // will add property A and B to the dynamic + /// + /// + public void AddDynamicParams( +#if CSHARP30 + object param +#else + dynamic param +#endif + ) + { + var obj = param as object; + if (obj != null) + { + var subDynamic = obj as OracleDynamicParameters; + if (subDynamic == null) + { + var dictionary = obj as IEnumerable>; + if (dictionary == null) + { + templates = templates ?? new List(); + templates.Add(obj); + } + else + { + foreach (var kvp in dictionary) + { +#if CSHARP30 + Add(kvp.Key, kvp.Value, null, null, null); +#else + Add(kvp.Key, kvp.Value); +#endif + } + } + } + else + { + if (subDynamic.parameters != null) + { + foreach (var kvp in subDynamic.parameters) + { + parameters.Add(kvp.Key, kvp.Value); + } + } + + if (subDynamic.templates != null) + { + templates = templates ?? new List(); + foreach (var t in subDynamic.templates) + { + templates.Add(t); + } + } + } + } + } + + /// + /// Add a parameter to this dynamic parameter list + /// + /// + /// + /// + /// + /// + public void Add( +#if CSHARP30 + string name, object value, DbType? dbType, ParameterDirection? direction, int? size +#else + string name, object value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null +#endif + ) + { + parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size }; + } + + private static string Clean(string name) + { + if (!string.IsNullOrEmpty(name)) + { + switch (name[0]) + { + case '@': + case ':': + case '?': + return name.Substring(1); + } + } + return name; + } + + void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity) + { + AddParameters(command, identity); + } + + /// + /// Add all the parameters needed to the command just before it executes + /// + /// The raw command prior to execution + /// Information about the query + protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) + { + if (templates != null) + { + foreach (var template in templates) + { + var newIdent = identity.ForDynamicParameters(template.GetType()); + Action appender; + + lock (paramReaderCache) + { + if (!paramReaderCache.TryGetValue(newIdent, out appender)) + { + appender = SqlMapper.CreateParamInfoGenerator(newIdent, false, false); + paramReaderCache[newIdent] = appender; + } + } + + appender(command, template); + } + } + + foreach (var param in parameters.Values) + { + string name = Clean(param.Name); + bool add = !((OracleCommand)command).Parameters.Contains(name); + OracleParameter p; + if (add) + { + p = ((OracleCommand)command).CreateParameter(); + p.ParameterName = name; + } + else + { + p = ((OracleCommand)command).Parameters[name]; + } + var val = param.Value; + p.Value = val ?? DBNull.Value; + p.Direction = param.ParameterDirection; + var s = val as string; + if (s != null) + { + if (s.Length <= 4000) + { + p.Size = 4000; + } + } + if (param.Size != null) + { + p.Size = param.Size.Value; + } + if (param.DbType != null) + { + p.OracleDbType = param.DbType.Value; + } + if (add) + { + command.Parameters.Add(p); + } + param.AttachedParam = p; + } + } + + /// + /// All the names of the param in the bag, use Get to yank them out + /// + public IEnumerable ParameterNames + { + get + { + return parameters.Select(p => p.Key); + } + } + + /// + /// Get the value of a parameter + /// + /// + /// + /// The value, note DBNull.Value is not returned, instead the value is returned as null + public T Get(string name) + { + var val = parameters[Clean(name)].AttachedParam.Value; + if (val == DBNull.Value) + { + if (default(T) != null) + { + throw new ApplicationException("Attempting to cast a DBNull to a non nullable type!"); + } + return default(T); + } + return (T)val; + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs deleted file mode 100644 index 81c0d3a80..000000000 --- a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Data; -using Dapper; - -namespace StackExchange.Profiling -{ - /// - /// Handle Guid to String conversions for Oracle Provider - /// - //public class OracleGuidTypeHandler : SqlMapper.TypeHandler - //{ - // /// - // public override Guid Parse(object value) => new Guid(value.ToString()); - - // /// - // public override void SetValue(IDbDataParameter parameter, Guid value) - // { - // parameter.Value = value.ToString(); - // } - //} - - /// - /// Handle Guid to String conversions for Oracle Provider - /// - public class OracleNullableGuidTypeHandler : SqlMapper.TypeHandler - { - /// - public override Guid? Parse(object value) => value == null ? (Guid?)null : new Guid(value.ToString()); - - /// - public override void SetValue(IDbDataParameter parameter, Guid? value) - { - parameter.Value = value?.ToString(); - } - } -} diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index af288e204..cce6b20b9 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -1,12 +1,13 @@ -using Dapper; -using Oracle.ManagedDataAccess.Client; -using StackExchange.Profiling.Internal; -using System; +using System; using System.Collections.Generic; using System.Data.Common; +using System.Diagnostics; using System.Linq; -using System.Security.Cryptography; using System.Threading.Tasks; +using Dapper; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; +using StackExchange.Profiling.Internal; namespace StackExchange.Profiling.Storage { @@ -64,7 +65,16 @@ public override void Save(MiniProfiler profiler) { using (var conn = GetConnection()) { - conn.Execute(SaveSql, ToProfilerTiming(profiler)); + conn.Open(); + + try + { + conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } var timings = new List(); if (profiler.Root != null) @@ -73,18 +83,37 @@ public override void Save(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - conn.Execute(SaveTimingsSql, timings.Select(timing => ToTiming(timing))); + try + { + timings.ForEach(timing => + { + var dt = TimingToDynamic(conn, timing); + conn.Execute(SaveTimingsSql, dt); + }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } if (profiler.ClientTimings?.Timings?.Any() ?? false) { - // set the profilerId (isn't needed unless we are storing it) - foreach (var timing in profiler.ClientTimings.Timings) + try { - timing.MiniProfilerId = profiler.Id; - timing.Id = Guid.NewGuid(); + profiler.ClientTimings.Timings.ForEach(timing => + { + // set the profilerId (isn't needed unless we are storing it) + timing.Id = Guid.NewGuid(); + timing.MiniProfilerId = profiler.Id; + + var dct = ClientTimingToDynamic(timing); + conn.Execute(SaveClientTimingsSql, dct); + }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; } - - conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))); } } } @@ -95,9 +124,13 @@ public override void Save(MiniProfiler profiler) /// The to save. public override async Task SaveAsync(MiniProfiler profiler) { + throw new NotImplementedException(); + using (var conn = GetConnection()) { - await conn.ExecuteAsync(SaveSql, ToProfilerTiming(profiler)).ConfigureAwait(false); + conn.Open(); + + await conn.ExecuteAsync(SaveSql, ProfilerToDynamic(conn, profiler)).ConfigureAwait(false); var timings = new List(); if (profiler.Root != null) @@ -106,7 +139,7 @@ public override async Task SaveAsync(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => ToTiming(timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => TimingToDynamic(conn, timing))).ConfigureAwait(false); if (profiler.ClientTimings?.Timings?.Any() ?? false) { @@ -116,47 +149,141 @@ public override async Task SaveAsync(MiniProfiler profiler) timing.MiniProfilerId = profiler.Id; timing.Id = Guid.NewGuid(); } - await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ClientTimingToDynamic(timing))).ConfigureAwait(false); } } } - private object ToProfilerTiming(MiniProfiler profiler) => new + + private OracleDynamicParameters ProfilerToDynamic(DbConnection conn, MiniProfiler profiler) + { + if (profiler == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", profiler.Id.ToString()); + pars.Add("pStarted", profiler.Started); + pars.Add("pName", profiler.Name.Truncate(200)); + pars.Add("pUser", profiler.User.Truncate(100)); + pars.Add("pRootTimingId", profiler.Root?.Id.ToString()); + pars.Add("pDurationMilliseconds", profiler.DurationMilliseconds); + pars.Add("pHasUserViewed", profiler.HasUserViewed ? 1 : 0); + pars.Add("pMachineName", profiler.MachineName.Truncate(100)); + pars.Add("pClientTimingsRedirectCount", profiler.ClientTimings?.RedirectCount); + + if (string.IsNullOrWhiteSpace(profiler.CustomLinksJson)) + { + pars.Add("pCustomLinksJson", null); + } + else + { + byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(profiler.CustomLinksJson); + var clob = new OracleClob((OracleConnection)conn); + clob.Write(newvalue, 0, newvalue.Length); + + pars.Add("pCustomLinksJson", clob); + } + + return pars; + } + + private OracleDynamicParameters TimingToDynamic(DbConnection conn, Timing timing) + { + if (timing == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", timing.Id.ToString()); + pars.Add("pMiniProfilerId", timing.MiniProfilerId.ToString()); + pars.Add("pParentTimingId", timing.ParentTimingId == Guid.Empty ? null : timing.ParentTimingId.ToString()); + pars.Add("pName", timing.Name.Truncate(200)); + pars.Add("pDurationMilliseconds", timing.DurationMilliseconds); + pars.Add("pStartMilliseconds", timing.StartMilliseconds); + pars.Add("pIsRoot", timing.IsRoot ? 1 : 0); + pars.Add("pDepth", timing.Depth); + + if (string.IsNullOrWhiteSpace(timing.CustomTimingsJson)) + { + pars.Add("pCustomTimingsJson", null); + } + else + { + byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(timing.CustomTimingsJson); + var clob = new OracleClob((OracleConnection)conn); + clob.Write(newvalue, 0, newvalue.Length); + + pars.Add("pCustomTimingsJson", clob); + } + + return pars; + } + + private OracleDynamicParameters ClientTimingToDynamic(ClientTiming clientTiming) + { + if (clientTiming == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", clientTiming.Id.ToString()); + pars.Add("pMiniProfilerId", clientTiming.MiniProfilerId.ToString()); + pars.Add("pName", clientTiming.Name.Truncate(200)); + pars.Add("pStart", clientTiming.Start); + pars.Add("pDuration", clientTiming.Duration); + + return pars; + } + + private IEnumerable DynamicListToProfiler(IEnumerable profilers) + { + foreach (var profile in profilers) yield return DynamicToProfiler(profile); + } + +#pragma warning disable CS0618 // Used for serialization only + private MiniProfiler DynamicToProfiler(dynamic profile) => new MiniProfiler { - pId = profiler.Id.ToString(), - pStarted = profiler.Started, - pName = profiler.Name.Truncate(200), - pUser = profiler.User.Truncate(100), - pRootTimingId = profiler.Root?.Id.ToString(), - pDurationMilliseconds = profiler.DurationMilliseconds, - pHasUserViewed = profiler.HasUserViewed ? 1 : 0, - pMachineName = profiler.MachineName.Truncate(100), - pCustomLinksJson = profiler.CustomLinksJson, - pClientTimingsRedirectCount = profiler.ClientTimings?.RedirectCount + Id = new Guid((string)profile.Id), + Started = profile.STARTED, + Name = profile.Name, + User = profile.User, + RootTimingId = profile.ROOTTIMINGID == null ? (Guid?)null : new Guid((string)profile.ROOTTIMINGID), + DurationMilliseconds = Convert.ToDecimal(profile.DURATIONMILLISECONDS ?? 0), + HasUserViewed = profile.HASUSERVIEWED == 1, + MachineName = profile.MACHINENAME, + CustomLinksJson = profile.CUSTOMLINKSJSON, + ClientTimingsRedirectCount = profile.CLIENTTIMINGSREDIRECTCOUNT }; +#pragma warning restore CS0618 // Used for serialization only - private object ToTiming(Timing timing) => new + + private IEnumerable DynamicListToTiming(IEnumerable timings) + { + foreach (var timing in timings) yield return DynamicToTiming(timing); + } + +#pragma warning disable CS0618 // Used for serialization only + private Timing DynamicToTiming(dynamic timing) => new Timing { - pId = timing.Id.ToString(), - pMiniProfilerId = timing.MiniProfilerId.ToString(), - pParentTimingId = timing.ParentTimingId.ToString(), - pName = timing.Name.Truncate(200), - pDurationMilliseconds = timing.DurationMilliseconds, - pStartMilliseconds = timing.StartMilliseconds, - pIsRoot = timing.IsRoot ? 1 : 0, - pDepth = timing.Depth, - pCustomTimingsJson = timing.CustomTimingsJson + Id = new Guid((string)timing.Id), + MiniProfilerId = new Guid((string)timing.MINIPROFILERID), + ParentTimingId = timing.PARENTTIMINGID == null ? Guid.Empty : new Guid((string)timing.PARENTTIMINGID), + Name = timing.Name, + DurationMilliseconds = timing.DURATIONMILLISECONDS == null ? null : Convert.ToDecimal(timing.DURATIONMILLISECONDS), + StartMilliseconds = Convert.ToDecimal(timing.STARTMILLISECONDS), + CustomTimingsJson = timing.CUSTOMTIMINGSJSON }; +#pragma warning restore CS0618 // Used for serialization only + + private IEnumerable DynamicListToClientTiming(IEnumerable clientTimings) + { + foreach (var clientTiming in clientTimings) yield return DynamicToClientTiming(clientTiming); + } - private object ToClientTiming(ClientTiming timing) => new + private ClientTiming DynamicToClientTiming(dynamic clientTiming) => new ClientTiming { - pId = timing.Id.ToString(), - pMiniProfilerId = timing.MiniProfilerId.ToString(), - pName = timing.Name.Truncate(200), - pStart = timing.Start, - pDuration = timing.Duration + Id = new Guid((string)clientTiming.Id), + MiniProfilerId = new Guid((string)clientTiming.MINIPROFILERID), + Name = clientTiming.Name, + Start = Convert.ToDecimal(clientTiming.Start), + Duration = Convert.ToDecimal(clientTiming.Duration) }; - + private string _loadSqlProfiler; private string _loadSqlTimings; private string _loadSqlClientTimings; @@ -164,7 +291,7 @@ public override async Task SaveAsync(MiniProfiler profiler) private string LoadSqlProfiler => _loadSqlProfiler ?? (_loadSqlProfiler = $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"); private string LoadSqlTimings => _loadSqlTimings ?? (_loadSqlTimings = $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"); private string LoadSqlClientTimings => _loadSqlClientTimings ?? (_loadSqlClientTimings = $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""); - + /// /// Loads the MiniProfiler identified by 'id' from the database. /// @@ -177,18 +304,15 @@ public override MiniProfiler Load(Guid id) { try { - var dresult = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); - result = - - result = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); - var timings = conn.Query(LoadSqlTimings, new { pId = id.ToString() }).AsList(); - var clientTimings = conn.Query(LoadSqlClientTimings, new { pId = id.ToString() }).AsList(); - + result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); + var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); + var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); + ConnectTimings(result, timings, clientTimings); } catch (Exception ex) { - throw; + Debug.WriteLine(ex.ToString()); throw; } } @@ -207,12 +331,14 @@ public override MiniProfiler Load(Guid id) /// The loaded . public override async Task LoadAsync(Guid id) { + throw new NotImplementedException(); + MiniProfiler result; using (var conn = GetConnection()) { - result = (await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); - var timings = (await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); - var clientTimings = (await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + result = DynamicListToProfiler(await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); + var timings = DynamicListToTiming(await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + var clientTimings = DynamicListToClientTiming(await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); ConnectTimings(result, timings, clientTimings); } @@ -256,23 +382,37 @@ public override async Task LoadAsync(Guid id) private string _toggleViewedSql; private string ToggleViewedSql => _toggleViewedSql ?? (_toggleViewedSql = $@" Update {MiniProfilersTable} - Set HasUserViewed = :hasUserVeiwed + Set HasUserViewed = :pHasUserViewed Where ""Id"" = :pId - And ""User"" = :user"); + And ""User"" = :pUser"); - private void ToggleViewed(string user, Guid id, bool hasUserVeiwed) + private void ToggleViewed(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - conn.Execute(ToggleViewedSql, new { id, user, hasUserVeiwed }); + try + { + conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } - private async Task ToggleViewedAsync(string user, Guid id, bool hasUserVeiwed) + private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - await conn.ExecuteAsync(ToggleViewedSql, new { id, user, hasUserVeiwed }).ConfigureAwait(false); + try + { + await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -293,8 +433,15 @@ public override List GetUnviewedIds(string user) { using (var conn = GetConnection()) { - var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); - return ids.Select(id => new Guid(id)).AsList(); + try + { + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -307,8 +454,15 @@ public override async Task> GetUnviewedIdsAsync(string user) { using (var conn = GetConnection()) { - var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)).AsList(); + try + { + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -324,9 +478,16 @@ public override IEnumerable List(int maxResults, DateTime? start = null, D { using (var conn = GetConnection()) { - var query = BuildListQuery(start, finish, orderBy); - var ids = conn.Query(query, new { maxResults, start, finish }); - return ids.Select(id => new Guid(id)); + try + { + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -342,19 +503,26 @@ public override async Task> ListAsync(int maxResults, DateTime { using (var conn = GetConnection()) { - var query = BuildListQuery(start, finish, orderBy); - var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)); + try + { + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } private string BuildListQuery(DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) { var sb = StringBuilderCache.Get(); - sb.Append(@" -Select ""Id"" - From ").Append(MiniProfilersTable).Append(@" - Where rownum <= {=maxResults}"); + sb.AppendLine($@"Select ""Id""") + .AppendLine($@" From {MiniProfilersTable}") + .AppendLine(" Where rownum <= {=maxResults}"); + if (finish != null) { sb.AppendLine(" And Started < :finish"); @@ -363,7 +531,9 @@ private string BuildListQuery(DateTime? start = null, DateTime? finish = null, L { sb.AppendLine(" And Started > :start"); } - sb.Append(" Order By ").Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); + + sb.Append(" Order By ") + .Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); return sb.ToStringRecycle(); } @@ -390,7 +560,7 @@ DurationMilliseconds NUMBER(15,1) NOT NULL, ""User"" VARCHAR2(100 CHAR) NULL, HasUserViewed NUMBER(1, 0) NOT NULL, MachineName VARCHAR2(100 CHAR) NULL, - CustomLinksJson VARCHAR2(4000 CHAR), + CustomLinksJson NCLOB NULL, ClientTimingsRedirectCount INTEGER NULL ); ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); @@ -425,7 +595,7 @@ DurationMilliseconds NUMBER(15,3) NOT NULL, StartMilliseconds NUMBER(15,3) NOT NULL, IsRoot NUMBER(1, 0) NOT NULL, ""Depth"" SMALLINT NOT NULL, - CustomTimingsJson VARCHAR2(4000 CHAR) NULL + CustomTimingsJson NCLOB NULL ); ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); From 178065fdde8a57fec68e8c6f9fd6e94067084026 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 17:20:37 -0600 Subject: [PATCH 03/29] =?UTF-8?q?Limpieza=20del=20c=C3=B3digo=20fuente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MiniProfiler.Providers.Oracle.csproj | 2 +- .../OracleStorage.cs | 150 +++++------------- 2 files changed, 38 insertions(+), 114 deletions(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index d6971c6a6..be13e75c1 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -3,7 +3,7 @@ MiniProfiler.Providers.Oracle MiniProfiler.Providers.Oracle MiniProfiler: Profiler storage for Oracle Database - Fernando Paz + Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index cce6b20b9..4a93131a4 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -67,14 +67,7 @@ public override void Save(MiniProfiler profiler) { conn.Open(); - try - { - conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); var timings = new List(); if (profiler.Root != null) @@ -83,37 +76,19 @@ public override void Save(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - try - { - timings.ForEach(timing => - { - var dt = TimingToDynamic(conn, timing); - conn.Execute(SaveTimingsSql, dt); - }); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(SaveTimingsSql, timings.Select(t => TimingToDynamic(conn, t)).AsList()); if (profiler.ClientTimings?.Timings?.Any() ?? false) { - try - { - profiler.ClientTimings.Timings.ForEach(timing => - { - // set the profilerId (isn't needed unless we are storing it) - timing.Id = Guid.NewGuid(); - timing.MiniProfilerId = profiler.Id; - - var dct = ClientTimingToDynamic(timing); - conn.Execute(SaveClientTimingsSql, dct); - }); - } - catch (Exception ex) + profiler.ClientTimings.Timings.ForEach(clientTiming => { - Debug.WriteLine(ex.ToString()); throw; - } + // set the profilerId (isn't needed unless we are storing it) + clientTiming.Id = Guid.NewGuid(); + clientTiming.MiniProfilerId = profiler.Id; + + }); + + conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))); } } } @@ -124,8 +99,6 @@ public override void Save(MiniProfiler profiler) /// The to save. public override async Task SaveAsync(MiniProfiler profiler) { - throw new NotImplementedException(); - using (var conn = GetConnection()) { conn.Open(); @@ -139,17 +112,19 @@ public override async Task SaveAsync(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => TimingToDynamic(conn, timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(t => TimingToDynamic(conn, t)).AsList()).ConfigureAwait(false); if (profiler.ClientTimings?.Timings?.Any() ?? false) { - // set the profilerId (isn't needed unless we are storing it) - foreach (var timing in profiler.ClientTimings.Timings) + profiler.ClientTimings.Timings.ForEach(clientTiming => { - timing.MiniProfilerId = profiler.Id; - timing.Id = Guid.NewGuid(); - } - await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ClientTimingToDynamic(timing))).ConfigureAwait(false); + // set the profilerId (isn't needed unless we are storing it) + clientTiming.Id = Guid.NewGuid(); + clientTiming.MiniProfilerId = profiler.Id; + + }); + + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))).ConfigureAwait(false); } } } @@ -302,18 +277,11 @@ public override MiniProfiler Load(Guid id) MiniProfiler result; using (var conn = GetConnection()) { - try - { - result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); - var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); - var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); + result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); + var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); + var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); - ConnectTimings(result, timings, clientTimings); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + ConnectTimings(result, timings, clientTimings); } if (result != null) @@ -331,8 +299,6 @@ public override MiniProfiler Load(Guid id) /// The loaded . public override async Task LoadAsync(Guid id) { - throw new NotImplementedException(); - MiniProfiler result; using (var conn = GetConnection()) { @@ -390,14 +356,7 @@ private void ToggleViewed(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - try - { - conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); } } @@ -405,14 +364,7 @@ private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - try - { - await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); } } @@ -433,15 +385,8 @@ public override List GetUnviewedIds(string user) { using (var conn = GetConnection()) { - try - { - var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); - return ids.Select(id => new Guid(id)).AsList(); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); } } @@ -454,15 +399,8 @@ public override async Task> GetUnviewedIdsAsync(string user) { using (var conn = GetConnection()) { - try - { - var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)).AsList(); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); } } @@ -478,16 +416,9 @@ public override IEnumerable List(int maxResults, DateTime? start = null, D { using (var conn = GetConnection()) { - try - { - var query = BuildListQuery(start, finish, orderBy); - var ids = conn.Query(query, new { maxResults, start, finish }); - return ids.Select(id => new Guid(id)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); } } @@ -503,16 +434,9 @@ public override async Task> ListAsync(int maxResults, DateTime { using (var conn = GetConnection()) { - try - { - var query = BuildListQuery(start, finish, orderBy); - var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); } } @@ -560,7 +484,7 @@ DurationMilliseconds NUMBER(15,1) NOT NULL, ""User"" VARCHAR2(100 CHAR) NULL, HasUserViewed NUMBER(1, 0) NOT NULL, MachineName VARCHAR2(100 CHAR) NULL, - CustomLinksJson NCLOB NULL, + CustomLinksJson CLOB NULL, ClientTimingsRedirectCount INTEGER NULL ); ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); @@ -595,7 +519,7 @@ DurationMilliseconds NUMBER(15,3) NOT NULL, StartMilliseconds NUMBER(15,3) NOT NULL, IsRoot NUMBER(1, 0) NOT NULL, ""Depth"" SMALLINT NOT NULL, - CustomTimingsJson NCLOB NULL + CustomTimingsJson CLOB NULL ); ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); From 3b65568de8fc26b93ae07e3b5db1b048b570c852 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Mon, 15 Jun 2020 09:51:31 -0600 Subject: [PATCH 04/29] Sample project for OracleStorage Provider --- MiniProfiler.sln | 7 + samples/Samples.Mvc5.EFCore/packages.config | 4 + .../App_Start/BundleConfig.cs | 23 + .../App_Start/FilterConfig.cs | 14 + .../App_Start/RouteConfig.cs | 19 + samples/Samples.Mvc5.Oracle/Content/Site.css | 13 + .../Samples.Mvc5.Oracle/Content/bootstrap.css | 8589 +++++++++++++++++ .../Content/bootstrap.min.css | 7584 +++++++++++++++ .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../Controllers/BaseController.cs | 113 + .../Controllers/HomeController.cs | 457 + .../EFCodeFirst/EFContext.cs | 25 + .../Samples.Mvc5.Oracle/EFCodeFirst/Person.cs | 20 + samples/Samples.Mvc5.Oracle/Global.asax | 1 + samples/Samples.Mvc5.Oracle/Global.asax.cs | 155 + .../Helpers/OracleMiniProfilerStorage.cs | 49 + .../Properties/AssemblyInfo.cs | 35 + .../Samples.Mvc5.Oracle.csproj | 233 + .../Scripts/_references.js | 2 + .../Samples.Mvc5.Oracle/Scripts/bootstrap.js | 2377 +++++ .../Scripts/bootstrap.min.js | 7 + .../Views/Home/About.cshtml | 18 + .../Views/Home/Index.cshtml | 96 + .../Views/Home/ResultsAuthorization.cshtml | 19 + .../Views/Shared/Error.cshtml | 8 + .../Views/Shared/_Layout.cshtml | 66 + samples/Samples.Mvc5.Oracle/Views/Web.config | 39 + .../Views/_ViewStart.cshtml | 3 + samples/Samples.Mvc5.Oracle/Web.Debug.config | 30 + .../Samples.Mvc5.Oracle/Web.Release.config | 31 + samples/Samples.Mvc5.Oracle/Web.config | 83 + samples/Samples.Mvc5.Oracle/favicon.ico | Bin 0 -> 32038 bytes samples/Samples.Mvc5.Oracle/packages.config | 19 + 37 files changed, 20427 insertions(+) create mode 100644 samples/Samples.Mvc5.EFCore/packages.config create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/Content/Site.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/bootstrap.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.svg create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 create mode 100644 samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs create mode 100644 samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs create mode 100644 samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs create mode 100644 samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs create mode 100644 samples/Samples.Mvc5.Oracle/Global.asax create mode 100644 samples/Samples.Mvc5.Oracle/Global.asax.cs create mode 100644 samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs create mode 100644 samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs create mode 100644 samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/_references.js create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Web.config create mode 100644 samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Web.Debug.config create mode 100644 samples/Samples.Mvc5.Oracle/Web.Release.config create mode 100644 samples/Samples.Mvc5.Oracle/Web.config create mode 100644 samples/Samples.Mvc5.Oracle/favicon.ico create mode 100644 samples/Samples.Mvc5.Oracle/packages.config diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 44e31ebbb..9fc6f9cb6 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -97,6 +97,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ EndProjectSection Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{A14F7769-55E7-4045-B653-EC4DD44C339C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{CB089B96-B68A-4283-A0C3-F50C4483270C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -215,6 +217,10 @@ Global {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -249,6 +255,7 @@ Global {D95A09CD-A291-42D0-AA41-8426090D0476} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A14EA029-60E2-485A-B757-3626511CF2C4} = {5C8ED0C0-7DBB-4660-836E-A760E25160A0} {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} + {CB089B96-B68A-4283-A0C3-F50C4483270C} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9373F37A-A996-4545-A251-1902C8886E3F} diff --git a/samples/Samples.Mvc5.EFCore/packages.config b/samples/Samples.Mvc5.EFCore/packages.config new file mode 100644 index 000000000..82ecffe0f --- /dev/null +++ b/samples/Samples.Mvc5.EFCore/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs new file mode 100644 index 000000000..4be793084 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs @@ -0,0 +1,23 @@ +using System.Web.Optimization; + +namespace Samples.Mvc5 +{ + public static class BundleConfig + { + // For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862 + public static void RegisterBundles(BundleCollection bundles) + { + bundles.Add(new ScriptBundle("~/bundles/jquery").Include( + "~/Scripts/jquery-{version}.js")); + + bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( + "~/Scripts/bootstrap.js", + "~/Scripts/respond.js")); + + bundles.Add(new StyleBundle("~/Content/css").Include( + "~/Content/bootstrap.css", + "~/Content/bootstrap-theme.css", + "~/Content/site.css")); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs new file mode 100644 index 000000000..93d59c552 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs @@ -0,0 +1,14 @@ +using System.Web.Mvc; +using StackExchange.Profiling.Mvc; + +namespace Samples.Mvc5 +{ + public static class FilterConfig + { + public static void RegisterGlobalFilters(GlobalFilterCollection filters) + { + filters.Add(new HandleErrorAttribute()); + filters.Add(new ProfilingActionFilter()); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs new file mode 100644 index 000000000..d24b25480 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs @@ -0,0 +1,19 @@ +using System.Web.Mvc; +using System.Web.Routing; + +namespace Samples.Mvc5 +{ + public static class RouteConfig + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + + routes.MapRoute( + name: "Default", + url: "{controller}/{action}/{id}", + defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } + ); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/Content/Site.css b/samples/Samples.Mvc5.Oracle/Content/Site.css new file mode 100644 index 000000000..cd0faeed6 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/Site.css @@ -0,0 +1,13 @@ +.navbar { + margin-bottom: 0; +} + +.glyphicon.spinning { + margin-left: 5px; + font-size: 0.6em; + animation: spin 0.6s infinite linear; +} +@keyframes spin { + from { transform: scale(1) rotate(0deg); } + to { transform: scale(1) rotate(360deg); } +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Content/bootstrap.css b/samples/Samples.Mvc5.Oracle/Content/bootstrap.css new file mode 100644 index 000000000..0d7ca4ff2 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/bootstrap.css @@ -0,0 +1,8589 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); +/*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! + * 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; + -ms-text-size-adjust: 100%; + -webkit-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 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +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 { + border: 0; + padding: 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-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + } + + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #008cba; + text-decoration: none; +} + + a:hover, + a:focus { + color: #008cba; + 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: 0; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + 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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + 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: #999999; + } + +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} + + 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: 10.5px; + margin-bottom: 10.5px; +} + + 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: 39px; +} + +h2, +.h2 { + font-size: 32px; +} + +h3, +.h3 { + font-size: 26px; +} + +h4, +.h4 { + font-size: 19px; +} + +h5, +.h5 { + font-size: 15px; +} + +h6, +.h6 { + font-size: 13px; +} + +p { + margin: 0 0 10.5px; +} + +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 22.5px; + } +} + +small, +.small { + font-size: 80%; +} + +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} + +.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: #999999; +} + +.text-primary { + color: #008cba; +} + +a.text-primary:hover, +a.text-primary:focus { + color: #006687; +} + +.text-success { + color: #43ac6a; +} + +a.text-success:hover, +a.text-success:focus { + color: #358753; +} + +.text-info { + color: #5bc0de; +} + +a.text-info:hover, +a.text-info:focus { + color: #31b0d5; +} + +.text-warning { + color: #e99002; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #b67102; +} + +.text-danger { + color: #f04124; +} + +a.text-danger:hover, +a.text-danger:focus { + color: #d32a0e; +} + +.bg-primary { + color: #fff; + background-color: #008cba; +} + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #006687; +} + +.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: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; +} + + ul ul, + ol ul, + ul ol, + ol ol { + margin-bottom: 0; + } + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} + + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } + +dl { + margin-top: 0; + margin-bottom: 21px; +} + +dt, +dd { + line-height: 1.4; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} + + 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.4; + color: #6f6f6f; + } + + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: '\2014 \00A0'; + } + + .blockquote-reverse, + blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; + } + + .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: 21px; + font-style: normal; + line-height: 1.4; +} + +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: 0; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 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: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} + + 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 { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +.row { + margin-left: -15px; + margin-right: -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-left: 15px; + padding-right: 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: #999999; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} + + .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.4; + vertical-align: top; + border-top: 1px solid #dddddd; + } + + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; + } + + .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 #dddddd; + } + + .table .table { + background-color: #ffffff; + } + +.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 #dddddd; +} + + .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 #dddddd; + } + + .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; + float: none; + display: table-column; +} + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.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 { + overflow-x: auto; + min-height: 0.01%; +} + +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + + .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 { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + 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: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} + +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 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, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + } + + .form-control::-moz-placeholder { + color: #999999; + opacity: 1; + } + + .form-control:-ms-input-placeholder { + color: #999999; + } + + .form-control::-webkit-input-placeholder { + color: #999999; + } + + .form-control::-ms-expand { + border: 0; + background-color: transparent; + } + + .form-control[disabled], + .form-control[readonly], + fieldset[disabled] .form-control { + background-color: #eeeeee; + 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: 39px; + } + + 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: 36px; + } + + 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: 60px; + } +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} + + .radio label, + .checkbox label { + min-height: 21px; + 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-left: -20px; + margin-top: 4px \9; + } + + .radio + .radio, + .checkbox + .checkbox { + margin-top: -5px; + } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + 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 { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} + + .form-control-static.input-lg, + .form-control-static.input-sm { + padding-left: 0; + padding-right: 0; + } + +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-sm { + height: 36px; + line-height: 36px; +} + +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} + +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.form-group-sm select.form-control { + height: 36px; + line-height: 36px; +} + +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} + +.form-group-sm .form-control-static { + height: 36px; + min-height: 33px; + padding: 9px 12px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-lg { + height: 60px; + line-height: 60px; +} + +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} + +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.form-group-lg select.form-control { + height: 60px; + line-height: 60px; +} + +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} + +.form-group-lg .form-control-static { + height: 60px; + min-height: 40px; + padding: 17px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.has-feedback { + position: relative; +} + + .has-feedback .form-control { + padding-right: 48.75px; + } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + 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: 60px; + height: 60px; + line-height: 60px; +} + +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} + +.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: #43ac6a; +} + +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + } + +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} + +.has-success .form-control-feedback { + color: #43ac6a; +} + +.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: #e99002; +} + +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + } + +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} + +.has-warning .form-control-feedback { + color: #e99002; +} + +.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: #f04124; +} + +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + } + +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} + +.has-error .form-control-feedback { + color: #f04124; +} + +.has-feedback label ~ .form-control-feedback { + top: 26px; +} + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} + +@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 { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; +} + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} + +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 17px; + font-size: 19px; + } +} + +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + .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: #333333; + text-decoration: none; + } + + .btn:active, + .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + } + + .btn.disabled, + .btn[disabled], + fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + } + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-default:focus, + .btn-default.focus { + color: #333333; + background-color: #cecece; + border-color: #8c8c8c; + } + + .btn-default:hover { + color: #333333; + background-color: #cecece; + border-color: #adadad; + } + + .btn-default:active, + .btn-default.active, + .open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + 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: #333333; + background-color: #bcbcbc; + 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: #e7e7e7; + border-color: #cccccc; + } + + .btn-default .badge { + color: #e7e7e7; + background-color: #333333; + } + +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} + + .btn-primary:focus, + .btn-primary.focus { + color: #ffffff; + background-color: #006687; + border-color: #001921; + } + + .btn-primary:hover { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .btn-primary:active, + .btn-primary.active, + .open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .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: #ffffff; + background-color: #004b63; + border-color: #001921; + } + + .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: #008cba; + border-color: #0079a1; + } + + .btn-primary .badge { + color: #008cba; + background-color: #ffffff; + } + +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-success:focus, + .btn-success.focus { + color: #ffffff; + background-color: #358753; + border-color: #183e26; + } + + .btn-success:hover { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .btn-success:active, + .btn-success.active, + .open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .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: #ffffff; + background-color: #2b6e44; + border-color: #183e26; + } + + .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: #43ac6a; + border-color: #3c9a5f; + } + + .btn-success .badge { + color: #43ac6a; + background-color: #ffffff; + } + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-info:focus, + .btn-info.focus { + color: #ffffff; + background-color: #31b0d5; + border-color: #1b6d85; + } + + .btn-info:hover { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; + } + + .btn-info:active, + .btn-info.active, + .open > .dropdown-toggle.btn-info { + color: #ffffff; + 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: #ffffff; + 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: #ffffff; + } + +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} + + .btn-warning:focus, + .btn-warning.focus { + color: #ffffff; + background-color: #b67102; + border-color: #513201; + } + + .btn-warning:hover { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .btn-warning:active, + .btn-warning.active, + .open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .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: #ffffff; + background-color: #935b01; + border-color: #513201; + } + + .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: #e99002; + border-color: #d08002; + } + + .btn-warning .badge { + color: #e99002; + background-color: #ffffff; + } + +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-danger:focus, + .btn-danger.focus { + color: #ffffff; + background-color: #d32a0e; + border-color: #731708; + } + + .btn-danger:hover { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .btn-danger:active, + .btn-danger.active, + .open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .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: #ffffff; + background-color: #b1240c; + border-color: #731708; + } + + .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: #f04124; + border-color: #ea2f10; + } + + .btn-danger .badge { + color: #f04124; + background-color: #ffffff; + } + +.btn-link { + color: #008cba; + font-weight: normal; + 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: #008cba; + 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: #999999; + text-decoration: none; + } + +.btn-lg, +.btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.btn-sm, +.btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.btn-xs, +.btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.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 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.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-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + +.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; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + + .dropdown-menu.pull-right { + right: 0; + left: auto; + } + + .dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.2); + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; + } + + .dropdown-menu > li > a:hover, + .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; + } + + .dropdown-menu > .active > a, + .dropdown-menu > .active > a:hover, + .dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; + } + + .dropdown-menu > .disabled > a, + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + color: #999999; + } + + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; + } + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} + +.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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 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-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .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-right-radius: 0; + border-top-left-radius: 0; + } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} + + .btn-group-justified > .btn, + .btn-group-justified > .btn-group { + float: none; + display: table-cell; + 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-left: 0; + padding-right: 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: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} + +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: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} + +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: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} + + .input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; + } + + .input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; + } + + .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-bottom-right-radius: 0; + border-top-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-bottom-left-radius: 0; + border-top-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 { + margin-bottom: 0; + padding-left: 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: #eeeeee; + } + + .nav > li.disabled > a { + color: #999999; + } + + .nav > li.disabled > a:hover, + .nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } + + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; + } + + .nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; + } + + .nav > li > a > img { + max-width: none; + } + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + + .nav-tabs > li { + float: left; + margin-bottom: -1px; + } + + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; + } + + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; + } + + .nav-tabs > li.active > a, + .nav-tabs > li.active > a:hover, + .nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; + } + + .nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; + } + + .nav-tabs.nav-justified > li { + float: none; + } + + .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; +} + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 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: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + + .nav-pills > li > a { + border-radius: 0; + } + + .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: #ffffff; + background-color: #008cba; + } + +.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 { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; + } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; + } + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + + .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-left: 0; + padding-right: 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; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} + + .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; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} + + .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: 6px -15px; +} + + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; + } + +@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: 21px; + } + + .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: 12px; + padding-bottom: 12px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 3px; + margin-bottom: 3px; +} + +@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; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} + + .navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; + } + + .navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; + } + +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 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: #333333; + border-color: #222222; +} + + .navbar-default .navbar-brand { + color: #ffffff; + } + + .navbar-default .navbar-brand:hover, + .navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-default .navbar-text { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a:hover, + .navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .active > a, + .navbar-default .navbar-nav > .active > a:hover, + .navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .disabled > a, + .navbar-default .navbar-nav > .disabled > a:hover, + .navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + + .navbar-default .navbar-toggle { + border-color: transparent; + } + + .navbar-default .navbar-toggle:hover, + .navbar-default .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-default .navbar-collapse, + .navbar-default .navbar-form { + border-color: #222222; + } + + .navbar-default .navbar-nav > .open > a, + .navbar-default .navbar-nav > .open > a:hover, + .navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; + } + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .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: #ffffff; + background-color: #272727; + } + + .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: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #ffffff; +} + + .navbar-default .navbar-link:hover { + color: #ffffff; + } + +.navbar-default .btn-link { + color: #ffffff; +} + + .navbar-default .btn-link:hover, + .navbar-default .btn-link:focus { + color: #ffffff; + } + + .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: #cccccc; + } + +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} + + .navbar-inverse .navbar-brand { + color: #ffffff; + } + + .navbar-inverse .navbar-brand:hover, + .navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-inverse .navbar-text { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a:hover, + .navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .active > a, + .navbar-inverse .navbar-nav > .active > a:hover, + .navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .disabled > a, + .navbar-inverse .navbar-nav > .disabled > a:hover, + .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + + .navbar-inverse .navbar-toggle { + border-color: transparent; + } + + .navbar-inverse .navbar-toggle:hover, + .navbar-inverse .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-inverse .navbar-collapse, + .navbar-inverse .navbar-form { + border-color: #007196; + } + + .navbar-inverse .navbar-nav > .open > a, + .navbar-inverse .navbar-nav > .open > a:hover, + .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; + } + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .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: #ffffff; + background-color: #006687; + } + + .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: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #ffffff; +} + + .navbar-inverse .navbar-link:hover { + color: #ffffff; + } + +.navbar-inverse .btn-link { + color: #ffffff; +} + + .navbar-inverse .btn-link:hover, + .navbar-inverse .btn-link:focus { + color: #ffffff; + } + + .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: #444444; + } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} + + .breadcrumb > li { + display: inline-block; + } + + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; + } + + .breadcrumb > .active { + color: #333333; + } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} + + .pagination > li { + display: inline; + } + + .pagination > li > a, + .pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; + } + + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .pagination > li > a:hover, + .pagination > li > span:hover, + .pagination > li > a:focus, + .pagination > li > span:focus { + z-index: 2; + color: #008cba; + background-color: #eeeeee; + border-color: transparent; + } + + .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: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; + } + + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; + } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} + + .pager li { + display: inline; + } + + .pager li > a, + .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; + } + + .pager li > a:hover, + .pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + + .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: #999999; + background-color: transparent; + cursor: not-allowed; + } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + + .label-default[href]:hover, + .label-default[href]:focus { + background-color: #808080; + } + +.label-primary { + background-color: #008cba; +} + + .label-primary[href]:hover, + .label-primary[href]:focus { + background-color: #006687; + } + +.label-success { + background-color: #43ac6a; +} + + .label-success[href]:hover, + .label-success[href]:focus { + background-color: #358753; + } + +.label-info { + background-color: #5bc0de; +} + + .label-info[href]:hover, + .label-info[href]:focus { + background-color: #31b0d5; + } + +.label-warning { + background-color: #e99002; +} + + .label-warning[href]:hover, + .label-warning[href]:focus { + background-color: #b67102; + } + +.label-danger { + background-color: #f04124; +} + + .label-danger[href]:hover, + .label-danger[href]:focus { + background-color: #d32a0e; + } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #008cba; + 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: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} + +.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: #fafafa; +} + + .jumbotron h1, + .jumbotron .h1 { + color: inherit; + } + + .jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; + } + + .jumbotron > hr { + border-top-color: #e1e1e1; + } + +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 0; + padding-left: 15px; + padding-right: 15px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + + .jumbotron h1, + .jumbotron .h1 { + font-size: 68px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} + + .thumbnail > img, + .thumbnail a > img { + margin-left: auto; + margin-right: auto; + } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #008cba; +} + +.thumbnail .caption { + padding: 9px; + color: #222222; +} + +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} + + .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 { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} + + .alert-success hr { + border-top-color: #358753; + } + + .alert-success .alert-link { + color: #e6e6e6; + } + +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} + + .alert-info hr { + border-top-color: #2aabd2; + } + + .alert-info .alert-link { + color: #e6e6e6; + } + +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} + + .alert-warning hr { + border-top-color: #b67102; + } + + .alert-warning .alert-link { + color: #e6e6e6; + } + +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} + + .alert-danger hr { + border-top-color: #d32a0e; + } + + .alert-danger .alert-link { + color: #e6e6e6; + } + +@-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 { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.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: #43ac6a; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.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, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #e99002; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #f04124; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} + + .media:first-child { + margin-top: 0; + } + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.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 { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + + .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + } + + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + +a.list-group-item, +button.list-group-item { + color: #555555; +} + + a.list-group-item .list-group-item-heading, + button.list-group-item .list-group-item-heading { + color: #333333; + } + + a.list-group-item:hover, + button.list-group-item:hover, + a.list-group-item:focus, + button.list-group-item:focus { + text-decoration: none; + color: #555555; + 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 { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} + + .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: #999999; + } + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} + + .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: #87e1ff; + } + +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #43ac6a; +} + + 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: #43ac6a; + 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: #43ac6a; + border-color: #43ac6a; + } + +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #5bc0de; +} + + 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: #5bc0de; + 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: #5bc0de; + border-color: #5bc0de; + } + +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #e99002; +} + + 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: #e99002; + 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: #e99002; + border-color: #e99002; + } + +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #f04124; +} + + 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: #f04124; + 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: #f04124; + border-color: #f04124; + } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} + + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; + } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + 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 #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} + +.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-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-bottom-left-radius: -1; + } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-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-left: 15px; + padding-right: 15px; + } + + .panel > .table:first-child, + .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-top-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .table:last-child, + .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; + } + + .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-left-radius: -1; + border-bottom-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .panel-body + .table, + .panel > .panel-body + .table-responsive, + .panel > .table + .panel-body, + .panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; + } + + .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 { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 21px; +} + + .panel-group .panel { + margin-bottom: 0; + border-radius: 0; + } + + .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 #dddddd; + } + + .panel-group .panel-footer { + border-top: 0; + } + + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; + } + +.panel-default { + border-color: #dddddd; +} + + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; + } + + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; + } + + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; + } + + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; + } + +.panel-primary { + border-color: #008cba; +} + + .panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; + } + + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; + } + + .panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; + } + + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; + } + +.panel-success { + border-color: #3c9a5f; +} + + .panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; + } + + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; + } + + .panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; + } + + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; + } + +.panel-info { + border-color: #3db5d8; +} + + .panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; + } + + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; + } + + .panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; + } + + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; + } + +.panel-warning { + border-color: #d08002; +} + + .panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; + } + + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; + } + + .panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; + } + + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; + } + +.panel-danger { + border-color: #ea2f10; +} + + .panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; + } + + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; + } + + .panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; + } + + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; + } + +.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; + left: 0; + bottom: 0; + height: 100%; + width: 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: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + + .well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); + } + +.well-lg { + padding: 24px; + border-radius: 0; +} + +.well-sm { + padding: 9px; + border-radius: 0; +} + +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + + .close:hover, + .close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} + + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + } + + .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: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); + } + + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); + } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + + .modal-header .close { + margin-top: -2px; + } + +.modal-title { + margin: 0; + line-height: 1.4; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; + } + + .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, 0.5); + box-shadow: 0 5px 15px rgba(0, 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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} + + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); + } + + .tooltip.top { + margin-top: -3px; + padding: 5px 0; + } + + .tooltip.right { + margin-left: 3px; + padding: 0 5px; + } + + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; + } + + .tooltip.left { + margin-left: -3px; + padding: 0 5px; + } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + background-color: #333333; + border-radius: 0; +} + +.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: #333333; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 15px; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} + + .popover.top { + margin-top: -10px; + } + + .popover.right { + margin-left: 10px; + } + + .popover.bottom { + margin-top: 10px; + } + + .popover.left { + margin-left: -10px; + } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 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 { + border-width: 10px; + content: ""; + } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0, 0, 0, 0.05); + bottom: -11px; +} + + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; + } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0, 0, 0, 0.05); +} + + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; + } + +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0, 0, 0, 0.05); + top: -11px; +} + + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; + } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0, 0, 0, 0.05); +} + + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; + } + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} + + .carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.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 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.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 { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 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; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); +} + + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + } + + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + } + + .carousel-control:hover, + .carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); + } + + .carousel-control .icon-prev, + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + + .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; + line-height: 1; + font-family: serif; + } + + .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%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} + + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + } + + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; + } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 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 { + left: 20%; + right: 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 { + content: " "; + display: table; +} + +.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-left: auto; + margin-right: 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; + } +} + +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} + + .navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; + } + +.navbar-collapse { + border-top-color: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: none; + box-shadow: none; +} + +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} + +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} + + .navbar-form .form-control { + height: auto; + padding: 4px 6px; + } + +.navbar-text { + margin: 12px 15px; + line-height: 21px; +} + +.navbar .dropdown-menu { + border: none; +} + + .navbar .dropdown-menu > li > a, + .navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; + } + +.navbar .dropdown-header { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-default .dropdown-menu { + background-color: #333333; +} + + .navbar-default .dropdown-menu > li > a, + .navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-default .dropdown-menu > li > a:hover, + .navbar-default .dropdown-menu > .active > a, + .navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; + } + +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} + + .navbar-inverse .dropdown-menu > li > a, + .navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-inverse .dropdown-menu > li > a:hover, + .navbar-inverse .dropdown-menu > .active > a, + .navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; + } + +.btn { + padding: 8px 12px; +} + +.btn-lg { + padding: 16px 20px; +} + +.btn-sm { + padding: 8px 12px; +} + +.btn-xs { + padding: 4px 6px; +} + +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} + +.btn-group .dropdown-menu { + border-top-width: 0; +} + +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} + +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; + } + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; + } + +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; + } + +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; + } + +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; + } + +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; + } + +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; + } + +.lead { + color: #6f6f6f; +} + +cite { + font-style: italic; +} + +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} + + blockquote.pull-right { + border-right-width: 1px; + } + + blockquote small { + font-size: 12px; + font-weight: 300; + } + +table { + font-size: 12px; +} + +label, +.control-label, +.help-block, +.checkbox, +.radio { + font-size: 12px; + font-weight: normal; +} + +input[type="radio"], +input[type="checkbox"] { + margin-top: 1px; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} + +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} + +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} + +.nav-pills { + font-weight: 300; +} + +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} + +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} + + .pagination > li > a, + .pagination > li > span { + margin-left: 4px; + color: #999999; + } + + .pagination > .active > a, + .pagination > .active > span { + color: #fff; + } + + .pagination > li > a, + .pagination > li:first-child > a, + .pagination > li:last-child > a, + .pagination > li > span, + .pagination > li:first-child > span, + .pagination > li:last-child > span { + border-radius: 3px; + } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding-left: 22px; + padding-right: 22px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 0 5px; +} + +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} + +.list-group { + font-size: 12px; + font-weight: 300; +} + +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} + + .close:hover, + .close:focus { + opacity: 1; + } + +.alert { + font-size: 12px; + font-weight: 300; +} + + .alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; + } + +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} + +.label-default { + background-color: #e7e7e7; + color: #333333; +} + +.badge { + font-weight: 300; +} + +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} + +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} + + .dropdown-menu > li > a { + padding: 12px 15px; + } + +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} + +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} + +.panel-heading, +.panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-default .close { + color: #222222; +} + +.modal .close { + color: #222222; +} diff --git a/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css b/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css new file mode 100644 index 000000000..2cc43b996 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css @@ -0,0 +1,7584 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); /*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ /*! + * 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; + -ms-text-size-adjust: 100%; + -webkit-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 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, input, optgroup, select, textarea { + color: inherit; + font: inherit; + margin: 0; +} + +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 { + border: 0; + padding: 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-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + } + + input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +@media print { + *, *:before, *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #008cba; + text-decoration: none; +} + + a:hover, a:focus { + color: #008cba; + 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: 0; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + 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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-weight: 300; + 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: #999999; + } + +h1, .h1, h2, .h2, h3, .h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} + + 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: 10.5px; + margin-bottom: 10.5px; +} + + 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: 39px; +} + +h2, .h2 { + font-size: 32px; +} + +h3, .h3 { + font-size: 26px; +} + +h4, .h4 { + font-size: 19px; +} + +h5, .h5 { + font-size: 15px; +} + +h6, .h6 { + font-size: 13px; +} + +p { + margin: 0 0 10.5px; +} + +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} + +@media (min-width:768px) { + .lead { + font-size: 22.5px; + } +} + +small, .small { + font-size: 80%; +} + +mark, .mark { + background-color: #fcf8e3; + padding: .2em; +} + +.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: #999999; +} + +.text-primary { + color: #008cba; +} + +a.text-primary:hover, a.text-primary:focus { + color: #006687; +} + +.text-success { + color: #43ac6a; +} + +a.text-success:hover, a.text-success:focus { + color: #358753; +} + +.text-info { + color: #5bc0de; +} + +a.text-info:hover, a.text-info:focus { + color: #31b0d5; +} + +.text-warning { + color: #e99002; +} + +a.text-warning:hover, a.text-warning:focus { + color: #b67102; +} + +.text-danger { + color: #f04124; +} + +a.text-danger:hover, a.text-danger:focus { + color: #d32a0e; +} + +.bg-primary { + color: #fff; + background-color: #008cba; +} + +a.bg-primary:hover, a.bg-primary:focus { + background-color: #006687; +} + +.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: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} + +ul, ol { + margin-top: 0; + margin-bottom: 10.5px; +} + + ul ul, ol ul, ul ol, ol ol { + margin-bottom: 0; + } + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} + + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } + +dl { + margin-top: 0; + margin-bottom: 21px; +} + +dt, dd { + line-height: 1.4; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width:768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} + + 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.4; + color: #6f6f6f; + } + + blockquote footer:before, blockquote small:before, blockquote .small:before { + content: '\2014 \00A0'; + } + + .blockquote-reverse, blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; + } + + .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: 21px; + font-style: normal; + line-height: 1.4; +} + +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: 0; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.25); + box-shadow: inset 0 -1px 0 rgba(0,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: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} + + 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 { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +@media (min-width:768px) { + .container { + width: 750px; + } +} + +@media (min-width:992px) { + .container { + width: 970px; + } +} + +@media (min-width:1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +.row { + margin-left: -15px; + margin-right: -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-left: 15px; + padding-right: 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: #999999; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} + + .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.4; + vertical-align: top; + border-top: 1px solid #dddddd; + } + + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; + } + + .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 #dddddd; + } + + .table .table { + background-color: #ffffff; + } + +.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 #dddddd; +} + + .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 #dddddd; + } + + .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; + float: none; + display: table-column; +} + +table td[class*="col-"], table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.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 { + overflow-x: auto; + min-height: 0.01%; +} + +@media screen and (max-width:767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + + .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 { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + 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: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} + +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,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,0.075),0 0 8px rgba(102,175,233,0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6); + } + + .form-control::-moz-placeholder { + color: #999999; + opacity: 1; + } + + .form-control:-ms-input-placeholder { + color: #999999; + } + + .form-control::-webkit-input-placeholder { + color: #999999; + } + + .form-control::-ms-expand { + border: 0; + background-color: transparent; + } + + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + 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: 39px; + } + + 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: 36px; + } + + 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: 60px; + } +} + +.form-group { + margin-bottom: 15px; +} + +.radio, .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} + + .radio label, .checkbox label { + min-height: 21px; + 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-left: -20px; + margin-top: 4px; \9 + } + + .radio + .radio, .checkbox + .checkbox { + margin-top: -5px; + } + +.radio-inline, .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + 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 { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} + + .form-control-static.input-lg, .form-control-static.input-sm { + padding-left: 0; + padding-right: 0; + } + +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-sm { + height: 36px; + line-height: 36px; +} + +textarea.input-sm, select[multiple].input-sm { + height: auto; +} + +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.form-group-sm select.form-control { + height: 36px; + line-height: 36px; +} + +.form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { + height: auto; +} + +.form-group-sm .form-control-static { + height: 36px; + min-height: 33px; + padding: 9px 12px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-lg { + height: 60px; + line-height: 60px; +} + +textarea.input-lg, select[multiple].input-lg { + height: auto; +} + +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.form-group-lg select.form-control { + height: 60px; + line-height: 60px; +} + +.form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { + height: auto; +} + +.form-group-lg .form-control-static { + height: 60px; + min-height: 40px; + padding: 17px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.has-feedback { + position: relative; +} + + .has-feedback .form-control { + padding-right: 48.75px; + } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + 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: 60px; + height: 60px; + line-height: 60px; +} + +.input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} + +.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: #43ac6a; +} + +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1; + } + +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} + +.has-success .form-control-feedback { + color: #43ac6a; +} + +.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: #e99002; +} + +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53; + } + +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} + +.has-warning .form-control-feedback { + color: #e99002; +} + +.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: #f04124; +} + +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483; + } + +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} + +.has-error .form-control-feedback { + color: #f04124; +} + +.has-feedback label ~ .form-control-feedback { + top: 26px; +} + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} + +@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 { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} + +.form-horizontal .radio, .form-horizontal .checkbox { + min-height: 30px; +} + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} + +@media (min-width:768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} + +@media (min-width:768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 17px; + font-size: 19px; + } +} + +@media (min-width:768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + .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: #333333; + text-decoration: none; + } + + .btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + } + + .btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + } + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-default:focus, .btn-default.focus { + color: #333333; + background-color: #cecece; + border-color: #8c8c8c; + } + + .btn-default:hover { + color: #333333; + background-color: #cecece; + border-color: #adadad; + } + + .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + 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: #333333; + background-color: #bcbcbc; + 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: #e7e7e7; + border-color: #cccccc; + } + + .btn-default .badge { + color: #e7e7e7; + background-color: #333333; + } + +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} + + .btn-primary:focus, .btn-primary.focus { + color: #ffffff; + background-color: #006687; + border-color: #001921; + } + + .btn-primary:hover { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .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: #ffffff; + background-color: #004b63; + border-color: #001921; + } + + .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: #008cba; + border-color: #0079a1; + } + + .btn-primary .badge { + color: #008cba; + background-color: #ffffff; + } + +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-success:focus, .btn-success.focus { + color: #ffffff; + background-color: #358753; + border-color: #183e26; + } + + .btn-success:hover { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .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: #ffffff; + background-color: #2b6e44; + border-color: #183e26; + } + + .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: #43ac6a; + border-color: #3c9a5f; + } + + .btn-success .badge { + color: #43ac6a; + background-color: #ffffff; + } + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-info:focus, .btn-info.focus { + color: #ffffff; + background-color: #31b0d5; + border-color: #1b6d85; + } + + .btn-info:hover { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; + } + + .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { + color: #ffffff; + 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: #ffffff; + 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: #ffffff; + } + +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} + + .btn-warning:focus, .btn-warning.focus { + color: #ffffff; + background-color: #b67102; + border-color: #513201; + } + + .btn-warning:hover { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .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: #ffffff; + background-color: #935b01; + border-color: #513201; + } + + .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: #e99002; + border-color: #d08002; + } + + .btn-warning .badge { + color: #e99002; + background-color: #ffffff; + } + +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-danger:focus, .btn-danger.focus { + color: #ffffff; + background-color: #d32a0e; + border-color: #731708; + } + + .btn-danger:hover { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .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: #ffffff; + background-color: #b1240c; + border-color: #731708; + } + + .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: #f04124; + border-color: #ea2f10; + } + + .btn-danger .badge { + color: #f04124; + background-color: #ffffff; + } + +.btn-link { + color: #008cba; + font-weight: normal; + 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: #008cba; + 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: #999999; + text-decoration: none; + } + +.btn-lg, .btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.btn-xs, .btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.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 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.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-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + +.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; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0,0,0,0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175); + box-shadow: 0 6px 12px rgba(0,0,0,0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + + .dropdown-menu.pull-right { + right: 0; + left: auto; + } + + .dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0,0,0,0.2); + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; + } + + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; + } + + .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; + } + + .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #999999; + } + + .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + cursor: not-allowed; + } + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} + +.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width:768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} + +.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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + +.btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + box-shadow: inset 0 3px 5px rgba(0,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-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .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-right-radius: 0; + border-top-left-radius: 0; + } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} + + .btn-group-justified > .btn, .btn-group-justified > .btn-group { + float: none; + display: table-cell; + 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-left: 0; + padding-right: 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: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} + +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: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} + +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: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} + + .input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; + } + + .input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; + } + + .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-bottom-right-radius: 0; + border-top-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-bottom-left-radius: 0; + border-top-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 { + margin-bottom: 0; + padding-left: 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: #eeeeee; + } + + .nav > li.disabled > a { + color: #999999; + } + + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } + + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; + } + + .nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; + } + + .nav > li > a > img { + max-width: none; + } + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + + .nav-tabs > li { + float: left; + margin-bottom: -1px; + } + + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; + } + + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; + } + + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; + } + + .nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; + } + + .nav-tabs.nav-justified > li { + float: none; + } + + .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; +} + +.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width:768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 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: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + + .nav-pills > li > a { + border-radius: 0; + } + + .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: #ffffff; + background-color: #008cba; + } + +.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 { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; + } + + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; + } + +@media (min-width:768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} + +@media (min-width:768px) { + .navbar { + border-radius: 0; + } +} + +@media (min-width:768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + -webkit-overflow-scrolling: touch; +} + + .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-left: 0; + padding-right: 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; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} + + .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; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} + + .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: 6px -15px; +} + + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; + } + +@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: 21px; + } + + .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: 12px; + padding-bottom: 12px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1); + margin-top: 3px; + margin-bottom: 3px; +} + +@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; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} + + .navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; + } + + .navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; + } + +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} + +@media (min-width:768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 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: #333333; + border-color: #222222; +} + + .navbar-default .navbar-brand { + color: #ffffff; + } + + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-default .navbar-text { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + + .navbar-default .navbar-toggle { + border-color: transparent; + } + + .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-default .navbar-collapse, .navbar-default .navbar-form { + border-color: #222222; + } + + .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; + } + +@media (max-width:767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .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: #ffffff; + background-color: #272727; + } + + .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: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #ffffff; +} + + .navbar-default .navbar-link:hover { + color: #ffffff; + } + +.navbar-default .btn-link { + color: #ffffff; +} + + .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #ffffff; + } + + .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: #cccccc; + } + +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} + + .navbar-inverse .navbar-brand { + color: #ffffff; + } + + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-inverse .navbar-text { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + + .navbar-inverse .navbar-toggle { + border-color: transparent; + } + + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #007196; + } + + .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; + } + +@media (max-width:767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .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: #ffffff; + background-color: #006687; + } + + .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: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #ffffff; +} + + .navbar-inverse .navbar-link:hover { + color: #ffffff; + } + +.navbar-inverse .btn-link { + color: #ffffff; +} + + .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #ffffff; + } + + .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: #444444; + } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} + + .breadcrumb > li { + display: inline-block; + } + + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; + } + + .breadcrumb > .active { + color: #333333; + } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} + + .pagination > li { + display: inline; + } + + .pagination > li > a, .pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; + } + + .pagination > li:first-child > a, .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + + .pagination > li:last-child > a, .pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { + z-index: 2; + color: #008cba; + background-color: #eeeeee; + border-color: transparent; + } + + .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: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; + } + + .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; + } + +.pagination-lg > li > a, .pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pagination-sm > li > a, .pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; +} + +.pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} + + .pager li { + display: inline; + } + + .pager li > a, .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; + } + + .pager li > a:hover, .pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + + .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: #999999; + background-color: transparent; + cursor: not-allowed; + } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +a.label:hover, a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + + .label-default[href]:hover, .label-default[href]:focus { + background-color: #808080; + } + +.label-primary { + background-color: #008cba; +} + + .label-primary[href]:hover, .label-primary[href]:focus { + background-color: #006687; + } + +.label-success { + background-color: #43ac6a; +} + + .label-success[href]:hover, .label-success[href]:focus { + background-color: #358753; + } + +.label-info { + background-color: #5bc0de; +} + + .label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; + } + +.label-warning { + background-color: #e99002; +} + + .label-warning[href]:hover, .label-warning[href]:focus { + background-color: #b67102; + } + +.label-danger { + background-color: #f04124; +} + + .label-danger[href]:hover, .label-danger[href]:focus { + background-color: #d32a0e; + } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #008cba; + 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: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} + +.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: #fafafa; +} + + .jumbotron h1, .jumbotron .h1 { + color: inherit; + } + + .jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; + } + + .jumbotron > hr { + border-top-color: #e1e1e1; + } + +.container .jumbotron, .container-fluid .jumbotron { + border-radius: 0; + padding-left: 15px; + padding-right: 15px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + + .jumbotron h1, .jumbotron .h1 { + font-size: 68px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -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-left: auto; + margin-right: auto; + } + +a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { + border-color: #008cba; +} + +.thumbnail .caption { + padding: 9px; + color: #222222; +} + +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} + + .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 { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} + + .alert-success hr { + border-top-color: #358753; + } + + .alert-success .alert-link { + color: #e6e6e6; + } + +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} + + .alert-info hr { + border-top-color: #2aabd2; + } + + .alert-info .alert-link { + color: #e6e6e6; + } + +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} + + .alert-warning hr { + border-top-color: #b67102; + } + + .alert-warning .alert-link { + color: #e6e6e6; + } + +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} + + .alert-danger hr { + border-top-color: #d32a0e; + } + + .alert-danger .alert-link { + color: #e6e6e6; + } + +@-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 { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); + box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15); + box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, .progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.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: #43ac6a; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.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,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #e99002; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #f04124; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} + + .media:first-child { + margin-top: 0; + } + +.media, .media-body { + zoom: 1; + overflow: hidden; +} + +.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 { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + + .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + } + + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + +a.list-group-item, button.list-group-item { + color: #555555; +} + + a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { + color: #333333; + } + + a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { + text-decoration: none; + color: #555555; + 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 { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} + + .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: #999999; + } + +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} + + .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: #87e1ff; + } + +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} + +a.list-group-item-success, button.list-group-item-success { + color: #43ac6a; +} + + 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: #43ac6a; + 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: #43ac6a; + border-color: #43ac6a; + } + +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} + +a.list-group-item-info, button.list-group-item-info { + color: #5bc0de; +} + + 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: #5bc0de; + 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: #5bc0de; + border-color: #5bc0de; + } + +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} + +a.list-group-item-warning, button.list-group-item-warning { + color: #e99002; +} + + 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: #e99002; + 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: #e99002; + border-color: #e99002; + } + +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} + +a.list-group-item-danger, button.list-group-item-danger { + color: #f04124; +} + + 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: #f04124; + 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: #f04124; + border-color: #f04124; + } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05); + box-shadow: 0 1px 1px rgba(0,0,0,0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} + + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; + } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + 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 #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} + +.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-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-bottom-left-radius: -1; + } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-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-left: 15px; + padding-right: 15px; + } + + .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-top-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; + } + + .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-left-radius: -1; + border-bottom-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; + } + + .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 { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 21px; +} + + .panel-group .panel { + margin-bottom: 0; + border-radius: 0; + } + + .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 #dddddd; + } + + .panel-group .panel-footer { + border-top: 0; + } + + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; + } + +.panel-default { + border-color: #dddddd; +} + + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; + } + + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; + } + + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; + } + + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; + } + +.panel-primary { + border-color: #008cba; +} + + .panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; + } + + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; + } + + .panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; + } + + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; + } + +.panel-success { + border-color: #3c9a5f; +} + + .panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; + } + + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; + } + + .panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; + } + + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; + } + +.panel-info { + border-color: #3db5d8; +} + + .panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; + } + + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; + } + + .panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; + } + + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; + } + +.panel-warning { + border-color: #d08002; +} + + .panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; + } + + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; + } + + .panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; + } + + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; + } + +.panel-danger { + border-color: #ea2f10; +} + + .panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; + } + + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; + } + + .panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; + } + + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; + } + +.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; + left: 0; + bottom: 0; + height: 100%; + width: 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: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); +} + + .well blockquote { + border-color: #ddd; + border-color: rgba(0,0,0,0.15); + } + +.well-lg { + padding: 24px; + border-radius: 0; +} + +.well-sm { + padding: 9px; + border-radius: 0; +} + +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + + .close:hover, .close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} + + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + } + + .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: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0,0,0,0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5); + box-shadow: 0 3px 9px rgba(0,0,0,0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); + } + + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); + } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + + .modal-header .close { + margin-top: -2px; + } + +.modal-title { + margin: 0; + line-height: 1.4; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; + } + + .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,0.5); + box-shadow: 0 5px 15px rgba(0,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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} + + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); + } + + .tooltip.top { + margin-top: -3px; + padding: 5px 0; + } + + .tooltip.right { + margin-left: 3px; + padding: 0 5px; + } + + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; + } + + .tooltip.left { + margin-left: -3px; + padding: 0 5px; + } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + background-color: #333333; + border-radius: 0; +} + +.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: #333333; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 15px; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2); + box-shadow: 0 5px 10px rgba(0,0,0,0.2); +} + + .popover.top { + margin-top: -10px; + } + + .popover.right { + margin-left: 10px; + } + + .popover.bottom { + margin-top: 10px; + } + + .popover.left { + margin-left: -10px; + } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 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 { + border-width: 10px; + content: ""; + } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0,0,0,0.05); + bottom: -11px; +} + + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; + } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0,0,0,0.05); +} + + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; + } + +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0,0,0,0.05); + top: -11px; +} + + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; + } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0,0,0,0.05); +} + + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; + } + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} + + .carousel-inner > .item { + display: none; + position: relative; + -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 { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 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; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0,0,0,0.6); + background-color: rgba(0,0,0,0); +} + + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001))); + background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + } + + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5))); + background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + } + + .carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); + } + + .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + + .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; + line-height: 1; + font-family: serif; + } + + .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%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} + + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0,0,0,0); + } + + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; + } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0,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 { + left: 20%; + right: 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 { + content: " "; + display: table; +} + +.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-left: auto; + margin-right: 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; + } +} + +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} + + .navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; + } + +.navbar-collapse { + border-top-color: rgba(0,0,0,0.2); + -webkit-box-shadow: none; + box-shadow: none; +} + +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} + +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} + + .navbar-form .form-control { + height: auto; + padding: 4px 6px; + } + +.navbar-text { + margin: 12px 15px; + line-height: 21px; +} + +.navbar .dropdown-menu { + border: none; +} + + .navbar .dropdown-menu > li > a, .navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; + } + +.navbar .dropdown-header { + color: rgba(255,255,255,0.5); +} + +.navbar-default .dropdown-menu { + background-color: #333333; +} + + .navbar-default .dropdown-menu > li > a, .navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-default .dropdown-menu > li > a:hover, .navbar-default .dropdown-menu > .active > a, .navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; + } + +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} + + .navbar-inverse .dropdown-menu > li > a, .navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-inverse .dropdown-menu > li > a:hover, .navbar-inverse .dropdown-menu > .active > a, .navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; + } + +.btn { + padding: 8px 12px; +} + +.btn-lg { + padding: 16px 20px; +} + +.btn-sm { + padding: 8px 12px; +} + +.btn-xs { + padding: 4px 6px; +} + +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} + +.btn-group .dropdown-menu { + border-top-width: 0; +} + +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} + +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; + } + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; + } + +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; + } + +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; + } + +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; + } + +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; + } + +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; + } + +.lead { + color: #6f6f6f; +} + +cite { + font-style: italic; +} + +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} + + blockquote.pull-right { + border-right-width: 1px; + } + + blockquote small { + font-size: 12px; + font-weight: 300; + } + +table { + font-size: 12px; +} + +label, .control-label, .help-block, .checkbox, .radio { + font-size: 12px; + font-weight: normal; +} + +input[type="radio"], input[type="checkbox"] { + margin-top: 1px; +} + +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + border-color: transparent; +} + +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} + +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} + +.nav-pills { + font-weight: 300; +} + +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} + +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} + + .pagination > li > a, .pagination > li > span { + margin-left: 4px; + color: #999999; + } + + .pagination > .active > a, .pagination > .active > span { + color: #fff; + } + + .pagination > li > a, .pagination > li:first-child > a, .pagination > li:last-child > a, .pagination > li > span, .pagination > li:first-child > span, .pagination > li:last-child > span { + border-radius: 3px; + } + +.pagination-lg > li > a, .pagination-lg > li > span { + padding-left: 22px; + padding-right: 22px; +} + +.pagination-sm > li > a, .pagination-sm > li > span { + padding: 0 5px; +} + +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} + +.list-group { + font-size: 12px; + font-weight: 300; +} + +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} + + .close:hover, .close:focus { + opacity: 1; + } + +.alert { + font-size: 12px; + font-weight: 300; +} + + .alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; + } + +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} + +.label-default { + background-color: #e7e7e7; + color: #333333; +} + +.badge { + font-weight: 300; +} + +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} + +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} + + .dropdown-menu > li > a { + padding: 12px 15px; + } + +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} + +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} + +.panel-heading, .panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-default .close { + color: #222222; +} + +.modal .close { + color: #222222; +} diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs b/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs new file mode 100644 index 000000000..518dde96e --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs @@ -0,0 +1,113 @@ +using System; +using System.Data.Common; +using System.Web.Mvc; + +using StackExchange.Profiling; + +namespace Samples.Mvc5.Controllers +{ + /// + /// The base controller. + /// + public abstract class BaseController : Controller + { + /// + /// keep track of the profiler to dispose it. + /// + private IDisposable _resultExecutingToExecuted; + + /// + /// Returns an open connection that will have its queries profiled. + /// + /// The mini profiler. + /// the data connection abstraction. + public static DbConnection GetConnection(MiniProfiler profiler = null) + { + using (profiler.Step("GetOpenConnection")) + { + DbConnection cnn = new Oracle.ManagedDataAccess.Client.OracleConnection(MvcApplication.ConnectionString); + + // to get profiling times, we have to wrap whatever connection we're using in a ProfiledDbConnection + // when MiniProfiler.Current is null, this connection will not record any database timings + if (MiniProfiler.Current != null) + { + cnn = new StackExchange.Profiling.Data.ProfiledDbConnection(cnn, MiniProfiler.Current); + } + + cnn.Open(); + return cnn; + } + } + + /// + /// on action executing. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnActionExecuting(ActionExecutingContext filterContext) + { + var profiler = MiniProfiler.Current; + + using (profiler.Step("OnActionExecuting")) + { + //UpsertRouteHit(filterContext.ActionDescriptor, profiler); + base.OnActionExecuting(filterContext); + } + } + + /// + /// on result executing. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnResultExecuting(ResultExecutingContext filterContext) + { + _resultExecutingToExecuted = MiniProfiler.Current.Step("OnResultExecuting"); + + base.OnResultExecuting(filterContext); + } + + /// + /// on result executed. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnResultExecuted(ResultExecutedContext filterContext) + { + _resultExecutingToExecuted?.Dispose(); + + base.OnResultExecuted(filterContext); + } + + ///// + ///// The UPSERT route hit. + ///// demonstrate using a base controller to intercept actions as they are executed. + ///// + ///// The action description. + ///// The profiler. + //private void UpsertRouteHit(ActionDescriptor actionDesc, MiniProfiler profiler) + //{ + // var routeName = actionDesc.ControllerDescriptor.ControllerName + "/" + actionDesc.ActionName; + + // using (var conn = GetConnection(profiler)) + // { + // var param = new { routeName }; + + // using (profiler.Step("Insert RouteHits")) + // { + // conn.Execute("insert or ignore into RouteHits (RouteName, HitCount) values (@routeName, 0)", param); + // } + // using (profiler.Step("Update RouteHits")) + // { + // // let's put some whitespace in this query to demonstrate formatting + // // i might have broken this with the tabs (jim - 2013-01-08) + // conn.Execute( + // @"update RouteHits + // set HitCount = HitCount + 1 + // where RouteName = @routeName", + // param); + // } + // } + //} + } +} diff --git a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs new file mode 100644 index 000000000..b28e418ac --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs @@ -0,0 +1,457 @@ +using System; +using System.Data.Common; +using System.Linq; +using System.Threading; +using System.Web.Mvc; +using Dapper; +using StackExchange.Profiling; +using StackExchange.Profiling.Data; + +using Samples.Mvc5.EFCodeFirst; +using Samples.Mvc5.Helpers; +using System.Collections.Generic; + +namespace Samples.Mvc5.Controllers +{ + public class HomeController : BaseController + { + /// + /// enable the profiling UI. + /// + /// enable profiling the UI + public ActionResult EnableProfilingUI() + { + MvcApplication.DisableProfilingResults = false; + return Redirect("/"); + } + + /// + /// disable the profiling UI. + /// + /// disable profiling the UI + public ActionResult DisableProfilingUI() + { + MvcApplication.DisableProfilingResults = true; + return Redirect("/"); + } + + /// + /// the default view, home page, top right orientation. + /// + public ActionResult Index() => HomeWithPosition(RenderPosition.Right); + + /// + /// the default view, home page, top left orientation. + /// + public ActionResult TopLeft() => HomeWithPosition(RenderPosition.Left); + + /// + /// the default view, home page, bottom left orientation. + /// + public ActionResult BottomLeft() => HomeWithPosition(RenderPosition.BottomLeft); + + /// + /// the default view, home page, bottom right orientation. + /// + public ActionResult BottomRight() => HomeWithPosition(RenderPosition.BottomRight); + + private ActionResult HomeWithPosition(RenderPosition pos) + { + DefaultActions(); + ViewBag.Orientation = pos; + return View("Index"); + } + + /// + /// Runs the default actions used on all Index views (default, and bottom left/right) + /// + private void DefaultActions() + { + var profiler = MiniProfiler.Current; + + // test out using storage for this one request. Only store in SqlLite, not in httpCache + //profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); + + using (profiler.Step("Set page title")) + { + ViewBag.Title = "Home Page"; + } + + using (profiler.Step("Doing complex stuff")) + { + using (profiler.Step("Step A")) + { + // simulate fetching a url + using (profiler.CustomTiming("http", "GET http://google.com")) + { + Thread.Sleep(10); + } + } + using (profiler.Step("Step B")) + { + // simulate fetching a url + using (profiler.CustomTiming("http", "GET http://stackoverflow.com")) + { + Thread.Sleep(20); + } + + using (profiler.CustomTiming("redis", "SET \"mykey\" 10")) + { + Thread.Sleep(5); + } + } + } + + // now something that loops + for (int i = 0; i < 15; i++) + { + using (profiler.CustomTiming("redis", "SET \"mykey\" 10")) + { + Thread.Sleep(i); + } + } + + // let's also add a custom link to stack overflow! + profiler.AddCustomLink("stack overflow", "http://stackoverflow.com"); + } + + /// + /// about view. + /// + /// the about view (default) + /// this view is not profiled. + public ActionResult About() + { + // prevent this specific route from being profiled + MiniProfiler.Current?.Stop(true); + + return View(); + } + + /// + /// results authorization. + /// + /// The . + public ActionResult ResultsAuthorization() => View(); + + /// + /// fetch the route hits. + /// + /// the view of route hits. + public ActionResult FetchRouteHits() + { + try + { + var profiler = MiniProfiler.Current; + + using (profiler.Step("Insert Route Row")) + using (var conn = GetConnection(profiler)) + { + conn.Execute("INSERT INTO RouteHits (RouteName, HitCount) VALUES (:RouteName, :HitCount)", new {RouteName = Request.Url.AbsoluteUri, HitCount = new Random().Next(100, 400)}); + } + + using (profiler.Step("Do more complex stuff")) + { + Thread.Sleep(new Random().Next(100, 400)); + } + + using (profiler.Step("FetchRouteHits")) + using (var conn = GetConnection(profiler)) + { + var result = conn.Query("select RouteName, HitCount from RouteHits order by RouteName"); + return Json(result, JsonRequestBehavior.AllowGet); + } + } + catch (Exception ex) + { + return Json(new List { ex.Message, ex.StackTrace }, JsonRequestBehavior.AllowGet); + } + } + + public ActionResult MinSaveMs() + { + var profiler = MiniProfiler.Current; + + using (profiler.StepIf("Should show up", 50)) + { + Thread.Sleep(60); + } + using (profiler.StepIf("Should not show up", 50)) + { + Thread.Sleep(10); + } + + using (profiler.StepIf("Show show up with children", 10, true)) + { + Thread.Sleep(5); + using (profiler.Step("Step A")) + { + Thread.Sleep(10); + } + using (profiler.Step("Step B")) + { + Thread.Sleep(10); + } + using (profiler.StepIf("Should not show up", 15)) + { + Thread.Sleep(10); + } + } + + using (profiler.StepIf("Show Not show up with children", 10)) + { + Thread.Sleep(5); + using (profiler.Step("Step A")) + { + Thread.Sleep(10); + } + using (profiler.Step("Step B")) + { + Thread.Sleep(10); + } + } + + using (profiler.CustomTimingIf("redis", "should show up", 5)) + { + Thread.Sleep(10); + } + + using (profiler.CustomTimingIf("redis", "should not show up", 15)) + { + Thread.Sleep(10); + } + return Content("All good"); + } + + /// + /// The EF code first. + /// + /// the entity framework code first view. + public ActionResult EFCodeFirst() + { + int count; + int? newCount = null; + + EFContext context = null; + using (MiniProfiler.Current.Step("EF Stuff")) + { + try + { + using (MiniProfiler.Current.Step("Create Context")) + context = new EFContext(MvcApplication.ConnectionString); + + // this is not correct, as the count from this assignment is never actually used + using (MiniProfiler.Current.Step("First count")) + count = context.People.Count(); + + using (MiniProfiler.Current.Step("Insertion")) + { + var p = new Person { Name = "Fernando" }; + context.People.Add(p); + context.SaveChanges(); + } + + // this count is actually used. + using (MiniProfiler.Current.Step("Second count")) + count = context.People.Count(); + + const string sql = "Select count(*) from \"People\""; + using (MiniProfiler.Current.Step("Get Count from SqlQuery Method - no sql recorded")) + { + newCount = context.Database.SqlQuery(sql).Single(); + } + using (MiniProfiler.Current.Step("Get Count using ProfiledConnection - sql recorded")) + { + using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) + { + conn.Open(); + newCount = conn.Query(sql).Single(); + conn.Close(); + } + } + + return Content(string.Format("EF Code First complete - count: {0}, sqlQuery count {1}", count, newCount)); + } + catch (Exception ex) + { + return Content($"EF Code First Error: {ex}"); + } + finally + { + context?.Dispose(); + } + } + } + + /// + /// duplicated queries. + /// + /// duplicated query demonstration + public ActionResult DuplicatedQueries() + { + using (var conn = GetConnection()) + { + long total = 0; + + for (int i = 0; i < 20; i++) + { + total += conn.Query("select count(1) from RouteHits where HitCount = :i", new { i }).First(); + } + return Content(string.Format("Duplicated Queries (N+1) completed {0}", total)); + } + } + + /// + /// test a massive nesting. + /// + /// the result view of the massive nesting. + public ActionResult MassiveNesting() + { + var i = 0; + using (var conn = GetConnection()) + { + RecursiveMethod(ref i, conn, MiniProfiler.Current); + } + return Content("Massive Nesting completed"); + } + + /// + /// The second massive nesting. + /// + /// the second massive nesting view + public ActionResult MassiveNesting2() + { + for (int i = 0; i < 6; i++) + { + MassiveNesting(); + } + return Content("Massive Nesting 2 completed"); + } + + /// + /// demonstrate a recursive method. + /// + /// recursion depth + /// the connection + /// The profiler. + private void RecursiveMethod(ref int depth, DbConnection connection, MiniProfiler profiler) + { + Thread.Sleep(5); // ensure we show up in the profiler + + if (depth >= 10) return; + + using (profiler.Step("Nested call " + depth)) + { + // run some meaningless queries to illustrate formatting + connection.Query( + @"select * + from MiniProfilers + where DurationMilliseconds >= :duration + or Started > :yesterday", + new + { + name = "Home/Index", + duration = 100.5, + yesterday = DateTime.UtcNow.AddDays(-1) + }); + + connection.Query("select RouteName, HitCount from RouteHits where HitCount < 100000000 or HitCount > 0 order by HitCount, RouteName -- this should hopefully wrap"); + + // massive query to test if max-height is properly removed from
 stylings
+                connection.Query(
+                        @"select *
+                        from   (select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 0 and 9
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 10 and 19
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 20 and 29
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 30 and 39
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 40 and 49
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 50 and 59
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 60 and 69
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 70 and 79
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 80 and 89
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 90 and 99
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount > 100)
+                        order  by RouteName");
+
+                // need a long title to test max-width
+                using (profiler.Step("Incrementing a reference parameter named i"))
+                {
+                    depth++;
+                }
+                RecursiveMethod(ref depth, connection, profiler);
+            }
+        }
+
+        /// 
+        /// route hit.
+        /// 
+        public class RouteHit
+        {
+            /// 
+            /// Gets or sets the route name.
+            /// 
+            public string RouteName { get; set; }
+
+            /// 
+            /// Gets or sets the hit count.
+            /// 
+            public long HitCount { get; set; }
+        }
+
+        /// 
+        /// The parameterized SQL with enumerations.
+        /// 
+        /// The .
+        public ActionResult ParameterizedSqlWithEnums()
+        {
+            using (var conn = GetConnection())
+            {
+                var shouldBeOne = conn.Query("select 1 from dual where :OK = 200", new { System.Net.HttpStatusCode.OK }).Single();
+                return Content("Parameterized SQL with Enums completed: " + shouldBeOne);
+            }
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs
new file mode 100644
index 000000000..c396f6fc4
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs
@@ -0,0 +1,25 @@
+namespace Samples.Mvc5.EFCodeFirst
+{
+    using System.Data.Entity;
+
+    /// 
+    /// The EF context.
+    /// 
+    public class EFContext : DbContext
+    {
+        public EFContext(string connectionString) : base(connectionString)
+        {
+        }
+
+        protected override void OnModelCreating(DbModelBuilder modelBuilder)
+        {
+            modelBuilder.HasDefaultSchema("VH4DB");
+            base.OnModelCreating(modelBuilder);
+        }
+
+        /// 
+        /// Gets or sets the people.
+        /// 
+        public DbSet People { get; set; }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs
new file mode 100644
index 000000000..826ab42ae
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs
@@ -0,0 +1,20 @@
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Samples.Mvc5.EFCodeFirst
+{
+    /// 
+    /// The person.
+    /// 
+    public class Person
+    {
+        /// 
+        /// Gets or sets the id.
+        /// 
+        public int Id { get; set; }
+
+        /// 
+        /// Gets or sets the name.
+        /// 
+        public string Name { get; set; }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Global.asax b/samples/Samples.Mvc5.Oracle/Global.asax
new file mode 100644
index 000000000..71f57b15d
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Global.asax
@@ -0,0 +1 @@
+<%@ Application Codebehind="Global.asax.cs" Inherits="Samples.Mvc5.MvcApplication" Language="C#" %>
diff --git a/samples/Samples.Mvc5.Oracle/Global.asax.cs b/samples/Samples.Mvc5.Oracle/Global.asax.cs
new file mode 100644
index 000000000..574bfd180
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Global.asax.cs
@@ -0,0 +1,155 @@
+using System;
+using System.IO;
+using System.Web;
+using System.Web.Mvc;
+using System.Web.Optimization;
+using System.Web.Routing;
+
+using StackExchange.Profiling;
+using StackExchange.Profiling.EntityFramework6;
+using StackExchange.Profiling.Mvc;
+using StackExchange.Profiling.Storage;
+using Samples.Mvc5.Helpers;
+using Oracle.ManagedDataAccess.Client;
+using System.Configuration;
+
+namespace Samples.Mvc5
+{
+    public class MvcApplication : HttpApplication
+    {
+        /// 
+        /// Gets the connection string.
+        /// 
+        public static string ConnectionString;
+
+        protected void Application_Start()
+        {
+            ConnectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString;
+
+            AreaRegistration.RegisterAllAreas();
+
+            // Note: ProfilingActionFilter is added in the FilterConfig
+            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
+            RouteConfig.RegisterRoutes(RouteTable.Routes);
+            BundleConfig.RegisterBundles(BundleTable.Bundles);
+
+            InitProfilerSettings();
+        }
+
+        /// 
+        /// The application begin request event.
+        /// 
+        protected void Application_BeginRequest()
+        {
+            MiniProfiler profiler = null;
+
+            // might want to decide here (or maybe inside the action) whether you want
+            // to profile this request - for example, using an "IsSystemAdmin" flag against
+            // the user, or similar; this could also all be done in action filters, but this
+            // is simple and practical; just return null for most users. For our test, we'll
+            // profile only for local requests (seems reasonable)
+            if (Request.IsLocal)
+            {
+                profiler = MiniProfiler.StartNew();
+            }
+
+            using (profiler.Step("Application_BeginRequest"))
+            {
+                // you can start profiling your code immediately
+            }
+        }
+
+        /// 
+        /// The application end request.
+        /// 
+        protected void Application_EndRequest()
+        {
+            MiniProfiler.Current?.Stop();
+        }
+
+        /// 
+        /// Gets or sets a value indicating whether disable profiling results.
+        /// 
+        public static bool DisableProfilingResults { get; set; }
+
+        /// 
+        /// Customize aspects of the MiniProfiler.
+        /// 
+        private void InitProfilerSettings()
+        {
+            // A powerful feature of the MiniProfiler is the ability to share links to results with other developers.
+            // by default, however, long-term result caching is done in HttpRuntime.Cache, which is very volatile.
+            // 
+            // Let's rig up serialization of our profiler results to a database, so they survive app restarts.
+            MiniProfiler.Configure(new MiniProfilerOptions
+            {
+                // Sets up the route to use for MiniProfiler resources:
+                // Here, ~/profiler is used for things like /profiler/mini-profiler-includes.js)
+                RouteBasePath = "~/profiler",
+
+                // Setting up a MultiStorage provider. This will store results in the MemoryCacheStorage (normally the default) and in SqlLite as well.
+                //Storage = new MultiStorageProvider(
+                //    new MemoryCacheStorage(new TimeSpan(1, 0, 0)),
+                //    // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control.
+                //    new OracleStorage(ConnectionString)  // OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null)", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null)")
+                //    ),
+
+                // Different RDBMS have different ways of declaring sql parameters - SQLite can understand inline sql parameters just fine.
+                // By default, sql parameters will be displayed.
+                //SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(),
+
+                // These settings are optional and all have defaults, any matching setting specified in .RenderIncludes() will
+                // override the application-wide defaults specified here, for example if you had both:
+                //    PopupRenderPosition = RenderPosition.Right;
+                //    and in the page:
+                //    @MiniProfiler.Current.RenderIncludes(position: RenderPosition.Left)
+                // ...then the position would be on the left on that page, and on the right (the application default) for anywhere that doesn't
+                // specified position in the .RenderIncludes() call.
+                PopupRenderPosition = RenderPosition.Right,  // defaults to left
+                PopupMaxTracesToShow = 10,                   // defaults to 15
+
+                // ResultsAuthorize (optional - open to all by default):
+                // because profiler results can contain sensitive data (e.g. sql queries with parameter values displayed), we
+                // can define a function that will authorize clients to see the JSON or full page results.
+                // we use it on http://stackoverflow.com to check that the request cookies belong to a valid developer.
+                ResultsAuthorize = request =>
+                {
+                    // you may implement this if you need to restrict visibility of profiling on a per request basis
+
+                    // for example, for this specific path, we'll only allow profiling if a query parameter is set
+                    if ("/Home/ResultsAuthorization".Equals(request.Url.LocalPath, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return (request.Url.Query).IndexOf("isauthorized", StringComparison.OrdinalIgnoreCase) >= 0;
+                    }
+
+                    // all other paths can check our global switch
+                    return !DisableProfilingResults;
+                },
+
+                // ResultsListAuthorize (optional - open to all by default)
+                // the list of all sessions in the store is restricted by default, you must return true to allow it
+                ResultsListAuthorize = request =>
+                {
+                    // you may implement this if you need to restrict visibility of profiling lists on a per request basis 
+                    return true; // all requests are legit in our happy world
+                },
+
+                // Stack trace settings
+                StackMaxLength = 256, // default is 120 characters
+
+                // (Optional) You can disable "Connection Open()", "Connection Close()" (and async variant) tracking.
+                // (defaults to true, and connection opening/closing is tracked)
+                TrackConnectionOpenClose = true
+        }
+            // Optional settings to control the stack trace output in the details pane
+            .ExcludeType("SessionFactory")  // Ignore any class with the name of SessionFactory)
+            .ExcludeAssembly("NHibernate")  // Ignore any assembly named NHibernate
+            .ExcludeMethod("Flush")         // Ignore any method with the name of Flush
+            .AddViewProfiling()              // Add MVC view profiling
+            );
+
+            MiniProfilerEF6.Initialize();
+            MiniProfiler.DefaultOptions.Storage = new OracleStorage(ConnectionString);
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs
new file mode 100644
index 000000000..7cb243c37
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Dapper;
+using Oracle.ManagedDataAccess.Client;
+using StackExchange.Profiling.Storage;
+
+namespace Samples.Mvc5.Helpers
+{
+    /// 
+    /// The SQLITE mini profiler storage.
+    /// 
+    public class OracleMiniProfilerStorage : OracleStorage
+    {
+        /// 
+        /// Initializes a new instance of the  class.
+        /// 
+        /// The connection string.
+        public OracleMiniProfilerStorage(string connectionString) : base(connectionString)
+        {
+        }
+
+        /// 
+        /// Get the Connection.
+        /// 
+        /// The Abstracted Connection
+        protected override System.Data.Common.DbConnection GetConnection() =>
+            new OracleConnection(ConnectionString);
+
+        /// 
+        /// Used for testing purposes - destroys and recreates the SQLITE file with needed tables.
+        /// 
+        /// The Extra Tables To Create.
+        public OracleMiniProfilerStorage RecreateDatabase(params string[] extraTablesToCreate)
+        {
+            using (var cnn = GetConnection())
+            {
+                // We need some tiny mods to allow SQLite support 
+                foreach (var sql in TableCreationScripts.Union(extraTablesToCreate))
+                {
+                    cnn.Execute(sql);
+                }
+            }
+            return this;
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..61db7b69c
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+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: AssemblyTitle("WebApplication1")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("WebApplication1")]
+[assembly: AssemblyCopyright("Copyright ©  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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("cb089b96-b68a-4283-a0c3-f50c4483270c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj
new file mode 100644
index 000000000..3c7f85c6d
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj
@@ -0,0 +1,233 @@
+
+  
+  
+  
+  
+  
+    Debug
+    AnyCPU
+    
+    
+    2.0
+    {CB089B96-B68A-4283-A0C3-F50C4483270C}
+    {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+    Library
+    Properties
+    Samples.Mvc5
+    Samples.Mvc5
+    v4.6.2
+    true
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    true
+    full
+    false
+    bin\
+    DEBUG;TRACE
+    prompt
+    4
+  
+  
+    true
+    pdbonly
+    true
+    bin\
+    TRACE
+    prompt
+    4
+  
+  
+    
+      ..\..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll
+    
+    
+      ..\..\packages\Dapper.StrongName.1.50.2\lib\net451\Dapper.StrongName.dll
+    
+    
+      ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll
+    
+    
+      ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.SqlServer.dll
+    
+    
+      ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
+    
+    
+    
+      ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
+    
+    
+      ..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll
+    
+    
+      ..\..\packages\Oracle.ManagedDataAccess.Core.2.19.70\lib\netstandard2.0\Oracle.ManagedDataAccess.dll
+    
+    
+      ..\..\packages\Oracle.ManagedDataAccess.EntityFramework.12.2.1100\lib\net45\Oracle.ManagedDataAccess.EntityFramework.dll
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      ..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+      Global.asax
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      Web.config
+    
+    
+      Web.config
+    
+  
+  
+    
+  
+  
+    
+      {4dfa7ad2-fcae-44db-af5c-f26aba93dbdc}
+      MiniProfiler.EF6
+    
+    
+      {074bcd84-3e44-4140-9918-c09fcbeec09f}
+      MiniProfiler.Mvc5
+    
+    
+      {a14f7769-55e7-4045-b653-ec4dd44c339c}
+      MiniProfiler.Providers.Oracle
+    
+    
+      {ba40a569-bee2-4e39-80a7-763bc15a9077}
+      MiniProfiler.Shared
+    
+    
+      {386222bd-6b6e-480f-a342-8de1ab516e2c}
+      MiniProfiler
+    
+  
+  
+    10.0
+    $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+  
+  
+  
+  
+  
+    
+      
+        
+          True
+          True
+          16761
+          /
+          http://localhost:16761/
+          True
+          http://localhost:16761/
+          False
+          False
+          
+          
+          False
+        
+      
+    
+  
+  
+    
+      This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+    
+    
+    
+    
+    
+  
+  
+  
+
\ No newline at end of file
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/_references.js b/samples/Samples.Mvc5.Oracle/Scripts/_references.js
new file mode 100644
index 000000000..f7a693e4c
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/_references.js
@@ -0,0 +1,2 @@
+/// 
+/// 
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js
new file mode 100644
index 000000000..8a2e99a53
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js
@@ -0,0 +1,2377 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.7
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.7
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.7'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector === '#' ? [] : selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.7
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.7'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d).prop(d, true)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d).prop(d, false)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target).closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
+        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
+        e.preventDefault()
+        // The target component still receive the focus
+        if ($btn.is('input,button')) $btn.trigger('focus')
+        else $btn.find('input:visible,button:visible').first().trigger('focus')
+      }
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.7
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.7'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.7
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+/* jshint latedef: false */
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.7'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.7
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.7'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger($.Event('shown.bs.dropdown', relatedTarget))
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.7
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options             = options
+    this.$body               = $(document.body)
+    this.$element            = $(element)
+    this.$dialog             = this.$element.find('.modal-dialog')
+    this.$backdrop           = null
+    this.isShown             = null
+    this.originalBodyPad     = null
+    this.scrollbarWidth      = 0
+    this.ignoreBackdropClick = false
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.7'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (document !== e.target &&
+            this.$element[0] !== e.target &&
+            !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.7
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.7'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (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!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
+        that.$element
+          .removeAttr('aria-describedby')
+          .trigger('hidden.bs.' + that.type)
+      }
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var isSvg = window.SVGElement && el instanceof window.SVGElement
+    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
+    // See https://github.com/twbs/bootstrap/issues/20280
+    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+      that.$element = null
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.7
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.7'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: ''
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.7
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.7'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.7
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.3.7'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.7
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.7'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js
new file mode 100644
index 000000000..9bcd2fcca
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)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/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml new file mode 100644 index 000000000..594a59cd0 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml @@ -0,0 +1,18 @@ +@{ + ViewBag.Title = "About Us"; +} +
+ +

+ We explictly stopped profiling on this route: +

public ActionResult About()
+{
+    // prevent this specific route from being profiled
+    MiniProfiler.Stop(discardResults: true);
+
+    return View();
+}
+

+
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml new file mode 100644 index 000000000..0e683071a --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml @@ -0,0 +1,96 @@ +@using StackExchange.Profiling +@{ + using (MiniProfiler.Current.Step("Some complex thinking")) + { + System.Threading.Thread.Sleep(25); + } +} +@section head +{ + +} + +
+ +
+
+
+
Click the links below to see it profile ajax requests
+ +
+
+
You can also...
+
+ +
+
+
+
+
+
Results from ajax requests
+
+
+
+
+ +
+ Some content way down the page - notice how the profiler button is fixed in the upper left corner. +
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml new file mode 100644 index 000000000..7c5ccdc9c --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml @@ -0,0 +1,19 @@ +@{ + ViewBag.Title = "Results Authorization"; +} + +
+ +

+ This route will only display timings when we have ?isAuthorized=1 on the query string. +

+

+ It shows how you can use MiniProfilerWebSettings.Results_Authorize to ensure that certain request conditions are met + before serving sensitive profiler results. +

+

+ We use it on Stack Overflow to ensure that the current request's cookies map to a developer. +

+
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml b/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml new file mode 100644 index 000000000..9d8983aee --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml @@ -0,0 +1,8 @@ +@model System.Web.Mvc.HandleErrorInfo +@{ + ViewBag.Title = "Error"; +} + +

+ Sorry, an error occurred while processing your request. +

\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml b/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml new file mode 100644 index 000000000..0c814dc43 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml @@ -0,0 +1,66 @@ +@using StackExchange.Profiling; +@using StackExchange.Profiling.Mvc +@{ + // allows us to test out starting a profiler hidden - use ALT + P to toggle display of results + var startHidden = !string.IsNullOrEmpty(Request.QueryString["startHidden"]); +} + + + + @this.InitClientTimings() + @this.TimeScript("jQuery 3.1.1", @) + @using (MiniProfiler.Current.Step(" rendering")) + { + @ViewBag.Title - MVC MiniProfiler Demo + @(this.TimeScript("Our CSS", @Styles.Render("~/Content/css"))); + @Scripts.Render("~/bundles/bootstrap") + @RenderSection("head", required: false) + } + + +
+ +
+
+ @RenderBody() +
+ @* renders our UI's css and javascript - best put it in the bottom so it does not effect perf *@ + @if (ViewBag.Orientation != null) + { + var position = (RenderPosition)ViewBag.Orientation; + @MiniProfiler.Current.RenderIncludes(position: position, showTrivial: false, showTimeWithChildren: false, startHidden: startHidden) + } + else + { + @MiniProfiler.Current.RenderIncludes(position: RenderPosition.Right, showTrivial: false, showTimeWithChildren: false, startHidden: startHidden) + } + + diff --git a/samples/Samples.Mvc5.Oracle/Views/Web.config b/samples/Samples.Mvc5.Oracle/Views/Web.config new file mode 100644 index 000000000..9d18deae0 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Web.config @@ -0,0 +1,39 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml b/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml new file mode 100644 index 000000000..efda124b1 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Web.Debug.config b/samples/Samples.Mvc5.Oracle/Web.Debug.config new file mode 100644 index 000000000..d7712aaf1 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Web.Release.config b/samples/Samples.Mvc5.Oracle/Web.Release.config new file mode 100644 index 000000000..28a4d5fcc --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Web.config b/samples/Samples.Mvc5.Oracle/Web.config new file mode 100644 index 000000000..3e3a24f41 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.config @@ -0,0 +1,83 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/favicon.ico b/samples/Samples.Mvc5.Oracle/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3a799985c43bc7309d701b2cad129023377dc71 GIT binary patch literal 32038 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 + + + + + + + + + + + + + + + + + + \ No newline at end of file From 71e5a3dd9fb0dc4f7714fa10ca443d00681c1178 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 08:52:54 -0600 Subject: [PATCH 05/29] Tested for version 4.1.0, with Oracle Managed DataAccess 12.2.1100. Nuget package created from here. --- .../MiniProfiler.Providers.Oracle.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index be13e75c1..2258a2bca 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -6,11 +6,12 @@ Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 + true - + \ No newline at end of file From c378b82af68a1f1556e779a39962cc1823e02adc Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 10:55:36 -0600 Subject: [PATCH 06/29] Upgrade to Oracle Managed DataAccess v.2.19.70 --- .../MiniProfiler.Providers.Oracle.csproj | 2 +- src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 2258a2bca..2ae66dea4 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs index d4206075d..dd520cf4a 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -5,6 +5,9 @@ using System.Data; using System.Linq; +/// +/// Handle Parameters for Oracle Storage Provider +/// public class OracleDynamicParameters : SqlMapper.IDynamicParameters { private static Dictionary> paramReaderCache = new Dictionary>(); From 79558f23c3817929c8c430f71f7cd23db043a7f1 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 10:56:50 -0600 Subject: [PATCH 07/29] Standarize sample MVC 5 application --- MiniProfiler.sln | 27 ++- .../Controllers/HomeController.cs | 19 +- .../EFCodeFirst/EFContext.cs | 4 +- .../Samples.Mvc5.Oracle/EFCodeFirst/Person.cs | 4 +- samples/Samples.Mvc5.Oracle/Global.asax.cs | 16 +- .../Helpers/OracleMiniProfilerStorage.cs | 2 +- .../Properties/AssemblyInfo.cs | 35 --- .../Properties/launchSettings.json | 27 +++ .../Samples.Mvc5.Oracle.csproj | 229 +++--------------- samples/Samples.Mvc5.Oracle/Web.config | 8 +- samples/Samples.Mvc5.Oracle/packages.config | 19 -- 11 files changed, 103 insertions(+), 287 deletions(-) delete mode 100644 samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs create mode 100644 samples/Samples.Mvc5.Oracle/Properties/launchSettings.json delete mode 100644 samples/Samples.Mvc5.Oracle/packages.config diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 9fc6f9cb6..6329ace63 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -95,9 +95,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ ProjectSection(SolutionItems) = preProject .github\workflows\main.yml = .github\workflows\main.yml EndProjectSection -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{A14F7769-55E7-4045-B653-EC4DD44C339C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{CB089B96-B68A-4283-A0C3-F50C4483270C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{7D4F8D50-57F1-4368-A77F-DD20B617ADA0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -213,14 +214,14 @@ Global {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.Build.0 = Release|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.Build.0 = Release|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -254,12 +255,12 @@ Global {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {D95A09CD-A291-42D0-AA41-8426090D0476} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A14EA029-60E2-485A-B757-3626511CF2C4} = {5C8ED0C0-7DBB-4660-836E-A760E25160A0} - {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} - {CB089B96-B68A-4283-A0C3-F50C4483270C} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9373F37A-A996-4545-A251-1902C8886E3F} LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 + SolutionGuid = {9373F37A-A996-4545-A251-1902C8886E3F} EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = StackExchange.Profiling.vsmdi diff --git a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs index b28e418ac..8bf3134c8 100644 --- a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs +++ b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs @@ -69,8 +69,8 @@ private void DefaultActions() { var profiler = MiniProfiler.Current; - // test out using storage for this one request. Only store in SqlLite, not in httpCache - //profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); + // test out using storage for this one request. Only store in Oracle Database, not in httpCache + profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); using (profiler.Step("Set page title")) { @@ -246,7 +246,7 @@ public ActionResult EFCodeFirst() using (MiniProfiler.Current.Step("Insertion")) { - var p = new Person { Name = "Fernando" }; + var p = new Person { Name = "sam" }; context.People.Add(p); context.SaveChanges(); } @@ -261,13 +261,12 @@ public ActionResult EFCodeFirst() newCount = context.Database.SqlQuery(sql).Single(); } using (MiniProfiler.Current.Step("Get Count using ProfiledConnection - sql recorded")) + + using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) { - using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) - { - conn.Open(); - newCount = conn.Query(sql).Single(); - conn.Close(); - } + conn.Open(); + newCount = conn.Query(sql).Single(); + conn.Close(); } return Content(string.Format("EF Code First complete - count: {0}, sqlQuery count {1}", count, newCount)); @@ -287,6 +286,7 @@ public ActionResult EFCodeFirst() /// duplicated queries. /// /// duplicated query demonstration + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0063:Use simple 'using' statement", Justification = "This isn't C# 8, silly IDE.")] public ActionResult DuplicatedQueries() { using (var conn = GetConnection()) @@ -445,6 +445,7 @@ public class RouteHit /// The parameterized SQL with enumerations. /// /// The . + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0063:Use simple 'using' statement", Justification = "This isn't C# 8, silly IDE.")] public ActionResult ParameterizedSqlWithEnums() { using (var conn = GetConnection()) diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs index c396f6fc4..4dbf41bb6 100644 --- a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs +++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs @@ -13,7 +13,9 @@ public EFContext(string connectionString) : base(connectionString) protected override void OnModelCreating(DbModelBuilder modelBuilder) { - modelBuilder.HasDefaultSchema("VH4DB"); + // Set default esquema for Oracle User + modelBuilder.HasDefaultSchema("USERID"); + base.OnModelCreating(modelBuilder); } diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs index 826ab42ae..fc626241f 100644 --- a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs +++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs @@ -1,6 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - -namespace Samples.Mvc5.EFCodeFirst +namespace Samples.Mvc5.EFCodeFirst { /// /// The person. diff --git a/samples/Samples.Mvc5.Oracle/Global.asax.cs b/samples/Samples.Mvc5.Oracle/Global.asax.cs index 574bfd180..3c202539e 100644 --- a/samples/Samples.Mvc5.Oracle/Global.asax.cs +++ b/samples/Samples.Mvc5.Oracle/Global.asax.cs @@ -88,13 +88,13 @@ private void InitProfilerSettings() RouteBasePath = "~/profiler", // Setting up a MultiStorage provider. This will store results in the MemoryCacheStorage (normally the default) and in SqlLite as well. - //Storage = new MultiStorageProvider( - // new MemoryCacheStorage(new TimeSpan(1, 0, 0)), - // // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control. - // new OracleStorage(ConnectionString) // OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null)", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null)") - // ), + Storage = new MultiStorageProvider( + new MemoryCacheStorage(new TimeSpan(1, 0, 0)), + // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control. + new OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null);", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null);") + ), - // Different RDBMS have different ways of declaring sql parameters - SQLite can understand inline sql parameters just fine. + // Different RDBMS have different ways of declaring sql parameters // By default, sql parameters will be displayed. //SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(), @@ -107,6 +107,7 @@ private void InitProfilerSettings() // specified position in the .RenderIncludes() call. PopupRenderPosition = RenderPosition.Right, // defaults to left PopupMaxTracesToShow = 10, // defaults to 15 + ColorScheme = ColorScheme.Auto, // defaults to light // ResultsAuthorize (optional - open to all by default): // because profiler results can contain sensitive data (e.g. sql queries with parameter values displayed), we @@ -128,7 +129,7 @@ private void InitProfilerSettings() // ResultsListAuthorize (optional - open to all by default) // the list of all sessions in the store is restricted by default, you must return true to allow it - ResultsListAuthorize = request => + ResultsListAuthorize = _ => { // you may implement this if you need to restrict visibility of profiling lists on a per request basis return true; // all requests are legit in our happy world @@ -149,7 +150,6 @@ private void InitProfilerSettings() ); MiniProfilerEF6.Initialize(); - MiniProfiler.DefaultOptions.Storage = new OracleStorage(ConnectionString); } } } diff --git a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs index 7cb243c37..fa6801548 100644 --- a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs +++ b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs @@ -30,7 +30,7 @@ protected override System.Data.Common.DbConnection GetConnection() => new OracleConnection(ConnectionString); /// - /// Used for testing purposes - destroys and recreates the SQLITE file with needed tables. + /// Used for testing purposes - create tables in Oracle database /// /// The Extra Tables To Create. public OracleMiniProfilerStorage RecreateDatabase(params string[] extraTablesToCreate) diff --git a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs deleted file mode 100644 index 61db7b69c..000000000 --- a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("WebApplication1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("WebApplication1")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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("cb089b96-b68a-4283-a0c3-f50c4483270c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json new file mode 100644 index 000000000..60851c9e6 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:53085/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Samples.Mvc5": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj index 3c7f85c6d..04f8062d5 100644 --- a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj +++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj @@ -1,233 +1,80 @@ - - - - - + Debug AnyCPU - - - 2.0 - {CB089B96-B68A-4283-A0C3-F50C4483270C} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library - Properties Samples.Mvc5 Samples.Mvc5 - v4.6.2 + net462 true - - - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - true - pdbonly - true bin\ - TRACE - prompt - 4 + false + + if not exist "roslyn" md "roslyn" + xcopy /s /y /q "$(CscToolPath)\*.*" "roslyn" + - - ..\..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll - - - ..\..\packages\Dapper.StrongName.1.50.2\lib\net451\Dapper.StrongName.dll - - - ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll - - - ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.SqlServer.dll - - - ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - + + + + + + + + + + - - ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - - - ..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\Oracle.ManagedDataAccess.Core.2.19.70\lib\netstandard2.0\Oracle.ManagedDataAccess.dll - - - ..\..\packages\Oracle.ManagedDataAccess.EntityFramework.12.2.1100\lib\net45\Oracle.ManagedDataAccess.EntityFramework.dll - - - - - + + + - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll - - - ..\..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll - - - ..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll - - - ..\..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll - + + + - - - + + + + + + - - - ..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll - + - - - - + + - - - - - - - - - - - - - - - - Global.asax - - - - - - - - - - - - - - - - - - Web.config - - - Web.config - - - - - - {4dfa7ad2-fcae-44db-af5c-f26aba93dbdc} - MiniProfiler.EF6 - - - {074bcd84-3e44-4140-9918-c09fcbeec09f} - MiniProfiler.Mvc5 - - - {a14f7769-55e7-4045-b653-ec4dd44c339c} - MiniProfiler.Providers.Oracle - - - {ba40a569-bee2-4e39-80a7-763bc15a9077} - MiniProfiler.Shared - - - {386222bd-6b6e-480f-a342-8de1ab516e2c} - MiniProfiler - + - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + - - - True True - 16761 + 51485 / - http://localhost:16761/ - True - http://localhost:16761/ + http://localhost:51485/ False False - - + False - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Web.config b/samples/Samples.Mvc5.Oracle/Web.config index 3e3a24f41..931cffdc6 100644 --- a/samples/Samples.Mvc5.Oracle/Web.config +++ b/samples/Samples.Mvc5.Oracle/Web.config @@ -1,7 +1,6 @@  -
@@ -12,7 +11,7 @@ - + @@ -56,10 +55,6 @@ - - - - @@ -77,7 +72,6 @@ - \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/packages.config b/samples/Samples.Mvc5.Oracle/packages.config deleted file mode 100644 index 477445a8a..000000000 --- a/samples/Samples.Mvc5.Oracle/packages.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 37501bc1a94821d8f230c4ae0e4f9405febc2dc6 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 11:19:51 -0600 Subject: [PATCH 08/29] Discard changes in other projects --- samples/Samples.Mvc5.EFCore/packages.config | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 samples/Samples.Mvc5.EFCore/packages.config diff --git a/samples/Samples.Mvc5.EFCore/packages.config b/samples/Samples.Mvc5.EFCore/packages.config deleted file mode 100644 index 82ecffe0f..000000000 --- a/samples/Samples.Mvc5.EFCore/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 42f97b71a67ff201e3a951cef60a5b0557dbb14e Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Wed, 27 Oct 2021 19:03:03 -0600 Subject: [PATCH 09/29] Remove GeneratePackageOnBuild from project --- .../MiniProfiler.Providers.Oracle.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 2ae66dea4..be13e75c1 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -6,7 +6,6 @@ Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 - true From 3a0d304f8b733fad42d47661026401d2e5d155c9 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 08:07:00 -0600 Subject: [PATCH 10/29] Version inicial de OracleStorage Provider --- .../MiniProfiler.Providers.Oracle.csproj | 15 + .../OracleBoolTypeHandler.cs | 20 + .../OracleGuidTypeHandler.cs | 36 ++ .../OracleStorage.cs | 474 ++++++++++++++++++ 4 files changed, 545 insertions(+) create mode 100644 src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj create mode 100644 src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleStorage.cs diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj new file mode 100644 index 000000000..82875e0ba --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -0,0 +1,15 @@ + + + MiniProfiler.Providers.Oracle + MiniProfiler.Providers.Oracle + MiniProfiler: Profiler storage for Oracle Database + Fernando Paz + Oracle;$(PackageBaseTags) + net461;netstandard2.0 + + + + + + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs new file mode 100644 index 000000000..b2bb189cc --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs @@ -0,0 +1,20 @@ +using System.Data; +using Dapper; + +namespace StackExchange.Profiling +{ + /// + /// Handle Bool to Integer conversions for Oracle Provider + /// + public class OracleBoolTypeHandler : SqlMapper.TypeHandler + { + /// + public override bool Parse(object value) => ((int)value) == 1; + + /// + public override void SetValue(IDbDataParameter parameter, bool value) + { + parameter.Value = value ? 1 : 0; + } + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs new file mode 100644 index 000000000..81c0d3a80 --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs @@ -0,0 +1,36 @@ +using System; +using System.Data; +using Dapper; + +namespace StackExchange.Profiling +{ + /// + /// Handle Guid to String conversions for Oracle Provider + /// + //public class OracleGuidTypeHandler : SqlMapper.TypeHandler + //{ + // /// + // public override Guid Parse(object value) => new Guid(value.ToString()); + + // /// + // public override void SetValue(IDbDataParameter parameter, Guid value) + // { + // parameter.Value = value.ToString(); + // } + //} + + /// + /// Handle Guid to String conversions for Oracle Provider + /// + public class OracleNullableGuidTypeHandler : SqlMapper.TypeHandler + { + /// + public override Guid? Parse(object value) => value == null ? (Guid?)null : new Guid(value.ToString()); + + /// + public override void SetValue(IDbDataParameter parameter, Guid? value) + { + parameter.Value = value?.ToString(); + } + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs new file mode 100644 index 000000000..af288e204 --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -0,0 +1,474 @@ +using Dapper; +using Oracle.ManagedDataAccess.Client; +using StackExchange.Profiling.Internal; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; + +namespace StackExchange.Profiling.Storage +{ + /// + /// Understands how to store a to a Oracle Database database. + /// + public class OracleStorage : DatabaseStorageBase + { + /// + /// Initializes a new instance of the class with the specified connection string. + /// + /// The connection string to use. + public OracleStorage(string connectionString) : base(connectionString) { /* base call */ } + + /// + /// Initializes a new instance of the class with the specified connection string + /// and the given table names to use. + /// + /// The connection string to use. + /// The table name to use for MiniProfilers. + /// The table name to use for MiniProfiler Timings. + /// The table name to use for MiniProfiler Client Timings. + public OracleStorage(string connectionString, string profilersTable, string timingsTable, string clientTimingsTable) + : base(connectionString, profilersTable, timingsTable, clientTimingsTable) { } + + private string _saveSql; + private string SaveSql => _saveSql ?? (_saveSql = $@" +INSERT INTO {MiniProfilersTable} + (""Id"", RootTimingId, ""Name"", Started, DurationMilliseconds, ""User"", HasUserViewed, MachineName, CustomLinksJson, ClientTimingsRedirectCount) +SELECT :pId, :pRootTimingId, :pName, :pStarted, :pDurationMilliseconds, :pUser, :pHasUserViewed, :pMachineName, :pCustomLinksJson, :pClientTimingsRedirectCount + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilersTable} WHERE ""Id"" = :pId)"); + + private string _saveTimingsSql; + private string SaveTimingsSql => _saveTimingsSql ?? (_saveTimingsSql = $@" +INSERT INTO {MiniProfilerTimingsTable} + (""Id"", MiniProfilerId, ParentTimingId, ""Name"", DurationMilliseconds, StartMilliseconds, IsRoot, ""Depth"", CustomTimingsJson) +SELECT :pId, :pMiniProfilerId, :pParentTimingId, :pName, :pDurationMilliseconds, :pStartMilliseconds, :pIsRoot, :pDepth, :pCustomTimingsJson + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerTimingsTable} WHERE ""Id"" = :pId)"); + + private string _saveClientTimingsSql; + private string SaveClientTimingsSql => _saveClientTimingsSql ?? (_saveClientTimingsSql = $@" +INSERT INTO {MiniProfilerClientTimingsTable} + (""Id"", MiniProfilerId, ""Name"", ""Start"", ""Duration"") +SELECT :pId, :pMiniProfilerId, :pName, :pStart, :pDuration + FROM DUAL + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerClientTimingsTable} WHERE ""Id"" = :pId)"); + + /// + /// Stores to dbo.MiniProfilers under its ; + /// + /// The to save. + public override void Save(MiniProfiler profiler) + { + using (var conn = GetConnection()) + { + conn.Execute(SaveSql, ToProfilerTiming(profiler)); + + var timings = new List(); + if (profiler.Root != null) + { + profiler.Root.MiniProfilerId = profiler.Id; + FlattenTimings(profiler.Root, timings); + } + + conn.Execute(SaveTimingsSql, timings.Select(timing => ToTiming(timing))); + + if (profiler.ClientTimings?.Timings?.Any() ?? false) + { + // set the profilerId (isn't needed unless we are storing it) + foreach (var timing in profiler.ClientTimings.Timings) + { + timing.MiniProfilerId = profiler.Id; + timing.Id = Guid.NewGuid(); + } + + conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))); + } + } + } + + /// + /// Asynchronously stores to dbo.MiniProfilers under its . + /// + /// The to save. + public override async Task SaveAsync(MiniProfiler profiler) + { + using (var conn = GetConnection()) + { + await conn.ExecuteAsync(SaveSql, ToProfilerTiming(profiler)).ConfigureAwait(false); + + var timings = new List(); + if (profiler.Root != null) + { + profiler.Root.MiniProfilerId = profiler.Id; + FlattenTimings(profiler.Root, timings); + } + + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => ToTiming(timing))).ConfigureAwait(false); + + if (profiler.ClientTimings?.Timings?.Any() ?? false) + { + // set the profilerId (isn't needed unless we are storing it) + foreach (var timing in profiler.ClientTimings.Timings) + { + timing.MiniProfilerId = profiler.Id; + timing.Id = Guid.NewGuid(); + } + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))).ConfigureAwait(false); + } + } + } + + private object ToProfilerTiming(MiniProfiler profiler) => new + { + pId = profiler.Id.ToString(), + pStarted = profiler.Started, + pName = profiler.Name.Truncate(200), + pUser = profiler.User.Truncate(100), + pRootTimingId = profiler.Root?.Id.ToString(), + pDurationMilliseconds = profiler.DurationMilliseconds, + pHasUserViewed = profiler.HasUserViewed ? 1 : 0, + pMachineName = profiler.MachineName.Truncate(100), + pCustomLinksJson = profiler.CustomLinksJson, + pClientTimingsRedirectCount = profiler.ClientTimings?.RedirectCount + }; + + private object ToTiming(Timing timing) => new + { + pId = timing.Id.ToString(), + pMiniProfilerId = timing.MiniProfilerId.ToString(), + pParentTimingId = timing.ParentTimingId.ToString(), + pName = timing.Name.Truncate(200), + pDurationMilliseconds = timing.DurationMilliseconds, + pStartMilliseconds = timing.StartMilliseconds, + pIsRoot = timing.IsRoot ? 1 : 0, + pDepth = timing.Depth, + pCustomTimingsJson = timing.CustomTimingsJson + }; + + private object ToClientTiming(ClientTiming timing) => new + { + pId = timing.Id.ToString(), + pMiniProfilerId = timing.MiniProfilerId.ToString(), + pName = timing.Name.Truncate(200), + pStart = timing.Start, + pDuration = timing.Duration + }; + + private string _loadSqlProfiler; + private string _loadSqlTimings; + private string _loadSqlClientTimings; + + private string LoadSqlProfiler => _loadSqlProfiler ?? (_loadSqlProfiler = $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"); + private string LoadSqlTimings => _loadSqlTimings ?? (_loadSqlTimings = $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"); + private string LoadSqlClientTimings => _loadSqlClientTimings ?? (_loadSqlClientTimings = $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""); + + /// + /// Loads the MiniProfiler identified by 'id' from the database. + /// + /// The profiler ID to load. + /// The loaded . + public override MiniProfiler Load(Guid id) + { + MiniProfiler result; + using (var conn = GetConnection()) + { + try + { + var dresult = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); + result = + + result = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); + var timings = conn.Query(LoadSqlTimings, new { pId = id.ToString() }).AsList(); + var clientTimings = conn.Query(LoadSqlClientTimings, new { pId = id.ToString() }).AsList(); + + ConnectTimings(result, timings, clientTimings); + } + catch (Exception ex) + { + throw; + } + } + + if (result != null) + { + // HACK: stored dates are UTC, but are pulled out as local time + result.Started = new DateTime(result.Started.Ticks, DateTimeKind.Utc); + } + return result; + } + + /// + /// Loads the MiniProfiler identified by 'id' from the database. + /// + /// The profiler ID to load. + /// The loaded . + public override async Task LoadAsync(Guid id) + { + MiniProfiler result; + using (var conn = GetConnection()) + { + result = (await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); + var timings = (await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + var clientTimings = (await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + + ConnectTimings(result, timings, clientTimings); + } + + if (result != null) + { + // HACK: stored dates are UTC, but are pulled out as local time + result.Started = new DateTime(result.Started.Ticks, DateTimeKind.Utc); + } + return result; + } + + /// + /// Sets a particular profiler session so it is considered "unviewed" + /// + /// The user to set this profiler ID as unviewed for. + /// The profiler ID to set unviewed. + public override void SetUnviewed(string user, Guid id) => ToggleViewed(user, id, false); + + /// + /// Asynchronously sets a particular profiler session so it is considered "unviewed" + /// + /// The user to set this profiler ID as unviewed for. + /// The profiler ID to set unviewed. + public override Task SetUnviewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, false); + + /// + /// Sets a particular profiler session to "viewed" + /// + /// The user to set this profiler ID as viewed for. + /// The profiler ID to set viewed. + public override void SetViewed(string user, Guid id) => ToggleViewed(user, id, true); + + /// + /// Asynchronously sets a particular profiler session to "viewed" + /// + /// The user to set this profiler ID as viewed for. + /// The profiler ID to set viewed. + public override Task SetViewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, true); + + private string _toggleViewedSql; + private string ToggleViewedSql => _toggleViewedSql ?? (_toggleViewedSql = $@" +Update {MiniProfilersTable} + Set HasUserViewed = :hasUserVeiwed + Where ""Id"" = :pId + And ""User"" = :user"); + + private void ToggleViewed(string user, Guid id, bool hasUserVeiwed) + { + using (var conn = GetConnection()) + { + conn.Execute(ToggleViewedSql, new { id, user, hasUserVeiwed }); + } + } + + private async Task ToggleViewedAsync(string user, Guid id, bool hasUserVeiwed) + { + using (var conn = GetConnection()) + { + await conn.ExecuteAsync(ToggleViewedSql, new { id, user, hasUserVeiwed }).ConfigureAwait(false); + } + } + + private string _getUnviewedIdsSql; + private string GetUnviewedIdsSql => _getUnviewedIdsSql ?? (_getUnviewedIdsSql = $@" + Select ""Id"" + From {MiniProfilersTable} + Where ""User"" = :pUser + And HasUserViewed = 0 +Order By Started"); + + /// + /// Returns a list of s that haven't been seen by . + /// + /// User identified by the current MiniProfilerOptions.UserProvider + /// The list of keys for the supplied user + public override List GetUnviewedIds(string user) + { + using (var conn = GetConnection()) + { + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); + } + } + + /// + /// Asynchronously returns a list of s that haven't been seen by . + /// + /// User identified by the current MiniProfilerOptions.UserProvider + /// The list of keys for the supplied user + public override async Task> GetUnviewedIdsAsync(string user) + { + using (var conn = GetConnection()) + { + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); + } + } + + /// + /// List the MiniProfiler Ids for the given search criteria. + /// + /// The max number of results + /// Search window start + /// Search window end + /// Result order + /// The list of GUID keys + public override IEnumerable List(int maxResults, DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + using (var conn = GetConnection()) + { + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); + } + } + + /// + /// Asynchronously returns the MiniProfiler Ids for the given search criteria. + /// + /// The max number of results + /// Search window start + /// Search window end + /// Result order + /// The list of GUID keys + public override async Task> ListAsync(int maxResults, DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + using (var conn = GetConnection()) + { + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); + } + } + + private string BuildListQuery(DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) + { + var sb = StringBuilderCache.Get(); + sb.Append(@" +Select ""Id"" + From ").Append(MiniProfilersTable).Append(@" + Where rownum <= {=maxResults}"); + if (finish != null) + { + sb.AppendLine(" And Started < :finish"); + } + if (start != null) + { + sb.AppendLine(" And Started > :start"); + } + sb.Append(" Order By ").Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); + + return sb.ToStringRecycle(); + } + + /// + /// Returns a connection to Oracle Database. + /// + protected override DbConnection GetConnection() => new OracleConnection(ConnectionString); + + /// + /// SQL statements to create the Oracle Database tables. + /// + protected override IEnumerable GetTableCreationScripts() + { + yield return $@" +CREATE TABLE {MiniProfilersTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + RootTimingId VARCHAR2(36 CHAR) NULL, + ""Name"" VARCHAR2(200 CHAR) NULL, + Started DATE NOT NULL, + DurationMilliseconds NUMBER(15,1) NOT NULL, + ""User"" VARCHAR2(100 CHAR) NULL, + HasUserViewed NUMBER(1, 0) NOT NULL, + MachineName VARCHAR2(100 CHAR) NULL, + CustomLinksJson VARCHAR2(4000 CHAR), + ClientTimingsRedirectCount INTEGER NULL +); +ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); + +-- displaying results selects everything based on the main {MiniProfilersTable}.Id column +CREATE UNIQUE INDEX IX_{MiniProfilersTable}_1 ON {MiniProfilersTable} (""Id""); + +-- speeds up a query that is called on every .Stop() +CREATE INDEX IX_{MiniProfilersTable}_2 ON {MiniProfilersTable} (""User"", HasUserViewed); + +CREATE SEQUENCE {MiniProfilersTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilersTable}_IDT + BEFORE INSERT ON {MiniProfilersTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT MiniProfilers_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +/ + +---------------------------------------------------------------------------------------------- + +CREATE TABLE {MiniProfilerTimingsTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + MiniProfilerId VARCHAR2(36 CHAR) NOT NULL, + ParentTimingId VARCHAR2(36 CHAR) NULL, + ""Name"" VARCHAR2(200 CHAR) NOT NULL, + DurationMilliseconds NUMBER(15,3) NOT NULL, + StartMilliseconds NUMBER(15,3) NOT NULL, + IsRoot NUMBER(1, 0) NOT NULL, + ""Depth"" SMALLINT NOT NULL, + CustomTimingsJson VARCHAR2(4000 CHAR) NULL +); +ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); + +CREATE UNIQUE INDEX IX_{MiniProfilerTimingsTable}_1 ON {MiniProfilerTimingsTable} (""Id""); +CREATE INDEX IX_{MiniProfilerTimingsTable}_2 ON {MiniProfilerTimingsTable} (MiniProfilerId); + +CREATE SEQUENCE {MiniProfilerTimingsTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilerTimingsTable}_IDT + BEFORE INSERT ON {MiniProfilerTimingsTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT {MiniProfilerTimingsTable}_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +/ + +---------------------------------------------------------------------------------------------- + +CREATE TABLE {MiniProfilerClientTimingsTable} +( + ""RowId"" INTEGER NOT NULL, + ""Id"" VARCHAR2(36 CHAR) NOT NULL, + MiniProfilerId VARCHAR2(36 CHAR) NOT NULL, + ""Name"" VARCHAR2(200 CHAR) NOT NULL, + ""Start"" NUMBER(9, 3) NOT NULL, + ""Duration"" NUMBER(9, 3) NOT NULL +); +ALTER TABLE {MiniProfilerClientTimingsTable} ADD CONSTRAINT PK_{MiniProfilerClientTimingsTable} PRIMARY KEY (""RowId""); + +CREATE UNIQUE INDEX IX_{MiniProfilerClientTimingsTable}_1 on {MiniProfilerClientTimingsTable} (""Id""); +CREATE INDEX IX_{MiniProfilerClientTimingsTable}_2 on {MiniProfilerClientTimingsTable} (MiniProfilerId); + +CREATE SEQUENCE {MiniProfilerClientTimingsTable}_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE; + +CREATE OR REPLACE TRIGGER {MiniProfilerClientTimingsTable}_IDT + BEFORE INSERT ON {MiniProfilerClientTimingsTable} + REFERENCING NEW AS NEW OLD AS OLD + FOR EACH ROW WHEN (NVL(NEW.""RowId"", 0) = 0) +Begin + SELECT {MiniProfilerClientTimingsTable}_SEQ.NEXTVAL INTO :NEW.""RowId"" FROM DUAL; +End; +"; + } + } +} From 794c7e7a3f12c59824045968c803b3d4c43ce824 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 16:31:16 -0600 Subject: [PATCH 11/29] Proveedor Oracle funcionando correctamente --- MiniProfiler.sln | 10 + .../MiniProfiler.Providers.Oracle.csproj | 1 + .../OracleBoolTypeHandler.cs | 20 -- .../OracleDynamicParameters.cs | 243 +++++++++++++ .../OracleGuidTypeHandler.cs | 36 -- .../OracleStorage.cs | 328 +++++++++++++----- 6 files changed, 503 insertions(+), 135 deletions(-) delete mode 100644 src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs create mode 100644 src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs delete mode 100644 src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 9aadf3037..9669e9d4c 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -91,6 +91,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ ProjectSection(SolutionItems) = preProject .github\workflows\main.yml = .github\workflows\main.yml EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{A14F7769-55E7-4045-B653-EC4DD44C339C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AspNet", "samples\Samples.AspNet\Samples.AspNet.csproj", "{9C7822CD-BE8E-424F-A0C6-86CC986ABB42}" EndProject @@ -210,6 +211,14 @@ Global {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Debug|Any CPU.Build.0 = Debug|Any CPU {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Release|Any CPU.Build.0 = Release|Any CPU + {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -243,6 +252,7 @@ Global {A14EA029-60E2-485A-B757-3626511CF2C4} = {5C8ED0C0-7DBB-4660-836E-A760E25160A0} {9C7822CD-BE8E-424F-A0C6-86CC986ABB42} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A1DCACC2-0D9A-401E-B6A4-856E5DD00541} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} + {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 82875e0ba..d6971c6a6 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -10,6 +10,7 @@ + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs deleted file mode 100644 index b2bb189cc..000000000 --- a/src/MiniProfiler.Providers.Oracle/OracleBoolTypeHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Data; -using Dapper; - -namespace StackExchange.Profiling -{ - /// - /// Handle Bool to Integer conversions for Oracle Provider - /// - public class OracleBoolTypeHandler : SqlMapper.TypeHandler - { - /// - public override bool Parse(object value) => ((int)value) == 1; - - /// - public override void SetValue(IDbDataParameter parameter, bool value) - { - parameter.Value = value ? 1 : 0; - } - } -} diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs new file mode 100644 index 000000000..d4206075d --- /dev/null +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -0,0 +1,243 @@ +using Dapper; +using Oracle.ManagedDataAccess.Client; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +public class OracleDynamicParameters : SqlMapper.IDynamicParameters +{ + private static Dictionary> paramReaderCache = new Dictionary>(); + + private Dictionary parameters = new Dictionary(); + private List templates; + + private class ParamInfo + { + + public string Name { get; set; } + + public object Value { get; set; } + + public ParameterDirection ParameterDirection { get; set; } + + public OracleDbType? DbType { get; set; } + + public int? Size { get; set; } + + public IDbDataParameter AttachedParam { get; set; } + } + + /// + /// construct a dynamic parameter bag + /// + public OracleDynamicParameters() + { + } + + /// + /// construct a dynamic parameter bag + /// + /// can be an anonymous type or a DynamicParameters bag + public OracleDynamicParameters(object template) + { + AddDynamicParams(template); + } + + /// + /// Append a whole object full of params to the dynamic + /// EG: AddDynamicParams(new {A = 1, B = 2}) // will add property A and B to the dynamic + /// + /// + public void AddDynamicParams( +#if CSHARP30 + object param +#else + dynamic param +#endif + ) + { + var obj = param as object; + if (obj != null) + { + var subDynamic = obj as OracleDynamicParameters; + if (subDynamic == null) + { + var dictionary = obj as IEnumerable>; + if (dictionary == null) + { + templates = templates ?? new List(); + templates.Add(obj); + } + else + { + foreach (var kvp in dictionary) + { +#if CSHARP30 + Add(kvp.Key, kvp.Value, null, null, null); +#else + Add(kvp.Key, kvp.Value); +#endif + } + } + } + else + { + if (subDynamic.parameters != null) + { + foreach (var kvp in subDynamic.parameters) + { + parameters.Add(kvp.Key, kvp.Value); + } + } + + if (subDynamic.templates != null) + { + templates = templates ?? new List(); + foreach (var t in subDynamic.templates) + { + templates.Add(t); + } + } + } + } + } + + /// + /// Add a parameter to this dynamic parameter list + /// + /// + /// + /// + /// + /// + public void Add( +#if CSHARP30 + string name, object value, DbType? dbType, ParameterDirection? direction, int? size +#else + string name, object value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null +#endif + ) + { + parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size }; + } + + private static string Clean(string name) + { + if (!string.IsNullOrEmpty(name)) + { + switch (name[0]) + { + case '@': + case ':': + case '?': + return name.Substring(1); + } + } + return name; + } + + void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity) + { + AddParameters(command, identity); + } + + /// + /// Add all the parameters needed to the command just before it executes + /// + /// The raw command prior to execution + /// Information about the query + protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) + { + if (templates != null) + { + foreach (var template in templates) + { + var newIdent = identity.ForDynamicParameters(template.GetType()); + Action appender; + + lock (paramReaderCache) + { + if (!paramReaderCache.TryGetValue(newIdent, out appender)) + { + appender = SqlMapper.CreateParamInfoGenerator(newIdent, false, false); + paramReaderCache[newIdent] = appender; + } + } + + appender(command, template); + } + } + + foreach (var param in parameters.Values) + { + string name = Clean(param.Name); + bool add = !((OracleCommand)command).Parameters.Contains(name); + OracleParameter p; + if (add) + { + p = ((OracleCommand)command).CreateParameter(); + p.ParameterName = name; + } + else + { + p = ((OracleCommand)command).Parameters[name]; + } + var val = param.Value; + p.Value = val ?? DBNull.Value; + p.Direction = param.ParameterDirection; + var s = val as string; + if (s != null) + { + if (s.Length <= 4000) + { + p.Size = 4000; + } + } + if (param.Size != null) + { + p.Size = param.Size.Value; + } + if (param.DbType != null) + { + p.OracleDbType = param.DbType.Value; + } + if (add) + { + command.Parameters.Add(p); + } + param.AttachedParam = p; + } + } + + /// + /// All the names of the param in the bag, use Get to yank them out + /// + public IEnumerable ParameterNames + { + get + { + return parameters.Select(p => p.Key); + } + } + + /// + /// Get the value of a parameter + /// + /// + /// + /// The value, note DBNull.Value is not returned, instead the value is returned as null + public T Get(string name) + { + var val = parameters[Clean(name)].AttachedParam.Value; + if (val == DBNull.Value) + { + if (default(T) != null) + { + throw new ApplicationException("Attempting to cast a DBNull to a non nullable type!"); + } + return default(T); + } + return (T)val; + } +} diff --git a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs b/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs deleted file mode 100644 index 81c0d3a80..000000000 --- a/src/MiniProfiler.Providers.Oracle/OracleGuidTypeHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Data; -using Dapper; - -namespace StackExchange.Profiling -{ - /// - /// Handle Guid to String conversions for Oracle Provider - /// - //public class OracleGuidTypeHandler : SqlMapper.TypeHandler - //{ - // /// - // public override Guid Parse(object value) => new Guid(value.ToString()); - - // /// - // public override void SetValue(IDbDataParameter parameter, Guid value) - // { - // parameter.Value = value.ToString(); - // } - //} - - /// - /// Handle Guid to String conversions for Oracle Provider - /// - public class OracleNullableGuidTypeHandler : SqlMapper.TypeHandler - { - /// - public override Guid? Parse(object value) => value == null ? (Guid?)null : new Guid(value.ToString()); - - /// - public override void SetValue(IDbDataParameter parameter, Guid? value) - { - parameter.Value = value?.ToString(); - } - } -} diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index af288e204..cce6b20b9 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -1,12 +1,13 @@ -using Dapper; -using Oracle.ManagedDataAccess.Client; -using StackExchange.Profiling.Internal; -using System; +using System; using System.Collections.Generic; using System.Data.Common; +using System.Diagnostics; using System.Linq; -using System.Security.Cryptography; using System.Threading.Tasks; +using Dapper; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; +using StackExchange.Profiling.Internal; namespace StackExchange.Profiling.Storage { @@ -64,7 +65,16 @@ public override void Save(MiniProfiler profiler) { using (var conn = GetConnection()) { - conn.Execute(SaveSql, ToProfilerTiming(profiler)); + conn.Open(); + + try + { + conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } var timings = new List(); if (profiler.Root != null) @@ -73,18 +83,37 @@ public override void Save(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - conn.Execute(SaveTimingsSql, timings.Select(timing => ToTiming(timing))); + try + { + timings.ForEach(timing => + { + var dt = TimingToDynamic(conn, timing); + conn.Execute(SaveTimingsSql, dt); + }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } if (profiler.ClientTimings?.Timings?.Any() ?? false) { - // set the profilerId (isn't needed unless we are storing it) - foreach (var timing in profiler.ClientTimings.Timings) + try { - timing.MiniProfilerId = profiler.Id; - timing.Id = Guid.NewGuid(); + profiler.ClientTimings.Timings.ForEach(timing => + { + // set the profilerId (isn't needed unless we are storing it) + timing.Id = Guid.NewGuid(); + timing.MiniProfilerId = profiler.Id; + + var dct = ClientTimingToDynamic(timing); + conn.Execute(SaveClientTimingsSql, dct); + }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; } - - conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))); } } } @@ -95,9 +124,13 @@ public override void Save(MiniProfiler profiler) /// The to save. public override async Task SaveAsync(MiniProfiler profiler) { + throw new NotImplementedException(); + using (var conn = GetConnection()) { - await conn.ExecuteAsync(SaveSql, ToProfilerTiming(profiler)).ConfigureAwait(false); + conn.Open(); + + await conn.ExecuteAsync(SaveSql, ProfilerToDynamic(conn, profiler)).ConfigureAwait(false); var timings = new List(); if (profiler.Root != null) @@ -106,7 +139,7 @@ public override async Task SaveAsync(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => ToTiming(timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => TimingToDynamic(conn, timing))).ConfigureAwait(false); if (profiler.ClientTimings?.Timings?.Any() ?? false) { @@ -116,47 +149,141 @@ public override async Task SaveAsync(MiniProfiler profiler) timing.MiniProfilerId = profiler.Id; timing.Id = Guid.NewGuid(); } - await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ToClientTiming(timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ClientTimingToDynamic(timing))).ConfigureAwait(false); } } } - private object ToProfilerTiming(MiniProfiler profiler) => new + + private OracleDynamicParameters ProfilerToDynamic(DbConnection conn, MiniProfiler profiler) + { + if (profiler == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", profiler.Id.ToString()); + pars.Add("pStarted", profiler.Started); + pars.Add("pName", profiler.Name.Truncate(200)); + pars.Add("pUser", profiler.User.Truncate(100)); + pars.Add("pRootTimingId", profiler.Root?.Id.ToString()); + pars.Add("pDurationMilliseconds", profiler.DurationMilliseconds); + pars.Add("pHasUserViewed", profiler.HasUserViewed ? 1 : 0); + pars.Add("pMachineName", profiler.MachineName.Truncate(100)); + pars.Add("pClientTimingsRedirectCount", profiler.ClientTimings?.RedirectCount); + + if (string.IsNullOrWhiteSpace(profiler.CustomLinksJson)) + { + pars.Add("pCustomLinksJson", null); + } + else + { + byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(profiler.CustomLinksJson); + var clob = new OracleClob((OracleConnection)conn); + clob.Write(newvalue, 0, newvalue.Length); + + pars.Add("pCustomLinksJson", clob); + } + + return pars; + } + + private OracleDynamicParameters TimingToDynamic(DbConnection conn, Timing timing) + { + if (timing == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", timing.Id.ToString()); + pars.Add("pMiniProfilerId", timing.MiniProfilerId.ToString()); + pars.Add("pParentTimingId", timing.ParentTimingId == Guid.Empty ? null : timing.ParentTimingId.ToString()); + pars.Add("pName", timing.Name.Truncate(200)); + pars.Add("pDurationMilliseconds", timing.DurationMilliseconds); + pars.Add("pStartMilliseconds", timing.StartMilliseconds); + pars.Add("pIsRoot", timing.IsRoot ? 1 : 0); + pars.Add("pDepth", timing.Depth); + + if (string.IsNullOrWhiteSpace(timing.CustomTimingsJson)) + { + pars.Add("pCustomTimingsJson", null); + } + else + { + byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(timing.CustomTimingsJson); + var clob = new OracleClob((OracleConnection)conn); + clob.Write(newvalue, 0, newvalue.Length); + + pars.Add("pCustomTimingsJson", clob); + } + + return pars; + } + + private OracleDynamicParameters ClientTimingToDynamic(ClientTiming clientTiming) + { + if (clientTiming == null) return null; + + var pars = new OracleDynamicParameters(); + pars.Add("pId", clientTiming.Id.ToString()); + pars.Add("pMiniProfilerId", clientTiming.MiniProfilerId.ToString()); + pars.Add("pName", clientTiming.Name.Truncate(200)); + pars.Add("pStart", clientTiming.Start); + pars.Add("pDuration", clientTiming.Duration); + + return pars; + } + + private IEnumerable DynamicListToProfiler(IEnumerable profilers) + { + foreach (var profile in profilers) yield return DynamicToProfiler(profile); + } + +#pragma warning disable CS0618 // Used for serialization only + private MiniProfiler DynamicToProfiler(dynamic profile) => new MiniProfiler { - pId = profiler.Id.ToString(), - pStarted = profiler.Started, - pName = profiler.Name.Truncate(200), - pUser = profiler.User.Truncate(100), - pRootTimingId = profiler.Root?.Id.ToString(), - pDurationMilliseconds = profiler.DurationMilliseconds, - pHasUserViewed = profiler.HasUserViewed ? 1 : 0, - pMachineName = profiler.MachineName.Truncate(100), - pCustomLinksJson = profiler.CustomLinksJson, - pClientTimingsRedirectCount = profiler.ClientTimings?.RedirectCount + Id = new Guid((string)profile.Id), + Started = profile.STARTED, + Name = profile.Name, + User = profile.User, + RootTimingId = profile.ROOTTIMINGID == null ? (Guid?)null : new Guid((string)profile.ROOTTIMINGID), + DurationMilliseconds = Convert.ToDecimal(profile.DURATIONMILLISECONDS ?? 0), + HasUserViewed = profile.HASUSERVIEWED == 1, + MachineName = profile.MACHINENAME, + CustomLinksJson = profile.CUSTOMLINKSJSON, + ClientTimingsRedirectCount = profile.CLIENTTIMINGSREDIRECTCOUNT }; +#pragma warning restore CS0618 // Used for serialization only - private object ToTiming(Timing timing) => new + + private IEnumerable DynamicListToTiming(IEnumerable timings) + { + foreach (var timing in timings) yield return DynamicToTiming(timing); + } + +#pragma warning disable CS0618 // Used for serialization only + private Timing DynamicToTiming(dynamic timing) => new Timing { - pId = timing.Id.ToString(), - pMiniProfilerId = timing.MiniProfilerId.ToString(), - pParentTimingId = timing.ParentTimingId.ToString(), - pName = timing.Name.Truncate(200), - pDurationMilliseconds = timing.DurationMilliseconds, - pStartMilliseconds = timing.StartMilliseconds, - pIsRoot = timing.IsRoot ? 1 : 0, - pDepth = timing.Depth, - pCustomTimingsJson = timing.CustomTimingsJson + Id = new Guid((string)timing.Id), + MiniProfilerId = new Guid((string)timing.MINIPROFILERID), + ParentTimingId = timing.PARENTTIMINGID == null ? Guid.Empty : new Guid((string)timing.PARENTTIMINGID), + Name = timing.Name, + DurationMilliseconds = timing.DURATIONMILLISECONDS == null ? null : Convert.ToDecimal(timing.DURATIONMILLISECONDS), + StartMilliseconds = Convert.ToDecimal(timing.STARTMILLISECONDS), + CustomTimingsJson = timing.CUSTOMTIMINGSJSON }; +#pragma warning restore CS0618 // Used for serialization only + + private IEnumerable DynamicListToClientTiming(IEnumerable clientTimings) + { + foreach (var clientTiming in clientTimings) yield return DynamicToClientTiming(clientTiming); + } - private object ToClientTiming(ClientTiming timing) => new + private ClientTiming DynamicToClientTiming(dynamic clientTiming) => new ClientTiming { - pId = timing.Id.ToString(), - pMiniProfilerId = timing.MiniProfilerId.ToString(), - pName = timing.Name.Truncate(200), - pStart = timing.Start, - pDuration = timing.Duration + Id = new Guid((string)clientTiming.Id), + MiniProfilerId = new Guid((string)clientTiming.MINIPROFILERID), + Name = clientTiming.Name, + Start = Convert.ToDecimal(clientTiming.Start), + Duration = Convert.ToDecimal(clientTiming.Duration) }; - + private string _loadSqlProfiler; private string _loadSqlTimings; private string _loadSqlClientTimings; @@ -164,7 +291,7 @@ public override async Task SaveAsync(MiniProfiler profiler) private string LoadSqlProfiler => _loadSqlProfiler ?? (_loadSqlProfiler = $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"); private string LoadSqlTimings => _loadSqlTimings ?? (_loadSqlTimings = $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"); private string LoadSqlClientTimings => _loadSqlClientTimings ?? (_loadSqlClientTimings = $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""); - + /// /// Loads the MiniProfiler identified by 'id' from the database. /// @@ -177,18 +304,15 @@ public override MiniProfiler Load(Guid id) { try { - var dresult = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); - result = - - result = conn.Query(LoadSqlProfiler, new { pId = id.ToString() }).FirstOrDefault(); - var timings = conn.Query(LoadSqlTimings, new { pId = id.ToString() }).AsList(); - var clientTimings = conn.Query(LoadSqlClientTimings, new { pId = id.ToString() }).AsList(); - + result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); + var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); + var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); + ConnectTimings(result, timings, clientTimings); } catch (Exception ex) { - throw; + Debug.WriteLine(ex.ToString()); throw; } } @@ -207,12 +331,14 @@ public override MiniProfiler Load(Guid id) /// The loaded . public override async Task LoadAsync(Guid id) { + throw new NotImplementedException(); + MiniProfiler result; using (var conn = GetConnection()) { - result = (await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); - var timings = (await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); - var clientTimings = (await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + result = DynamicListToProfiler(await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); + var timings = DynamicListToTiming(await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + var clientTimings = DynamicListToClientTiming(await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); ConnectTimings(result, timings, clientTimings); } @@ -256,23 +382,37 @@ public override async Task LoadAsync(Guid id) private string _toggleViewedSql; private string ToggleViewedSql => _toggleViewedSql ?? (_toggleViewedSql = $@" Update {MiniProfilersTable} - Set HasUserViewed = :hasUserVeiwed + Set HasUserViewed = :pHasUserViewed Where ""Id"" = :pId - And ""User"" = :user"); + And ""User"" = :pUser"); - private void ToggleViewed(string user, Guid id, bool hasUserVeiwed) + private void ToggleViewed(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - conn.Execute(ToggleViewedSql, new { id, user, hasUserVeiwed }); + try + { + conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } - private async Task ToggleViewedAsync(string user, Guid id, bool hasUserVeiwed) + private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - await conn.ExecuteAsync(ToggleViewedSql, new { id, user, hasUserVeiwed }).ConfigureAwait(false); + try + { + await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -293,8 +433,15 @@ public override List GetUnviewedIds(string user) { using (var conn = GetConnection()) { - var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); - return ids.Select(id => new Guid(id)).AsList(); + try + { + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -307,8 +454,15 @@ public override async Task> GetUnviewedIdsAsync(string user) { using (var conn = GetConnection()) { - var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)).AsList(); + try + { + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -324,9 +478,16 @@ public override IEnumerable List(int maxResults, DateTime? start = null, D { using (var conn = GetConnection()) { - var query = BuildListQuery(start, finish, orderBy); - var ids = conn.Query(query, new { maxResults, start, finish }); - return ids.Select(id => new Guid(id)); + try + { + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } @@ -342,19 +503,26 @@ public override async Task> ListAsync(int maxResults, DateTime { using (var conn = GetConnection()) { - var query = BuildListQuery(start, finish, orderBy); - var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)); + try + { + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); throw; + } } } private string BuildListQuery(DateTime? start = null, DateTime? finish = null, ListResultsOrder orderBy = ListResultsOrder.Descending) { var sb = StringBuilderCache.Get(); - sb.Append(@" -Select ""Id"" - From ").Append(MiniProfilersTable).Append(@" - Where rownum <= {=maxResults}"); + sb.AppendLine($@"Select ""Id""") + .AppendLine($@" From {MiniProfilersTable}") + .AppendLine(" Where rownum <= {=maxResults}"); + if (finish != null) { sb.AppendLine(" And Started < :finish"); @@ -363,7 +531,9 @@ private string BuildListQuery(DateTime? start = null, DateTime? finish = null, L { sb.AppendLine(" And Started > :start"); } - sb.Append(" Order By ").Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); + + sb.Append(" Order By ") + .Append(orderBy == ListResultsOrder.Descending ? "Started Desc" : "Started Asc"); return sb.ToStringRecycle(); } @@ -390,7 +560,7 @@ DurationMilliseconds NUMBER(15,1) NOT NULL, ""User"" VARCHAR2(100 CHAR) NULL, HasUserViewed NUMBER(1, 0) NOT NULL, MachineName VARCHAR2(100 CHAR) NULL, - CustomLinksJson VARCHAR2(4000 CHAR), + CustomLinksJson NCLOB NULL, ClientTimingsRedirectCount INTEGER NULL ); ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); @@ -425,7 +595,7 @@ DurationMilliseconds NUMBER(15,3) NOT NULL, StartMilliseconds NUMBER(15,3) NOT NULL, IsRoot NUMBER(1, 0) NOT NULL, ""Depth"" SMALLINT NOT NULL, - CustomTimingsJson VARCHAR2(4000 CHAR) NULL + CustomTimingsJson NCLOB NULL ); ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); From 3d8af09eedab3b8a4df44449ec3d01378d5b0f82 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Fri, 12 Jun 2020 17:20:37 -0600 Subject: [PATCH 12/29] =?UTF-8?q?Limpieza=20del=20c=C3=B3digo=20fuente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MiniProfiler.Providers.Oracle.csproj | 2 +- .../OracleStorage.cs | 150 +++++------------- 2 files changed, 38 insertions(+), 114 deletions(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index d6971c6a6..be13e75c1 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -3,7 +3,7 @@ MiniProfiler.Providers.Oracle MiniProfiler.Providers.Oracle MiniProfiler: Profiler storage for Oracle Database - Fernando Paz + Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index cce6b20b9..4a93131a4 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -67,14 +67,7 @@ public override void Save(MiniProfiler profiler) { conn.Open(); - try - { - conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(SaveSql, ProfilerToDynamic(conn, profiler)); var timings = new List(); if (profiler.Root != null) @@ -83,37 +76,19 @@ public override void Save(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - try - { - timings.ForEach(timing => - { - var dt = TimingToDynamic(conn, timing); - conn.Execute(SaveTimingsSql, dt); - }); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(SaveTimingsSql, timings.Select(t => TimingToDynamic(conn, t)).AsList()); if (profiler.ClientTimings?.Timings?.Any() ?? false) { - try - { - profiler.ClientTimings.Timings.ForEach(timing => - { - // set the profilerId (isn't needed unless we are storing it) - timing.Id = Guid.NewGuid(); - timing.MiniProfilerId = profiler.Id; - - var dct = ClientTimingToDynamic(timing); - conn.Execute(SaveClientTimingsSql, dct); - }); - } - catch (Exception ex) + profiler.ClientTimings.Timings.ForEach(clientTiming => { - Debug.WriteLine(ex.ToString()); throw; - } + // set the profilerId (isn't needed unless we are storing it) + clientTiming.Id = Guid.NewGuid(); + clientTiming.MiniProfilerId = profiler.Id; + + }); + + conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))); } } } @@ -124,8 +99,6 @@ public override void Save(MiniProfiler profiler) /// The to save. public override async Task SaveAsync(MiniProfiler profiler) { - throw new NotImplementedException(); - using (var conn = GetConnection()) { conn.Open(); @@ -139,17 +112,19 @@ public override async Task SaveAsync(MiniProfiler profiler) FlattenTimings(profiler.Root, timings); } - await conn.ExecuteAsync(SaveTimingsSql, timings.Select(timing => TimingToDynamic(conn, timing))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveTimingsSql, timings.Select(t => TimingToDynamic(conn, t)).AsList()).ConfigureAwait(false); if (profiler.ClientTimings?.Timings?.Any() ?? false) { - // set the profilerId (isn't needed unless we are storing it) - foreach (var timing in profiler.ClientTimings.Timings) + profiler.ClientTimings.Timings.ForEach(clientTiming => { - timing.MiniProfilerId = profiler.Id; - timing.Id = Guid.NewGuid(); - } - await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(timing => ClientTimingToDynamic(timing))).ConfigureAwait(false); + // set the profilerId (isn't needed unless we are storing it) + clientTiming.Id = Guid.NewGuid(); + clientTiming.MiniProfilerId = profiler.Id; + + }); + + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))).ConfigureAwait(false); } } } @@ -302,18 +277,11 @@ public override MiniProfiler Load(Guid id) MiniProfiler result; using (var conn = GetConnection()) { - try - { - result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); - var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); - var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); + result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); + var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); + var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); - ConnectTimings(result, timings, clientTimings); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + ConnectTimings(result, timings, clientTimings); } if (result != null) @@ -331,8 +299,6 @@ public override MiniProfiler Load(Guid id) /// The loaded . public override async Task LoadAsync(Guid id) { - throw new NotImplementedException(); - MiniProfiler result; using (var conn = GetConnection()) { @@ -390,14 +356,7 @@ private void ToggleViewed(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - try - { - conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + conn.Execute(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }); } } @@ -405,14 +364,7 @@ private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { - try - { - await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + await conn.ExecuteAsync(ToggleViewedSql, new { pId = id.ToString(), pUser = user, pHasUserViewed = hasUserViewed ? 1 : 0 }).ConfigureAwait(false); } } @@ -433,15 +385,8 @@ public override List GetUnviewedIds(string user) { using (var conn = GetConnection()) { - try - { - var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); - return ids.Select(id => new Guid(id)).AsList(); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var ids = conn.Query(GetUnviewedIdsSql, new { pUser = user }).ToList(); + return ids.Select(id => new Guid(id)).AsList(); } } @@ -454,15 +399,8 @@ public override async Task> GetUnviewedIdsAsync(string user) { using (var conn = GetConnection()) { - try - { - var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)).AsList(); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var ids = await conn.QueryAsync(GetUnviewedIdsSql, new { pUser = user }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)).AsList(); } } @@ -478,16 +416,9 @@ public override IEnumerable List(int maxResults, DateTime? start = null, D { using (var conn = GetConnection()) { - try - { - var query = BuildListQuery(start, finish, orderBy); - var ids = conn.Query(query, new { maxResults, start, finish }); - return ids.Select(id => new Guid(id)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var query = BuildListQuery(start, finish, orderBy); + var ids = conn.Query(query, new { maxResults, start, finish }); + return ids.Select(id => new Guid(id)); } } @@ -503,16 +434,9 @@ public override async Task> ListAsync(int maxResults, DateTime { using (var conn = GetConnection()) { - try - { - var query = BuildListQuery(start, finish, orderBy); - var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); - return ids.Select(id => new Guid(id)); - } - catch (Exception ex) - { - Debug.WriteLine(ex.ToString()); throw; - } + var query = BuildListQuery(start, finish, orderBy); + var ids = await conn.QueryAsync(query, new { maxResults, start, finish }).ConfigureAwait(false); + return ids.Select(id => new Guid(id)); } } @@ -560,7 +484,7 @@ DurationMilliseconds NUMBER(15,1) NOT NULL, ""User"" VARCHAR2(100 CHAR) NULL, HasUserViewed NUMBER(1, 0) NOT NULL, MachineName VARCHAR2(100 CHAR) NULL, - CustomLinksJson NCLOB NULL, + CustomLinksJson CLOB NULL, ClientTimingsRedirectCount INTEGER NULL ); ALTER TABLE {MiniProfilersTable} ADD CONSTRAINT PK_{MiniProfilersTable} PRIMARY KEY (""RowId""); @@ -595,7 +519,7 @@ DurationMilliseconds NUMBER(15,3) NOT NULL, StartMilliseconds NUMBER(15,3) NOT NULL, IsRoot NUMBER(1, 0) NOT NULL, ""Depth"" SMALLINT NOT NULL, - CustomTimingsJson NCLOB NULL + CustomTimingsJson CLOB NULL ); ALTER TABLE {MiniProfilerTimingsTable} ADD CONSTRAINT PK_{MiniProfilerTimingsTable} PRIMARY KEY (""RowId""); From 1bab3d6de0aff3ccdea8eb85d68509faf2bd06e0 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Mon, 15 Jun 2020 09:51:31 -0600 Subject: [PATCH 13/29] Sample project for OracleStorage Provider --- MiniProfiler.sln | 6 + samples/Samples.Mvc5.EFCore/packages.config | 4 + .../App_Start/BundleConfig.cs | 23 + .../App_Start/FilterConfig.cs | 14 + .../App_Start/RouteConfig.cs | 19 + samples/Samples.Mvc5.Oracle/Content/Site.css | 13 + .../Samples.Mvc5.Oracle/Content/bootstrap.css | 8589 +++++++++++++++++ .../Content/bootstrap.min.css | 7584 +++++++++++++++ .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../Controllers/BaseController.cs | 113 + .../Controllers/HomeController.cs | 457 + .../EFCodeFirst/EFContext.cs | 25 + .../Samples.Mvc5.Oracle/EFCodeFirst/Person.cs | 20 + samples/Samples.Mvc5.Oracle/Global.asax | 1 + samples/Samples.Mvc5.Oracle/Global.asax.cs | 155 + .../Helpers/OracleMiniProfilerStorage.cs | 49 + .../Properties/AssemblyInfo.cs | 35 + .../Samples.Mvc5.Oracle.csproj | 233 + .../Scripts/_references.js | 2 + .../Samples.Mvc5.Oracle/Scripts/bootstrap.js | 2377 +++++ .../Scripts/bootstrap.min.js | 7 + .../Views/Home/About.cshtml | 18 + .../Views/Home/Index.cshtml | 96 + .../Views/Home/ResultsAuthorization.cshtml | 19 + .../Views/Shared/Error.cshtml | 8 + .../Views/Shared/_Layout.cshtml | 66 + samples/Samples.Mvc5.Oracle/Views/Web.config | 39 + .../Views/_ViewStart.cshtml | 3 + samples/Samples.Mvc5.Oracle/Web.Debug.config | 30 + .../Samples.Mvc5.Oracle/Web.Release.config | 31 + samples/Samples.Mvc5.Oracle/Web.config | 83 + samples/Samples.Mvc5.Oracle/favicon.ico | Bin 0 -> 32038 bytes samples/Samples.Mvc5.Oracle/packages.config | 19 + 37 files changed, 20426 insertions(+) create mode 100644 samples/Samples.Mvc5.EFCore/packages.config create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs create mode 100644 samples/Samples.Mvc5.Oracle/Content/Site.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/bootstrap.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.svg create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff create mode 100644 samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 create mode 100644 samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs create mode 100644 samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs create mode 100644 samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs create mode 100644 samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs create mode 100644 samples/Samples.Mvc5.Oracle/Global.asax create mode 100644 samples/Samples.Mvc5.Oracle/Global.asax.cs create mode 100644 samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs create mode 100644 samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs create mode 100644 samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/_references.js create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js create mode 100644 samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Views/Web.config create mode 100644 samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml create mode 100644 samples/Samples.Mvc5.Oracle/Web.Debug.config create mode 100644 samples/Samples.Mvc5.Oracle/Web.Release.config create mode 100644 samples/Samples.Mvc5.Oracle/Web.config create mode 100644 samples/Samples.Mvc5.Oracle/favicon.ico create mode 100644 samples/Samples.Mvc5.Oracle/packages.config diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 9669e9d4c..a6a18fc39 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -96,6 +96,7 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AspNet", "samples\Samples.AspNet\Samples.AspNet.csproj", "{9C7822CD-BE8E-424F-A0C6-86CC986ABB42}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Minimal", "src\MiniProfiler.Minimal\MiniProfiler.Minimal.csproj", "{A1DCACC2-0D9A-401E-B6A4-856E5DD00541}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{CB089B96-B68A-4283-A0C3-F50C4483270C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -219,6 +220,10 @@ Global {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -253,6 +258,7 @@ Global {9C7822CD-BE8E-424F-A0C6-86CC986ABB42} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A1DCACC2-0D9A-401E-B6A4-856E5DD00541} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} + {CB089B96-B68A-4283-A0C3-F50C4483270C} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 diff --git a/samples/Samples.Mvc5.EFCore/packages.config b/samples/Samples.Mvc5.EFCore/packages.config new file mode 100644 index 000000000..82ecffe0f --- /dev/null +++ b/samples/Samples.Mvc5.EFCore/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs new file mode 100644 index 000000000..4be793084 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/BundleConfig.cs @@ -0,0 +1,23 @@ +using System.Web.Optimization; + +namespace Samples.Mvc5 +{ + public static class BundleConfig + { + // For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862 + public static void RegisterBundles(BundleCollection bundles) + { + bundles.Add(new ScriptBundle("~/bundles/jquery").Include( + "~/Scripts/jquery-{version}.js")); + + bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( + "~/Scripts/bootstrap.js", + "~/Scripts/respond.js")); + + bundles.Add(new StyleBundle("~/Content/css").Include( + "~/Content/bootstrap.css", + "~/Content/bootstrap-theme.css", + "~/Content/site.css")); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs new file mode 100644 index 000000000..93d59c552 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/FilterConfig.cs @@ -0,0 +1,14 @@ +using System.Web.Mvc; +using StackExchange.Profiling.Mvc; + +namespace Samples.Mvc5 +{ + public static class FilterConfig + { + public static void RegisterGlobalFilters(GlobalFilterCollection filters) + { + filters.Add(new HandleErrorAttribute()); + filters.Add(new ProfilingActionFilter()); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs b/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs new file mode 100644 index 000000000..d24b25480 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/App_Start/RouteConfig.cs @@ -0,0 +1,19 @@ +using System.Web.Mvc; +using System.Web.Routing; + +namespace Samples.Mvc5 +{ + public static class RouteConfig + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + + routes.MapRoute( + name: "Default", + url: "{controller}/{action}/{id}", + defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } + ); + } + } +} diff --git a/samples/Samples.Mvc5.Oracle/Content/Site.css b/samples/Samples.Mvc5.Oracle/Content/Site.css new file mode 100644 index 000000000..cd0faeed6 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/Site.css @@ -0,0 +1,13 @@ +.navbar { + margin-bottom: 0; +} + +.glyphicon.spinning { + margin-left: 5px; + font-size: 0.6em; + animation: spin 0.6s infinite linear; +} +@keyframes spin { + from { transform: scale(1) rotate(0deg); } + to { transform: scale(1) rotate(360deg); } +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Content/bootstrap.css b/samples/Samples.Mvc5.Oracle/Content/bootstrap.css new file mode 100644 index 000000000..0d7ca4ff2 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/bootstrap.css @@ -0,0 +1,8589 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); +/*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! + * 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; + -ms-text-size-adjust: 100%; + -webkit-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 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +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 { + border: 0; + padding: 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-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + } + + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #008cba; + text-decoration: none; +} + + a:hover, + a:focus { + color: #008cba; + 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: 0; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + 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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + 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: #999999; + } + +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} + + 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: 10.5px; + margin-bottom: 10.5px; +} + + 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: 39px; +} + +h2, +.h2 { + font-size: 32px; +} + +h3, +.h3 { + font-size: 26px; +} + +h4, +.h4 { + font-size: 19px; +} + +h5, +.h5 { + font-size: 15px; +} + +h6, +.h6 { + font-size: 13px; +} + +p { + margin: 0 0 10.5px; +} + +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 22.5px; + } +} + +small, +.small { + font-size: 80%; +} + +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} + +.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: #999999; +} + +.text-primary { + color: #008cba; +} + +a.text-primary:hover, +a.text-primary:focus { + color: #006687; +} + +.text-success { + color: #43ac6a; +} + +a.text-success:hover, +a.text-success:focus { + color: #358753; +} + +.text-info { + color: #5bc0de; +} + +a.text-info:hover, +a.text-info:focus { + color: #31b0d5; +} + +.text-warning { + color: #e99002; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #b67102; +} + +.text-danger { + color: #f04124; +} + +a.text-danger:hover, +a.text-danger:focus { + color: #d32a0e; +} + +.bg-primary { + color: #fff; + background-color: #008cba; +} + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #006687; +} + +.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: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; +} + + ul ul, + ol ul, + ul ol, + ol ol { + margin-bottom: 0; + } + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} + + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } + +dl { + margin-top: 0; + margin-bottom: 21px; +} + +dt, +dd { + line-height: 1.4; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} + + 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.4; + color: #6f6f6f; + } + + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: '\2014 \00A0'; + } + + .blockquote-reverse, + blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; + } + + .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: 21px; + font-style: normal; + line-height: 1.4; +} + +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: 0; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 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: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} + + 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 { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +.row { + margin-left: -15px; + margin-right: -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-left: 15px; + padding-right: 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: #999999; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} + + .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.4; + vertical-align: top; + border-top: 1px solid #dddddd; + } + + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; + } + + .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 #dddddd; + } + + .table .table { + background-color: #ffffff; + } + +.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 #dddddd; +} + + .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 #dddddd; + } + + .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; + float: none; + display: table-column; +} + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.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 { + overflow-x: auto; + min-height: 0.01%; +} + +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + + .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 { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + 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: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} + +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 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, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + } + + .form-control::-moz-placeholder { + color: #999999; + opacity: 1; + } + + .form-control:-ms-input-placeholder { + color: #999999; + } + + .form-control::-webkit-input-placeholder { + color: #999999; + } + + .form-control::-ms-expand { + border: 0; + background-color: transparent; + } + + .form-control[disabled], + .form-control[readonly], + fieldset[disabled] .form-control { + background-color: #eeeeee; + 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: 39px; + } + + 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: 36px; + } + + 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: 60px; + } +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} + + .radio label, + .checkbox label { + min-height: 21px; + 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-left: -20px; + margin-top: 4px \9; + } + + .radio + .radio, + .checkbox + .checkbox { + margin-top: -5px; + } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + 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 { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} + + .form-control-static.input-lg, + .form-control-static.input-sm { + padding-left: 0; + padding-right: 0; + } + +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-sm { + height: 36px; + line-height: 36px; +} + +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} + +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.form-group-sm select.form-control { + height: 36px; + line-height: 36px; +} + +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} + +.form-group-sm .form-control-static { + height: 36px; + min-height: 33px; + padding: 9px 12px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-lg { + height: 60px; + line-height: 60px; +} + +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} + +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.form-group-lg select.form-control { + height: 60px; + line-height: 60px; +} + +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} + +.form-group-lg .form-control-static { + height: 60px; + min-height: 40px; + padding: 17px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.has-feedback { + position: relative; +} + + .has-feedback .form-control { + padding-right: 48.75px; + } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + 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: 60px; + height: 60px; + line-height: 60px; +} + +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} + +.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: #43ac6a; +} + +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + } + +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} + +.has-success .form-control-feedback { + color: #43ac6a; +} + +.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: #e99002; +} + +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + } + +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} + +.has-warning .form-control-feedback { + color: #e99002; +} + +.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: #f04124; +} + +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + + .has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + } + +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} + +.has-error .form-control-feedback { + color: #f04124; +} + +.has-feedback label ~ .form-control-feedback { + top: 26px; +} + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} + +@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 { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; +} + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} + +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 17px; + font-size: 19px; + } +} + +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + .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: #333333; + text-decoration: none; + } + + .btn:active, + .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + } + + .btn.disabled, + .btn[disabled], + fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + } + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-default:focus, + .btn-default.focus { + color: #333333; + background-color: #cecece; + border-color: #8c8c8c; + } + + .btn-default:hover { + color: #333333; + background-color: #cecece; + border-color: #adadad; + } + + .btn-default:active, + .btn-default.active, + .open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + 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: #333333; + background-color: #bcbcbc; + 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: #e7e7e7; + border-color: #cccccc; + } + + .btn-default .badge { + color: #e7e7e7; + background-color: #333333; + } + +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} + + .btn-primary:focus, + .btn-primary.focus { + color: #ffffff; + background-color: #006687; + border-color: #001921; + } + + .btn-primary:hover { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .btn-primary:active, + .btn-primary.active, + .open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .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: #ffffff; + background-color: #004b63; + border-color: #001921; + } + + .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: #008cba; + border-color: #0079a1; + } + + .btn-primary .badge { + color: #008cba; + background-color: #ffffff; + } + +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-success:focus, + .btn-success.focus { + color: #ffffff; + background-color: #358753; + border-color: #183e26; + } + + .btn-success:hover { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .btn-success:active, + .btn-success.active, + .open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .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: #ffffff; + background-color: #2b6e44; + border-color: #183e26; + } + + .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: #43ac6a; + border-color: #3c9a5f; + } + + .btn-success .badge { + color: #43ac6a; + background-color: #ffffff; + } + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-info:focus, + .btn-info.focus { + color: #ffffff; + background-color: #31b0d5; + border-color: #1b6d85; + } + + .btn-info:hover { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; + } + + .btn-info:active, + .btn-info.active, + .open > .dropdown-toggle.btn-info { + color: #ffffff; + 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: #ffffff; + 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: #ffffff; + } + +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} + + .btn-warning:focus, + .btn-warning.focus { + color: #ffffff; + background-color: #b67102; + border-color: #513201; + } + + .btn-warning:hover { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .btn-warning:active, + .btn-warning.active, + .open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .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: #ffffff; + background-color: #935b01; + border-color: #513201; + } + + .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: #e99002; + border-color: #d08002; + } + + .btn-warning .badge { + color: #e99002; + background-color: #ffffff; + } + +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-danger:focus, + .btn-danger.focus { + color: #ffffff; + background-color: #d32a0e; + border-color: #731708; + } + + .btn-danger:hover { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .btn-danger:active, + .btn-danger.active, + .open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .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: #ffffff; + background-color: #b1240c; + border-color: #731708; + } + + .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: #f04124; + border-color: #ea2f10; + } + + .btn-danger .badge { + color: #f04124; + background-color: #ffffff; + } + +.btn-link { + color: #008cba; + font-weight: normal; + 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: #008cba; + 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: #999999; + text-decoration: none; + } + +.btn-lg, +.btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.btn-sm, +.btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.btn-xs, +.btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.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 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.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-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + +.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; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + + .dropdown-menu.pull-right { + right: 0; + left: auto; + } + + .dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.2); + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; + } + + .dropdown-menu > li > a:hover, + .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; + } + + .dropdown-menu > .active > a, + .dropdown-menu > .active > a:hover, + .dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; + } + + .dropdown-menu > .disabled > a, + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + color: #999999; + } + + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; + } + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} + +.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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 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-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .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-right-radius: 0; + border-top-left-radius: 0; + } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} + + .btn-group-justified > .btn, + .btn-group-justified > .btn-group { + float: none; + display: table-cell; + 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-left: 0; + padding-right: 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: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} + +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: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} + +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: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} + + .input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; + } + + .input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; + } + + .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-bottom-right-radius: 0; + border-top-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-bottom-left-radius: 0; + border-top-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 { + margin-bottom: 0; + padding-left: 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: #eeeeee; + } + + .nav > li.disabled > a { + color: #999999; + } + + .nav > li.disabled > a:hover, + .nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } + + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; + } + + .nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; + } + + .nav > li > a > img { + max-width: none; + } + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + + .nav-tabs > li { + float: left; + margin-bottom: -1px; + } + + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; + } + + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; + } + + .nav-tabs > li.active > a, + .nav-tabs > li.active > a:hover, + .nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; + } + + .nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; + } + + .nav-tabs.nav-justified > li { + float: none; + } + + .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; +} + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 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: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + + .nav-pills > li > a { + border-radius: 0; + } + + .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: #ffffff; + background-color: #008cba; + } + +.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 { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; + } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; + } + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + + .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-left: 0; + padding-right: 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; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} + + .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; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} + + .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: 6px -15px; +} + + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; + } + +@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: 21px; + } + + .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: 12px; + padding-bottom: 12px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 3px; + margin-bottom: 3px; +} + +@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; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} + + .navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; + } + + .navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; + } + +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 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: #333333; + border-color: #222222; +} + + .navbar-default .navbar-brand { + color: #ffffff; + } + + .navbar-default .navbar-brand:hover, + .navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-default .navbar-text { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a:hover, + .navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .active > a, + .navbar-default .navbar-nav > .active > a:hover, + .navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .disabled > a, + .navbar-default .navbar-nav > .disabled > a:hover, + .navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + + .navbar-default .navbar-toggle { + border-color: transparent; + } + + .navbar-default .navbar-toggle:hover, + .navbar-default .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-default .navbar-collapse, + .navbar-default .navbar-form { + border-color: #222222; + } + + .navbar-default .navbar-nav > .open > a, + .navbar-default .navbar-nav > .open > a:hover, + .navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; + } + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .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: #ffffff; + background-color: #272727; + } + + .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: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #ffffff; +} + + .navbar-default .navbar-link:hover { + color: #ffffff; + } + +.navbar-default .btn-link { + color: #ffffff; +} + + .navbar-default .btn-link:hover, + .navbar-default .btn-link:focus { + color: #ffffff; + } + + .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: #cccccc; + } + +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} + + .navbar-inverse .navbar-brand { + color: #ffffff; + } + + .navbar-inverse .navbar-brand:hover, + .navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-inverse .navbar-text { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a:hover, + .navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .active > a, + .navbar-inverse .navbar-nav > .active > a:hover, + .navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .disabled > a, + .navbar-inverse .navbar-nav > .disabled > a:hover, + .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + + .navbar-inverse .navbar-toggle { + border-color: transparent; + } + + .navbar-inverse .navbar-toggle:hover, + .navbar-inverse .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-inverse .navbar-collapse, + .navbar-inverse .navbar-form { + border-color: #007196; + } + + .navbar-inverse .navbar-nav > .open > a, + .navbar-inverse .navbar-nav > .open > a:hover, + .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; + } + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .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: #ffffff; + background-color: #006687; + } + + .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: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #ffffff; +} + + .navbar-inverse .navbar-link:hover { + color: #ffffff; + } + +.navbar-inverse .btn-link { + color: #ffffff; +} + + .navbar-inverse .btn-link:hover, + .navbar-inverse .btn-link:focus { + color: #ffffff; + } + + .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: #444444; + } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} + + .breadcrumb > li { + display: inline-block; + } + + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; + } + + .breadcrumb > .active { + color: #333333; + } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} + + .pagination > li { + display: inline; + } + + .pagination > li > a, + .pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; + } + + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .pagination > li > a:hover, + .pagination > li > span:hover, + .pagination > li > a:focus, + .pagination > li > span:focus { + z-index: 2; + color: #008cba; + background-color: #eeeeee; + border-color: transparent; + } + + .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: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; + } + + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; + } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} + + .pager li { + display: inline; + } + + .pager li > a, + .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; + } + + .pager li > a:hover, + .pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + + .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: #999999; + background-color: transparent; + cursor: not-allowed; + } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + + .label-default[href]:hover, + .label-default[href]:focus { + background-color: #808080; + } + +.label-primary { + background-color: #008cba; +} + + .label-primary[href]:hover, + .label-primary[href]:focus { + background-color: #006687; + } + +.label-success { + background-color: #43ac6a; +} + + .label-success[href]:hover, + .label-success[href]:focus { + background-color: #358753; + } + +.label-info { + background-color: #5bc0de; +} + + .label-info[href]:hover, + .label-info[href]:focus { + background-color: #31b0d5; + } + +.label-warning { + background-color: #e99002; +} + + .label-warning[href]:hover, + .label-warning[href]:focus { + background-color: #b67102; + } + +.label-danger { + background-color: #f04124; +} + + .label-danger[href]:hover, + .label-danger[href]:focus { + background-color: #d32a0e; + } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #008cba; + 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: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} + +.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: #fafafa; +} + + .jumbotron h1, + .jumbotron .h1 { + color: inherit; + } + + .jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; + } + + .jumbotron > hr { + border-top-color: #e1e1e1; + } + +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 0; + padding-left: 15px; + padding-right: 15px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + + .jumbotron h1, + .jumbotron .h1 { + font-size: 68px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} + + .thumbnail > img, + .thumbnail a > img { + margin-left: auto; + margin-right: auto; + } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #008cba; +} + +.thumbnail .caption { + padding: 9px; + color: #222222; +} + +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} + + .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 { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} + + .alert-success hr { + border-top-color: #358753; + } + + .alert-success .alert-link { + color: #e6e6e6; + } + +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} + + .alert-info hr { + border-top-color: #2aabd2; + } + + .alert-info .alert-link { + color: #e6e6e6; + } + +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} + + .alert-warning hr { + border-top-color: #b67102; + } + + .alert-warning .alert-link { + color: #e6e6e6; + } + +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} + + .alert-danger hr { + border-top-color: #d32a0e; + } + + .alert-danger .alert-link { + color: #e6e6e6; + } + +@-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 { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.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: #43ac6a; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.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, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #e99002; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #f04124; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} + + .media:first-child { + margin-top: 0; + } + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.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 { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + + .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + } + + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + +a.list-group-item, +button.list-group-item { + color: #555555; +} + + a.list-group-item .list-group-item-heading, + button.list-group-item .list-group-item-heading { + color: #333333; + } + + a.list-group-item:hover, + button.list-group-item:hover, + a.list-group-item:focus, + button.list-group-item:focus { + text-decoration: none; + color: #555555; + 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 { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} + + .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: #999999; + } + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} + + .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: #87e1ff; + } + +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #43ac6a; +} + + 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: #43ac6a; + 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: #43ac6a; + border-color: #43ac6a; + } + +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #5bc0de; +} + + 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: #5bc0de; + 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: #5bc0de; + border-color: #5bc0de; + } + +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #e99002; +} + + 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: #e99002; + 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: #e99002; + border-color: #e99002; + } + +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #f04124; +} + + 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: #f04124; + 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: #f04124; + border-color: #f04124; + } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} + + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; + } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + 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 #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} + +.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-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-bottom-left-radius: -1; + } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-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-left: 15px; + padding-right: 15px; + } + + .panel > .table:first-child, + .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-top-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .table:last-child, + .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; + } + + .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-left-radius: -1; + border-bottom-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .panel-body + .table, + .panel > .panel-body + .table-responsive, + .panel > .table + .panel-body, + .panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; + } + + .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 { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 21px; +} + + .panel-group .panel { + margin-bottom: 0; + border-radius: 0; + } + + .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 #dddddd; + } + + .panel-group .panel-footer { + border-top: 0; + } + + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; + } + +.panel-default { + border-color: #dddddd; +} + + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; + } + + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; + } + + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; + } + + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; + } + +.panel-primary { + border-color: #008cba; +} + + .panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; + } + + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; + } + + .panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; + } + + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; + } + +.panel-success { + border-color: #3c9a5f; +} + + .panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; + } + + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; + } + + .panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; + } + + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; + } + +.panel-info { + border-color: #3db5d8; +} + + .panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; + } + + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; + } + + .panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; + } + + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; + } + +.panel-warning { + border-color: #d08002; +} + + .panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; + } + + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; + } + + .panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; + } + + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; + } + +.panel-danger { + border-color: #ea2f10; +} + + .panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; + } + + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; + } + + .panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; + } + + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; + } + +.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; + left: 0; + bottom: 0; + height: 100%; + width: 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: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + + .well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); + } + +.well-lg { + padding: 24px; + border-radius: 0; +} + +.well-sm { + padding: 9px; + border-radius: 0; +} + +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + + .close:hover, + .close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} + + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + } + + .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: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); + } + + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); + } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + + .modal-header .close { + margin-top: -2px; + } + +.modal-title { + margin: 0; + line-height: 1.4; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; + } + + .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, 0.5); + box-shadow: 0 5px 15px rgba(0, 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: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} + + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); + } + + .tooltip.top { + margin-top: -3px; + padding: 5px 0; + } + + .tooltip.right { + margin-left: 3px; + padding: 0 5px; + } + + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; + } + + .tooltip.left { + margin-left: -3px; + padding: 0 5px; + } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + background-color: #333333; + border-radius: 0; +} + +.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: #333333; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 15px; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} + + .popover.top { + margin-top: -10px; + } + + .popover.right { + margin-left: 10px; + } + + .popover.bottom { + margin-top: 10px; + } + + .popover.left { + margin-left: -10px; + } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 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 { + border-width: 10px; + content: ""; + } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0, 0, 0, 0.05); + bottom: -11px; +} + + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; + } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0, 0, 0, 0.05); +} + + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; + } + +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0, 0, 0, 0.05); + top: -11px; +} + + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; + } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0, 0, 0, 0.05); +} + + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; + } + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} + + .carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.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 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.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 { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 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; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); +} + + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + } + + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + } + + .carousel-control:hover, + .carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); + } + + .carousel-control .icon-prev, + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + + .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; + line-height: 1; + font-family: serif; + } + + .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%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} + + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + } + + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; + } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 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 { + left: 20%; + right: 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 { + content: " "; + display: table; +} + +.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-left: auto; + margin-right: 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; + } +} + +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} + + .navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; + } + +.navbar-collapse { + border-top-color: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: none; + box-shadow: none; +} + +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} + +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} + + .navbar-form .form-control { + height: auto; + padding: 4px 6px; + } + +.navbar-text { + margin: 12px 15px; + line-height: 21px; +} + +.navbar .dropdown-menu { + border: none; +} + + .navbar .dropdown-menu > li > a, + .navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; + } + +.navbar .dropdown-header { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-default .dropdown-menu { + background-color: #333333; +} + + .navbar-default .dropdown-menu > li > a, + .navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-default .dropdown-menu > li > a:hover, + .navbar-default .dropdown-menu > .active > a, + .navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; + } + +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} + + .navbar-inverse .dropdown-menu > li > a, + .navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-inverse .dropdown-menu > li > a:hover, + .navbar-inverse .dropdown-menu > .active > a, + .navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; + } + +.btn { + padding: 8px 12px; +} + +.btn-lg { + padding: 16px 20px; +} + +.btn-sm { + padding: 8px 12px; +} + +.btn-xs { + padding: 4px 6px; +} + +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} + +.btn-group .dropdown-menu { + border-top-width: 0; +} + +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} + +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; + } + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; + } + +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; + } + +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; + } + +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; + } + +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; + } + +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; + } + +.lead { + color: #6f6f6f; +} + +cite { + font-style: italic; +} + +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} + + blockquote.pull-right { + border-right-width: 1px; + } + + blockquote small { + font-size: 12px; + font-weight: 300; + } + +table { + font-size: 12px; +} + +label, +.control-label, +.help-block, +.checkbox, +.radio { + font-size: 12px; + font-weight: normal; +} + +input[type="radio"], +input[type="checkbox"] { + margin-top: 1px; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} + +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} + +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} + +.nav-pills { + font-weight: 300; +} + +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} + +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} + + .pagination > li > a, + .pagination > li > span { + margin-left: 4px; + color: #999999; + } + + .pagination > .active > a, + .pagination > .active > span { + color: #fff; + } + + .pagination > li > a, + .pagination > li:first-child > a, + .pagination > li:last-child > a, + .pagination > li > span, + .pagination > li:first-child > span, + .pagination > li:last-child > span { + border-radius: 3px; + } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding-left: 22px; + padding-right: 22px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 0 5px; +} + +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} + +.list-group { + font-size: 12px; + font-weight: 300; +} + +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} + + .close:hover, + .close:focus { + opacity: 1; + } + +.alert { + font-size: 12px; + font-weight: 300; +} + + .alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; + } + +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} + +.label-default { + background-color: #e7e7e7; + color: #333333; +} + +.badge { + font-weight: 300; +} + +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} + +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} + + .dropdown-menu > li > a { + padding: 12px 15px; + } + +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} + +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} + +.panel-heading, +.panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-default .close { + color: #222222; +} + +.modal .close { + color: #222222; +} diff --git a/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css b/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css new file mode 100644 index 000000000..2cc43b996 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Content/bootstrap.min.css @@ -0,0 +1,7584 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); /*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ /*! + * 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; + -ms-text-size-adjust: 100%; + -webkit-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 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, input, optgroup, select, textarea { + color: inherit; + font: inherit; + margin: 0; +} + +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 { + border: 0; + padding: 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-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + } + + input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +@media print { + *, *:before, *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #008cba; + text-decoration: none; +} + + a:hover, a:focus { + color: #008cba; + 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: 0; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + 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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-weight: 300; + 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: #999999; + } + +h1, .h1, h2, .h2, h3, .h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} + + 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: 10.5px; + margin-bottom: 10.5px; +} + + 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: 39px; +} + +h2, .h2 { + font-size: 32px; +} + +h3, .h3 { + font-size: 26px; +} + +h4, .h4 { + font-size: 19px; +} + +h5, .h5 { + font-size: 15px; +} + +h6, .h6 { + font-size: 13px; +} + +p { + margin: 0 0 10.5px; +} + +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} + +@media (min-width:768px) { + .lead { + font-size: 22.5px; + } +} + +small, .small { + font-size: 80%; +} + +mark, .mark { + background-color: #fcf8e3; + padding: .2em; +} + +.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: #999999; +} + +.text-primary { + color: #008cba; +} + +a.text-primary:hover, a.text-primary:focus { + color: #006687; +} + +.text-success { + color: #43ac6a; +} + +a.text-success:hover, a.text-success:focus { + color: #358753; +} + +.text-info { + color: #5bc0de; +} + +a.text-info:hover, a.text-info:focus { + color: #31b0d5; +} + +.text-warning { + color: #e99002; +} + +a.text-warning:hover, a.text-warning:focus { + color: #b67102; +} + +.text-danger { + color: #f04124; +} + +a.text-danger:hover, a.text-danger:focus { + color: #d32a0e; +} + +.bg-primary { + color: #fff; + background-color: #008cba; +} + +a.bg-primary:hover, a.bg-primary:focus { + background-color: #006687; +} + +.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: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} + +ul, ol { + margin-top: 0; + margin-bottom: 10.5px; +} + + ul ul, ol ul, ul ol, ol ol { + margin-bottom: 0; + } + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} + + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } + +dl { + margin-top: 0; + margin-bottom: 21px; +} + +dt, dd { + line-height: 1.4; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width:768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} + + 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.4; + color: #6f6f6f; + } + + blockquote footer:before, blockquote small:before, blockquote .small:before { + content: '\2014 \00A0'; + } + + .blockquote-reverse, blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; + } + + .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: 21px; + font-style: normal; + line-height: 1.4; +} + +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: 0; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.25); + box-shadow: inset 0 -1px 0 rgba(0,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: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} + + 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 { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +@media (min-width:768px) { + .container { + width: 750px; + } +} + +@media (min-width:992px) { + .container { + width: 970px; + } +} + +@media (min-width:1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +.row { + margin-left: -15px; + margin-right: -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-left: 15px; + padding-right: 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: #999999; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} + + .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.4; + vertical-align: top; + border-top: 1px solid #dddddd; + } + + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; + } + + .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 #dddddd; + } + + .table .table { + background-color: #ffffff; + } + +.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 #dddddd; +} + + .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 #dddddd; + } + + .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; + float: none; + display: table-column; +} + +table td[class*="col-"], table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.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 { + overflow-x: auto; + min-height: 0.01%; +} + +@media screen and (max-width:767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + + .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 { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + 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: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} + +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,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,0.075),0 0 8px rgba(102,175,233,0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6); + } + + .form-control::-moz-placeholder { + color: #999999; + opacity: 1; + } + + .form-control:-ms-input-placeholder { + color: #999999; + } + + .form-control::-webkit-input-placeholder { + color: #999999; + } + + .form-control::-ms-expand { + border: 0; + background-color: transparent; + } + + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + 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: 39px; + } + + 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: 36px; + } + + 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: 60px; + } +} + +.form-group { + margin-bottom: 15px; +} + +.radio, .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} + + .radio label, .checkbox label { + min-height: 21px; + 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-left: -20px; + margin-top: 4px; \9 + } + + .radio + .radio, .checkbox + .checkbox { + margin-top: -5px; + } + +.radio-inline, .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + 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 { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} + + .form-control-static.input-lg, .form-control-static.input-sm { + padding-left: 0; + padding-right: 0; + } + +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-sm { + height: 36px; + line-height: 36px; +} + +textarea.input-sm, select[multiple].input-sm { + height: auto; +} + +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.form-group-sm select.form-control { + height: 36px; + line-height: 36px; +} + +.form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { + height: auto; +} + +.form-group-sm .form-control-static { + height: 36px; + min-height: 33px; + padding: 9px 12px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-lg { + height: 60px; + line-height: 60px; +} + +textarea.input-lg, select[multiple].input-lg { + height: auto; +} + +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.form-group-lg select.form-control { + height: 60px; + line-height: 60px; +} + +.form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { + height: auto; +} + +.form-group-lg .form-control-static { + height: 60px; + min-height: 40px; + padding: 17px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.has-feedback { + position: relative; +} + + .has-feedback .form-control { + padding-right: 48.75px; + } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + 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: 60px; + height: 60px; + line-height: 60px; +} + +.input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} + +.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: #43ac6a; +} + +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1; + } + +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} + +.has-success .form-control-feedback { + color: #43ac6a; +} + +.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: #e99002; +} + +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53; + } + +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} + +.has-warning .form-control-feedback { + color: #e99002; +} + +.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: #f04124; +} + +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} + + .has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483; + } + +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} + +.has-error .form-control-feedback { + color: #f04124; +} + +.has-feedback label ~ .form-control-feedback { + top: 26px; +} + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} + +@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 { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} + +.form-horizontal .radio, .form-horizontal .checkbox { + min-height: 30px; +} + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} + +@media (min-width:768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} + +@media (min-width:768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 17px; + font-size: 19px; + } +} + +@media (min-width:768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + .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: #333333; + text-decoration: none; + } + + .btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + } + + .btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + } + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-default:focus, .btn-default.focus { + color: #333333; + background-color: #cecece; + border-color: #8c8c8c; + } + + .btn-default:hover { + color: #333333; + background-color: #cecece; + border-color: #adadad; + } + + .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + 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: #333333; + background-color: #bcbcbc; + 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: #e7e7e7; + border-color: #cccccc; + } + + .btn-default .badge { + color: #e7e7e7; + background-color: #333333; + } + +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} + + .btn-primary:focus, .btn-primary.focus { + color: #ffffff; + background-color: #006687; + border-color: #001921; + } + + .btn-primary:hover { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; + } + + .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: #ffffff; + background-color: #004b63; + border-color: #001921; + } + + .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: #008cba; + border-color: #0079a1; + } + + .btn-primary .badge { + color: #008cba; + background-color: #ffffff; + } + +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-success:focus, .btn-success.focus { + color: #ffffff; + background-color: #358753; + border-color: #183e26; + } + + .btn-success:hover { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; + } + + .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: #ffffff; + background-color: #2b6e44; + border-color: #183e26; + } + + .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: #43ac6a; + border-color: #3c9a5f; + } + + .btn-success .badge { + color: #43ac6a; + background-color: #ffffff; + } + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-info:focus, .btn-info.focus { + color: #ffffff; + background-color: #31b0d5; + border-color: #1b6d85; + } + + .btn-info:hover { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; + } + + .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { + color: #ffffff; + 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: #ffffff; + 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: #ffffff; + } + +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} + + .btn-warning:focus, .btn-warning.focus { + color: #ffffff; + background-color: #b67102; + border-color: #513201; + } + + .btn-warning:hover { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; + } + + .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: #ffffff; + background-color: #935b01; + border-color: #513201; + } + + .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: #e99002; + border-color: #d08002; + } + + .btn-warning .badge { + color: #e99002; + background-color: #ffffff; + } + +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-danger:focus, .btn-danger.focus { + color: #ffffff; + background-color: #d32a0e; + border-color: #731708; + } + + .btn-danger:hover { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; + } + + .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: #ffffff; + background-color: #b1240c; + border-color: #731708; + } + + .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: #f04124; + border-color: #ea2f10; + } + + .btn-danger .badge { + color: #f04124; + background-color: #ffffff; + } + +.btn-link { + color: #008cba; + font-weight: normal; + 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: #008cba; + 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: #999999; + text-decoration: none; + } + +.btn-lg, .btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.btn-xs, .btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +.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 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.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-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + +.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; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0,0,0,0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175); + box-shadow: 0 6px 12px rgba(0,0,0,0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + + .dropdown-menu.pull-right { + right: 0; + left: auto; + } + + .dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0,0,0,0.2); + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; + } + + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; + } + + .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; + } + + .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #999999; + } + + .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + cursor: not-allowed; + } + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} + +.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width:768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} + +.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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + +.btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + box-shadow: inset 0 3px 5px rgba(0,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-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .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-right-radius: 0; + border-top-left-radius: 0; + } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} + + .btn-group-justified > .btn, .btn-group-justified > .btn-group { + float: none; + display: table-cell; + 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-left: 0; + padding-right: 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: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} + +select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} + +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: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} + +select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} + +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: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} + + .input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; + } + + .input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; + } + + .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-bottom-right-radius: 0; + border-top-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-bottom-left-radius: 0; + border-top-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 { + margin-bottom: 0; + padding-left: 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: #eeeeee; + } + + .nav > li.disabled > a { + color: #999999; + } + + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } + + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; + } + + .nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; + } + + .nav > li > a > img { + max-width: none; + } + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + + .nav-tabs > li { + float: left; + margin-bottom: -1px; + } + + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; + } + + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; + } + + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; + } + + .nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; + } + + .nav-tabs.nav-justified > li { + float: none; + } + + .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; +} + +.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width:768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 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: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + + .nav-pills > li > a { + border-radius: 0; + } + + .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: #ffffff; + background-color: #008cba; + } + +.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 { + text-align: center; + margin-bottom: 5px; + } + + .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: 0; + } + + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; + } + +@media (min-width:768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} + +@media (min-width:768px) { + .navbar { + border-radius: 0; + } +} + +@media (min-width:768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + -webkit-overflow-scrolling: touch; +} + + .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-left: 0; + padding-right: 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; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} + + .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; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} + + .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: 6px -15px; +} + + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; + } + +@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: 21px; + } + + .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: 12px; + padding-bottom: 12px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1); + margin-top: 3px; + margin-bottom: 3px; +} + +@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; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} + + .navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; + } + + .navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; + } + +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} + +@media (min-width:768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 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: #333333; + border-color: #222222; +} + + .navbar-default .navbar-brand { + color: #ffffff; + } + + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-default .navbar-text { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + + .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + + .navbar-default .navbar-toggle { + border-color: transparent; + } + + .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-default .navbar-collapse, .navbar-default .navbar-form { + border-color: #222222; + } + + .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; + } + +@media (max-width:767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + + .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: #ffffff; + background-color: #272727; + } + + .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: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #ffffff; +} + + .navbar-default .navbar-link:hover { + color: #ffffff; + } + +.navbar-default .btn-link { + color: #ffffff; +} + + .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #ffffff; + } + + .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: #cccccc; + } + +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} + + .navbar-inverse .navbar-brand { + color: #ffffff; + } + + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + + .navbar-inverse .navbar-text { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + + .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + + .navbar-inverse .navbar-toggle { + border-color: transparent; + } + + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: transparent; + } + + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; + } + + .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #007196; + } + + .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; + } + +@media (max-width:767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + + .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: #ffffff; + background-color: #006687; + } + + .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: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #ffffff; +} + + .navbar-inverse .navbar-link:hover { + color: #ffffff; + } + +.navbar-inverse .btn-link { + color: #ffffff; +} + + .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #ffffff; + } + + .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: #444444; + } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} + + .breadcrumb > li { + display: inline-block; + } + + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; + } + + .breadcrumb > .active { + color: #333333; + } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} + + .pagination > li { + display: inline; + } + + .pagination > li > a, .pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; + } + + .pagination > li:first-child > a, .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + + .pagination > li:last-child > a, .pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + + .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { + z-index: 2; + color: #008cba; + background-color: #eeeeee; + border-color: transparent; + } + + .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: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; + } + + .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; + } + +.pagination-lg > li > a, .pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; +} + +.pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pagination-sm > li > a, .pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; +} + +.pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} + + .pager li { + display: inline; + } + + .pager li > a, .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; + } + + .pager li > a:hover, .pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + + .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: #999999; + background-color: transparent; + cursor: not-allowed; + } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +a.label:hover, a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + + .label-default[href]:hover, .label-default[href]:focus { + background-color: #808080; + } + +.label-primary { + background-color: #008cba; +} + + .label-primary[href]:hover, .label-primary[href]:focus { + background-color: #006687; + } + +.label-success { + background-color: #43ac6a; +} + + .label-success[href]:hover, .label-success[href]:focus { + background-color: #358753; + } + +.label-info { + background-color: #5bc0de; +} + + .label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; + } + +.label-warning { + background-color: #e99002; +} + + .label-warning[href]:hover, .label-warning[href]:focus { + background-color: #b67102; + } + +.label-danger { + background-color: #f04124; +} + + .label-danger[href]:hover, .label-danger[href]:focus { + background-color: #d32a0e; + } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #008cba; + 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: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} + +.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: #fafafa; +} + + .jumbotron h1, .jumbotron .h1 { + color: inherit; + } + + .jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; + } + + .jumbotron > hr { + border-top-color: #e1e1e1; + } + +.container .jumbotron, .container-fluid .jumbotron { + border-radius: 0; + padding-left: 15px; + padding-right: 15px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + + .jumbotron h1, .jumbotron .h1 { + font-size: 68px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -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-left: auto; + margin-right: auto; + } + +a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { + border-color: #008cba; +} + +.thumbnail .caption { + padding: 9px; + color: #222222; +} + +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} + + .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 { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} + + .alert-success hr { + border-top-color: #358753; + } + + .alert-success .alert-link { + color: #e6e6e6; + } + +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} + + .alert-info hr { + border-top-color: #2aabd2; + } + + .alert-info .alert-link { + color: #e6e6e6; + } + +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} + + .alert-warning hr { + border-top-color: #b67102; + } + + .alert-warning .alert-link { + color: #e6e6e6; + } + +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} + + .alert-danger hr { + border-top-color: #d32a0e; + } + + .alert-danger .alert-link { + color: #e6e6e6; + } + +@-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 { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); + box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15); + box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, .progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.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: #43ac6a; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.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,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #e99002; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #f04124; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} + + .media:first-child { + margin-top: 0; + } + +.media, .media-body { + zoom: 1; + overflow: hidden; +} + +.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 { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + + .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + } + + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + +a.list-group-item, button.list-group-item { + color: #555555; +} + + a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { + color: #333333; + } + + a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { + text-decoration: none; + color: #555555; + 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 { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} + + .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: #999999; + } + +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} + + .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: #87e1ff; + } + +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} + +a.list-group-item-success, button.list-group-item-success { + color: #43ac6a; +} + + 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: #43ac6a; + 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: #43ac6a; + border-color: #43ac6a; + } + +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} + +a.list-group-item-info, button.list-group-item-info { + color: #5bc0de; +} + + 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: #5bc0de; + 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: #5bc0de; + border-color: #5bc0de; + } + +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} + +a.list-group-item-warning, button.list-group-item-warning { + color: #e99002; +} + + 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: #e99002; + 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: #e99002; + border-color: #e99002; + } + +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} + +a.list-group-item-danger, button.list-group-item-danger { + color: #f04124; +} + + 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: #f04124; + 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: #f04124; + border-color: #f04124; + } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05); + box-shadow: 0 1px 1px rgba(0,0,0,0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} + + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; + } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + 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 #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} + +.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-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-bottom-left-radius: -1; + } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-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-left: 15px; + padding-right: 15px; + } + + .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; + } + + .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: -1; + border-top-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; + } + + .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-left-radius: -1; + border-bottom-right-radius: -1; + } + + .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: -1; + } + + .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: -1; + } + + .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; + } + + .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 { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 21px; +} + + .panel-group .panel { + margin-bottom: 0; + border-radius: 0; + } + + .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 #dddddd; + } + + .panel-group .panel-footer { + border-top: 0; + } + + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; + } + +.panel-default { + border-color: #dddddd; +} + + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; + } + + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; + } + + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; + } + + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; + } + +.panel-primary { + border-color: #008cba; +} + + .panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; + } + + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; + } + + .panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; + } + + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; + } + +.panel-success { + border-color: #3c9a5f; +} + + .panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; + } + + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; + } + + .panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; + } + + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; + } + +.panel-info { + border-color: #3db5d8; +} + + .panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; + } + + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; + } + + .panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; + } + + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; + } + +.panel-warning { + border-color: #d08002; +} + + .panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; + } + + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; + } + + .panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; + } + + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; + } + +.panel-danger { + border-color: #ea2f10; +} + + .panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; + } + + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; + } + + .panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; + } + + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; + } + +.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; + left: 0; + bottom: 0; + height: 100%; + width: 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: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); +} + + .well blockquote { + border-color: #ddd; + border-color: rgba(0,0,0,0.15); + } + +.well-lg { + padding: 24px; + border-radius: 0; +} + +.well-sm { + padding: 9px; + border-radius: 0; +} + +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + + .close:hover, .close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} + + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + } + + .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: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0,0,0,0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5); + box-shadow: 0 3px 9px rgba(0,0,0,0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); + } + + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); + } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + + .modal-header .close { + margin-top: -2px; + } + +.modal-title { + margin: 0; + line-height: 1.4; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; + } + + .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,0.5); + box-shadow: 0 5px 15px rgba(0,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: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} + + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); + } + + .tooltip.top { + margin-top: -3px; + padding: 5px 0; + } + + .tooltip.right { + margin-left: 3px; + padding: 0 5px; + } + + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; + } + + .tooltip.left { + margin-left: -3px; + padding: 0 5px; + } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + background-color: #333333; + border-radius: 0; +} + +.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: #333333; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.4; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 15px; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2); + box-shadow: 0 5px 10px rgba(0,0,0,0.2); +} + + .popover.top { + margin-top: -10px; + } + + .popover.right { + margin-left: 10px; + } + + .popover.bottom { + margin-top: 10px; + } + + .popover.left { + margin-left: -10px; + } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 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 { + border-width: 10px; + content: ""; + } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0,0,0,0.05); + bottom: -11px; +} + + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; + } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0,0,0,0.05); +} + + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; + } + +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0,0,0,0.05); + top: -11px; +} + + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; + } + +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0,0,0,0.05); +} + + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; + } + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} + + .carousel-inner > .item { + display: none; + position: relative; + -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 { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 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; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0,0,0,0.6); + background-color: rgba(0,0,0,0); +} + + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001))); + background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + } + + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5))); + background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + } + + .carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); + } + + .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + + .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; + line-height: 1; + font-family: serif; + } + + .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%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} + + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0,0,0,0); + } + + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; + } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0,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 { + left: 20%; + right: 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 { + content: " "; + display: table; +} + +.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-left: auto; + margin-right: 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; + } +} + +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} + + .navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; + } + +.navbar-collapse { + border-top-color: rgba(0,0,0,0.2); + -webkit-box-shadow: none; + box-shadow: none; +} + +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} + +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} + + .navbar-form .form-control { + height: auto; + padding: 4px 6px; + } + +.navbar-text { + margin: 12px 15px; + line-height: 21px; +} + +.navbar .dropdown-menu { + border: none; +} + + .navbar .dropdown-menu > li > a, .navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; + } + +.navbar .dropdown-header { + color: rgba(255,255,255,0.5); +} + +.navbar-default .dropdown-menu { + background-color: #333333; +} + + .navbar-default .dropdown-menu > li > a, .navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-default .dropdown-menu > li > a:hover, .navbar-default .dropdown-menu > .active > a, .navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; + } + +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} + + .navbar-inverse .dropdown-menu > li > a, .navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; + } + + .navbar-inverse .dropdown-menu > li > a:hover, .navbar-inverse .dropdown-menu > .active > a, .navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; + } + +.btn { + padding: 8px 12px; +} + +.btn-lg { + padding: 16px 20px; +} + +.btn-sm { + padding: 8px 12px; +} + +.btn-xs { + padding: 4px 6px; +} + +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} + +.btn-group .dropdown-menu { + border-top-width: 0; +} + +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} + +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; + } + + .btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; + } + +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; + } + +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; + } + +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; + } + +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; + } + +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; + } + + .btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; + } + +.lead { + color: #6f6f6f; +} + +cite { + font-style: italic; +} + +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} + + blockquote.pull-right { + border-right-width: 1px; + } + + blockquote small { + font-size: 12px; + font-weight: 300; + } + +table { + font-size: 12px; +} + +label, .control-label, .help-block, .checkbox, .radio { + font-size: 12px; + font-weight: normal; +} + +input[type="radio"], input[type="checkbox"] { + margin-top: 1px; +} + +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + border-color: transparent; +} + +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} + +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} + +.nav-pills { + font-weight: 300; +} + +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} + +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} + + .pagination > li > a, .pagination > li > span { + margin-left: 4px; + color: #999999; + } + + .pagination > .active > a, .pagination > .active > span { + color: #fff; + } + + .pagination > li > a, .pagination > li:first-child > a, .pagination > li:last-child > a, .pagination > li > span, .pagination > li:first-child > span, .pagination > li:last-child > span { + border-radius: 3px; + } + +.pagination-lg > li > a, .pagination-lg > li > span { + padding-left: 22px; + padding-right: 22px; +} + +.pagination-sm > li > a, .pagination-sm > li > span { + padding: 0 5px; +} + +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} + +.list-group { + font-size: 12px; + font-weight: 300; +} + +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} + + .close:hover, .close:focus { + opacity: 1; + } + +.alert { + font-size: 12px; + font-weight: 300; +} + + .alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; + } + +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} + +.label-default { + background-color: #e7e7e7; + color: #333333; +} + +.badge { + font-weight: 300; +} + +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} + +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} + + .dropdown-menu > li > a { + padding: 12px 15px; + } + +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} + +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} + +.panel-heading, .panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-default .close { + color: #222222; +} + +.modal .close { + color: #222222; +} diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 b/samples/Samples.Mvc5.Oracle/Content/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs b/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs new file mode 100644 index 000000000..518dde96e --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Controllers/BaseController.cs @@ -0,0 +1,113 @@ +using System; +using System.Data.Common; +using System.Web.Mvc; + +using StackExchange.Profiling; + +namespace Samples.Mvc5.Controllers +{ + /// + /// The base controller. + /// + public abstract class BaseController : Controller + { + /// + /// keep track of the profiler to dispose it. + /// + private IDisposable _resultExecutingToExecuted; + + /// + /// Returns an open connection that will have its queries profiled. + /// + /// The mini profiler. + /// the data connection abstraction. + public static DbConnection GetConnection(MiniProfiler profiler = null) + { + using (profiler.Step("GetOpenConnection")) + { + DbConnection cnn = new Oracle.ManagedDataAccess.Client.OracleConnection(MvcApplication.ConnectionString); + + // to get profiling times, we have to wrap whatever connection we're using in a ProfiledDbConnection + // when MiniProfiler.Current is null, this connection will not record any database timings + if (MiniProfiler.Current != null) + { + cnn = new StackExchange.Profiling.Data.ProfiledDbConnection(cnn, MiniProfiler.Current); + } + + cnn.Open(); + return cnn; + } + } + + /// + /// on action executing. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnActionExecuting(ActionExecutingContext filterContext) + { + var profiler = MiniProfiler.Current; + + using (profiler.Step("OnActionExecuting")) + { + //UpsertRouteHit(filterContext.ActionDescriptor, profiler); + base.OnActionExecuting(filterContext); + } + } + + /// + /// on result executing. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnResultExecuting(ResultExecutingContext filterContext) + { + _resultExecutingToExecuted = MiniProfiler.Current.Step("OnResultExecuting"); + + base.OnResultExecuting(filterContext); + } + + /// + /// on result executed. + /// demonstrate using a base controller to intercept actions as they are executed. + /// + /// The filter context. + protected override void OnResultExecuted(ResultExecutedContext filterContext) + { + _resultExecutingToExecuted?.Dispose(); + + base.OnResultExecuted(filterContext); + } + + ///// + ///// The UPSERT route hit. + ///// demonstrate using a base controller to intercept actions as they are executed. + ///// + ///// The action description. + ///// The profiler. + //private void UpsertRouteHit(ActionDescriptor actionDesc, MiniProfiler profiler) + //{ + // var routeName = actionDesc.ControllerDescriptor.ControllerName + "/" + actionDesc.ActionName; + + // using (var conn = GetConnection(profiler)) + // { + // var param = new { routeName }; + + // using (profiler.Step("Insert RouteHits")) + // { + // conn.Execute("insert or ignore into RouteHits (RouteName, HitCount) values (@routeName, 0)", param); + // } + // using (profiler.Step("Update RouteHits")) + // { + // // let's put some whitespace in this query to demonstrate formatting + // // i might have broken this with the tabs (jim - 2013-01-08) + // conn.Execute( + // @"update RouteHits + // set HitCount = HitCount + 1 + // where RouteName = @routeName", + // param); + // } + // } + //} + } +} diff --git a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs new file mode 100644 index 000000000..b28e418ac --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs @@ -0,0 +1,457 @@ +using System; +using System.Data.Common; +using System.Linq; +using System.Threading; +using System.Web.Mvc; +using Dapper; +using StackExchange.Profiling; +using StackExchange.Profiling.Data; + +using Samples.Mvc5.EFCodeFirst; +using Samples.Mvc5.Helpers; +using System.Collections.Generic; + +namespace Samples.Mvc5.Controllers +{ + public class HomeController : BaseController + { + /// + /// enable the profiling UI. + /// + /// enable profiling the UI + public ActionResult EnableProfilingUI() + { + MvcApplication.DisableProfilingResults = false; + return Redirect("/"); + } + + /// + /// disable the profiling UI. + /// + /// disable profiling the UI + public ActionResult DisableProfilingUI() + { + MvcApplication.DisableProfilingResults = true; + return Redirect("/"); + } + + /// + /// the default view, home page, top right orientation. + /// + public ActionResult Index() => HomeWithPosition(RenderPosition.Right); + + /// + /// the default view, home page, top left orientation. + /// + public ActionResult TopLeft() => HomeWithPosition(RenderPosition.Left); + + /// + /// the default view, home page, bottom left orientation. + /// + public ActionResult BottomLeft() => HomeWithPosition(RenderPosition.BottomLeft); + + /// + /// the default view, home page, bottom right orientation. + /// + public ActionResult BottomRight() => HomeWithPosition(RenderPosition.BottomRight); + + private ActionResult HomeWithPosition(RenderPosition pos) + { + DefaultActions(); + ViewBag.Orientation = pos; + return View("Index"); + } + + /// + /// Runs the default actions used on all Index views (default, and bottom left/right) + /// + private void DefaultActions() + { + var profiler = MiniProfiler.Current; + + // test out using storage for this one request. Only store in SqlLite, not in httpCache + //profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); + + using (profiler.Step("Set page title")) + { + ViewBag.Title = "Home Page"; + } + + using (profiler.Step("Doing complex stuff")) + { + using (profiler.Step("Step A")) + { + // simulate fetching a url + using (profiler.CustomTiming("http", "GET http://google.com")) + { + Thread.Sleep(10); + } + } + using (profiler.Step("Step B")) + { + // simulate fetching a url + using (profiler.CustomTiming("http", "GET http://stackoverflow.com")) + { + Thread.Sleep(20); + } + + using (profiler.CustomTiming("redis", "SET \"mykey\" 10")) + { + Thread.Sleep(5); + } + } + } + + // now something that loops + for (int i = 0; i < 15; i++) + { + using (profiler.CustomTiming("redis", "SET \"mykey\" 10")) + { + Thread.Sleep(i); + } + } + + // let's also add a custom link to stack overflow! + profiler.AddCustomLink("stack overflow", "http://stackoverflow.com"); + } + + /// + /// about view. + /// + /// the about view (default) + /// this view is not profiled. + public ActionResult About() + { + // prevent this specific route from being profiled + MiniProfiler.Current?.Stop(true); + + return View(); + } + + /// + /// results authorization. + /// + /// The . + public ActionResult ResultsAuthorization() => View(); + + /// + /// fetch the route hits. + /// + /// the view of route hits. + public ActionResult FetchRouteHits() + { + try + { + var profiler = MiniProfiler.Current; + + using (profiler.Step("Insert Route Row")) + using (var conn = GetConnection(profiler)) + { + conn.Execute("INSERT INTO RouteHits (RouteName, HitCount) VALUES (:RouteName, :HitCount)", new {RouteName = Request.Url.AbsoluteUri, HitCount = new Random().Next(100, 400)}); + } + + using (profiler.Step("Do more complex stuff")) + { + Thread.Sleep(new Random().Next(100, 400)); + } + + using (profiler.Step("FetchRouteHits")) + using (var conn = GetConnection(profiler)) + { + var result = conn.Query("select RouteName, HitCount from RouteHits order by RouteName"); + return Json(result, JsonRequestBehavior.AllowGet); + } + } + catch (Exception ex) + { + return Json(new List { ex.Message, ex.StackTrace }, JsonRequestBehavior.AllowGet); + } + } + + public ActionResult MinSaveMs() + { + var profiler = MiniProfiler.Current; + + using (profiler.StepIf("Should show up", 50)) + { + Thread.Sleep(60); + } + using (profiler.StepIf("Should not show up", 50)) + { + Thread.Sleep(10); + } + + using (profiler.StepIf("Show show up with children", 10, true)) + { + Thread.Sleep(5); + using (profiler.Step("Step A")) + { + Thread.Sleep(10); + } + using (profiler.Step("Step B")) + { + Thread.Sleep(10); + } + using (profiler.StepIf("Should not show up", 15)) + { + Thread.Sleep(10); + } + } + + using (profiler.StepIf("Show Not show up with children", 10)) + { + Thread.Sleep(5); + using (profiler.Step("Step A")) + { + Thread.Sleep(10); + } + using (profiler.Step("Step B")) + { + Thread.Sleep(10); + } + } + + using (profiler.CustomTimingIf("redis", "should show up", 5)) + { + Thread.Sleep(10); + } + + using (profiler.CustomTimingIf("redis", "should not show up", 15)) + { + Thread.Sleep(10); + } + return Content("All good"); + } + + /// + /// The EF code first. + /// + /// the entity framework code first view. + public ActionResult EFCodeFirst() + { + int count; + int? newCount = null; + + EFContext context = null; + using (MiniProfiler.Current.Step("EF Stuff")) + { + try + { + using (MiniProfiler.Current.Step("Create Context")) + context = new EFContext(MvcApplication.ConnectionString); + + // this is not correct, as the count from this assignment is never actually used + using (MiniProfiler.Current.Step("First count")) + count = context.People.Count(); + + using (MiniProfiler.Current.Step("Insertion")) + { + var p = new Person { Name = "Fernando" }; + context.People.Add(p); + context.SaveChanges(); + } + + // this count is actually used. + using (MiniProfiler.Current.Step("Second count")) + count = context.People.Count(); + + const string sql = "Select count(*) from \"People\""; + using (MiniProfiler.Current.Step("Get Count from SqlQuery Method - no sql recorded")) + { + newCount = context.Database.SqlQuery(sql).Single(); + } + using (MiniProfiler.Current.Step("Get Count using ProfiledConnection - sql recorded")) + { + using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) + { + conn.Open(); + newCount = conn.Query(sql).Single(); + conn.Close(); + } + } + + return Content(string.Format("EF Code First complete - count: {0}, sqlQuery count {1}", count, newCount)); + } + catch (Exception ex) + { + return Content($"EF Code First Error: {ex}"); + } + finally + { + context?.Dispose(); + } + } + } + + /// + /// duplicated queries. + /// + /// duplicated query demonstration + public ActionResult DuplicatedQueries() + { + using (var conn = GetConnection()) + { + long total = 0; + + for (int i = 0; i < 20; i++) + { + total += conn.Query("select count(1) from RouteHits where HitCount = :i", new { i }).First(); + } + return Content(string.Format("Duplicated Queries (N+1) completed {0}", total)); + } + } + + /// + /// test a massive nesting. + /// + /// the result view of the massive nesting. + public ActionResult MassiveNesting() + { + var i = 0; + using (var conn = GetConnection()) + { + RecursiveMethod(ref i, conn, MiniProfiler.Current); + } + return Content("Massive Nesting completed"); + } + + /// + /// The second massive nesting. + /// + /// the second massive nesting view + public ActionResult MassiveNesting2() + { + for (int i = 0; i < 6; i++) + { + MassiveNesting(); + } + return Content("Massive Nesting 2 completed"); + } + + /// + /// demonstrate a recursive method. + /// + /// recursion depth + /// the connection + /// The profiler. + private void RecursiveMethod(ref int depth, DbConnection connection, MiniProfiler profiler) + { + Thread.Sleep(5); // ensure we show up in the profiler + + if (depth >= 10) return; + + using (profiler.Step("Nested call " + depth)) + { + // run some meaningless queries to illustrate formatting + connection.Query( + @"select * + from MiniProfilers + where DurationMilliseconds >= :duration + or Started > :yesterday", + new + { + name = "Home/Index", + duration = 100.5, + yesterday = DateTime.UtcNow.AddDays(-1) + }); + + connection.Query("select RouteName, HitCount from RouteHits where HitCount < 100000000 or HitCount > 0 order by HitCount, RouteName -- this should hopefully wrap"); + + // massive query to test if max-height is properly removed from
 stylings
+                connection.Query(
+                        @"select *
+                        from   (select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 0 and 9
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 10 and 19
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 20 and 29
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 30 and 39
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 40 and 49
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 50 and 59
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 60 and 69
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 70 and 79
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 80 and 89
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount between 90 and 99
+                                union all
+                                select RouteName,
+                                       HitCount
+                                from   RouteHits
+                                where  HitCount > 100)
+                        order  by RouteName");
+
+                // need a long title to test max-width
+                using (profiler.Step("Incrementing a reference parameter named i"))
+                {
+                    depth++;
+                }
+                RecursiveMethod(ref depth, connection, profiler);
+            }
+        }
+
+        /// 
+        /// route hit.
+        /// 
+        public class RouteHit
+        {
+            /// 
+            /// Gets or sets the route name.
+            /// 
+            public string RouteName { get; set; }
+
+            /// 
+            /// Gets or sets the hit count.
+            /// 
+            public long HitCount { get; set; }
+        }
+
+        /// 
+        /// The parameterized SQL with enumerations.
+        /// 
+        /// The .
+        public ActionResult ParameterizedSqlWithEnums()
+        {
+            using (var conn = GetConnection())
+            {
+                var shouldBeOne = conn.Query("select 1 from dual where :OK = 200", new { System.Net.HttpStatusCode.OK }).Single();
+                return Content("Parameterized SQL with Enums completed: " + shouldBeOne);
+            }
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs
new file mode 100644
index 000000000..c396f6fc4
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs
@@ -0,0 +1,25 @@
+namespace Samples.Mvc5.EFCodeFirst
+{
+    using System.Data.Entity;
+
+    /// 
+    /// The EF context.
+    /// 
+    public class EFContext : DbContext
+    {
+        public EFContext(string connectionString) : base(connectionString)
+        {
+        }
+
+        protected override void OnModelCreating(DbModelBuilder modelBuilder)
+        {
+            modelBuilder.HasDefaultSchema("VH4DB");
+            base.OnModelCreating(modelBuilder);
+        }
+
+        /// 
+        /// Gets or sets the people.
+        /// 
+        public DbSet People { get; set; }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs
new file mode 100644
index 000000000..826ab42ae
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs
@@ -0,0 +1,20 @@
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Samples.Mvc5.EFCodeFirst
+{
+    /// 
+    /// The person.
+    /// 
+    public class Person
+    {
+        /// 
+        /// Gets or sets the id.
+        /// 
+        public int Id { get; set; }
+
+        /// 
+        /// Gets or sets the name.
+        /// 
+        public string Name { get; set; }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Global.asax b/samples/Samples.Mvc5.Oracle/Global.asax
new file mode 100644
index 000000000..71f57b15d
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Global.asax
@@ -0,0 +1 @@
+<%@ Application Codebehind="Global.asax.cs" Inherits="Samples.Mvc5.MvcApplication" Language="C#" %>
diff --git a/samples/Samples.Mvc5.Oracle/Global.asax.cs b/samples/Samples.Mvc5.Oracle/Global.asax.cs
new file mode 100644
index 000000000..574bfd180
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Global.asax.cs
@@ -0,0 +1,155 @@
+using System;
+using System.IO;
+using System.Web;
+using System.Web.Mvc;
+using System.Web.Optimization;
+using System.Web.Routing;
+
+using StackExchange.Profiling;
+using StackExchange.Profiling.EntityFramework6;
+using StackExchange.Profiling.Mvc;
+using StackExchange.Profiling.Storage;
+using Samples.Mvc5.Helpers;
+using Oracle.ManagedDataAccess.Client;
+using System.Configuration;
+
+namespace Samples.Mvc5
+{
+    public class MvcApplication : HttpApplication
+    {
+        /// 
+        /// Gets the connection string.
+        /// 
+        public static string ConnectionString;
+
+        protected void Application_Start()
+        {
+            ConnectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString;
+
+            AreaRegistration.RegisterAllAreas();
+
+            // Note: ProfilingActionFilter is added in the FilterConfig
+            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
+            RouteConfig.RegisterRoutes(RouteTable.Routes);
+            BundleConfig.RegisterBundles(BundleTable.Bundles);
+
+            InitProfilerSettings();
+        }
+
+        /// 
+        /// The application begin request event.
+        /// 
+        protected void Application_BeginRequest()
+        {
+            MiniProfiler profiler = null;
+
+            // might want to decide here (or maybe inside the action) whether you want
+            // to profile this request - for example, using an "IsSystemAdmin" flag against
+            // the user, or similar; this could also all be done in action filters, but this
+            // is simple and practical; just return null for most users. For our test, we'll
+            // profile only for local requests (seems reasonable)
+            if (Request.IsLocal)
+            {
+                profiler = MiniProfiler.StartNew();
+            }
+
+            using (profiler.Step("Application_BeginRequest"))
+            {
+                // you can start profiling your code immediately
+            }
+        }
+
+        /// 
+        /// The application end request.
+        /// 
+        protected void Application_EndRequest()
+        {
+            MiniProfiler.Current?.Stop();
+        }
+
+        /// 
+        /// Gets or sets a value indicating whether disable profiling results.
+        /// 
+        public static bool DisableProfilingResults { get; set; }
+
+        /// 
+        /// Customize aspects of the MiniProfiler.
+        /// 
+        private void InitProfilerSettings()
+        {
+            // A powerful feature of the MiniProfiler is the ability to share links to results with other developers.
+            // by default, however, long-term result caching is done in HttpRuntime.Cache, which is very volatile.
+            // 
+            // Let's rig up serialization of our profiler results to a database, so they survive app restarts.
+            MiniProfiler.Configure(new MiniProfilerOptions
+            {
+                // Sets up the route to use for MiniProfiler resources:
+                // Here, ~/profiler is used for things like /profiler/mini-profiler-includes.js)
+                RouteBasePath = "~/profiler",
+
+                // Setting up a MultiStorage provider. This will store results in the MemoryCacheStorage (normally the default) and in SqlLite as well.
+                //Storage = new MultiStorageProvider(
+                //    new MemoryCacheStorage(new TimeSpan(1, 0, 0)),
+                //    // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control.
+                //    new OracleStorage(ConnectionString)  // OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null)", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null)")
+                //    ),
+
+                // Different RDBMS have different ways of declaring sql parameters - SQLite can understand inline sql parameters just fine.
+                // By default, sql parameters will be displayed.
+                //SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(),
+
+                // These settings are optional and all have defaults, any matching setting specified in .RenderIncludes() will
+                // override the application-wide defaults specified here, for example if you had both:
+                //    PopupRenderPosition = RenderPosition.Right;
+                //    and in the page:
+                //    @MiniProfiler.Current.RenderIncludes(position: RenderPosition.Left)
+                // ...then the position would be on the left on that page, and on the right (the application default) for anywhere that doesn't
+                // specified position in the .RenderIncludes() call.
+                PopupRenderPosition = RenderPosition.Right,  // defaults to left
+                PopupMaxTracesToShow = 10,                   // defaults to 15
+
+                // ResultsAuthorize (optional - open to all by default):
+                // because profiler results can contain sensitive data (e.g. sql queries with parameter values displayed), we
+                // can define a function that will authorize clients to see the JSON or full page results.
+                // we use it on http://stackoverflow.com to check that the request cookies belong to a valid developer.
+                ResultsAuthorize = request =>
+                {
+                    // you may implement this if you need to restrict visibility of profiling on a per request basis
+
+                    // for example, for this specific path, we'll only allow profiling if a query parameter is set
+                    if ("/Home/ResultsAuthorization".Equals(request.Url.LocalPath, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return (request.Url.Query).IndexOf("isauthorized", StringComparison.OrdinalIgnoreCase) >= 0;
+                    }
+
+                    // all other paths can check our global switch
+                    return !DisableProfilingResults;
+                },
+
+                // ResultsListAuthorize (optional - open to all by default)
+                // the list of all sessions in the store is restricted by default, you must return true to allow it
+                ResultsListAuthorize = request =>
+                {
+                    // you may implement this if you need to restrict visibility of profiling lists on a per request basis 
+                    return true; // all requests are legit in our happy world
+                },
+
+                // Stack trace settings
+                StackMaxLength = 256, // default is 120 characters
+
+                // (Optional) You can disable "Connection Open()", "Connection Close()" (and async variant) tracking.
+                // (defaults to true, and connection opening/closing is tracked)
+                TrackConnectionOpenClose = true
+        }
+            // Optional settings to control the stack trace output in the details pane
+            .ExcludeType("SessionFactory")  // Ignore any class with the name of SessionFactory)
+            .ExcludeAssembly("NHibernate")  // Ignore any assembly named NHibernate
+            .ExcludeMethod("Flush")         // Ignore any method with the name of Flush
+            .AddViewProfiling()              // Add MVC view profiling
+            );
+
+            MiniProfilerEF6.Initialize();
+            MiniProfiler.DefaultOptions.Storage = new OracleStorage(ConnectionString);
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs
new file mode 100644
index 000000000..7cb243c37
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Dapper;
+using Oracle.ManagedDataAccess.Client;
+using StackExchange.Profiling.Storage;
+
+namespace Samples.Mvc5.Helpers
+{
+    /// 
+    /// The SQLITE mini profiler storage.
+    /// 
+    public class OracleMiniProfilerStorage : OracleStorage
+    {
+        /// 
+        /// Initializes a new instance of the  class.
+        /// 
+        /// The connection string.
+        public OracleMiniProfilerStorage(string connectionString) : base(connectionString)
+        {
+        }
+
+        /// 
+        /// Get the Connection.
+        /// 
+        /// The Abstracted Connection
+        protected override System.Data.Common.DbConnection GetConnection() =>
+            new OracleConnection(ConnectionString);
+
+        /// 
+        /// Used for testing purposes - destroys and recreates the SQLITE file with needed tables.
+        /// 
+        /// The Extra Tables To Create.
+        public OracleMiniProfilerStorage RecreateDatabase(params string[] extraTablesToCreate)
+        {
+            using (var cnn = GetConnection())
+            {
+                // We need some tiny mods to allow SQLite support 
+                foreach (var sql in TableCreationScripts.Union(extraTablesToCreate))
+                {
+                    cnn.Execute(sql);
+                }
+            }
+            return this;
+        }
+    }
+}
diff --git a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..61db7b69c
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+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: AssemblyTitle("WebApplication1")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("WebApplication1")]
+[assembly: AssemblyCopyright("Copyright ©  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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("cb089b96-b68a-4283-a0c3-f50c4483270c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj
new file mode 100644
index 000000000..3c7f85c6d
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj
@@ -0,0 +1,233 @@
+
+  
+  
+  
+  
+  
+    Debug
+    AnyCPU
+    
+    
+    2.0
+    {CB089B96-B68A-4283-A0C3-F50C4483270C}
+    {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+    Library
+    Properties
+    Samples.Mvc5
+    Samples.Mvc5
+    v4.6.2
+    true
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    true
+    full
+    false
+    bin\
+    DEBUG;TRACE
+    prompt
+    4
+  
+  
+    true
+    pdbonly
+    true
+    bin\
+    TRACE
+    prompt
+    4
+  
+  
+    
+      ..\..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll
+    
+    
+      ..\..\packages\Dapper.StrongName.1.50.2\lib\net451\Dapper.StrongName.dll
+    
+    
+      ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll
+    
+    
+      ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.SqlServer.dll
+    
+    
+      ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
+    
+    
+    
+      ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
+    
+    
+      ..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll
+    
+    
+      ..\..\packages\Oracle.ManagedDataAccess.Core.2.19.70\lib\netstandard2.0\Oracle.ManagedDataAccess.dll
+    
+    
+      ..\..\packages\Oracle.ManagedDataAccess.EntityFramework.12.2.1100\lib\net45\Oracle.ManagedDataAccess.EntityFramework.dll
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll
+    
+    
+      ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      ..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+      Global.asax
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      Web.config
+    
+    
+      Web.config
+    
+  
+  
+    
+  
+  
+    
+      {4dfa7ad2-fcae-44db-af5c-f26aba93dbdc}
+      MiniProfiler.EF6
+    
+    
+      {074bcd84-3e44-4140-9918-c09fcbeec09f}
+      MiniProfiler.Mvc5
+    
+    
+      {a14f7769-55e7-4045-b653-ec4dd44c339c}
+      MiniProfiler.Providers.Oracle
+    
+    
+      {ba40a569-bee2-4e39-80a7-763bc15a9077}
+      MiniProfiler.Shared
+    
+    
+      {386222bd-6b6e-480f-a342-8de1ab516e2c}
+      MiniProfiler
+    
+  
+  
+    10.0
+    $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+  
+  
+  
+  
+  
+    
+      
+        
+          True
+          True
+          16761
+          /
+          http://localhost:16761/
+          True
+          http://localhost:16761/
+          False
+          False
+          
+          
+          False
+        
+      
+    
+  
+  
+    
+      This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+    
+    
+    
+    
+    
+  
+  
+  
+
\ No newline at end of file
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/_references.js b/samples/Samples.Mvc5.Oracle/Scripts/_references.js
new file mode 100644
index 000000000..f7a693e4c
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/_references.js
@@ -0,0 +1,2 @@
+/// 
+/// 
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js
new file mode 100644
index 000000000..8a2e99a53
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.js
@@ -0,0 +1,2377 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.7
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.7
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.7'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector === '#' ? [] : selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.7
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.7'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d).prop(d, true)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d).prop(d, false)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target).closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
+        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
+        e.preventDefault()
+        // The target component still receive the focus
+        if ($btn.is('input,button')) $btn.trigger('focus')
+        else $btn.find('input:visible,button:visible').first().trigger('focus')
+      }
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.7
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.7'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.7
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+/* jshint latedef: false */
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.7'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.7
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.7'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger($.Event('shown.bs.dropdown', relatedTarget))
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.7
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options             = options
+    this.$body               = $(document.body)
+    this.$element            = $(element)
+    this.$dialog             = this.$element.find('.modal-dialog')
+    this.$backdrop           = null
+    this.isShown             = null
+    this.originalBodyPad     = null
+    this.scrollbarWidth      = 0
+    this.ignoreBackdropClick = false
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.7'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (document !== e.target &&
+            this.$element[0] !== e.target &&
+            !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.7
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.7'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (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!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
+        that.$element
+          .removeAttr('aria-describedby')
+          .trigger('hidden.bs.' + that.type)
+      }
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var isSvg = window.SVGElement && el instanceof window.SVGElement
+    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
+    // See https://github.com/twbs/bootstrap/issues/20280
+    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+      that.$element = null
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.7
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.7'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: ''
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.7
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.7'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.7
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.3.7'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.7
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.7'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js
new file mode 100644
index 000000000..9bcd2fcca
--- /dev/null
+++ b/samples/Samples.Mvc5.Oracle/Scripts/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)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/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml new file mode 100644 index 000000000..594a59cd0 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/About.cshtml @@ -0,0 +1,18 @@ +@{ + ViewBag.Title = "About Us"; +} +
+ +

+ We explictly stopped profiling on this route: +

public ActionResult About()
+{
+    // prevent this specific route from being profiled
+    MiniProfiler.Stop(discardResults: true);
+
+    return View();
+}
+

+
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml new file mode 100644 index 000000000..0e683071a --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/Index.cshtml @@ -0,0 +1,96 @@ +@using StackExchange.Profiling +@{ + using (MiniProfiler.Current.Step("Some complex thinking")) + { + System.Threading.Thread.Sleep(25); + } +} +@section head +{ + +} + +
+ +
+
+
+
Click the links below to see it profile ajax requests
+ +
+
+
You can also...
+
+ +
+
+
+
+
+
Results from ajax requests
+
+
+
+
+ +
+ Some content way down the page - notice how the profiler button is fixed in the upper left corner. +
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml b/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml new file mode 100644 index 000000000..7c5ccdc9c --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Home/ResultsAuthorization.cshtml @@ -0,0 +1,19 @@ +@{ + ViewBag.Title = "Results Authorization"; +} + +
+ +

+ This route will only display timings when we have ?isAuthorized=1 on the query string. +

+

+ It shows how you can use MiniProfilerWebSettings.Results_Authorize to ensure that certain request conditions are met + before serving sensitive profiler results. +

+

+ We use it on Stack Overflow to ensure that the current request's cookies map to a developer. +

+
\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml b/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml new file mode 100644 index 000000000..9d8983aee --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Shared/Error.cshtml @@ -0,0 +1,8 @@ +@model System.Web.Mvc.HandleErrorInfo +@{ + ViewBag.Title = "Error"; +} + +

+ Sorry, an error occurred while processing your request. +

\ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml b/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml new file mode 100644 index 000000000..0c814dc43 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Shared/_Layout.cshtml @@ -0,0 +1,66 @@ +@using StackExchange.Profiling; +@using StackExchange.Profiling.Mvc +@{ + // allows us to test out starting a profiler hidden - use ALT + P to toggle display of results + var startHidden = !string.IsNullOrEmpty(Request.QueryString["startHidden"]); +} + + + + @this.InitClientTimings() + @this.TimeScript("jQuery 3.1.1", @) + @using (MiniProfiler.Current.Step(" rendering")) + { + @ViewBag.Title - MVC MiniProfiler Demo + @(this.TimeScript("Our CSS", @Styles.Render("~/Content/css"))); + @Scripts.Render("~/bundles/bootstrap") + @RenderSection("head", required: false) + } + + +
+ +
+
+ @RenderBody() +
+ @* renders our UI's css and javascript - best put it in the bottom so it does not effect perf *@ + @if (ViewBag.Orientation != null) + { + var position = (RenderPosition)ViewBag.Orientation; + @MiniProfiler.Current.RenderIncludes(position: position, showTrivial: false, showTimeWithChildren: false, startHidden: startHidden) + } + else + { + @MiniProfiler.Current.RenderIncludes(position: RenderPosition.Right, showTrivial: false, showTimeWithChildren: false, startHidden: startHidden) + } + + diff --git a/samples/Samples.Mvc5.Oracle/Views/Web.config b/samples/Samples.Mvc5.Oracle/Views/Web.config new file mode 100644 index 000000000..9d18deae0 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/Web.config @@ -0,0 +1,39 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml b/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml new file mode 100644 index 000000000..efda124b1 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Web.Debug.config b/samples/Samples.Mvc5.Oracle/Web.Debug.config new file mode 100644 index 000000000..d7712aaf1 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Web.Release.config b/samples/Samples.Mvc5.Oracle/Web.Release.config new file mode 100644 index 000000000..28a4d5fcc --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/samples/Samples.Mvc5.Oracle/Web.config b/samples/Samples.Mvc5.Oracle/Web.config new file mode 100644 index 000000000..3e3a24f41 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Web.config @@ -0,0 +1,83 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/favicon.ico b/samples/Samples.Mvc5.Oracle/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3a799985c43bc7309d701b2cad129023377dc71 GIT binary patch literal 32038 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 + + + + + + + + + + + + + + + + + + \ No newline at end of file From cd6fd238ee4585157d75cb99ccb20f00ba5d4175 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 08:52:54 -0600 Subject: [PATCH 14/29] Tested for version 4.1.0, with Oracle Managed DataAccess 12.2.1100. Nuget package created from here. --- .../MiniProfiler.Providers.Oracle.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index be13e75c1..2258a2bca 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -6,11 +6,12 @@ Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 + true - + \ No newline at end of file From 0c6d968da303705cf2d807269b5e6f6e108bf123 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 10:55:36 -0600 Subject: [PATCH 15/29] Upgrade to Oracle Managed DataAccess v.2.19.70 --- .../MiniProfiler.Providers.Oracle.csproj | 2 +- src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 2258a2bca..2ae66dea4 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs index d4206075d..dd520cf4a 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -5,6 +5,9 @@ using System.Data; using System.Linq; +/// +/// Handle Parameters for Oracle Storage Provider +/// public class OracleDynamicParameters : SqlMapper.IDynamicParameters { private static Dictionary> paramReaderCache = new Dictionary>(); From 1a8e39ac27d89b26772ea74e53660d896e85aae0 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 10:56:50 -0600 Subject: [PATCH 16/29] Standarize sample MVC 5 application --- MiniProfiler.sln | 22 +- .../Controllers/HomeController.cs | 19 +- .../EFCodeFirst/EFContext.cs | 4 +- .../Samples.Mvc5.Oracle/EFCodeFirst/Person.cs | 4 +- samples/Samples.Mvc5.Oracle/Global.asax.cs | 16 +- .../Helpers/OracleMiniProfilerStorage.cs | 2 +- .../Properties/AssemblyInfo.cs | 35 --- .../Properties/launchSettings.json | 27 +++ .../Samples.Mvc5.Oracle.csproj | 229 +++--------------- samples/Samples.Mvc5.Oracle/Web.config | 8 +- samples/Samples.Mvc5.Oracle/packages.config | 19 -- 11 files changed, 102 insertions(+), 283 deletions(-) delete mode 100644 samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs create mode 100644 samples/Samples.Mvc5.Oracle/Properties/launchSettings.json delete mode 100644 samples/Samples.Mvc5.Oracle/packages.config diff --git a/MiniProfiler.sln b/MiniProfiler.sln index a6a18fc39..9ba620530 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -91,12 +91,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ ProjectSection(SolutionItems) = preProject .github\workflows\main.yml = .github\workflows\main.yml EndProjectSection -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{A14F7769-55E7-4045-B653-EC4DD44C339C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AspNet", "samples\Samples.AspNet\Samples.AspNet.csproj", "{9C7822CD-BE8E-424F-A0C6-86CC986ABB42}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Minimal", "src\MiniProfiler.Minimal\MiniProfiler.Minimal.csproj", "{A1DCACC2-0D9A-401E-B6A4-856E5DD00541}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{CB089B96-B68A-4283-A0C3-F50C4483270C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{7D4F8D50-57F1-4368-A77F-DD20B617ADA0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -216,14 +218,14 @@ Global {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A14F7769-55E7-4045-B653-EC4DD44C339C}.Release|Any CPU.Build.0 = Release|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB089B96-B68A-4283-A0C3-F50C4483270C}.Release|Any CPU.Build.0 = Release|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.Build.0 = Release|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -259,6 +261,8 @@ Global {A1DCACC2-0D9A-401E-B6A4-856E5DD00541} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {CB089B96-B68A-4283-A0C3-F50C4483270C} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} + {7D4F8D50-57F1-4368-A77F-DD20B617ADA0} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} + {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 diff --git a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs index b28e418ac..8bf3134c8 100644 --- a/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs +++ b/samples/Samples.Mvc5.Oracle/Controllers/HomeController.cs @@ -69,8 +69,8 @@ private void DefaultActions() { var profiler = MiniProfiler.Current; - // test out using storage for this one request. Only store in SqlLite, not in httpCache - //profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); + // test out using storage for this one request. Only store in Oracle Database, not in httpCache + profiler.Storage = new OracleMiniProfilerStorage(MvcApplication.ConnectionString); using (profiler.Step("Set page title")) { @@ -246,7 +246,7 @@ public ActionResult EFCodeFirst() using (MiniProfiler.Current.Step("Insertion")) { - var p = new Person { Name = "Fernando" }; + var p = new Person { Name = "sam" }; context.People.Add(p); context.SaveChanges(); } @@ -261,13 +261,12 @@ public ActionResult EFCodeFirst() newCount = context.Database.SqlQuery(sql).Single(); } using (MiniProfiler.Current.Step("Get Count using ProfiledConnection - sql recorded")) + + using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) { - using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current)) - { - conn.Open(); - newCount = conn.Query(sql).Single(); - conn.Close(); - } + conn.Open(); + newCount = conn.Query(sql).Single(); + conn.Close(); } return Content(string.Format("EF Code First complete - count: {0}, sqlQuery count {1}", count, newCount)); @@ -287,6 +286,7 @@ public ActionResult EFCodeFirst() /// duplicated queries. /// /// duplicated query demonstration + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0063:Use simple 'using' statement", Justification = "This isn't C# 8, silly IDE.")] public ActionResult DuplicatedQueries() { using (var conn = GetConnection()) @@ -445,6 +445,7 @@ public class RouteHit /// The parameterized SQL with enumerations. /// /// The . + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0063:Use simple 'using' statement", Justification = "This isn't C# 8, silly IDE.")] public ActionResult ParameterizedSqlWithEnums() { using (var conn = GetConnection()) diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs index c396f6fc4..4dbf41bb6 100644 --- a/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs +++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/EFContext.cs @@ -13,7 +13,9 @@ public EFContext(string connectionString) : base(connectionString) protected override void OnModelCreating(DbModelBuilder modelBuilder) { - modelBuilder.HasDefaultSchema("VH4DB"); + // Set default esquema for Oracle User + modelBuilder.HasDefaultSchema("USERID"); + base.OnModelCreating(modelBuilder); } diff --git a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs index 826ab42ae..fc626241f 100644 --- a/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs +++ b/samples/Samples.Mvc5.Oracle/EFCodeFirst/Person.cs @@ -1,6 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - -namespace Samples.Mvc5.EFCodeFirst +namespace Samples.Mvc5.EFCodeFirst { /// /// The person. diff --git a/samples/Samples.Mvc5.Oracle/Global.asax.cs b/samples/Samples.Mvc5.Oracle/Global.asax.cs index 574bfd180..3c202539e 100644 --- a/samples/Samples.Mvc5.Oracle/Global.asax.cs +++ b/samples/Samples.Mvc5.Oracle/Global.asax.cs @@ -88,13 +88,13 @@ private void InitProfilerSettings() RouteBasePath = "~/profiler", // Setting up a MultiStorage provider. This will store results in the MemoryCacheStorage (normally the default) and in SqlLite as well. - //Storage = new MultiStorageProvider( - // new MemoryCacheStorage(new TimeSpan(1, 0, 0)), - // // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control. - // new OracleStorage(ConnectionString) // OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null)", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null)") - // ), + Storage = new MultiStorageProvider( + new MemoryCacheStorage(new TimeSpan(1, 0, 0)), + // The RecreateDatabase call is only done for testing purposes, so we don't check in the db to source control. + new OracleMiniProfilerStorage(ConnectionString).RecreateDatabase("create table People (\"Id\" integer not null, \"Name\" varchar2(1000) not null);", "create table RouteHits(RouteName varchar2(4000) not null, HitCount integer not null);") + ), - // Different RDBMS have different ways of declaring sql parameters - SQLite can understand inline sql parameters just fine. + // Different RDBMS have different ways of declaring sql parameters // By default, sql parameters will be displayed. //SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(), @@ -107,6 +107,7 @@ private void InitProfilerSettings() // specified position in the .RenderIncludes() call. PopupRenderPosition = RenderPosition.Right, // defaults to left PopupMaxTracesToShow = 10, // defaults to 15 + ColorScheme = ColorScheme.Auto, // defaults to light // ResultsAuthorize (optional - open to all by default): // because profiler results can contain sensitive data (e.g. sql queries with parameter values displayed), we @@ -128,7 +129,7 @@ private void InitProfilerSettings() // ResultsListAuthorize (optional - open to all by default) // the list of all sessions in the store is restricted by default, you must return true to allow it - ResultsListAuthorize = request => + ResultsListAuthorize = _ => { // you may implement this if you need to restrict visibility of profiling lists on a per request basis return true; // all requests are legit in our happy world @@ -149,7 +150,6 @@ private void InitProfilerSettings() ); MiniProfilerEF6.Initialize(); - MiniProfiler.DefaultOptions.Storage = new OracleStorage(ConnectionString); } } } diff --git a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs index 7cb243c37..fa6801548 100644 --- a/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs +++ b/samples/Samples.Mvc5.Oracle/Helpers/OracleMiniProfilerStorage.cs @@ -30,7 +30,7 @@ protected override System.Data.Common.DbConnection GetConnection() => new OracleConnection(ConnectionString); /// - /// Used for testing purposes - destroys and recreates the SQLITE file with needed tables. + /// Used for testing purposes - create tables in Oracle database /// /// The Extra Tables To Create. public OracleMiniProfilerStorage RecreateDatabase(params string[] extraTablesToCreate) diff --git a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs b/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs deleted file mode 100644 index 61db7b69c..000000000 --- a/samples/Samples.Mvc5.Oracle/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("WebApplication1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("WebApplication1")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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("cb089b96-b68a-4283-a0c3-f50c4483270c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json new file mode 100644 index 000000000..60851c9e6 --- /dev/null +++ b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:53085/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Samples.Mvc5": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj index 3c7f85c6d..04f8062d5 100644 --- a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj +++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj @@ -1,233 +1,80 @@ - - - - - + Debug AnyCPU - - - 2.0 - {CB089B96-B68A-4283-A0C3-F50C4483270C} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library - Properties Samples.Mvc5 Samples.Mvc5 - v4.6.2 + net462 true - - - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - true - pdbonly - true bin\ - TRACE - prompt - 4 + false + + if not exist "roslyn" md "roslyn" + xcopy /s /y /q "$(CscToolPath)\*.*" "roslyn" + - - ..\..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll - - - ..\..\packages\Dapper.StrongName.1.50.2\lib\net451\Dapper.StrongName.dll - - - ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll - - - ..\..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.SqlServer.dll - - - ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - + + + + + + + + + + - - ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - - - ..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\Oracle.ManagedDataAccess.Core.2.19.70\lib\netstandard2.0\Oracle.ManagedDataAccess.dll - - - ..\..\packages\Oracle.ManagedDataAccess.EntityFramework.12.2.1100\lib\net45\Oracle.ManagedDataAccess.EntityFramework.dll - - - - - + + + - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll - - - ..\..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll - - - ..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll - - - ..\..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll - + + + - - - + + + + + + - - - ..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll - + - - - - + + - - - - - - - - - - - - - - - - Global.asax - - - - - - - - - - - - - - - - - - Web.config - - - Web.config - - - - - - {4dfa7ad2-fcae-44db-af5c-f26aba93dbdc} - MiniProfiler.EF6 - - - {074bcd84-3e44-4140-9918-c09fcbeec09f} - MiniProfiler.Mvc5 - - - {a14f7769-55e7-4045-b653-ec4dd44c339c} - MiniProfiler.Providers.Oracle - - - {ba40a569-bee2-4e39-80a7-763bc15a9077} - MiniProfiler.Shared - - - {386222bd-6b6e-480f-a342-8de1ab516e2c} - MiniProfiler - + - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + - - - True True - 16761 + 51485 / - http://localhost:16761/ - True - http://localhost:16761/ + http://localhost:51485/ False False - - + False - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Web.config b/samples/Samples.Mvc5.Oracle/Web.config index 3e3a24f41..931cffdc6 100644 --- a/samples/Samples.Mvc5.Oracle/Web.config +++ b/samples/Samples.Mvc5.Oracle/Web.config @@ -1,7 +1,6 @@  -
@@ -12,7 +11,7 @@ - + @@ -56,10 +55,6 @@ - - - - @@ -77,7 +72,6 @@ - \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/packages.config b/samples/Samples.Mvc5.Oracle/packages.config deleted file mode 100644 index 477445a8a..000000000 --- a/samples/Samples.Mvc5.Oracle/packages.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file From c7b6af1cb16db67181b84687f2e54beb9caaa42b Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Thu, 2 Jul 2020 11:19:51 -0600 Subject: [PATCH 17/29] Discard changes in other projects --- samples/Samples.Mvc5.EFCore/packages.config | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 samples/Samples.Mvc5.EFCore/packages.config diff --git a/samples/Samples.Mvc5.EFCore/packages.config b/samples/Samples.Mvc5.EFCore/packages.config deleted file mode 100644 index 82ecffe0f..000000000 --- a/samples/Samples.Mvc5.EFCore/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 55444d88b611659ccade60924616096291f00045 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Wed, 27 Oct 2021 19:03:03 -0600 Subject: [PATCH 18/29] Remove GeneratePackageOnBuild from project --- .../MiniProfiler.Providers.Oracle.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 2ae66dea4..be13e75c1 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -6,7 +6,6 @@ Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver Oracle;$(PackageBaseTags) net461;netstandard2.0 - true From 65b947294e65353156e869152fcc9c0af6c9e765 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Tue, 4 Jul 2023 17:04:27 -0600 Subject: [PATCH 19/29] Remove Code Smells after merge --- MiniProfiler.sln | 51 +-- .../MiniProfiler.Providers.Oracle.csproj | 3 +- .../OracleDynamicParameters.cs | 324 ++++++++---------- .../OracleStorage.cs | 33 +- 4 files changed, 183 insertions(+), 228 deletions(-) diff --git a/MiniProfiler.sln b/MiniProfiler.sln index d6739f5f5..d1116168f 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -95,15 +95,10 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AspNet", "samples\Samples.AspNet\Samples.AspNet.csproj", "{9C7822CD-BE8E-424F-A0C6-86CC986ABB42}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Minimal", "src\MiniProfiler.Minimal\MiniProfiler.Minimal.csproj", "{A1DCACC2-0D9A-401E-B6A4-856E5DD00541}" -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{CB089B96-B68A-4283-A0C3-F50C4483270C}" -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{7D4F8D50-57F1-4368-A77F-DD20B617ADA0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}" -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{7D4F8D50-57F1-4368-A77F-DD20B617ADA0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Mvc5.Oracle", "samples\Samples.Mvc5.Oracle\Samples.Mvc5.Oracle.csproj", "{0BCD4266-7820-4945-9ACC-B8F8250DF79F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AspNet5", "samples\Samples.AspNet5\Samples.AspNet5.csproj", "{9C7822CD-BE8E-424F-A0C6-86CC986ABB42}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniProfiler.Providers.Oracle", "src\MiniProfiler.Providers.Oracle\MiniProfiler.Providers.Oracle.csproj", "{63829E59-0A2E-42A2-8EF6-B806257B9ADA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -211,18 +206,6 @@ Global {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB}.Release|Any CPU.Build.0 = Release|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.Build.0 = Release|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.Build.0 = Release|Any CPU {9C7822CD-BE8E-424F-A0C6-86CC986ABB42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C7822CD-BE8E-424F-A0C6-86CC986ABB42}.Debug|Any CPU.Build.0 = Debug|Any CPU {9C7822CD-BE8E-424F-A0C6-86CC986ABB42}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -231,18 +214,14 @@ Global {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Debug|Any CPU.Build.0 = Debug|Any CPU {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1DCACC2-0D9A-401E-B6A4-856E5DD00541}.Release|Any CPU.Build.0 = Release|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95A09CD-A291-42D0-AA41-8426090D0476}.Release|Any CPU.Build.0 = Release|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0}.Release|Any CPU.Build.0 = Release|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07}.Release|Any CPU.Build.0 = Release|Any CPU + {0BCD4266-7820-4945-9ACC-B8F8250DF79F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0BCD4266-7820-4945-9ACC-B8F8250DF79F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0BCD4266-7820-4945-9ACC-B8F8250DF79F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0BCD4266-7820-4945-9ACC-B8F8250DF79F}.Release|Any CPU.Build.0 = Release|Any CPU + {63829E59-0A2E-42A2-8EF6-B806257B9ADA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63829E59-0A2E-42A2-8EF6-B806257B9ADA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63829E59-0A2E-42A2-8EF6-B806257B9ADA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63829E59-0A2E-42A2-8EF6-B806257B9ADA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -274,18 +253,14 @@ Global {61E02A52-EB05-4B48-9AAE-BC7C1741E557} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {BD7A4E74-ECFE-4BBE-86D9-D6DC2BED86DB} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {A14EA029-60E2-485A-B757-3626511CF2C4} = {5C8ED0C0-7DBB-4660-836E-A760E25160A0} - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} {9C7822CD-BE8E-424F-A0C6-86CC986ABB42} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} {A1DCACC2-0D9A-401E-B6A4-856E5DD00541} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} - {A14F7769-55E7-4045-B653-EC4DD44C339C} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} - {CB089B96-B68A-4283-A0C3-F50C4483270C} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} - {7D4F8D50-57F1-4368-A77F-DD20B617ADA0} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} - {CF9E8BAF-CCF0-49E3-9431-C31EF6C84B07} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} + {0BCD4266-7820-4945-9ACC-B8F8250DF79F} = {E0DA4035-4D64-4BB8-8EA1-42197DE62519} + {63829E59-0A2E-42A2-8EF6-B806257B9ADA} = {6A510DBF-E85F-4D2C-B8F7-006DA31B3418} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 SolutionGuid = {9373F37A-A996-4545-A251-1902C8886E3F} + LessCompiler = 6a2b5b70-1c32-482f-b5c6-0597e2d4e376 EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = StackExchange.Profiling.vsmdi diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index be13e75c1..c74816399 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -3,9 +3,10 @@ MiniProfiler.Providers.Oracle MiniProfiler.Providers.Oracle MiniProfiler: Profiler storage for Oracle Database - Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver + Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver, Fernando Paz Oracle;$(PackageBaseTags) net461;netstandard2.0 + disable diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs index dd520cf4a..76f43ce58 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -5,242 +5,222 @@ using System.Data; using System.Linq; -/// -/// Handle Parameters for Oracle Storage Provider -/// -public class OracleDynamicParameters : SqlMapper.IDynamicParameters +namespace StackExchange.Profiling { - private static Dictionary> paramReaderCache = new Dictionary>(); - - private Dictionary parameters = new Dictionary(); - private List templates; - - private class ParamInfo + /// + /// Handle Parameters for Oracle Storage Provider + /// + public class OracleDynamicParameters : SqlMapper.IDynamicParameters { + private static readonly Dictionary> _paramReaderCache = new Dictionary>(); - public string Name { get; set; } + private readonly Dictionary _parameters = new Dictionary(); - public object Value { get; set; } + private List _templates; - public ParameterDirection ParameterDirection { get; set; } + private sealed class ParamInfo + { - public OracleDbType? DbType { get; set; } + public string Name { get; set; } - public int? Size { get; set; } + public object Value { get; set; } - public IDbDataParameter AttachedParam { get; set; } - } + public ParameterDirection ParameterDirection { get; set; } - /// - /// construct a dynamic parameter bag - /// - public OracleDynamicParameters() - { - } + public OracleDbType? DbType { get; set; } - /// - /// construct a dynamic parameter bag - /// - /// can be an anonymous type or a DynamicParameters bag - public OracleDynamicParameters(object template) - { - AddDynamicParams(template); - } + public int? Size { get; set; } - /// - /// Append a whole object full of params to the dynamic - /// EG: AddDynamicParams(new {A = 1, B = 2}) // will add property A and B to the dynamic - /// - /// - public void AddDynamicParams( + public IDbDataParameter AttachedParam { get; set; } + } + + /// + /// construct a dynamic parameter bag + /// + public OracleDynamicParameters() { } + + /// + /// construct a dynamic parameter bag + /// + /// can be an anonymous type or a DynamicParameters bag + public OracleDynamicParameters(object template) => AddDynamicParams(template); + + /// + /// Append a whole object full of params to the dynamic + /// EG: AddDynamicParams(new {A = 1, B = 2}) // will add property A and B to the dynamic + /// + /// + public void AddDynamicParams( #if CSHARP30 object param #else - dynamic param + dynamic param #endif - ) - { - var obj = param as object; - if (obj != null) + ) { - var subDynamic = obj as OracleDynamicParameters; - if (subDynamic == null) + if (param is object obj) { - var dictionary = obj as IEnumerable>; - if (dictionary == null) - { - templates = templates ?? new List(); - templates.Add(obj); - } - else + if (obj is not OracleDynamicParameters subDynamic) { - foreach (var kvp in dictionary) + if (obj is not IEnumerable> dictionary) + { + _templates ??= new List(); + _templates.Add(obj); + } + else { + foreach (var kvp in dictionary) + { #if CSHARP30 Add(kvp.Key, kvp.Value, null, null, null); #else - Add(kvp.Key, kvp.Value); + Add(kvp.Key, kvp.Value); #endif + } } } - } - else - { - if (subDynamic.parameters != null) + else { - foreach (var kvp in subDynamic.parameters) + if (subDynamic._parameters != null) { - parameters.Add(kvp.Key, kvp.Value); + foreach (var kvp in subDynamic._parameters) + { + _parameters.Add(kvp.Key, kvp.Value); + } } - } - if (subDynamic.templates != null) - { - templates = templates ?? new List(); - foreach (var t in subDynamic.templates) + if (subDynamic._templates != null) { - templates.Add(t); + _templates ??= new List(); + foreach (var t in subDynamic._templates) + { + _templates.Add(t); + } } } } } - } - /// - /// Add a parameter to this dynamic parameter list - /// - /// - /// - /// - /// - /// - public void Add( + /// + /// Add a parameter to this dynamic parameter list + /// + /// + /// + /// + /// + /// + public void Add( #if CSHARP30 string name, object value, DbType? dbType, ParameterDirection? direction, int? size #else - string name, object value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null + string name, object value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null #endif - ) - { - parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size }; - } + ) => _parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size }; - private static string Clean(string name) - { - if (!string.IsNullOrEmpty(name)) + private static string Clean(string name) { - switch (name[0]) + if (!string.IsNullOrEmpty(name)) { - case '@': - case ':': - case '?': - return name.Substring(1); + switch (name[0]) + { + case '@': + case ':': + case '?': + return name.Substring(1); + } } + return name; } - return name; - } - void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity) - { - AddParameters(command, identity); - } + void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity) => AddParameters(command, identity); - /// - /// Add all the parameters needed to the command just before it executes - /// - /// The raw command prior to execution - /// Information about the query - protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) - { - if (templates != null) + /// + /// Add all the parameters needed to the command just before it executes + /// + /// The raw command prior to execution + /// Information about the query + protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) { - foreach (var template in templates) + if (_templates != null) { - var newIdent = identity.ForDynamicParameters(template.GetType()); - Action appender; - - lock (paramReaderCache) + foreach (var template in _templates) { - if (!paramReaderCache.TryGetValue(newIdent, out appender)) + var newIdent = identity.ForDynamicParameters(template.GetType()); + Action appender; + + lock (_paramReaderCache) { - appender = SqlMapper.CreateParamInfoGenerator(newIdent, false, false); - paramReaderCache[newIdent] = appender; + if (!_paramReaderCache.TryGetValue(newIdent, out appender)) + { + appender = SqlMapper.CreateParamInfoGenerator(newIdent, false, false); + _paramReaderCache[newIdent] = appender; + } } - } - appender(command, template); + appender(command, template); + } } - } - foreach (var param in parameters.Values) - { - string name = Clean(param.Name); - bool add = !((OracleCommand)command).Parameters.Contains(name); - OracleParameter p; - if (add) - { - p = ((OracleCommand)command).CreateParameter(); - p.ParameterName = name; - } - else - { - p = ((OracleCommand)command).Parameters[name]; - } - var val = param.Value; - p.Value = val ?? DBNull.Value; - p.Direction = param.ParameterDirection; - var s = val as string; - if (s != null) + foreach (var param in _parameters.Values) { - if (s.Length <= 4000) + string name = Clean(param.Name); + bool add = !((OracleCommand)command).Parameters.Contains(name); + OracleParameter p; + if (add) + { + p = ((OracleCommand)command).CreateParameter(); + p.ParameterName = name; + } + else + { + p = ((OracleCommand)command).Parameters[name]; + } + var val = param.Value; + p.Value = val ?? DBNull.Value; + p.Direction = param.ParameterDirection; + if (val is string s && s.Length <= 4000) { p.Size = 4000; } + if (param.Size != null) + { + p.Size = param.Size.Value; + } + if (param.DbType != null) + { + p.OracleDbType = param.DbType.Value; + } + if (add) + { + command.Parameters.Add(p); + } + param.AttachedParam = p; } - if (param.Size != null) - { - p.Size = param.Size.Value; - } - if (param.DbType != null) - { - p.OracleDbType = param.DbType.Value; - } - if (add) - { - command.Parameters.Add(p); - } - param.AttachedParam = p; - } - } - - /// - /// All the names of the param in the bag, use Get to yank them out - /// - public IEnumerable ParameterNames - { - get - { - return parameters.Select(p => p.Key); } - } - /// - /// Get the value of a parameter - /// - /// - /// - /// The value, note DBNull.Value is not returned, instead the value is returned as null - public T Get(string name) - { - var val = parameters[Clean(name)].AttachedParam.Value; - if (val == DBNull.Value) + /// + /// All the names of the param in the bag, use Get to yank them out + /// + public IEnumerable ParameterNames => _parameters.Select(p => p.Key); + + /// + /// Get the value of a parameter + /// + /// + /// + /// The value, note DBNull.Value is not returned, instead the value is returned as null + public T Get(string name) { - if (default(T) != null) + var val = _parameters[Clean(name)].AttachedParam.Value; + if (val == DBNull.Value) { - throw new ApplicationException("Attempting to cast a DBNull to a non nullable type!"); + if (default(T) != null) + { + throw new InvalidCastException("Attempting to cast a DBNull to a non nullable type!"); + } + return default; } - return default(T); + return (T)val; } - return (T)val; } } diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index 4a93131a4..52c3cf955 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Data.Common; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Dapper; @@ -34,28 +33,28 @@ public OracleStorage(string connectionString, string profilersTable, string timi : base(connectionString, profilersTable, timingsTable, clientTimingsTable) { } private string _saveSql; - private string SaveSql => _saveSql ?? (_saveSql = $@" + private string SaveSql => _saveSql ??= $@" INSERT INTO {MiniProfilersTable} (""Id"", RootTimingId, ""Name"", Started, DurationMilliseconds, ""User"", HasUserViewed, MachineName, CustomLinksJson, ClientTimingsRedirectCount) SELECT :pId, :pRootTimingId, :pName, :pStarted, :pDurationMilliseconds, :pUser, :pHasUserViewed, :pMachineName, :pCustomLinksJson, :pClientTimingsRedirectCount FROM DUAL - WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilersTable} WHERE ""Id"" = :pId)"); + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilersTable} WHERE ""Id"" = :pId)"; private string _saveTimingsSql; - private string SaveTimingsSql => _saveTimingsSql ?? (_saveTimingsSql = $@" + private string SaveTimingsSql => _saveTimingsSql ??= $@" INSERT INTO {MiniProfilerTimingsTable} (""Id"", MiniProfilerId, ParentTimingId, ""Name"", DurationMilliseconds, StartMilliseconds, IsRoot, ""Depth"", CustomTimingsJson) SELECT :pId, :pMiniProfilerId, :pParentTimingId, :pName, :pDurationMilliseconds, :pStartMilliseconds, :pIsRoot, :pDepth, :pCustomTimingsJson FROM DUAL - WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerTimingsTable} WHERE ""Id"" = :pId)"); + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerTimingsTable} WHERE ""Id"" = :pId)"; private string _saveClientTimingsSql; - private string SaveClientTimingsSql => _saveClientTimingsSql ?? (_saveClientTimingsSql = $@" + private string SaveClientTimingsSql => _saveClientTimingsSql ??= $@" INSERT INTO {MiniProfilerClientTimingsTable} (""Id"", MiniProfilerId, ""Name"", ""Start"", ""Duration"") SELECT :pId, :pMiniProfilerId, :pName, :pStart, :pDuration FROM DUAL - WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerClientTimingsTable} WHERE ""Id"" = :pId)"); + WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerClientTimingsTable} WHERE ""Id"" = :pId)"; /// /// Stores to dbo.MiniProfilers under its ; @@ -88,7 +87,7 @@ public override void Save(MiniProfiler profiler) }); - conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))); + conn.Execute(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(ClientTimingToDynamic)); } } } @@ -124,7 +123,7 @@ public override async Task SaveAsync(MiniProfiler profiler) }); - await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(t => ClientTimingToDynamic(t))).ConfigureAwait(false); + await conn.ExecuteAsync(SaveClientTimingsSql, profiler.ClientTimings.Timings.Select(ClientTimingToDynamic)).ConfigureAwait(false); } } } @@ -217,7 +216,7 @@ private IEnumerable DynamicListToProfiler(IEnumerable pro Started = profile.STARTED, Name = profile.Name, User = profile.User, - RootTimingId = profile.ROOTTIMINGID == null ? (Guid?)null : new Guid((string)profile.ROOTTIMINGID), + RootTimingId = profile.ROOTTIMINGID == null ? null : new Guid((string)profile.ROOTTIMINGID), DurationMilliseconds = Convert.ToDecimal(profile.DURATIONMILLISECONDS ?? 0), HasUserViewed = profile.HASUSERVIEWED == 1, MachineName = profile.MACHINENAME, @@ -263,9 +262,9 @@ private IEnumerable DynamicListToClientTiming(IEnumerable private string _loadSqlTimings; private string _loadSqlClientTimings; - private string LoadSqlProfiler => _loadSqlProfiler ?? (_loadSqlProfiler = $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"); - private string LoadSqlTimings => _loadSqlTimings ?? (_loadSqlTimings = $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"); - private string LoadSqlClientTimings => _loadSqlClientTimings ?? (_loadSqlClientTimings = $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""); + private string LoadSqlProfiler => _loadSqlProfiler ??= $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"; + private string LoadSqlTimings => _loadSqlTimings ??= $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"; + private string LoadSqlClientTimings => _loadSqlClientTimings ??= $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""; /// /// Loads the MiniProfiler identified by 'id' from the database. @@ -346,11 +345,11 @@ public override async Task LoadAsync(Guid id) public override Task SetViewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, true); private string _toggleViewedSql; - private string ToggleViewedSql => _toggleViewedSql ?? (_toggleViewedSql = $@" + private string ToggleViewedSql => _toggleViewedSql ??= $@" Update {MiniProfilersTable} Set HasUserViewed = :pHasUserViewed Where ""Id"" = :pId - And ""User"" = :pUser"); + And ""User"" = :pUser"; private void ToggleViewed(string user, Guid id, bool hasUserViewed) { @@ -369,12 +368,12 @@ private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) } private string _getUnviewedIdsSql; - private string GetUnviewedIdsSql => _getUnviewedIdsSql ?? (_getUnviewedIdsSql = $@" + private string GetUnviewedIdsSql => _getUnviewedIdsSql ??= $@" Select ""Id"" From {MiniProfilersTable} Where ""User"" = :pUser And HasUserViewed = 0 -Order By Started"); +Order By Started"; /// /// Returns a list of s that haven't been seen by . From aaca6e7ba9962a21eb9ff6f18319fb4fd1ee8855 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Tue, 4 Jul 2023 17:45:10 -0600 Subject: [PATCH 20/29] Changes to accomplish Null safety, like the rest of providers --- .../MiniProfiler.Providers.Oracle.csproj | 3 +- .../OracleDynamicParameters.cs | 29 ++++---- .../OracleStorage.cs | 67 ++++++++----------- 3 files changed, 44 insertions(+), 55 deletions(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index c74816399..72c66ffa3 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -1,4 +1,4 @@ - + MiniProfiler.Providers.Oracle MiniProfiler.Providers.Oracle @@ -6,7 +6,6 @@ Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver, Fernando Paz Oracle;$(PackageBaseTags) net461;netstandard2.0 - disable diff --git a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs index 76f43ce58..d963c6c79 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleDynamicParameters.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data; +using System.Diagnostics.CodeAnalysis; using System.Linq; namespace StackExchange.Profiling @@ -16,22 +17,21 @@ public class OracleDynamicParameters : SqlMapper.IDynamicParameters private readonly Dictionary _parameters = new Dictionary(); - private List _templates; + private List? _templates; private sealed class ParamInfo { + public string Name { get; set; } = string.Empty; - public string Name { get; set; } + public object? Value { get; set; } - public object Value { get; set; } - - public ParameterDirection ParameterDirection { get; set; } + public ParameterDirection ParameterDirection { get; set; } = ParameterDirection.Input; public OracleDbType? DbType { get; set; } public int? Size { get; set; } - public IDbDataParameter AttachedParam { get; set; } + public OracleParameter AttachedParam { get; set; } = new OracleParameter(); } /// @@ -52,11 +52,11 @@ public OracleDynamicParameters() { } /// public void AddDynamicParams( #if CSHARP30 - object param + object param #else dynamic param #endif - ) + ) { if (param is object obj) { @@ -111,9 +111,9 @@ dynamic param /// public void Add( #if CSHARP30 - string name, object value, DbType? dbType, ParameterDirection? direction, int? size + string name, object value, DbType? dbType, ParameterDirection? direction, int? size #else - string name, object value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null + string name, object? value = null, OracleDbType? dbType = null, ParameterDirection? direction = null, int? size = null #endif ) => _parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size }; @@ -209,16 +209,15 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) /// /// /// The value, note DBNull.Value is not returned, instead the value is returned as null + [SuppressMessage("Style", "IDE0034:Simplify 'default' expression", Justification = "")] public T Get(string name) { var val = _parameters[Clean(name)].AttachedParam.Value; if (val == DBNull.Value) { - if (default(T) != null) - { - throw new InvalidCastException("Attempting to cast a DBNull to a non nullable type!"); - } - return default; +#pragma warning disable CS8603 // Possible null reference return. + return default(T) == null ? default(T) : throw new InvalidCastException("Attempting to cast a DBNull to a non nullable type!"); +#pragma warning restore CS8603 // Possible null reference return. } return (T)val; } diff --git a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs index 52c3cf955..85e9114f7 100644 --- a/src/MiniProfiler.Providers.Oracle/OracleStorage.cs +++ b/src/MiniProfiler.Providers.Oracle/OracleStorage.cs @@ -32,7 +32,8 @@ public OracleStorage(string connectionString) : base(connectionString) { /* base public OracleStorage(string connectionString, string profilersTable, string timingsTable, string clientTimingsTable) : base(connectionString, profilersTable, timingsTable, clientTimingsTable) { } - private string _saveSql; + private string? _saveSql, _saveTimingsSql, _saveClientTimingsSql; + private string SaveSql => _saveSql ??= $@" INSERT INTO {MiniProfilersTable} (""Id"", RootTimingId, ""Name"", Started, DurationMilliseconds, ""User"", HasUserViewed, MachineName, CustomLinksJson, ClientTimingsRedirectCount) @@ -40,7 +41,6 @@ INSERT INTO {MiniProfilersTable} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilersTable} WHERE ""Id"" = :pId)"; - private string _saveTimingsSql; private string SaveTimingsSql => _saveTimingsSql ??= $@" INSERT INTO {MiniProfilerTimingsTable} (""Id"", MiniProfilerId, ParentTimingId, ""Name"", DurationMilliseconds, StartMilliseconds, IsRoot, ""Depth"", CustomTimingsJson) @@ -48,7 +48,6 @@ INSERT INTO {MiniProfilerTimingsTable} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {MiniProfilerTimingsTable} WHERE ""Id"" = :pId)"; - private string _saveClientTimingsSql; private string SaveClientTimingsSql => _saveClientTimingsSql ??= $@" INSERT INTO {MiniProfilerClientTimingsTable} (""Id"", MiniProfilerId, ""Name"", ""Start"", ""Duration"") @@ -128,11 +127,10 @@ public override async Task SaveAsync(MiniProfiler profiler) } } + #region Create Oracle Dynamic Parameters private OracleDynamicParameters ProfilerToDynamic(DbConnection conn, MiniProfiler profiler) { - if (profiler == null) return null; - var pars = new OracleDynamicParameters(); pars.Add("pId", profiler.Id.ToString()); pars.Add("pStarted", profiler.Started); @@ -162,8 +160,6 @@ private OracleDynamicParameters ProfilerToDynamic(DbConnection conn, MiniProfile private OracleDynamicParameters TimingToDynamic(DbConnection conn, Timing timing) { - if (timing == null) return null; - var pars = new OracleDynamicParameters(); pars.Add("pId", timing.Id.ToString()); pars.Add("pMiniProfilerId", timing.MiniProfilerId.ToString()); @@ -192,8 +188,6 @@ private OracleDynamicParameters TimingToDynamic(DbConnection conn, Timing timing private OracleDynamicParameters ClientTimingToDynamic(ClientTiming clientTiming) { - if (clientTiming == null) return null; - var pars = new OracleDynamicParameters(); pars.Add("pId", clientTiming.Id.ToString()); pars.Add("pMiniProfilerId", clientTiming.MiniProfilerId.ToString()); @@ -209,40 +203,33 @@ private IEnumerable DynamicListToProfiler(IEnumerable pro foreach (var profile in profilers) yield return DynamicToProfiler(profile); } -#pragma warning disable CS0618 // Used for serialization only - private MiniProfiler DynamicToProfiler(dynamic profile) => new MiniProfiler + private MiniProfiler DynamicToProfiler(dynamic profile) => new MiniProfiler(profile.Name, new MiniProfilerBaseOptions()) { Id = new Guid((string)profile.Id), Started = profile.STARTED, - Name = profile.Name, User = profile.User, RootTimingId = profile.ROOTTIMINGID == null ? null : new Guid((string)profile.ROOTTIMINGID), DurationMilliseconds = Convert.ToDecimal(profile.DURATIONMILLISECONDS ?? 0), HasUserViewed = profile.HASUSERVIEWED == 1, MachineName = profile.MACHINENAME, CustomLinksJson = profile.CUSTOMLINKSJSON, - ClientTimingsRedirectCount = profile.CLIENTTIMINGSREDIRECTCOUNT + ClientTimingsRedirectCount = profile.CLIENTTIMINGSREDIRECTCOUNT, }; -#pragma warning restore CS0618 // Used for serialization only - - private IEnumerable DynamicListToTiming(IEnumerable timings) + private IEnumerable DynamicListToTiming(MiniProfiler profiler, IEnumerable timings) { - foreach (var timing in timings) yield return DynamicToTiming(timing); + foreach (var timing in timings) yield return DynamicToTiming(profiler, timing); } -#pragma warning disable CS0618 // Used for serialization only - private Timing DynamicToTiming(dynamic timing) => new Timing + private Timing DynamicToTiming(MiniProfiler profiler, dynamic timing) => new Timing(profiler, parent: null, name: timing.Name, minSaveMs: null) { Id = new Guid((string)timing.Id), MiniProfilerId = new Guid((string)timing.MINIPROFILERID), ParentTimingId = timing.PARENTTIMINGID == null ? Guid.Empty : new Guid((string)timing.PARENTTIMINGID), - Name = timing.Name, DurationMilliseconds = timing.DURATIONMILLISECONDS == null ? null : Convert.ToDecimal(timing.DURATIONMILLISECONDS), StartMilliseconds = Convert.ToDecimal(timing.STARTMILLISECONDS), CustomTimingsJson = timing.CUSTOMTIMINGSJSON }; -#pragma warning restore CS0618 // Used for serialization only private IEnumerable DynamicListToClientTiming(IEnumerable clientTimings) { @@ -258,12 +245,14 @@ private IEnumerable DynamicListToClientTiming(IEnumerable Duration = Convert.ToDecimal(clientTiming.Duration) }; - private string _loadSqlProfiler; - private string _loadSqlTimings; - private string _loadSqlClientTimings; + #endregion + + private string? _loadSqlProfiler, _loadSqlTimings, _loadSqlClientTimings; private string LoadSqlProfiler => _loadSqlProfiler ??= $@"SELECT * FROM {MiniProfilersTable} WHERE ""Id"" = :pId"; + private string LoadSqlTimings => _loadSqlTimings ??= $@"SELECT * FROM {MiniProfilerTimingsTable} WHERE MiniProfilerId = :pId ORDER BY StartMilliseconds"; + private string LoadSqlClientTimings => _loadSqlClientTimings ??= $@"SELECT * FROM {MiniProfilerClientTimingsTable} WHERE MiniProfilerId = :pId ORDER BY ""Start"""; /// @@ -271,13 +260,13 @@ private IEnumerable DynamicListToClientTiming(IEnumerable /// /// The profiler ID to load. /// The loaded . - public override MiniProfiler Load(Guid id) + public override MiniProfiler? Load(Guid id) { MiniProfiler result; using (var conn = GetConnection()) { result = DynamicListToProfiler(conn.Query(LoadSqlProfiler, new { pId = id.ToString() })).FirstOrDefault(); - var timings = DynamicListToTiming(conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); + var timings = DynamicListToTiming(result, conn.Query(LoadSqlTimings, new { pId = id.ToString() })).AsList(); var clientTimings = DynamicListToClientTiming(conn.Query(LoadSqlClientTimings, new { pId = id.ToString() })).AsList(); ConnectTimings(result, timings, clientTimings); @@ -296,13 +285,13 @@ public override MiniProfiler Load(Guid id) /// /// The profiler ID to load. /// The loaded . - public override async Task LoadAsync(Guid id) + public override async Task LoadAsync(Guid id) { MiniProfiler result; using (var conn = GetConnection()) { result = DynamicListToProfiler(await conn.QueryAsync(LoadSqlProfiler, new { pId = id.ToString() }).ConfigureAwait(false)).FirstOrDefault(); - var timings = DynamicListToTiming(await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); + var timings = DynamicListToTiming(result, await conn.QueryAsync(LoadSqlTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); var clientTimings = DynamicListToClientTiming(await conn.QueryAsync(LoadSqlClientTimings, new { pId = id.ToString() }).ConfigureAwait(false)).AsList(); ConnectTimings(result, timings, clientTimings); @@ -321,37 +310,38 @@ public override async Task LoadAsync(Guid id) /// /// The user to set this profiler ID as unviewed for. /// The profiler ID to set unviewed. - public override void SetUnviewed(string user, Guid id) => ToggleViewed(user, id, false); + public override void SetUnviewed(string? user, Guid id) => ToggleViewed(user, id, false); /// /// Asynchronously sets a particular profiler session so it is considered "unviewed" /// /// The user to set this profiler ID as unviewed for. /// The profiler ID to set unviewed. - public override Task SetUnviewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, false); + public override Task SetUnviewedAsync(string? user, Guid id) => ToggleViewedAsync(user, id, false); /// /// Sets a particular profiler session to "viewed" /// /// The user to set this profiler ID as viewed for. /// The profiler ID to set viewed. - public override void SetViewed(string user, Guid id) => ToggleViewed(user, id, true); + public override void SetViewed(string? user, Guid id) => ToggleViewed(user, id, true); /// /// Asynchronously sets a particular profiler session to "viewed" /// /// The user to set this profiler ID as viewed for. /// The profiler ID to set viewed. - public override Task SetViewedAsync(string user, Guid id) => ToggleViewedAsync(user, id, true); + public override Task SetViewedAsync(string? user, Guid id) => ToggleViewedAsync(user, id, true); + + private string? _toggleViewedSql; - private string _toggleViewedSql; private string ToggleViewedSql => _toggleViewedSql ??= $@" Update {MiniProfilersTable} Set HasUserViewed = :pHasUserViewed Where ""Id"" = :pId And ""User"" = :pUser"; - private void ToggleViewed(string user, Guid id, bool hasUserViewed) + private void ToggleViewed(string? user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { @@ -359,7 +349,7 @@ private void ToggleViewed(string user, Guid id, bool hasUserViewed) } } - private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) + private async Task ToggleViewedAsync(string? user, Guid id, bool hasUserViewed) { using (var conn = GetConnection()) { @@ -367,7 +357,8 @@ private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) } } - private string _getUnviewedIdsSql; + private string? _getUnviewedIdsSql; + private string GetUnviewedIdsSql => _getUnviewedIdsSql ??= $@" Select ""Id"" From {MiniProfilersTable} @@ -380,7 +371,7 @@ private async Task ToggleViewedAsync(string user, Guid id, bool hasUserViewed) /// /// User identified by the current MiniProfilerOptions.UserProvider /// The list of keys for the supplied user - public override List GetUnviewedIds(string user) + public override List GetUnviewedIds(string? user) { using (var conn = GetConnection()) { @@ -394,7 +385,7 @@ public override List GetUnviewedIds(string user) /// /// User identified by the current MiniProfilerOptions.UserProvider /// The list of keys for the supplied user - public override async Task> GetUnviewedIdsAsync(string user) + public override async Task> GetUnviewedIdsAsync(string? user) { using (var conn = GetConnection()) { From b21d93cf4c83f1bebbf7c03481d8cc144add33c9 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Tue, 4 Jul 2023 18:21:42 -0600 Subject: [PATCH 21/29] Update package Oracle.ManagedDataAccess.Core to 2.19.190 --- samples/Samples.Mvc5.Oracle/Properties/launchSettings.json | 2 +- samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj | 2 +- .../MiniProfiler.Providers.Oracle.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json index 60851c9e6..93f4efd17 100644 --- a/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json +++ b/samples/Samples.Mvc5.Oracle/Properties/launchSettings.json @@ -21,7 +21,7 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "http://localhost:5000" + "applicationUrl": "http://localhost:53085" } } } \ No newline at end of file diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj index 04f8062d5..d074a53ba 100644 --- a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj +++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 72c66ffa3..12fa79367 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -11,6 +11,6 @@ - + \ No newline at end of file From b92feff060e915d914a4e09a8345508c33016a3f Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Mon, 15 Jan 2024 15:44:41 -0600 Subject: [PATCH 22/29] Oracle.ManagedDataAccess.Core to 2.19.220 --- .../MiniProfiler.Providers.Oracle.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj index 12fa79367..8519455f9 100644 --- a/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj +++ b/src/MiniProfiler.Providers.Oracle/MiniProfiler.Providers.Oracle.csproj @@ -11,6 +11,6 @@ - + \ No newline at end of file From 6afccf03233ea1130fdd1844e6a236dd01d3b715 Mon Sep 17 00:00:00 2001 From: Fernando Paz Date: Mon, 15 Jan 2024 15:50:32 -0600 Subject: [PATCH 23/29] Update Sample Proyect to Oracle.ManagedDataAccess.Core to 2.19.220 --- samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj index d074a53ba..66d4c2f30 100644 --- a/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj +++ b/samples/Samples.Mvc5.Oracle/Samples.Mvc5.Oracle.csproj @@ -25,6 +25,7 @@ + From 633fbc3039088b615b132b6cb091ee330db06251 Mon Sep 17 00:00:00 2001 From: Ian Kemp Date: Wed, 2 Aug 2023 18:50:36 +0100 Subject: [PATCH 24/29] Add new features to MongoDbStorage provider (#613) * New features: * Decimal fields can now be serialized as `NumberDecimal`s instead of raw strings. * Indexes can be automatically created instead of having to manually call the `WithIndexCreation` method. * MiniProfiler sessions can be configured to be automatically expired (deleted) after a certain time period has elapsed. * The `MongoDbStorageOptions` class has been added to allow for setting the above options. * MongoDB C# driver has been updated to the latest version, and obsoleted code elements updated accordingly. * All new features are opt-in; full backwards-compatibility (including binary) is retained. Co-authored-by: Ian Kemp Co-authored-by: Nick Craver --- appveyor.yml | 1 - docs/Releases.md | 3 +- .../MiniProfiler.Providers.MongoDB.csproj | 4 +- .../MongoDbStorage.cs | 103 ++++++++++++++++-- .../MongoDbStorageOptions.cs | 55 ++++++++++ .../MiniProfiler.Tests/Helpers/TestConfig.cs | 2 +- .../Storage/MongoDbStorageTests.cs | 31 +++++- .../Storage/RavenDbStoreTests.cs | 10 +- 8 files changed, 188 insertions(+), 21 deletions(-) create mode 100644 src/MiniProfiler.Providers.MongoDB/MongoDbStorageOptions.cs diff --git a/appveyor.yml b/appveyor.yml index c9e2fdd3b..73805dd07 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,7 +37,6 @@ services: - mssql2019 - mysql - postgresql - - mongodb nuget: disable_publish_on_pr: true diff --git a/docs/Releases.md b/docs/Releases.md index 520668fe7..cd85345ea 100644 --- a/docs/Releases.md +++ b/docs/Releases.md @@ -6,7 +6,8 @@ layout: "default" This page tracks major changes included in any update starting with version 4.0.0.3 #### Unreleased -No pending unreleased changes. +- **Fixes/Changes**: + - Upgraded MongoDB driver, allowing automatic index creation and profiler expiration ([#613](https://github.com/MiniProfiler/dotnet/pull/613) - thanks [IanKemp](https://github.com/IanKemp)) #### Version 4.3.8 - **New**: diff --git a/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj b/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj index dc9c98085..0d9499595 100644 --- a/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj +++ b/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj @@ -3,7 +3,7 @@ MiniProfiler.Providers.MongoDB MiniProfiler.Providers.MongoDB MiniProfiler: Profiler storage for MongoDB - Nick Craver, Roger Calaf + Nick Craver, Roger Calaf, Ian Kemp NoSQL;MongoDB;$(PackageBaseTags) net461;netstandard2.0 ..\..\miniprofiler.snk @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.MongoDB/MongoDbStorage.cs b/src/MiniProfiler.Providers.MongoDB/MongoDbStorage.cs index 4cc73b031..1b36718ed 100644 --- a/src/MiniProfiler.Providers.MongoDB/MongoDbStorage.cs +++ b/src/MiniProfiler.Providers.MongoDB/MongoDbStorage.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using MongoDB.Bson; using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; using MongoDB.Driver; +using MongoDB.Driver.Core.Operations; using StackExchange.Profiling.Storage; namespace StackExchange.Profiling @@ -12,38 +16,69 @@ namespace StackExchange.Profiling /// public class MongoDbStorage : IAsyncStorage { + private readonly MongoDbStorageOptions _options; private readonly MongoClient _client; private readonly IMongoCollection _collection; /// /// Returns a new . MongoDb connection string will default to "mongodb://localhost" + /// and collection name to "profilers". /// /// The MongoDB connection string. public MongoDbStorage(string connectionString) : this(connectionString, "profilers") { } /// - /// Returns a new . MongoDb connection string will default to "mongodb://localhost" + /// Returns a new . MongoDb connection string will default to "mongodb://localhost". /// /// The MongoDB connection string. /// The collection name to use in the database. - public MongoDbStorage(string connectionString, string collectionName) + public MongoDbStorage(string connectionString, string collectionName) : this(new MongoDbStorageOptions + { + ConnectionString = connectionString, + CollectionName = collectionName, + }) { } + + /// + /// Creates a new instance of this class using the provided . + /// + /// Options to use for configuring this instance. + /// If is null or contains only whitespace. + public MongoDbStorage(MongoDbStorageOptions options) { + if (string.IsNullOrWhiteSpace(options.CollectionName)) + { + throw new ArgumentException("Collection name may not be null or contain only whitespace", nameof(options.CollectionName)); + } + + _options = options; + if (!BsonClassMap.IsClassMapRegistered(typeof(MiniProfiler))) { BsonClassMapFields(); } - var url = new MongoUrl(connectionString); + var url = new MongoUrl(options.ConnectionString); var databaseName = url.DatabaseName ?? "MiniProfiler"; _client = new MongoClient(url); _collection = _client .GetDatabase(databaseName) - .GetCollection(collectionName); + .GetCollection(options.CollectionName); + + if (options.AutomaticallyCreateIndexes) + { + WithIndexCreation(options.CacheDuration); + } } - private static void BsonClassMapFields() + private void BsonClassMapFields() { + if (_options.SerializeDecimalFieldsAsNumberDecimal) + { + BsonSerializer.RegisterSerializer(typeof(decimal), new DecimalSerializer(BsonType.Decimal128)); + BsonSerializer.RegisterSerializer(typeof(decimal?), new NullableSerializer(new DecimalSerializer(BsonType.Decimal128))); + } + BsonClassMap.RegisterClassMap( map => { @@ -97,13 +132,59 @@ private static void BsonClassMapFields() /// public MongoDbStorage WithIndexCreation() { - _collection.Indexes.CreateOne(Builders.IndexKeys.Ascending(_ => _.User)); - _collection.Indexes.CreateOne(Builders.IndexKeys.Ascending(_ => _.HasUserViewed)); - _collection.Indexes.CreateOne(Builders.IndexKeys.Ascending(_ => _.Started)); - _collection.Indexes.CreateOne(Builders.IndexKeys.Descending(_ => _.Started)); + _collection.Indexes.CreateOne(new CreateIndexModel(Builders.IndexKeys.Ascending(_ => _.User))); + _collection.Indexes.CreateOne(new CreateIndexModel(Builders.IndexKeys.Ascending(_ => _.HasUserViewed))); + CreateStartedAscendingIndex(); + _collection.Indexes.CreateOne(new CreateIndexModel(Builders.IndexKeys.Descending(_ => _.Started))); + return this; } + /// + /// Creates indexes on the following fields for faster querying: + /// + /// FieldDirectionNotes + /// UserAscending + /// HasUserViewedAscending + /// StartedAscendingUsed to apply the , if one was specified + /// StartedDescending + /// + /// + /// The time to persist profiles before they expire. + public MongoDbStorage WithIndexCreation(TimeSpan cacheDuration) + { + _options.CacheDuration = cacheDuration; + return WithIndexCreation(); + } + + private void CreateStartedAscendingIndex() + { + var index = Builders.IndexKeys.Ascending(_ => _.Started); + var options = _options.CacheDuration != default + ? new CreateIndexOptions { ExpireAfter = _options.CacheDuration } + : null; + var model = new CreateIndexModel(index, options); + + try + { + _collection.Indexes.CreateOne(model); + } + catch (MongoCommandException ex) when (_options.AutomaticallyRecreateIndexes && ex.Code == 85) + { + // Handling the case we found an conflicting existing index, and were told to re-create if this happens + var indexNames = _collection.Indexes.List().ToList() + .SelectMany(index => index.Elements) + .Where(element => element.Name == "name") + .Select(name => name.Value.ToString()); + var indexName = IndexNameHelper.GetIndexName(model.Keys.Render(_collection.Indexes.DocumentSerializer, _collection.Indexes.Settings.SerializerRegistry)); + if (indexNames.Contains(indexName)) + { + _collection.Indexes.DropOne(indexName); + } + _collection.Indexes.CreateOne(model); + } + } + /// /// Returns a list of s that haven't been seen by . /// @@ -188,7 +269,7 @@ public void Save(MiniProfiler profiler) _collection.ReplaceOne( p => p.Id == profiler.Id, profiler, - new UpdateOptions + new ReplaceOptions { IsUpsert = true }); @@ -203,7 +284,7 @@ public Task SaveAsync(MiniProfiler profiler) return _collection.ReplaceOneAsync( p => p.Id == profiler.Id, profiler, - new UpdateOptions + new ReplaceOptions { IsUpsert = true }); diff --git a/src/MiniProfiler.Providers.MongoDB/MongoDbStorageOptions.cs b/src/MiniProfiler.Providers.MongoDB/MongoDbStorageOptions.cs new file mode 100644 index 000000000..bfcc6f472 --- /dev/null +++ b/src/MiniProfiler.Providers.MongoDB/MongoDbStorageOptions.cs @@ -0,0 +1,55 @@ +using System; + +namespace StackExchange.Profiling +{ + /// + /// Options for configuring . + /// + public class MongoDbStorageOptions + { + /// + /// The connection string to use for connecting to MongoDB. + /// Defaults to mongodb://localhost. + /// + public string? ConnectionString { get; set; } + + /// + /// Name of the collection in which to store sessions in. + /// Defaults to profilers. + /// + public string CollectionName { get; set; } = "profilers"; + + /// + /// If set to , C# decimal fields will be serialized as NumberDecimals in MongoDB. + /// If set to , will serialize these fields as strings (backwards-compatible with older versions of this provider). + /// Defaults to . + /// + public bool SerializeDecimalFieldsAsNumberDecimal { get; set; } = true; + + /// + /// Specifies whether relevant indexes will automatically created when this provider is instantiated. + /// Defaults to . + /// + public bool AutomaticallyCreateIndexes { get; set; } = true; + + /// + /// Specifies whether relevant indexes will automatically recreated if creation fails (e.g. because something with + /// different options was previously created). + /// *THIS DROPS EXISTING DATA* + /// Defaults to . + /// + public bool AutomaticallyRecreateIndexes { get; set; } = false; + + /// + /// Gets or sets how long to cache each for, in absolute terms. + /// Defaults to one hour. + /// + /// + /// You need to either set to true or call + /// for this value to have any effect. + /// Setting this option will drop any (, ascending) index previously + /// defined, including those with custom options. + /// + public TimeSpan CacheDuration { get; set; } = TimeSpan.FromHours(1); + } +} diff --git a/tests/MiniProfiler.Tests/Helpers/TestConfig.cs b/tests/MiniProfiler.Tests/Helpers/TestConfig.cs index 112d184b4..67132ce2f 100644 --- a/tests/MiniProfiler.Tests/Helpers/TestConfig.cs +++ b/tests/MiniProfiler.Tests/Helpers/TestConfig.cs @@ -30,7 +30,7 @@ static TestConfig() public class Config { public bool RunLongRunning { get; set; } - public bool EnableTestLogging { get; set; } = Environment.GetEnvironmentVariable(nameof(EnableTestLogging)) == "true"; + public bool EnableTestLogging { get; set; } = bool.TryParse(Environment.GetEnvironmentVariable(nameof(EnableTestLogging)), out var enableTestLogging) && enableTestLogging; public string RedisConnectionString { get; set; } = Environment.GetEnvironmentVariable(nameof(RedisConnectionString)) ?? "localhost:6379"; public string SQLServerConnectionString { get; set; } = Environment.GetEnvironmentVariable(nameof(SQLServerConnectionString)) ?? "Server=.;Database=tempdb;Trusted_Connection=True;"; diff --git a/tests/MiniProfiler.Tests/Storage/MongoDbStorageTests.cs b/tests/MiniProfiler.Tests/Storage/MongoDbStorageTests.cs index cb8173c76..56a6746ad 100644 --- a/tests/MiniProfiler.Tests/Storage/MongoDbStorageTests.cs +++ b/tests/MiniProfiler.Tests/Storage/MongoDbStorageTests.cs @@ -1,4 +1,5 @@ using System; +using MongoDB.Driver; using Xunit; using Xunit.Abstractions; @@ -9,9 +10,37 @@ public class MongoDbStorageTests : StorageBaseTest, IClassFixture(() => new MongoDbStorage(options)); + Assert.NotNull(ex); + Assert.Equal(85, ex.Code); + + options.AutomaticallyRecreateIndexes = true; + // Succeeds, because drop/re-create is allowed now + var storage4 = new MongoDbStorage(options); + Assert.NotNull(storage4); + } } - public class MongoDbStorageFixture : StorageFixtureBase, IDisposable + public class MongoDbStorageFixture : StorageFixtureBase { public MongoDbStorageFixture() { diff --git a/tests/MiniProfiler.Tests/Storage/RavenDbStoreTests.cs b/tests/MiniProfiler.Tests/Storage/RavenDbStoreTests.cs index 0606ef422..fba7ae8a7 100644 --- a/tests/MiniProfiler.Tests/Storage/RavenDbStoreTests.cs +++ b/tests/MiniProfiler.Tests/Storage/RavenDbStoreTests.cs @@ -30,20 +30,21 @@ public RavenDbStoreFixture() { var store = new DocumentStore { - Urls = TestConfig.Current.RavenDbUrls.Split(';'), Database = TestConfig.Current.RavenDatabase + Urls = TestConfig.Current.RavenDbUrls.Split(';'), + Database = TestConfig.Current.RavenDatabase + TestId }; store.Initialize(); try { - store.Maintenance.ForDatabase(TestConfig.Current.RavenDatabase).Send(new GetStatisticsOperation()); + store.Maintenance.ForDatabase(store.Database).Send(new GetStatisticsOperation()); } catch (DatabaseDoesNotExistException) { try { - store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord(TestConfig.Current.RavenDatabase))); + store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord(store.Database))); } catch (ConcurrencyException) { @@ -51,10 +52,11 @@ public RavenDbStoreFixture() } } + var dbName = store.Database; store.Dispose(); store = null; - Storage = new RavenDbStorage(TestConfig.Current.RavenDbUrls.Split(';'), TestConfig.Current.RavenDatabase, waitForIndexes: true); + Storage = new RavenDbStorage(TestConfig.Current.RavenDbUrls.Split(';'), dbName, waitForIndexes: true); Storage.GetUnviewedIds(""); } catch (Exception e) From b004f6cc62da9b38b8f6e49a37df94923bc74a70 Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Wed, 2 Aug 2023 18:18:03 -0400 Subject: [PATCH 25/29] Project files: cleanup/normalization (#641) General project file cleanup and normalization. Also adding GitHub Actions enhanced logging for test results. --- .editorconfig | 7 ++- .github/workflows/main.yml | 10 ++++- .../Benchmarks/CustomTimingBenchmarks.cs | 2 +- .../Benchmarks/DictionaryBenchmarks.cs | 2 +- .../Benchmarks/JSONLibBenchmarks.cs | 44 +++++++++---------- .../Benchmarks/MiniProfilerBenchmarks.cs | 2 +- .../Benchmarks/SerializationBenchmarks.cs | 2 +- .../Benchmarks/StackTraceSnippetBenchmarks.cs | 2 +- .../MiniProfiler.Benchmarks.csproj | 14 +++--- samples/Misc/Misc.csproj | 2 +- samples/Samples.AspNet/Samples.AspNet.csproj | 6 ++- .../Samples.Console/Samples.Console.csproj | 16 ++++--- .../Samples.ConsoleCore.csproj | 4 +- .../Samples.Mvc5.EFCore.csproj | 43 ++++++------------ samples/Samples.Mvc5/Samples.Mvc5.csproj | 43 ++++++------------ .../MiniProfiler.AspNetCore.Mvc.csproj | 5 ++- .../MvcDiagnosticListener.cs | 2 +- .../MiniProfiler.AspNetCore.csproj | 5 ++- src/MiniProfiler.EF6/MiniProfiler.EF6.csproj | 4 +- .../MiniProfiler.EFC7.csproj | 4 +- .../MiniProfiler.EntityFrameworkCore.csproj | 4 +- .../RelationalDiagnosticListener.cs | 2 +- .../MiniProfiler.Minimal.csproj | 8 ++-- .../MiniProfiler.Mvc5.csproj | 7 ++- .../MiniProfiler.Providers.MongoDB.csproj | 4 +- .../MiniProfiler.Providers.MySql.csproj | 4 +- .../MiniProfiler.Providers.PostgreSql.csproj | 4 +- .../MiniProfiler.Providers.RavenDB.csproj | 4 +- .../MiniProfiler.Providers.Redis.csproj | 6 ++- .../MiniProfiler.Providers.SqlServer.csproj | 4 +- .../MiniProfiler.Providers.SqlServerCe.csproj | 4 +- .../MiniProfiler.Providers.Sqlite.csproj | 4 +- .../Data/ProfiledDbCommand.cs | 12 ++--- .../Data/ProfiledDbConnection.cs | 6 ++- .../Data/ProfiledDbDataAdapter.cs | 8 ++-- .../Data/ProfiledDbDataReader.cs | 6 +-- .../Data/ProfiledDbProviderFactory.cs | 25 +++++------ .../Data/SimpleProfiledCommand.cs | 7 +-- .../Data/SimpleProfiledConnection.cs | 2 + .../Data/SimpleProfiledDataReader.cs | 6 +-- .../Helpers/ProfilerSortedKey.cs | 6 +-- .../Helpers/StackTraceSnippet.cs | 24 +++++----- .../Internal/ExtensionMethods.cs | 44 +++++++++++++++++-- .../Internal/IDataParameterExtensions.cs | 2 +- .../IMiniProfilerDiagnosticListener.cs | 2 +- .../Internal/MiniProfilerBaseOptions.cs | 2 +- .../Internal/ResultRequest.cs | 18 ++++++-- src/MiniProfiler.Shared/JSONHacks.cs | 9 ++++ .../MiniProfiler.Shared.csproj | 20 +++++++-- src/MiniProfiler.Shared/MiniProfiler.cs | 11 +++-- .../VerboseSqlServerFormatter.cs | 10 ++--- src/MiniProfiler.Shared/SqlTimingParameter.cs | 2 +- src/MiniProfiler.Shared/Timing.cs | 12 ++++- src/MiniProfiler.Shared/TimingDebugInfo.cs | 4 +- src/MiniProfiler/MiniProfiler.csproj | 4 +- tests/Directory.Build.props | 1 + .../MiniProfiler.Tests.AspNet.csproj | 16 ++++--- .../MiniProfiler.Tests.AspNetCore.csproj | 4 +- .../MiniProfiler.Tests.csproj | 12 +++-- .../TimingInstrumentationTest.cs | 10 +++-- 60 files changed, 340 insertions(+), 219 deletions(-) create mode 100644 src/MiniProfiler.Shared/JSONHacks.cs diff --git a/.editorconfig b/.editorconfig index b28189639..b107d7a69 100644 --- a/.editorconfig +++ b/.editorconfig @@ -89,4 +89,9 @@ dotnet_diagnostic.IDE0079.severity = none dotnet_diagnostic.IDE0090.severity = silent # CA1822: Don't run for benchmarks and such -dotnet_code_quality.CA1822.api_surface = private, internal \ No newline at end of file +dotnet_code_quality.CA1822.api_surface = private, internal + +# IDE0056: Use index operator +csharp_style_prefer_index_operator = false +# IDE0057: Use range operator +csharp_style_prefer_range_operator = false diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f022aab9e..00996cc88 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -62,7 +62,7 @@ jobs: - name: .NET Build run: dotnet build Build.csproj -c Release /p:CI=true - name: .NET Test - run: dotnet test Build.csproj -c Release --no-build /p:CI=true + run: dotnet test Build.csproj -c Release --no-build --logger trx --logger GitHubActions --results-directory ./test-results/ /p:CI=true env: EnableTestLogging: true RedisConnectionString: localhost:${{ job.services.redis.ports[6379] }} @@ -72,5 +72,13 @@ jobs: RavenDbUrls: http://localhost:${{ job.services.ravendb.ports[8080] }} RavenDatabase: test SQLServerConnectionString: Server=tcp:127.0.0.1,${{ job.services.sqlserver.ports[1433] }};Database=tempdb;User Id=sa;Password=g0d4mm!tSQLServer; + - name: .NET Test Results + uses: dorny/test-reporter@v1 + continue-on-error: true + if: success() || failure() + with: + name: .NET Test Results + path: 'test-results/*.trx' + reporter: dotnet-trx - name: .NET Lib Pack run: dotnet pack Build.csproj --no-build -c Release /p:PackageOutputPath=%CD%\.nupkgs /p:CI=true diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/CustomTimingBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/CustomTimingBenchmarks.cs index 698edf2b0..c8c035df9 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/CustomTimingBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/CustomTimingBenchmarks.cs @@ -5,7 +5,7 @@ namespace Benchmarks { [SimpleJob(RuntimeMoniker.Net472, invocationCount: 50_000)] - [SimpleJob(RuntimeMoniker.Net50, invocationCount: 50_000)] + [SimpleJob(RuntimeMoniker.Net60, invocationCount: 50_000)] [Config(typeof(Configs.Memory))] public class CustomTimingBenchmarks { diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/DictionaryBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/DictionaryBenchmarks.cs index abb592a2c..a7a94b5f2 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/DictionaryBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/DictionaryBenchmarks.cs @@ -7,7 +7,7 @@ namespace Benchmarks.Benchmarks { [SimpleJob(RuntimeMoniker.Net472)] - [SimpleJob(RuntimeMoniker.Net50)] + [SimpleJob(RuntimeMoniker.Net60)] [Config(typeof(Configs.Memory))] public class DictionaryBenchmarks { diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/JSONLibBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/JSONLibBenchmarks.cs index c15efa66a..db317aa39 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/JSONLibBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/JSONLibBenchmarks.cs @@ -9,7 +9,7 @@ namespace Benchmarks { [SimpleJob(RuntimeMoniker.Net472)] - [SimpleJob(RuntimeMoniker.Net50)] + [SimpleJob(RuntimeMoniker.Net60)] [Config(typeof(Configs.Memory))] public class JSONLibBenchmarks { @@ -29,38 +29,38 @@ static JSONLibBenchmarks() [Benchmark(Description = "Serialize: Simple MiniProfiler (Newtonsoft)")] public string SimpleSerializeNewtonsoft() => JsonConvert.SerializeObject(_simpleProfiler); - - [Benchmark(Description = "Serialize: Simple MiniProfiler (Jil)")] - public string SimpleSerializeJil() => JSON.Serialize(_simpleProfiler, JilOptions); - - [Benchmark(Description = "Serialize: Simple MiniProfiler (ServiceStack)")] - public string SimpleSerializeServiceStack() => ServiceStack.Text.JsonSerializer.SerializeToString(_simpleProfiler); - [Benchmark(Description = "Serialize: Complex MiniProfiler (Newtonsoft)")] public string ComplexSerializeNewtonsoft() => JsonConvert.SerializeObject(_complexProfiler); - - [Benchmark(Description = "Serialize: Complex MiniProfiler (Jil)")] - public string ComplexSerializeJil() => JSON.Serialize(_complexProfiler, JilOptions); - - [Benchmark(Description = "Serialize: Complex MiniProfiler (ServiceStack)")] - public string ComplexSerializeServiceStack() => ServiceStack.Text.JsonSerializer.SerializeToString(_complexProfiler); - [Benchmark(Description = "Deserialize: Simple MiniProfiler (Newtonsoft)")] public MiniProfiler? SimpleDeserializeNewtonsoft() => JsonConvert.DeserializeObject(_simpleProfilerJson); - - [Benchmark(Description = "Deserialize: Simple MiniProfiler (Jil)")] - public MiniProfiler SimpleDeserializeBuiltIn() => JSON.Deserialize(_simpleProfilerJson, JilOptions); - - [Benchmark(Description = "Deserialize: Simple MiniProfiler (ServiceStack)")] - public MiniProfiler SimpleDeserializeServiceStack() => ServiceStack.Text.JsonSerializer.DeserializeFromString(_simpleProfilerJson); - [Benchmark(Description = "Deserialize: Complex MiniProfiler (Newtonsoft)")] public MiniProfiler? ComplexDeserializeNewtonsoft() => JsonConvert.DeserializeObject(_complexProfilerJson); + [Benchmark(Description = "Serialize: Simple MiniProfiler (Jil)")] + public string SimpleSerializeJil() => JSON.Serialize(_simpleProfiler, JilOptions); + [Benchmark(Description = "Serialize: Complex MiniProfiler (Jil)")] + public string ComplexSerializeJil() => JSON.Serialize(_complexProfiler, JilOptions); + [Benchmark(Description = "Deserialize: Simple MiniProfiler (Jil)")] + public MiniProfiler SimpleDeserializeBuiltIn() => JSON.Deserialize(_simpleProfilerJson, JilOptions); [Benchmark(Description = "Deserialize: Complex MiniProfiler (Jil)")] public MiniProfiler ComplexDeserializeBuiltIn() => JSON.Deserialize(_complexProfilerJson, JilOptions); + [Benchmark(Description = "Serialize: Simple MiniProfiler (ServiceStack)")] + public string SimpleSerializeServiceStack() => ServiceStack.Text.JsonSerializer.SerializeToString(_simpleProfiler); + [Benchmark(Description = "Serialize: Complex MiniProfiler (ServiceStack)")] + public string ComplexSerializeServiceStack() => ServiceStack.Text.JsonSerializer.SerializeToString(_complexProfiler); + [Benchmark(Description = "Deserialize: Simple MiniProfiler (ServiceStack)")] + public MiniProfiler SimpleDeserializeServiceStack() => ServiceStack.Text.JsonSerializer.DeserializeFromString(_simpleProfilerJson); [Benchmark(Description = "Deserialize: Complex MiniProfiler (ServiceStack)")] public MiniProfiler ComplexDeserializeServiceStack() => ServiceStack.Text.JsonSerializer.DeserializeFromString(_complexProfilerJson); + + [Benchmark(Description = "Serialize: Simple MiniProfiler (System.Text.Json)")] + public string SimpleSerializeSystemTextJson() => System.Text.Json.JsonSerializer.Serialize(_simpleProfiler); + [Benchmark(Description = "Serialize: Complex MiniProfiler (System.Text.Json)")] + public string ComplexSerializeSystemTextJson() => System.Text.Json.JsonSerializer.Serialize(_complexProfiler); + [Benchmark(Description = "Deserialize: Simple MiniProfiler (System.Text.Json)")] + public MiniProfiler? SimpleDeserializeSystemTextJson() => System.Text.Json.JsonSerializer.Deserialize(_simpleProfilerJson); + [Benchmark(Description = "Deserialize: Complex MiniProfiler (System.Text.Json)")] + public MiniProfiler? ComplexDeserializeSystemTextJson() => System.Text.Json.JsonSerializer.Deserialize(_complexProfilerJson); } } diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/MiniProfilerBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/MiniProfilerBenchmarks.cs index 8fbc80f8a..6892420ba 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/MiniProfilerBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/MiniProfilerBenchmarks.cs @@ -5,7 +5,7 @@ namespace Benchmarks { [SimpleJob(RuntimeMoniker.Net472)] - [SimpleJob(RuntimeMoniker.Net50)] + [SimpleJob(RuntimeMoniker.Net60)] [Config(typeof(Configs.Memory))] public class MiniProfilerBenchmarks { diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/SerializationBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/SerializationBenchmarks.cs index 1bc4ae9d2..2cf779577 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/SerializationBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/SerializationBenchmarks.cs @@ -6,7 +6,7 @@ namespace Benchmarks { [SimpleJob(RuntimeMoniker.Net472)] - [SimpleJob(RuntimeMoniker.Net50)] + [SimpleJob(RuntimeMoniker.Net60)] [Config(typeof(Configs.Memory))] public class SerializationBenchmarks { diff --git a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/StackTraceSnippetBenchmarks.cs b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/StackTraceSnippetBenchmarks.cs index 49a9b15f2..c1dde6a3e 100644 --- a/benchmarks/MiniProfiler.Benchmarks/Benchmarks/StackTraceSnippetBenchmarks.cs +++ b/benchmarks/MiniProfiler.Benchmarks/Benchmarks/StackTraceSnippetBenchmarks.cs @@ -5,7 +5,7 @@ namespace Benchmarks { [SimpleJob(RuntimeMoniker.Net472)] - [SimpleJob(RuntimeMoniker.Net50)] + [SimpleJob(RuntimeMoniker.Net60)] [Config(typeof(Configs.Full))] public class StackTraceSnippetBenchmarks { diff --git a/benchmarks/MiniProfiler.Benchmarks/MiniProfiler.Benchmarks.csproj b/benchmarks/MiniProfiler.Benchmarks/MiniProfiler.Benchmarks.csproj index 94eeec210..e0d88fbcd 100644 --- a/benchmarks/MiniProfiler.Benchmarks/MiniProfiler.Benchmarks.csproj +++ b/benchmarks/MiniProfiler.Benchmarks/MiniProfiler.Benchmarks.csproj @@ -8,22 +8,20 @@ net472;net6.0 AnyCPU false - 9 + - - + + - + - - + - + - \ No newline at end of file diff --git a/samples/Misc/Misc.csproj b/samples/Misc/Misc.csproj index 99aa25c6a..faf4b634b 100644 --- a/samples/Misc/Misc.csproj +++ b/samples/Misc/Misc.csproj @@ -1,8 +1,8 @@  - netstandard2.0 + diff --git a/samples/Samples.AspNet/Samples.AspNet.csproj b/samples/Samples.AspNet/Samples.AspNet.csproj index 35c64e4cb..f4419a22f 100644 --- a/samples/Samples.AspNet/Samples.AspNet.csproj +++ b/samples/Samples.AspNet/Samples.AspNet.csproj @@ -4,12 +4,14 @@ net6.0 true + + + + - - \ No newline at end of file diff --git a/samples/Samples.Console/Samples.Console.csproj b/samples/Samples.Console/Samples.Console.csproj index 86a1f0906..11dc9a55f 100644 --- a/samples/Samples.Console/Samples.Console.csproj +++ b/samples/Samples.Console/Samples.Console.csproj @@ -6,17 +6,21 @@ bin\$(Configuration)\ win7-x64 + - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/samples/Samples.ConsoleCore/Samples.ConsoleCore.csproj b/samples/Samples.ConsoleCore/Samples.ConsoleCore.csproj index de6604e61..9c86a1227 100644 --- a/samples/Samples.ConsoleCore/Samples.ConsoleCore.csproj +++ b/samples/Samples.ConsoleCore/Samples.ConsoleCore.csproj @@ -4,9 +4,11 @@ Samples.Console Exe + - + + \ No newline at end of file diff --git a/samples/Samples.Mvc5.EFCore/Samples.Mvc5.EFCore.csproj b/samples/Samples.Mvc5.EFCore/Samples.Mvc5.EFCore.csproj index 97c62781f..dfbc47120 100644 --- a/samples/Samples.Mvc5.EFCore/Samples.Mvc5.EFCore.csproj +++ b/samples/Samples.Mvc5.EFCore/Samples.Mvc5.EFCore.csproj @@ -9,53 +9,36 @@ true bin\ false - - if not exist "roslyn" md "roslyn" - xcopy /s /y /q "$(CscToolPath)\*.*" "roslyn" - + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/samples/Samples.Mvc5/Samples.Mvc5.csproj b/samples/Samples.Mvc5/Samples.Mvc5.csproj index e588de31d..08ecf99ac 100644 --- a/samples/Samples.Mvc5/Samples.Mvc5.csproj +++ b/samples/Samples.Mvc5/Samples.Mvc5.csproj @@ -9,44 +9,24 @@ true bin\ false - - if not exist "roslyn" md "roslyn" - xcopy /s /y /q "$(CscToolPath)\*.*" "roslyn" - + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + @@ -57,9 +37,11 @@ + + if not exist "$(TargetDir)x86" md "$(TargetDir)x86" @@ -69,6 +51,7 @@ xcopy /s /y /q "$(NuGetPackageRoot)\sqlite\3.13.0\runtimes\win7-x64\native\*.*" "$(TargetDir)x64\.." + diff --git a/src/MiniProfiler.AspNetCore.Mvc/MiniProfiler.AspNetCore.Mvc.csproj b/src/MiniProfiler.AspNetCore.Mvc/MiniProfiler.AspNetCore.Mvc.csproj index 598dc417e..9db0c16fb 100644 --- a/src/MiniProfiler.AspNetCore.Mvc/MiniProfiler.AspNetCore.Mvc.csproj +++ b/src/MiniProfiler.AspNetCore.Mvc/MiniProfiler.AspNetCore.Mvc.csproj @@ -7,9 +7,10 @@ ASP.NET Core;MVC;MVC Core;$(PackageBaseTags) net6.0 + - - + + \ No newline at end of file diff --git a/src/MiniProfiler.AspNetCore.Mvc/MvcDiagnosticListener.cs b/src/MiniProfiler.AspNetCore.Mvc/MvcDiagnosticListener.cs index 0f4f83a77..b2a670630 100644 --- a/src/MiniProfiler.AspNetCore.Mvc/MvcDiagnosticListener.cs +++ b/src/MiniProfiler.AspNetCore.Mvc/MvcDiagnosticListener.cs @@ -161,7 +161,7 @@ public StackTiming(object state, Timing? timing, StackTiming? previous) => /// Provides the observer with new data. /// /// The current notification information. - public void OnNext(KeyValuePair kv) + public void OnNext(KeyValuePair kv) { try { diff --git a/src/MiniProfiler.AspNetCore/MiniProfiler.AspNetCore.csproj b/src/MiniProfiler.AspNetCore/MiniProfiler.AspNetCore.csproj index 204608b26..1e816e111 100644 --- a/src/MiniProfiler.AspNetCore/MiniProfiler.AspNetCore.csproj +++ b/src/MiniProfiler.AspNetCore/MiniProfiler.AspNetCore.csproj @@ -7,9 +7,10 @@ ASP.NET Core;$(PackageBaseTags) net6.0 + - - + + \ No newline at end of file diff --git a/src/MiniProfiler.EF6/MiniProfiler.EF6.csproj b/src/MiniProfiler.EF6/MiniProfiler.EF6.csproj index a4e3fc9fd..15de099d4 100644 --- a/src/MiniProfiler.EF6/MiniProfiler.EF6.csproj +++ b/src/MiniProfiler.EF6/MiniProfiler.EF6.csproj @@ -8,8 +8,10 @@ Entity Framework;Entity Framework 6;$(PackageBaseTags) net461;netstandard2.1 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.EFC7/MiniProfiler.EFC7.csproj b/src/MiniProfiler.EFC7/MiniProfiler.EFC7.csproj index bdaeb91ca..1de4bc512 100644 --- a/src/MiniProfiler.EFC7/MiniProfiler.EFC7.csproj +++ b/src/MiniProfiler.EFC7/MiniProfiler.EFC7.csproj @@ -8,8 +8,10 @@ Entity Framework;Entity Framework Classic 7;$(PackageBaseTags) net461 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.EntityFrameworkCore/MiniProfiler.EntityFrameworkCore.csproj b/src/MiniProfiler.EntityFrameworkCore/MiniProfiler.EntityFrameworkCore.csproj index 197c13525..8e127183e 100644 --- a/src/MiniProfiler.EntityFrameworkCore/MiniProfiler.EntityFrameworkCore.csproj +++ b/src/MiniProfiler.EntityFrameworkCore/MiniProfiler.EntityFrameworkCore.csproj @@ -8,8 +8,10 @@ Entity Framework;Entity Framework Core;$(PackageBaseTags) netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.EntityFrameworkCore/RelationalDiagnosticListener.cs b/src/MiniProfiler.EntityFrameworkCore/RelationalDiagnosticListener.cs index 3fe2171a6..d2baf7bfe 100644 --- a/src/MiniProfiler.EntityFrameworkCore/RelationalDiagnosticListener.cs +++ b/src/MiniProfiler.EntityFrameworkCore/RelationalDiagnosticListener.cs @@ -43,7 +43,7 @@ public void OnCompleted() { } /// Provides the observer with new data. /// /// The current notification information. - public void OnNext(KeyValuePair kv) + public void OnNext(KeyValuePair kv) { var key = kv.Key; var val = kv.Value; diff --git a/src/MiniProfiler.Minimal/MiniProfiler.Minimal.csproj b/src/MiniProfiler.Minimal/MiniProfiler.Minimal.csproj index 1565f7c43..a15a9910f 100644 --- a/src/MiniProfiler.Minimal/MiniProfiler.Minimal.csproj +++ b/src/MiniProfiler.Minimal/MiniProfiler.Minimal.csproj @@ -4,19 +4,19 @@ MiniProfiler.Minimal Nick Craver MiniProfiler's no-frills headless build for no-UI applications. - netstandard2.0 + netstandard2.0;net6.0 MINIMAL - + - + - + diff --git a/src/MiniProfiler.Mvc5/MiniProfiler.Mvc5.csproj b/src/MiniProfiler.Mvc5/MiniProfiler.Mvc5.csproj index 98c51472a..0718c4552 100644 --- a/src/MiniProfiler.Mvc5/MiniProfiler.Mvc5.csproj +++ b/src/MiniProfiler.Mvc5/MiniProfiler.Mvc5.csproj @@ -8,9 +8,12 @@ ASP.NET;MVC;MVC 5;$(PackageBaseTags) net461 + - - + + + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj b/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj index 0d9499595..1c6ba1408 100644 --- a/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj +++ b/src/MiniProfiler.Providers.MongoDB/MiniProfiler.Providers.MongoDB.csproj @@ -9,8 +9,10 @@ ..\..\miniprofiler.snk false + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.MySql/MiniProfiler.Providers.MySql.csproj b/src/MiniProfiler.Providers.MySql/MiniProfiler.Providers.MySql.csproj index 97d3abc84..c0cf08802 100644 --- a/src/MiniProfiler.Providers.MySql/MiniProfiler.Providers.MySql.csproj +++ b/src/MiniProfiler.Providers.MySql/MiniProfiler.Providers.MySql.csproj @@ -7,9 +7,11 @@ SQL;MySQL;$(PackageBaseTags) net461;netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.PostgreSql/MiniProfiler.Providers.PostgreSql.csproj b/src/MiniProfiler.Providers.PostgreSql/MiniProfiler.Providers.PostgreSql.csproj index 1dbcdbb09..900ae30e4 100644 --- a/src/MiniProfiler.Providers.PostgreSql/MiniProfiler.Providers.PostgreSql.csproj +++ b/src/MiniProfiler.Providers.PostgreSql/MiniProfiler.Providers.PostgreSql.csproj @@ -7,9 +7,11 @@ SQL;Npgsql;PostgreSql;$(PackageBaseTags) net461;netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.RavenDB/MiniProfiler.Providers.RavenDB.csproj b/src/MiniProfiler.Providers.RavenDB/MiniProfiler.Providers.RavenDB.csproj index e8eb7a260..c60e8400c 100644 --- a/src/MiniProfiler.Providers.RavenDB/MiniProfiler.Providers.RavenDB.csproj +++ b/src/MiniProfiler.Providers.RavenDB/MiniProfiler.Providers.RavenDB.csproj @@ -7,9 +7,11 @@ Raven;RavenDB;$(PackageBaseTags) net461;netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Redis/MiniProfiler.Providers.Redis.csproj b/src/MiniProfiler.Providers.Redis/MiniProfiler.Providers.Redis.csproj index 90465b152..2d2126bfe 100644 --- a/src/MiniProfiler.Providers.Redis/MiniProfiler.Providers.Redis.csproj +++ b/src/MiniProfiler.Providers.Redis/MiniProfiler.Providers.Redis.csproj @@ -7,9 +7,11 @@ Redis;$(PackageBaseTags) net461;netstandard2.0 + - - + + + diff --git a/src/MiniProfiler.Providers.SqlServer/MiniProfiler.Providers.SqlServer.csproj b/src/MiniProfiler.Providers.SqlServer/MiniProfiler.Providers.SqlServer.csproj index 2d2c43a96..788e700b9 100644 --- a/src/MiniProfiler.Providers.SqlServer/MiniProfiler.Providers.SqlServer.csproj +++ b/src/MiniProfiler.Providers.SqlServer/MiniProfiler.Providers.SqlServer.csproj @@ -7,8 +7,10 @@ SQL;SQL Server;$(PackageBaseTags) net461;netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.SqlServerCe/MiniProfiler.Providers.SqlServerCe.csproj b/src/MiniProfiler.Providers.SqlServerCe/MiniProfiler.Providers.SqlServerCe.csproj index 410ba8b41..f06bca989 100644 --- a/src/MiniProfiler.Providers.SqlServerCe/MiniProfiler.Providers.SqlServerCe.csproj +++ b/src/MiniProfiler.Providers.SqlServerCe/MiniProfiler.Providers.SqlServerCe.csproj @@ -7,9 +7,11 @@ SQL Server CE;$(PackageBaseTags) net461 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Providers.Sqlite/MiniProfiler.Providers.Sqlite.csproj b/src/MiniProfiler.Providers.Sqlite/MiniProfiler.Providers.Sqlite.csproj index 87ca5f927..bfec4af5e 100644 --- a/src/MiniProfiler.Providers.Sqlite/MiniProfiler.Providers.Sqlite.csproj +++ b/src/MiniProfiler.Providers.Sqlite/MiniProfiler.Providers.Sqlite.csproj @@ -7,9 +7,11 @@ SQL;SQLite;$(PackageBaseTags) net461;netstandard2.0 + - + + \ No newline at end of file diff --git a/src/MiniProfiler.Shared/Data/ProfiledDbCommand.cs b/src/MiniProfiler.Shared/Data/ProfiledDbCommand.cs index a1bb72da0..0b79c3be8 100644 --- a/src/MiniProfiler.Shared/Data/ProfiledDbCommand.cs +++ b/src/MiniProfiler.Shared/Data/ProfiledDbCommand.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Data; using System.Data.Common; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; #if !MINIMAL @@ -95,7 +96,7 @@ public ProfiledDbCommand(DbCommand command, DbConnection? connection, IDbProfile var prop = commandType.GetProperty("BindByName", BindingFlags.Public | BindingFlags.Instance); action = null; ParameterInfo[] indexers; - MethodInfo setter; + MethodInfo? setter; if (prop?.CanWrite == true && prop.PropertyType == typeof(bool) && ((indexers = prop.GetIndexParameters()) == null || indexers.Length == 0) && (setter = prop.GetSetMethod()) != null) @@ -117,6 +118,7 @@ public ProfiledDbCommand(DbCommand command, DbConnection? connection, IDbProfile #endif /// + [AllowNull] public override string CommandText { get => _command.CommandText; @@ -308,14 +310,14 @@ public override async Task ExecuteNonQueryAsync(CancellationToken cancellat } /// - public override object ExecuteScalar() + public override object? ExecuteScalar() { if (_profiler?.IsActive != true) { return _command.ExecuteScalar(); } - object result; + object? result; _profiler.ExecuteStart(this, SqlExecuteType.Scalar); try { @@ -335,14 +337,14 @@ public override object ExecuteScalar() } /// - public override async Task ExecuteScalarAsync(CancellationToken cancellationToken) + public override async Task ExecuteScalarAsync(CancellationToken cancellationToken) { if (_profiler?.IsActive != true) { return await _command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false); } - object result; + object? result; _profiler.ExecuteStart(this, SqlExecuteType.Scalar); try { diff --git a/src/MiniProfiler.Shared/Data/ProfiledDbConnection.cs b/src/MiniProfiler.Shared/Data/ProfiledDbConnection.cs index d5cd69cda..28af54514 100644 --- a/src/MiniProfiler.Shared/Data/ProfiledDbConnection.cs +++ b/src/MiniProfiler.Shared/Data/ProfiledDbConnection.cs @@ -1,6 +1,7 @@ using System; using System.Data; using System.Data.Common; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -45,6 +46,7 @@ public ProfiledDbConnection(DbConnection connection, IDbProfiler? profiler) public DbConnection WrappedConnection => _connection; /// + [AllowNull] public override string ConnectionString { get => _connection.ConnectionString; @@ -165,7 +167,7 @@ private void StateChangeHandler(object sender, StateChangeEventArgs stateChangeE protected override bool CanRaiseEvents => true; /// - public override void EnlistTransaction(System.Transactions.Transaction transaction) => _connection.EnlistTransaction(transaction); + public override void EnlistTransaction(System.Transactions.Transaction? transaction) => _connection.EnlistTransaction(transaction); /// public override DataTable GetSchema() => _connection.GetSchema(); @@ -174,6 +176,6 @@ private void StateChangeHandler(object sender, StateChangeEventArgs stateChangeE public override DataTable GetSchema(string collectionName) => _connection.GetSchema(collectionName); /// - public override DataTable GetSchema(string collectionName, string[] restrictionValues) => _connection.GetSchema(collectionName, restrictionValues); + public override DataTable GetSchema(string collectionName, string?[] restrictionValues) => _connection.GetSchema(collectionName, restrictionValues); } } diff --git a/src/MiniProfiler.Shared/Data/ProfiledDbDataAdapter.cs b/src/MiniProfiler.Shared/Data/ProfiledDbDataAdapter.cs index ce62a7412..f4266fe38 100644 --- a/src/MiniProfiler.Shared/Data/ProfiledDbDataAdapter.cs +++ b/src/MiniProfiler.Shared/Data/ProfiledDbDataAdapter.cs @@ -155,7 +155,7 @@ private void InitCommands(IDbDataAdapter wrappedAdapter) set { _selectCommand = value; - InternalAdapter.SelectCommand = value is ProfiledDbCommand cmd ? cmd.InternalCommand : value; + InternalAdapter.SelectCommand = value is ProfiledDbCommand cmd ? cmd.WrappedCommand : value; } } @@ -166,7 +166,7 @@ private void InitCommands(IDbDataAdapter wrappedAdapter) set { _insertCommand = value; - InternalAdapter.InsertCommand = value is ProfiledDbCommand cmd ? cmd.InternalCommand : value; + InternalAdapter.InsertCommand = value is ProfiledDbCommand cmd ? cmd.WrappedCommand : value; } } @@ -177,7 +177,7 @@ private void InitCommands(IDbDataAdapter wrappedAdapter) set { _updateCommand = value; - InternalAdapter.UpdateCommand = value is ProfiledDbCommand cmd ? cmd.InternalCommand : value; + InternalAdapter.UpdateCommand = value is ProfiledDbCommand cmd ? cmd.WrappedCommand : value; } } @@ -188,7 +188,7 @@ private void InitCommands(IDbDataAdapter wrappedAdapter) set { _deleteCommand = value; - InternalAdapter.DeleteCommand = value is ProfiledDbCommand cmd ? cmd.InternalCommand : value; + InternalAdapter.DeleteCommand = value is ProfiledDbCommand cmd ? cmd.WrappedCommand : value; } } } diff --git a/src/MiniProfiler.Shared/Data/ProfiledDbDataReader.cs b/src/MiniProfiler.Shared/Data/ProfiledDbDataReader.cs index 53a2d67ed..8d225301b 100644 --- a/src/MiniProfiler.Shared/Data/ProfiledDbDataReader.cs +++ b/src/MiniProfiler.Shared/Data/ProfiledDbDataReader.cs @@ -69,14 +69,14 @@ public ProfiledDbDataReader(DbDataReader reader, CommandBehavior behavior, IDbPr public override byte GetByte(int ordinal) => WrappedReader.GetByte(ordinal); /// - public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) => + public override long GetBytes(int ordinal, long dataOffset, byte[]? buffer, int bufferOffset, int length) => WrappedReader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); /// public override char GetChar(int ordinal) => WrappedReader.GetChar(ordinal); /// - public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) => + public override long GetChars(int ordinal, long dataOffset, char[]? buffer, int bufferOffset, int length) => WrappedReader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); /// @@ -164,7 +164,7 @@ public override void Close() } /// - public override DataTable GetSchemaTable() => WrappedReader.GetSchemaTable(); + public override DataTable? GetSchemaTable() => WrappedReader.GetSchemaTable(); /// protected override void Dispose(bool disposing) diff --git a/src/MiniProfiler.Shared/Data/ProfiledDbProviderFactory.cs b/src/MiniProfiler.Shared/Data/ProfiledDbProviderFactory.cs index cc8bfbbc1..82df9a3f4 100644 --- a/src/MiniProfiler.Shared/Data/ProfiledDbProviderFactory.cs +++ b/src/MiniProfiler.Shared/Data/ProfiledDbProviderFactory.cs @@ -54,32 +54,32 @@ private ProfiledDbProviderFactory() { } #pragma warning restore CS8618 /// - public override DbCommand CreateCommand() + public override DbCommand? CreateCommand() { var command = _factory.CreateCommand(); var profiler = MiniProfiler.Current; - return profiler != null || _alwaysWrap + return command is not null && (profiler is not null || _alwaysWrap) ? new ProfiledDbCommand(command, null, profiler) : command; } /// - public override DbConnection CreateConnection() + public override DbConnection? CreateConnection() { var connection = _factory.CreateConnection(); var profiler = MiniProfiler.Current; - return profiler != null || _alwaysWrap + return connection is not null && (profiler is not null || _alwaysWrap) ? new ProfiledDbConnection(connection, profiler) : connection; } /// - public override DbConnectionStringBuilder CreateConnectionStringBuilder() => _factory.CreateConnectionStringBuilder(); + public override DbConnectionStringBuilder? CreateConnectionStringBuilder() => _factory.CreateConnectionStringBuilder(); /// - public override DbParameter CreateParameter() => _factory.CreateParameter(); + public override DbParameter? CreateParameter() => _factory.CreateParameter(); /// /// Allow to re-initialize the provider factory. @@ -91,24 +91,23 @@ public override DbConnection CreateConnection() public override bool CanCreateDataSourceEnumerator => _factory.CanCreateDataSourceEnumerator; /// - public override DbCommandBuilder CreateCommandBuilder() => _factory.CreateCommandBuilder(); + public override DbCommandBuilder? CreateCommandBuilder() => _factory.CreateCommandBuilder(); /// - public override DbDataAdapter CreateDataAdapter() + public override DbDataAdapter? CreateDataAdapter() { - var profiler = MiniProfiler.Current; - var dataAdapter = _factory.CreateDataAdapter(); + var profiler = MiniProfiler.Current; - return profiler != null || _alwaysWrap + return dataAdapter is not null && (profiler is not null || _alwaysWrap) ? new ProfiledDbDataAdapter(dataAdapter, profiler) : dataAdapter; } /// - public override DbDataSourceEnumerator CreateDataSourceEnumerator() => _factory.CreateDataSourceEnumerator(); + public override DbDataSourceEnumerator? CreateDataSourceEnumerator() => _factory.CreateDataSourceEnumerator(); -#if !NETSTANDARD2_0 +#if NET46_OR_GREATER /// public override CodeAccessPermission CreatePermission(PermissionState state) => _factory.CreatePermission(state); #endif diff --git a/src/MiniProfiler.Shared/Data/SimpleProfiledCommand.cs b/src/MiniProfiler.Shared/Data/SimpleProfiledCommand.cs index 5b3926cc0..9c6f78cb2 100644 --- a/src/MiniProfiler.Shared/Data/SimpleProfiledCommand.cs +++ b/src/MiniProfiler.Shared/Data/SimpleProfiledCommand.cs @@ -11,7 +11,7 @@ namespace StackExchange.Profiling.Data public class SimpleProfiledCommand : IDbCommand { private IDbCommand _command; - private IDbConnection _connection; + private IDbConnection? _connection; private IDbProfiler? _profiler; private IDbTransaction? _transaction; @@ -54,7 +54,7 @@ public IDataReader ExecuteReader(CommandBehavior behavior) => ProfileWith(SqlExecuteType.Reader, () => new SimpleProfiledDataReader(_command.ExecuteReader(behavior), _profiler)); /// - public object ExecuteScalar() => ProfileWith(SqlExecuteType.Scalar, () => _command.ExecuteScalar()); + public object? ExecuteScalar() => ProfileWith(SqlExecuteType.Scalar, () => _command.ExecuteScalar()); /// /// Profile with results. @@ -88,7 +88,7 @@ private TResult ProfileWith(SqlExecuteType type, Func func) } /// - public IDbConnection Connection + public IDbConnection? Connection { get => _connection; set @@ -116,6 +116,7 @@ public IDbTransaction? Transaction } /// + [AllowNull] [SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities", Justification = "Handled elsewhere.")] public string CommandText { diff --git a/src/MiniProfiler.Shared/Data/SimpleProfiledConnection.cs b/src/MiniProfiler.Shared/Data/SimpleProfiledConnection.cs index 2d56cbc6d..12a3403a4 100644 --- a/src/MiniProfiler.Shared/Data/SimpleProfiledConnection.cs +++ b/src/MiniProfiler.Shared/Data/SimpleProfiledConnection.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Diagnostics.CodeAnalysis; namespace StackExchange.Profiling.Data { @@ -13,6 +14,7 @@ public class SimpleProfiledConnection : IDbConnection private IDbConnection _connection; /// + [AllowNull] public string ConnectionString { get => _connection.ConnectionString; diff --git a/src/MiniProfiler.Shared/Data/SimpleProfiledDataReader.cs b/src/MiniProfiler.Shared/Data/SimpleProfiledDataReader.cs index 732d1ff3d..3e5e3a48c 100644 --- a/src/MiniProfiler.Shared/Data/SimpleProfiledDataReader.cs +++ b/src/MiniProfiler.Shared/Data/SimpleProfiledDataReader.cs @@ -53,14 +53,14 @@ public SimpleProfiledDataReader(IDataReader reader, IDbProfiler? profiler) public byte GetByte(int ordinal) => _reader.GetByte(ordinal); /// - public long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) => + public long GetBytes(int ordinal, long dataOffset, byte[]? buffer, int bufferOffset, int length) => _reader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); /// public char GetChar(int ordinal) => _reader.GetChar(ordinal); /// - public long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) => + public long GetChars(int ordinal, long dataOffset, char[]? buffer, int bufferOffset, int length) => _reader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); /// @@ -124,7 +124,7 @@ public void Close() } /// - public DataTable GetSchemaTable() => _reader.GetSchemaTable(); + public DataTable? GetSchemaTable() => _reader.GetSchemaTable(); /// public bool NextResult() => _reader.NextResult(); diff --git a/src/MiniProfiler.Shared/Helpers/ProfilerSortedKey.cs b/src/MiniProfiler.Shared/Helpers/ProfilerSortedKey.cs index 2c63ef169..bf07a380e 100644 --- a/src/MiniProfiler.Shared/Helpers/ProfilerSortedKey.cs +++ b/src/MiniProfiler.Shared/Helpers/ProfilerSortedKey.cs @@ -33,10 +33,10 @@ public ProfilerSortedKey(MiniProfiler profiler) /// Compares this to another. /// /// The to compare - public int CompareTo(ProfilerSortedKey other) + public int CompareTo(ProfilerSortedKey? other) { - var comp = Started.CompareTo(other.Started); - if (comp == 0) comp = Id.CompareTo(other.Id); + var comp = Started.CompareTo(other?.Started); + if (comp == 0) comp = Id.CompareTo(other?.Id); return comp; } } diff --git a/src/MiniProfiler.Shared/Helpers/StackTraceSnippet.cs b/src/MiniProfiler.Shared/Helpers/StackTraceSnippet.cs index 38344dbba..654de5aec 100644 --- a/src/MiniProfiler.Shared/Helpers/StackTraceSnippet.cs +++ b/src/MiniProfiler.Shared/Helpers/StackTraceSnippet.cs @@ -43,7 +43,7 @@ bool ShouldExcludeType(MethodBase method) return false; } - var frames = new StackTrace().GetFrames(); + StackFrame?[] frames = new StackTrace().GetFrames(); if (frames == null) { @@ -56,18 +56,22 @@ bool ShouldExcludeType(MethodBase method) for (int i = 0; i < frames.Length; i++) { - var method = frames[i].GetMethod(); + var method = frames[i]?.GetMethod(); + if (method is null) + { + continue; + } if (stackLength >= options.StackMaxLength // ASP.NET: no need to continue up the chain || method.Name == "System.Web.HttpApplication.IExecutionStep.Execute" - || (ModuleNames.GetOrAdd(method.Module, m => m.Name) == "Microsoft.AspNetCore.Mvc.Core.dll" && method.DeclaringType.Name == "ObjectMethodExecutor")) + || (ModuleNames.GetOrAdd(method.Module, m => m.Name) == "Microsoft.AspNetCore.Mvc.Core.dll" && method.DeclaringType?.Name == "ObjectMethodExecutor")) { frames[i] = null; startFrame = i < 0 ? 0 : i - 1; break; } else if (ShouldExcludeType(method) - || options.ExcludedAssemblies.Contains(AssemblyNames.GetOrAdd(method.Module.Assembly, a => a.GetName().Name)) + || options.ExcludedAssemblies.Contains(AssemblyNames.GetOrAdd(method.Module.Assembly, a => a.GetName().Name ?? "Unknown Assembly")) || options.ExcludedMethods.Contains(method.Name)) { frames[i] = null; @@ -83,7 +87,7 @@ bool ShouldExcludeType(MethodBase method) var f = frames[i]; if (f != null) { - var method = f.GetMethod(); + var method = f.GetMethod()!; if (sb.Length > 0) { sb.Append(" > "); @@ -494,7 +498,7 @@ internal static StringBuilder AppendGenericsHtml(this StringBuilder sb, string t { const string _dotSpan = "."; // Check the common framework list above - _commonGenerics.TryGetValue(typeOrMethod, out string[] args); + _commonGenerics.TryGetValue(typeOrMethod, out string[]? args); // Break each type down by namespace and class (remember, we *could* have nested generic classes) var classes = typeOrMethod.Split(_dot); @@ -543,11 +547,11 @@ void AppendArgs(string[] tArgs) if (tArgs.Length > 5) { sb.Append("").Append(tArgs[0]).Append("") - .Append(",") + .Append(',') .Append("").Append(tArgs[1]).Append("") - .Append(",") + .Append(',') .Append("").Append(tArgs[2]).Append("") - .Append("…") + .Append('…') .Append("").Append(tArgs[tArgs.Length - 1]).Append(""); } else @@ -556,7 +560,7 @@ void AppendArgs(string[] tArgs) { if (i > 0) { - sb.Append(","); + sb.Append(','); } sb.Append(""); sb.Append(tArgs[i]) diff --git a/src/MiniProfiler.Shared/Internal/ExtensionMethods.cs b/src/MiniProfiler.Shared/Internal/ExtensionMethods.cs index e3237c8ac..2b5a6b0df 100644 --- a/src/MiniProfiler.Shared/Internal/ExtensionMethods.cs +++ b/src/MiniProfiler.Shared/Internal/ExtensionMethods.cs @@ -3,9 +3,12 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -#if !MINIMAL +#if NEWTONSOFT using Newtonsoft.Json; using Newtonsoft.Json.Serialization; +#elif STJSON +using System.Text.Json; +using System.Text.Json.Serialization; #endif namespace StackExchange.Profiling.Internal @@ -79,7 +82,7 @@ public static string ToJson(this List? guids) return sb.ToString(); } -#if !MINIMAL +#if NEWTONSOFT private static readonly JsonSerializerSettings defaultSettings = new() { NullValueHandling = NullValueHandling.Ignore, @@ -127,6 +130,41 @@ public static string ToJson(this List? guids) /// The object resulting from the given string. public static T? FromJson(this string? s) where T : class => !string.IsNullOrEmpty(s) ? JsonConvert.DeserializeObject(s!, defaultSettings) : null; +#elif STJSON + private static readonly JsonSerializerOptions defaultSettings = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + }; + + /// + /// Renders the parameter to JSON. + /// + /// The to serialize. + /// Whether to HTML escape the output. + [return: NotNullIfNotNull(nameof(profiler))] + [SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Compatibility across versions")] + public static string? ToJson(this MiniProfiler? profiler, bool htmlEscape = false) => + profiler != default + ? JsonSerializer.Serialize(profiler, defaultSettings) + : null; + + /// + /// Serializes to a JSON string. + /// + /// The instance to serialize. + /// The resulting JSON object as a string. + [return: NotNullIfNotNull(nameof(o))] + public static string? ToJson(this object? o) => + o != null ? JsonSerializer.Serialize(o, defaultSettings) : null; + + /// + /// Deserializes to an object of type . + /// + /// The type to deserialize to. + /// The string to deserialize. + /// The object resulting from the given string. + public static T? FromJson(this string? s) where T : class => + !string.IsNullOrEmpty(s) ? JsonSerializer.Deserialize(s!, defaultSettings) : null; #endif /// @@ -138,7 +176,7 @@ public static string ToJson(this List? guids) /// The key to attempt removal of. /// The value found (if it was found) from the dictionary. /// Whether the key was removed. - public static bool TryRemove(this Dictionary dict, TKey key, [NotNullWhen(true)] out TValue? value) + public static bool TryRemove(this Dictionary dict, TKey key, [NotNullWhen(true)] out TValue? value) where TKey : notnull { value = default; if (dict?.TryGetValue(key, out value) == true) diff --git a/src/MiniProfiler.Shared/Internal/IDataParameterExtensions.cs b/src/MiniProfiler.Shared/Internal/IDataParameterExtensions.cs index ce77e7124..fd3fd4d44 100644 --- a/src/MiniProfiler.Shared/Internal/IDataParameterExtensions.cs +++ b/src/MiniProfiler.Shared/Internal/IDataParameterExtensions.cs @@ -15,7 +15,7 @@ public static class IDataParameterExtensions /// The parameter to get a value for. public static string? GetStringValue(this IDataParameter parameter) { - object rawValue = parameter.Value; + object? rawValue = parameter.Value; if (rawValue == null || rawValue == DBNull.Value) { return null; diff --git a/src/MiniProfiler.Shared/Internal/IMiniProfilerDiagnosticListener.cs b/src/MiniProfiler.Shared/Internal/IMiniProfilerDiagnosticListener.cs index a0a022f48..85bee71c1 100644 --- a/src/MiniProfiler.Shared/Internal/IMiniProfilerDiagnosticListener.cs +++ b/src/MiniProfiler.Shared/Internal/IMiniProfilerDiagnosticListener.cs @@ -7,7 +7,7 @@ namespace StackExchange.Profiling.Internal /// Internal MiniProfiler interface for registering DiagnosticListeners, not meant for consumption. /// This can and probably will break without warning. Don't use the .Internal namespace directly. /// - public interface IMiniProfilerDiagnosticListener : IObserver> + public interface IMiniProfilerDiagnosticListener : IObserver> { /// /// Gets a value indicating which listener this instance should be subscribed to. diff --git a/src/MiniProfiler.Shared/Internal/MiniProfilerBaseOptions.cs b/src/MiniProfiler.Shared/Internal/MiniProfilerBaseOptions.cs index c798a546d..4a245c1fe 100644 --- a/src/MiniProfiler.Shared/Internal/MiniProfilerBaseOptions.cs +++ b/src/MiniProfiler.Shared/Internal/MiniProfilerBaseOptions.cs @@ -16,7 +16,7 @@ public class MiniProfilerBaseOptions /// /// Assembly version of this dank MiniProfiler. /// - public static Version Version { get; } = typeof(MiniProfilerBaseOptions).GetTypeInfo().Assembly.GetName().Version; + public static Version Version { get; } = typeof(MiniProfilerBaseOptions).GetTypeInfo().Assembly.GetName().Version!; /// /// The hash to use for file cache breaking, this is automatically calculated. diff --git a/src/MiniProfiler.Shared/Internal/ResultRequest.cs b/src/MiniProfiler.Shared/Internal/ResultRequest.cs index 31b541fcb..b9fbbb558 100644 --- a/src/MiniProfiler.Shared/Internal/ResultRequest.cs +++ b/src/MiniProfiler.Shared/Internal/ResultRequest.cs @@ -3,7 +3,6 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; -using Newtonsoft.Json; namespace StackExchange.Profiling.Internal { @@ -37,7 +36,9 @@ public class ResultRequest /// public int TimingCount => (Performance?.Count ?? 0) + (Probes?.Count ?? 0); - private static readonly JsonSerializer _serializer = new(); +#if NEWTONSOFT + private static readonly Newtonsoft.Json.JsonSerializer _serializer = new(); +#endif /// /// Returns a deserialize object from an input stream, like an HTTP request body. @@ -49,8 +50,9 @@ public static bool TryParse(Stream stream, [NotNullWhen(true)] out ResultRequest { try { - using (var sr = new StreamReader(stream)) - using (var jsonTextReader = new JsonTextReader(sr)) +#if NEWTONSOFT + using var sr = new StreamReader(stream); + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(sr)) { var tmp = _serializer.Deserialize(jsonTextReader); if (tmp?.Id.HasValue == true) @@ -59,6 +61,14 @@ public static bool TryParse(Stream stream, [NotNullWhen(true)] out ResultRequest return true; } } +#elif STJSON + var tmp = System.Text.Json.JsonSerializer.Deserialize(stream); + if (tmp?.Id.HasValue == true) + { + result = tmp; + return true; + } +#endif } catch (Exception e) { diff --git a/src/MiniProfiler.Shared/JSONHacks.cs b/src/MiniProfiler.Shared/JSONHacks.cs new file mode 100644 index 000000000..1be242e02 --- /dev/null +++ b/src/MiniProfiler.Shared/JSONHacks.cs @@ -0,0 +1,9 @@ +// Defining these attributes here so we don't have a ton of #if defs around every property + +#if !NET6_0_OR_GREATER +namespace System.Text.Json.Serialization +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + internal sealed class JsonIgnore : Attribute { } +} +#endif diff --git a/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj b/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj index ba7ca4ef3..760e8d15f 100644 --- a/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj +++ b/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj @@ -4,18 +4,25 @@ MiniProfiler.Shared Marc Gravell, Jarrod Dixon, Yaakov Ellis, Nick Craver You shouldn't reference this - MiniProfiler's shared library for all frameworks - net461;netstandard2.0 + net461;netstandard2.0;net6.0 + + NEWTONSOFT + NEWTONSOFT + STJSON + - + + - - + + + @@ -23,10 +30,15 @@ + + + + + diff --git a/src/MiniProfiler.Shared/MiniProfiler.cs b/src/MiniProfiler.Shared/MiniProfiler.cs index c998426f1..f5468a8b7 100644 --- a/src/MiniProfiler.Shared/MiniProfiler.cs +++ b/src/MiniProfiler.Shared/MiniProfiler.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.Serialization; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using StackExchange.Profiling.Helpers; @@ -23,6 +24,7 @@ public partial class MiniProfiler /// The vast majority of use cases will be a single options instance, so this works pretty well. /// [IgnoreDataMember] + [JsonIgnore] public MiniProfilerBaseOptions Options { get; } = DefaultOptions; /// @@ -105,6 +107,7 @@ public MiniProfiler(string? name, MiniProfilerBaseOptions options) /// /// JSON used to store Custom Links. Do not touch. /// + [JsonIgnore] public string? CustomLinksJson { get => CustomLinks?.ToJson(); @@ -151,6 +154,7 @@ public Timing Root /// /// RedirectCount in ClientTimings. Used for sql storage. /// + [JsonIgnore] public int? ClientTimingsRedirectCount { get; set; } #endif @@ -183,6 +187,7 @@ public Timing Root /// /// Gets or sets points to the currently executing Timing. /// + [JsonIgnore] public Timing? Head { get => _head.Value ?? _lastSetHead; @@ -214,6 +219,7 @@ public Timing? Head /// /// Used to set custom storage for an individual request [IgnoreDataMember] + [JsonIgnore] public IAsyncStorage? Storage { get; set; } /// @@ -268,7 +274,6 @@ public async Task StopAsync(bool discardResults = false) /// /// Shared stop bits for and /// - /// private bool InnerStop() { if (!Stopwatch.IsRunning) @@ -307,7 +312,7 @@ private bool InnerStop() /// Returns true if Ids match. /// /// The to compare to. - public override bool Equals(object obj) => obj is MiniProfiler miniProfiler && Id.Equals(miniProfiler.Id); + public override bool Equals(object? obj) => obj is MiniProfiler miniProfiler && Id.Equals(miniProfiler.Id); /// /// Returns hash code of Id. @@ -352,7 +357,7 @@ public MiniProfiler Clone() { serializer.WriteObject(ms, this); ms.Position = 0; - return (MiniProfiler)serializer.ReadObject(ms); + return (MiniProfiler)serializer.ReadObject(ms)!; } } diff --git a/src/MiniProfiler.Shared/SqlFormatters/VerboseSqlServerFormatter.cs b/src/MiniProfiler.Shared/SqlFormatters/VerboseSqlServerFormatter.cs index 136153b2d..0714c5f13 100644 --- a/src/MiniProfiler.Shared/SqlFormatters/VerboseSqlServerFormatter.cs +++ b/src/MiniProfiler.Shared/SqlFormatters/VerboseSqlServerFormatter.cs @@ -35,20 +35,20 @@ public override string FormatSql(string commandText, List? p if (command != null && IncludeMetaData) { - buffer.Append("-- Command Type: ").Append(command.CommandType.ToString()).Append("\n"); - buffer.Append("-- Database: ").Append(command.Connection.Database).Append("\n"); + buffer.Append("-- Command Type: ").Append(command.CommandType.ToString()).Append('\n'); + buffer.Append("-- Database: ").Append(command.Connection?.Database).Append('\n'); if (command.Transaction != null) { - buffer.Append("-- Command Transaction Iso Level: ").Append(command.Transaction.IsolationLevel.ToString()).Append("\n"); + buffer.Append("-- Command Transaction Iso Level: ").Append(command.Transaction.IsolationLevel.ToString()).Append('\n'); } if (System.Transactions.Transaction.Current != null) { // transactions issued by TransactionScope are not bound to the database command but exists globally - buffer.Append("-- Transaction Scope Iso Level: ").Append(System.Transactions.Transaction.Current.IsolationLevel.ToString()).Append("\n"); + buffer.Append("-- Transaction Scope Iso Level: ").Append(System.Transactions.Transaction.Current.IsolationLevel.ToString()).Append('\n'); } - buffer.Append("\n"); + buffer.Append('\n'); } string baseOutput = base.FormatSql(commandText, parameters, command); diff --git a/src/MiniProfiler.Shared/SqlTimingParameter.cs b/src/MiniProfiler.Shared/SqlTimingParameter.cs index 4d76852ed..48cccaf0c 100644 --- a/src/MiniProfiler.Shared/SqlTimingParameter.cs +++ b/src/MiniProfiler.Shared/SqlTimingParameter.cs @@ -54,7 +54,7 @@ public class SqlTimingParameter /// and as . /// /// The to compare. - public override bool Equals(object obj) + public override bool Equals(object? obj) { return obj is SqlTimingParameter other && string.Equals(Name, other.Name) diff --git a/src/MiniProfiler.Shared/Timing.cs b/src/MiniProfiler.Shared/Timing.cs index 9f80d2ecc..87404bb62 100644 --- a/src/MiniProfiler.Shared/Timing.cs +++ b/src/MiniProfiler.Shared/Timing.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.Serialization; +using System.Text.Json.Serialization; using StackExchange.Profiling.Internal; namespace StackExchange.Profiling @@ -165,18 +166,21 @@ public string? CustomTimingsJson { /// /// This will be null for the root (initial) Timing. [IgnoreDataMember] + [JsonIgnore] public Timing? ParentTiming { get; set; } /// /// The Unique Identifier identifying the parent timing of this Timing. Used for sql server storage. /// [IgnoreDataMember] + [JsonIgnore] public Guid ParentTimingId { get; set; } /// /// Gets the elapsed milliseconds in this step without any children's durations. /// [IgnoreDataMember] + [JsonIgnore] public decimal DurationWithoutChildrenMilliseconds { get @@ -203,12 +207,14 @@ public decimal DurationWithoutChildrenMilliseconds /// , by default 2.0 ms. /// [IgnoreDataMember] + [JsonIgnore] public bool IsTrivial => DurationMilliseconds <= Profiler?.Options.TrivialDurationThresholdMilliseconds; /// /// Gets a value indicating whether this Timing has inner Timing steps. /// [IgnoreDataMember] + [JsonIgnore] [MemberNotNullWhen(true, nameof(Children))] public bool HasChildren => Children?.Count > 0; @@ -216,12 +222,14 @@ public decimal DurationWithoutChildrenMilliseconds /// Gets a value indicating whether this Timing is the first one created in a MiniProfiler session. /// [IgnoreDataMember] + [JsonIgnore] public bool IsRoot => Equals(Profiler?.Root); /// /// Gets a value indicating whether how far away this Timing is from the Profiler's Root. /// [IgnoreDataMember] + [JsonIgnore] public short Depth { get @@ -242,12 +250,14 @@ public short Depth /// /// Gets a reference to the containing profiler, allowing this Timing to affect the Head and get Stopwatch readings. /// + [JsonIgnore] internal MiniProfiler? Profiler { get; set; } /// /// The unique identifier used to identify the Profiler with which this Timing is associated. Used for sql storage. /// [IgnoreDataMember] + [JsonIgnore] public Guid MiniProfilerId { get; set; } /// @@ -358,7 +368,7 @@ internal void RemoveCustomTiming(string category, CustomTiming customTiming) /// The kind of custom timings, e.g. "sql", "redis", "memcache" private List GetCustomTimingList(string category) { - List result; + List? result; if (CustomTimings == null) { lock (_syncRoot) diff --git a/src/MiniProfiler.Shared/TimingDebugInfo.cs b/src/MiniProfiler.Shared/TimingDebugInfo.cs index 16dac172b..91804e7e2 100644 --- a/src/MiniProfiler.Shared/TimingDebugInfo.cs +++ b/src/MiniProfiler.Shared/TimingDebugInfo.cs @@ -40,8 +40,8 @@ internal TimingDebugInfo(Timing parent, int debugStackShave = 0) myIndex >= 0 && parentIndex >= 0; myIndex--, parentIndex--) { - StackFrame myFrame = RawStack.GetFrame(myIndex), - parentFrame = parentStack.GetFrame(parentIndex); + StackFrame myFrame = RawStack.GetFrame(myIndex)!, + parentFrame = parentStack.GetFrame(parentIndex)!; if (myFrame.GetILOffset() == parentFrame.GetILOffset() && myFrame.GetMethod() == parentFrame.GetMethod()) { CommonStackStart = myIndex; diff --git a/src/MiniProfiler/MiniProfiler.csproj b/src/MiniProfiler/MiniProfiler.csproj index e8c75fb15..3660da054 100644 --- a/src/MiniProfiler/MiniProfiler.csproj +++ b/src/MiniProfiler/MiniProfiler.csproj @@ -7,10 +7,12 @@ ASP.NET;SQL;$(PackageBaseTags) net461 + - + + \ No newline at end of file diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 6c358306a..e63e320da 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -11,6 +11,7 @@ + diff --git a/tests/MiniProfiler.Tests.AspNet/MiniProfiler.Tests.AspNet.csproj b/tests/MiniProfiler.Tests.AspNet/MiniProfiler.Tests.AspNet.csproj index 6d17458b9..885206918 100644 --- a/tests/MiniProfiler.Tests.AspNet/MiniProfiler.Tests.AspNet.csproj +++ b/tests/MiniProfiler.Tests.AspNet/MiniProfiler.Tests.AspNet.csproj @@ -4,19 +4,23 @@ StackExchange.Profiling.Tests net462 + - - - - + + + - - + + + + + + if not exist "$(TargetDir)x86" md "$(TargetDir)x86" diff --git a/tests/MiniProfiler.Tests.AspNetCore/MiniProfiler.Tests.AspNetCore.csproj b/tests/MiniProfiler.Tests.AspNetCore/MiniProfiler.Tests.AspNetCore.csproj index dcf8b98fe..4364a95fc 100644 --- a/tests/MiniProfiler.Tests.AspNetCore/MiniProfiler.Tests.AspNetCore.csproj +++ b/tests/MiniProfiler.Tests.AspNetCore/MiniProfiler.Tests.AspNetCore.csproj @@ -4,9 +4,11 @@ StackExchange.Profiling.Tests net6.0 + + + - \ No newline at end of file diff --git a/tests/MiniProfiler.Tests/MiniProfiler.Tests.csproj b/tests/MiniProfiler.Tests/MiniProfiler.Tests.csproj index da7f6b1b2..5fea3c9bb 100644 --- a/tests/MiniProfiler.Tests/MiniProfiler.Tests.csproj +++ b/tests/MiniProfiler.Tests/MiniProfiler.Tests.csproj @@ -4,7 +4,12 @@ StackExchange.Profiling.Tests net462;net6.0 + + + + + @@ -12,14 +17,13 @@ - - - + - + + if not exist "$(TargetDir)x86" md "$(TargetDir)x86" diff --git a/tests/MiniProfiler.Tests/TimingInstrumentationTest.cs b/tests/MiniProfiler.Tests/TimingInstrumentationTest.cs index a8e1a2302..f50a97ad3 100644 --- a/tests/MiniProfiler.Tests/TimingInstrumentationTest.cs +++ b/tests/MiniProfiler.Tests/TimingInstrumentationTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using Xunit; using Xunit.Abstractions; @@ -13,14 +13,16 @@ private class TimingInstrumentation : IDisposable public Timing Timing { get; set; } public bool Disposed { get; set; } public void Dispose() => Disposed = true; + + public TimingInstrumentation(Timing timing) => Timing = timing; } [Fact] public void IsInstrumented() { - TimingInstrumentation instrumentation = null; - Timing timing = null; - Options.TimingInstrumentationProvider = t => instrumentation = new TimingInstrumentation { Timing = t }; + TimingInstrumentation? instrumentation = null; + Timing? timing = null; + Options.TimingInstrumentationProvider = t => instrumentation = new TimingInstrumentation(t); var mp = Options.StartProfiler(); using (timing = mp.Step("Test timing")) From db3af5272aa072c342ebc8eb7e53e09f193b3cd1 Mon Sep 17 00:00:00 2001 From: Raif Atef Date: Thu, 3 Aug 2023 04:40:33 +0300 Subject: [PATCH 26/29] Eliminate the use of inline styles, making it compatible with strict CSP for style. (#634) Thank you for making this project easy to build and fork. With this PR MiniProfiler will run under a strict CSP that disallows inline styles and scripts (by using nonce) with zero errors. It accomplish this by putting dynamically generated style tag values as data attributes, and then later after appending the miniprofiler html, it queries for them and manipulates the style object on Element directly, thus eliminating the need for inline style. Co-authored-by: Nick Craver --- docs/Releases.md | 2 + .../Samples.AspNet/Helpers/NonceService.cs | 20 ++++++++ .../Pages/RazorPagesSample.cshtml | 2 +- samples/Samples.AspNet/Startup.cs | 12 +++++ .../Samples.AspNet/Views/Shared/Index.cshtml | 2 +- .../Views/Shared/_Layout.cshtml | 2 +- .../MiniProfilerExtensions.cs | 1 + .../MiniProfilerMiddleware.cs | 4 +- .../Internal/MiniProfilerBaseOptions.cs | 5 ++ src/MiniProfiler.Shared/Internal/Render.cs | 48 +++++++++++++++---- .../MiniProfiler.Shared.csproj | 2 +- src/MiniProfiler.Shared/ui/includes.css | 3 ++ src/MiniProfiler.Shared/ui/includes.less | 7 ++- .../ui/lib/MiniProfiler.ts | 43 ++++++++++++----- src/MiniProfiler/MiniProfilerHandler.cs | 4 +- tests/MiniProfiler.Tests/RenderTests.cs | 4 +- 16 files changed, 126 insertions(+), 35 deletions(-) create mode 100644 samples/Samples.AspNet/Helpers/NonceService.cs diff --git a/docs/Releases.md b/docs/Releases.md index cd85345ea..f81853234 100644 --- a/docs/Releases.md +++ b/docs/Releases.md @@ -6,6 +6,8 @@ layout: "default" This page tracks major changes included in any update starting with version 4.0.0.3 #### Unreleased +- **New**: + - Support for strict CSP (dynamic inline styles removed) ([#634](https://github.com/MiniProfiler/dotnet/pull/634) - thanks [rwasef1830](https://github.com/rwasef1830)) - **Fixes/Changes**: - Upgraded MongoDB driver, allowing automatic index creation and profiler expiration ([#613](https://github.com/MiniProfiler/dotnet/pull/613) - thanks [IanKemp](https://github.com/IanKemp)) diff --git a/samples/Samples.AspNet/Helpers/NonceService.cs b/samples/Samples.AspNet/Helpers/NonceService.cs new file mode 100644 index 000000000..3c7ac3ba9 --- /dev/null +++ b/samples/Samples.AspNet/Helpers/NonceService.cs @@ -0,0 +1,20 @@ +using System; +using System.Security.Cryptography; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; + +namespace Samples.AspNetCore +{ + /// + /// Nonce service (custom implementation) for sharing a random nonce for the lifetime of a request. + /// + public class NonceService + { + public string RequestNonce { get; } = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64)); + } + + public static class NonceExtensions + { + public static string? GetNonce(this HttpContext context) => context.RequestServices.GetService()?.RequestNonce; + } +} diff --git a/samples/Samples.AspNet/Pages/RazorPagesSample.cshtml b/samples/Samples.AspNet/Pages/RazorPagesSample.cshtml index 1cd9cf6d3..9c315856c 100644 --- a/samples/Samples.AspNet/Pages/RazorPagesSample.cshtml +++ b/samples/Samples.AspNet/Pages/RazorPagesSample.cshtml @@ -13,7 +13,7 @@ @section scripts { - "); - sb.Append(Includes(profiler, path: path, isAuthorized: true)); + sb.Append(Includes(profiler, path: path, isAuthorized: true, nonce: nonce)); sb.Append(@"
"); return sb.ToString(); } @@ -254,17 +279,20 @@ public static string SingleResultHtml(MiniProfiler profiler, string path) /// Renders a full HTML page for the share link in MiniProfiler. ///
/// The options to render for. + /// The current request service provider. /// The root path that MiniProfiler is being served from. /// A full HTML page for this MiniProfiler. - public static string ResultListHtml(MiniProfilerBaseOptions options, string path) + public static string ResultListHtml(MiniProfilerBaseOptions options, IServiceProvider serviceProvider, string path) { var version = options.VersionHash; + var nonce = options.NonceProvider?.Invoke(serviceProvider) ?? string.Empty; + var nonceAttribute = !string.IsNullOrWhiteSpace(nonce) ? " nonce=\"" + HttpUtility.HtmlAttributeEncode(nonce) + "\"" : null; return $@" List of profiling sessions - + - + MiniProfiler.listInit({{path: '{path}', version: '{version}', colorScheme: '{options.ColorScheme}'}}); diff --git a/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj b/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj index 760e8d15f..7a7623193 100644 --- a/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj +++ b/src/MiniProfiler.Shared/MiniProfiler.Shared.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/MiniProfiler.Shared/ui/includes.css b/src/MiniProfiler.Shared/ui/includes.css index 90936eac7..f6c48f69f 100644 --- a/src/MiniProfiler.Shared/ui/includes.css +++ b/src/MiniProfiler.Shared/ui/includes.css @@ -179,6 +179,9 @@ .mp-result table.mp-client-timings { margin-top: 10px; } +.mp-result table.mp-client-timings th:first-child { + text-align: left; +} .mp-result table.mp-client-timings td:nth-child(2) { width: 100%; padding: 0; diff --git a/src/MiniProfiler.Shared/ui/includes.less b/src/MiniProfiler.Shared/ui/includes.less index 150dfebc8..c5820e432 100644 --- a/src/MiniProfiler.Shared/ui/includes.less +++ b/src/MiniProfiler.Shared/ui/includes.less @@ -51,7 +51,7 @@ } .mp-scheme-light { - color-scheme: light; + color-scheme: light; } .mp-scheme-dark { @@ -72,7 +72,6 @@ --mp-highlight-keyword-color: #36a1ef; /* Borders */ --mp-result-border: solid 0.5px #575757; - color-scheme: dark; body { @@ -154,6 +153,10 @@ table.mp-client-timings { margin-top: 10px; + th:first-child { + text-align: left; + } + td:nth-child(2) { width: 100%; padding: 0; diff --git a/src/MiniProfiler.Shared/ui/lib/MiniProfiler.ts b/src/MiniProfiler.Shared/ui/lib/MiniProfiler.ts index f4ee8521f..0e06984ff 100644 --- a/src/MiniProfiler.Shared/ui/lib/MiniProfiler.ts +++ b/src/MiniProfiler.Shared/ui/lib/MiniProfiler.ts @@ -319,11 +319,11 @@ namespace StackExchange.Profiling { // fetch and render results mp.fetchResults(mp.options.ids); - + let lsDisplayValue; try { lsDisplayValue = window.localStorage.getItem('MiniProfiler-Display'); - } catch(e) { } + } catch (e) { } if (lsDisplayValue) { mp.container.style.display = lsDisplayValue; @@ -355,7 +355,7 @@ namespace StackExchange.Profiling { // profiler will be defined in the full page's head window.profiler.Started = new Date('' + window.profiler.Started); // Ugh, JavaScript const profilerHtml = mp.renderProfiler(window.profiler, false); - mp.container.insertAdjacentHTML('beforeend', profilerHtml); + mp.setStylesAndDisplay(profilerHtml); // highight mp.container.querySelectorAll('pre code').forEach(block => mp.highlight(block as HTMLElement)); @@ -728,7 +728,7 @@ namespace StackExchange.Profiling { let str = ` -
${renderDebugInfo(timing)} 0 ? ` style="padding-left:${timing.Depth * 11}px;"` : ''}> + 0 ? ` data-padding-left="${timing.Depth * 11}px"` : ''}> ${encode(timing.Name)} @@ -830,7 +830,7 @@ namespace StackExchange.Profiling { - + @@ -840,7 +840,7 @@ namespace StackExchange.Profiling { ${list.map((t) => ` - + @@ -957,12 +957,7 @@ namespace StackExchange.Profiling { } const profilerHtml = this.renderProfiler(json, true); - - if (this.controls) { - this.controls.insertAdjacentHTML('beforebegin', profilerHtml); - } else { - this.container.insertAdjacentHTML('beforeend', profilerHtml); - } + this.setStylesAndDisplay(profilerHtml); // limit count to maxTracesToShow, remove those before it const results = this.container.querySelectorAll('.mp-result'); @@ -972,6 +967,28 @@ namespace StackExchange.Profiling { } } + private setStylesAndDisplay(profilerHtml: string) { + const nonVisibleElement = document.createElement("div"); + nonVisibleElement.innerHTML = profilerHtml; + + // dynamic padding, margin and width + nonVisibleElement.querySelectorAll("[data-padding-left]").forEach(function (element) { + element.style.paddingLeft = element.dataset.paddingLeft; + }); + nonVisibleElement.querySelectorAll("[data-margin-left]").forEach(function (element) { + element.style.marginLeft = element.dataset.marginLeft; + }); + nonVisibleElement.querySelectorAll("[data-width]").forEach(function (element) { + element.style.width = element.dataset.width; + }); + + if (this.controls) { + this.controls.insertAdjacentElement('beforebegin', nonVisibleElement.firstElementChild); + } else { + this.container.insertAdjacentElement('beforeend', nonVisibleElement.firstElementChild); + } + } + private scrollToQuery = (link: HTMLElement, queries: HTMLElement) => { const id = link.closest('tr').dataset['timingId']; const rows = queries.querySelectorAll('tr[data-timing-id="' + id + '"]'); @@ -1221,7 +1238,7 @@ namespace StackExchange.Profiling { results.style.display = newValue; try { window.localStorage.setItem('MiniProfiler-Display', newValue); - } catch(e) { } + } catch (e) { } } }, false); } diff --git a/src/MiniProfiler/MiniProfilerHandler.cs b/src/MiniProfiler/MiniProfilerHandler.cs index 639266879..ed6ef36cb 100644 --- a/src/MiniProfiler/MiniProfilerHandler.cs +++ b/src/MiniProfiler/MiniProfilerHandler.cs @@ -143,7 +143,7 @@ public void ProcessRequest(HttpContext context) context.Response.ContentType = "text/html; charset=utf-8"; var path = VirtualPathUtility.ToAbsolute(Options.RouteBasePath).EnsureTrailingSlash(); - return Render.ResultListHtml(Options, path); + return Render.ResultListHtml(Options, context, path); } /// @@ -279,7 +279,7 @@ private static string ResultsJson(HttpContext context, MiniProfiler profiler) private string ResultsFullPage(HttpContext context, MiniProfiler profiler) { context.Response.ContentType = "text/html; charset=utf-8"; - return Render.SingleResultHtml(profiler, VirtualPathUtility.ToAbsolute(Options.RouteBasePath).EnsureTrailingSlash()); + return Render.SingleResultHtml(profiler, context, VirtualPathUtility.ToAbsolute(Options.RouteBasePath).EnsureTrailingSlash()); } private bool TryGetResource(string filename, out string resource) diff --git a/tests/MiniProfiler.Tests/RenderTests.cs b/tests/MiniProfiler.Tests/RenderTests.cs index 7aa8bcd77..a88eba0c2 100644 --- a/tests/MiniProfiler.Tests/RenderTests.cs +++ b/tests/MiniProfiler.Tests/RenderTests.cs @@ -15,7 +15,7 @@ public void DefaultRender() { var profiler = GetBasicProfiler(); var renderOptions = new RenderOptions(); - var result = Render.Includes(profiler, "/", true, renderOptions, new List() { profiler.Id }); + var result = Render.Includes(profiler, "/", true, renderOptions, null, new List() { profiler.Id }); Output.WriteLine("Result: " + result); Assert.NotNull(result); @@ -43,7 +43,7 @@ public void OptionsSet() TrivialDurationThresholdMilliseconds = 23, DecimalPlaces = 1, }; - var result = Render.Includes(profiler, "/", true, renderOptions, new List() { profiler.Id }); + var result = Render.Includes(profiler, "/", true, renderOptions, null, new List() { profiler.Id }); Output.WriteLine("Result: " + result); Assert.NotNull(result); From 137f610b66de543e8f15124dce0da613622455a0 Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Wed, 2 Aug 2023 21:53:06 -0400 Subject: [PATCH 27/29] Fix #652 - respect PopupDecimalPlaces in all cases (#655) --- docs/Releases.md | 1 + src/MiniProfiler.Shared/Internal/Render.cs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/docs/Releases.md b/docs/Releases.md index f81853234..476e65d64 100644 --- a/docs/Releases.md +++ b/docs/Releases.md @@ -10,6 +10,7 @@ This page tracks major changes included in any update starting with version 4.0. - Support for strict CSP (dynamic inline styles removed) ([#634](https://github.com/MiniProfiler/dotnet/pull/634) - thanks [rwasef1830](https://github.com/rwasef1830)) - **Fixes/Changes**: - Upgraded MongoDB driver, allowing automatic index creation and profiler expiration ([#613](https://github.com/MiniProfiler/dotnet/pull/613) - thanks [IanKemp](https://github.com/IanKemp)) + - Fixed [#652](https://github.com/MiniProfiler/dotnet/issues/652): Respect `PopupDecimalPlaces` in all cases ([#655](https://github.com/MiniProfiler/dotnet/pull/655)) #### Version 4.3.8 - **New**: diff --git a/src/MiniProfiler.Shared/Internal/Render.cs b/src/MiniProfiler.Shared/Internal/Render.cs index 032466c71..777a511a1 100644 --- a/src/MiniProfiler.Shared/Internal/Render.cs +++ b/src/MiniProfiler.Shared/Internal/Render.cs @@ -193,6 +193,10 @@ public static string Includes( sb.Append(options.ColorScheme.ToString()); sb.Append('"'); + sb.Append("\" data-decimal-places=\""); + sb.Append(options.PopupDecimalPlaces.ToString()); + sb.Append('"'); + if (isAuthorized) { sb.Append(" data-authorized=\"true\""); From d616917d0f469384fc91ab6091329ee92a9e7102 Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Wed, 2 Aug 2023 22:19:33 -0400 Subject: [PATCH 28/29] Update release notes for #641 --- docs/Releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Releases.md b/docs/Releases.md index 476e65d64..b210af3c5 100644 --- a/docs/Releases.md +++ b/docs/Releases.md @@ -8,6 +8,7 @@ This page tracks major changes included in any update starting with version 4.0. #### Unreleased - **New**: - Support for strict CSP (dynamic inline styles removed) ([#634](https://github.com/MiniProfiler/dotnet/pull/634) - thanks [rwasef1830](https://github.com/rwasef1830)) + - Adds `net6.0` build with no `Newtonsoft.Json` dependency ([#641](https://github.com/MiniProfiler/dotnet/pull/641)) - **Fixes/Changes**: - Upgraded MongoDB driver, allowing automatic index creation and profiler expiration ([#613](https://github.com/MiniProfiler/dotnet/pull/613) - thanks [IanKemp](https://github.com/IanKemp)) - Fixed [#652](https://github.com/MiniProfiler/dotnet/issues/652): Respect `PopupDecimalPlaces` in all cases ([#655](https://github.com/MiniProfiler/dotnet/pull/655)) From 64982a0428c7f8d699042ceaad92ad627c25e24f Mon Sep 17 00:00:00 2001 From: afuersch Date: Thu, 23 Nov 2023 03:01:08 +0100 Subject: [PATCH 29/29] Fix method name of async ResultsListAuthorizeAsync method in documentation. (#666) Fix method name of async ResultsListAuthorizeAsync method. --- docs/AspDotNetCore.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AspDotNetCore.md b/docs/AspDotNetCore.md index c87042043..b541cb12a 100644 --- a/docs/AspDotNetCore.md +++ b/docs/AspDotNetCore.md @@ -45,7 +45,7 @@ public void ConfigureServices(IServiceCollection services) options.ResultsListAuthorize = request => MyGetUserFunction(request).CanSeeMiniProfiler; // Or, there are async versions available: options.ResultsAuthorizeAsync = async request => (await MyGetUserFunctionAsync(request)).CanSeeMiniProfiler; - options.ResultsAuthorizeListAsync = async request => (await MyGetUserFunctionAsync(request)).CanSeeMiniProfilerLists; + options.ResultsListAuthorizeAsync = async request => (await MyGetUserFunctionAsync(request)).CanSeeMiniProfilerLists; // (Optional) To control which requests are profiled, use the Func option: // (default is everything should be profiled)
client eventclient event duration (ms) from start (ms)
${encode(t.name)}
${(t.duration >= 0 ? `${duration(t.duration, 0)}` : '')}