From 092740d8a6697bc21c6032ea80832f4ab7a22764 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 8 Jun 2017 14:36:30 -0500 Subject: [PATCH 001/255] update to project to contain sqad --- .vs/config/applicationhost.config | 2 +- ...ebApiContrib.Formatting.Xlsx.Sample.csproj | 5 +- .../packages.config | 2 +- .../Attributes/ExcelSheetAttribute.cs | 28 ++++++++++ .../Serialisation/SqadXlsxSerialiser.cs | 16 ++++++ .../SqadXlsxDocumentBuilder.cs | 50 ++++++++++++++++++ .../SqadXlsxSheetBuilder.cs | 44 +++++++++++++++ .../WebApiContrib.Formatting.Xlsx.csproj | 13 +++-- .../XlsxMediaTypeFormatter.cs | 25 +++++---- src/WebApiContrib.Formatting.Xlsx/mt50.snk | Bin 0 -> 596 bytes ...WebApiContrib.Formatting.Xlsx.Tests.csproj | 5 +- .../packages.config | 2 +- 12 files changed, 169 insertions(+), 23 deletions(-) create mode 100644 src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/mt50.snk diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config index b6768bd..142c815 100644 --- a/.vs/config/applicationhost.config +++ b/.vs/config/applicationhost.config @@ -163,7 +163,7 @@ - + diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/WebApiContrib.Formatting.Xlsx.Sample.csproj b/samples/WebApiContrib.Formatting.Xlsx.Sample/WebApiContrib.Formatting.Xlsx.Sample.csproj index cf8bb0e..fd3a8f8 100644 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/WebApiContrib.Formatting.Xlsx.Sample.csproj +++ b/samples/WebApiContrib.Formatting.Xlsx.Sample/WebApiContrib.Formatting.Xlsx.Sample.csproj @@ -46,9 +46,8 @@ False ..\..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll - - ..\..\packages\EPPlus.4.0.5\lib\net20\EPPlus.dll - True + + ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/packages.config b/samples/WebApiContrib.Formatting.Xlsx.Sample/packages.config index cb49386..adb0f59 100644 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/packages.config +++ b/samples/WebApiContrib.Formatting.Xlsx.Sample/packages.config @@ -2,7 +2,7 @@ - + diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs new file mode 100644 index 0000000..1bafa1d --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Attributes +{ + public class ExcelSheetAttribute : Attribute + { + private int? _order; + + public int Order + { + get { return _order ?? default(int); } + set { _order = value; } + } + + public ExcelSheetAttribute() { } + + public ExcelSheetAttribute(string SheetName) : this() + { + this.SheetName = SheetName; + } + + public string SheetName { get; set; } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs new file mode 100644 index 0000000..dbb96db --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class SqadXlsxSerialiser : DefaultXlsxSerialiser + { + public override void Serialise(Type itemType, object value, XlsxDocumentBuilder document) + { + base.Serialise(itemType, value, document); + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs new file mode 100644 index 0000000..3a5a9df --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -0,0 +1,50 @@ +using OfficeOpenXml; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx +{ + public class SqadXlsxDocumentBuilder + { + private ExcelPackage Package { get; set; } + + private Stream _stream; + + public SqadXlsxDocumentBuilder(Stream stream) + { + _stream = stream; + + // Create a worksheet + Package = new ExcelPackage(); + + } + + public void AutoFit() + { + throw new NotImplementedException(); + //Worksheet.Cells[Worksheet.Dimension.Address].AutoFitColumns(); + } + + public Task WriteToStream() + { + return Task.Factory.StartNew(() => Package.SaveAs(_stream)); + } + + + public static bool IsExcelSupportedType(object expression) + { + return expression is string + || expression is short + || expression is int + || expression is long + || expression is decimal + || expression is float + || expression is double + || expression is DateTime; + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs new file mode 100644 index 0000000..51ced66 --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -0,0 +1,44 @@ +using OfficeOpenXml; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx +{ + public class SqadXlsxSheetBuilder + { + private ExcelWorksheet _worksheet { get; set; } + private int _rowCount { get; set; } + + public SqadXlsxSheetBuilder(string SheetName) + { + _rowCount = 0; + _worksheet = new ExcelWorksheet(null,null,null,null,SheetName,0,0,eWorkSheetHidden.Visible); + } + + /// + /// Append a row to the XLSX worksheet. + /// + /// The row to append to this instance. + public void AppendRow(IEnumerable row) + { + _rowCount++; + + int i = 0; + foreach (var col in row) + { + _worksheet.Cells[_rowCount, ++i].Value = col; + } + } + + public void FormatColumn(int column, string format, bool skipHeaderRow = true) + { + var firstRow = skipHeaderRow ? 2 : 1; + + if (firstRow <= _rowCount) + _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 195b3bf..50af22c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -31,9 +31,15 @@ prompt 4 + + true + + + mt50.snk + - ..\..\..\Arkive-2.0\Arkive\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll + ..\..\..\MTMediaTools-5.5\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll ..\..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll @@ -43,8 +49,7 @@ - ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True + ..\..\..\MTMediaTools-5.5\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll @@ -58,6 +63,7 @@ + @@ -75,6 +81,7 @@ + Designer diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index 8779ed9..3ae2ac1 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -106,17 +106,8 @@ public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) { - // Get the raw request URI. - string rawUri = System.Web.HttpContext.Current.Request.RawUrl; - // Remove query string if present. - int queryStringIndex = rawUri.IndexOf('?'); - if (queryStringIndex > -1) - { - rawUri = rawUri.Substring(0, queryStringIndex); - } - - string fileName; + string fileName = "data"; // Look for ExcelDocumentAttribute on class. var itemType = util.GetEnumerableItemType(type); @@ -129,6 +120,18 @@ public override void SetDefaultContentHeaders(Type type, } else { + // Get the raw request URI. + string rawUri = System.Web.HttpContext.Current?.Request?.RawUrl; + if (string.IsNullOrEmpty(rawUri) != false) + { + // Remove query string if present. + int queryStringIndex = rawUri.IndexOf('?'); + if (queryStringIndex > -1) + { + rawUri = rawUri.Substring(0, queryStringIndex); + } + } + // Otherwise, use either the URL file name component or just "data". fileName = System.Web.VirtualPathUtility.GetFileName(rawUri) ?? "data"; } @@ -151,7 +154,7 @@ public override Task WriteToStreamAsync(Type type, System.Net.TransportContext transportContext) { // Create a document builder. - var document = new XlsxDocumentBuilder(writeStream); + var document = new SqadXlsxDocumentBuilder(writeStream); if (value == null) return document.WriteToStream(); diff --git a/src/WebApiContrib.Formatting.Xlsx/mt50.snk b/src/WebApiContrib.Formatting.Xlsx/mt50.snk new file mode 100644 index 0000000000000000000000000000000000000000..2bf5184b061fee268578b0a26da6775a2973e00f GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098SHU^EUeg+SK;0kwxx3cM3T{X-&zkBY#&pFRul$K6>&P=3D;xUwhiuG9u2 zKI`shz-@-fJ4VnR1-L7UiaBFKUeWU{C(cuy5L;SJ?5;19SD!#mXhtYg;K^Lc>qXA!Mf15Yz=yJv@HDOimT&bkbM_#*hu;FN`~5JtC7Yh&A!n*xP0R%RY=v|rZuc^A+T^EA iyqb4 - - ..\..\packages\EPPlus.4.0.5\lib\net20\EPPlus.dll - True + + ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config b/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config index 32726e1..54db11c 100644 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config +++ b/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file From cf9da640c3e5105f89021724c9fde1e7e21a47f4 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 9 Jun 2017 07:31:14 -0500 Subject: [PATCH 002/255] updates to serializing library --- .../IXlsxDocumentBuilder.cs | 14 ++++++ .../Serialisation/DefaultColumnResolver.cs | 2 +- .../Serialisation/DefaultSheetResolver.cs | 43 +++++++++++++++++++ .../Serialisation/DefaultXlsxSerialiser.cs | 13 ++++-- .../Serialisation/ExcelColumnInfo.cs | 10 ++--- .../ExcelColumnInfoCollection.cs | 17 +------- .../Serialisation/ExcelSheetInfo.cs | 16 +++++++ .../Serialisation/ExcelSheetInfoCollection.cs | 17 ++++++++ .../Serialisation/ISheetResolver.cs | 13 ++++++ .../Serialisation/IXlsxSerialiser.cs | 4 +- .../Serialisation/KeyedCollectionBase.cs | 32 ++++++++++++++ .../Serialisation/SqadXlsxSerialiser.cs | 16 +++++-- .../SqadXlsxDocumentBuilder.cs | 4 +- .../WebApiContrib.Formatting.Xlsx.csproj | 9 ++++ .../XlsxDocumentBuilder.cs | 4 +- .../XlsxMediaTypeFormatter.cs | 6 ++- 16 files changed, 184 insertions(+), 36 deletions(-) create mode 100644 src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs diff --git a/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs new file mode 100644 index 0000000..8f33f26 --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx +{ + public interface IXlsxDocumentBuilder + { + Task WriteToStream(); + bool IsExcelSupportedType(object expression); + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 955de0c..721a9f5 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -90,7 +90,7 @@ protected virtual void PopulateFieldInfoFromMetadata(ExcelColumnInfoCollection f if (!fieldInfo.Contains(propertyName)) continue; var field = fieldInfo[propertyName]; - var attribute = field.ExcelAttribute; + var attribute = field.ExcelColumnAttribute; if (!field.IsExcelHeaderDefined) field.Header = modelProp.DisplayName ?? propertyName; diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs new file mode 100644 index 0000000..aa9e680 --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Attributes; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class DefaultSheetResolver : ISheetResolver + { + public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, IEnumerable data) + { + var sheets = FormatterUtils.GetMemberNames(itemType); + var properties = GetSerialisablePropertyInfo(itemType, data); + + var sheetCollection = new ExcelSheetInfoCollection(); + + foreach (var sheet in sheets) + { + var prop = properties.FirstOrDefault(p => p.Name == sheet); + + if (prop == null) continue; + + sheetCollection.Add(new ExcelSheetInfo() + { + SheetName = sheet, + ExcelSheetAttribute = FormatterUtils.GetAttribute(prop) + }); + } + + return sheetCollection; + } + + public virtual IEnumerable GetSerialisablePropertyInfo(Type itemType, IEnumerable data) + { + return (from p in itemType.GetProperties() + where p.CanRead & p.GetGetMethod().IsPublic & p.GetGetMethod().GetParameters().Length == 0 + select p).ToList(); + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index a3162bc..169ce51 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -81,11 +81,11 @@ public virtual void Serialise(Type itemType, object value, XlsxDocumentBuilder d protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info) { // Boolean transformations. - if (info.ExcelAttribute != null && info.ExcelAttribute.TrueValue != null && cellValue.Equals("True")) - return info.ExcelAttribute.TrueValue; + if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.TrueValue != null && cellValue.Equals("True")) + return info.ExcelColumnAttribute.TrueValue; - else if (info.ExcelAttribute != null && info.ExcelAttribute.FalseValue != null && cellValue.Equals("False")) - return info.ExcelAttribute.FalseValue; + else if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.FalseValue != null && cellValue.Equals("False")) + return info.ExcelColumnAttribute.FalseValue; else if (!string.IsNullOrWhiteSpace(info.FormatString) & string.IsNullOrEmpty(info.ExcelNumberFormat)) return string.Format(info.FormatString, cellValue); @@ -140,5 +140,10 @@ private static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) else return dateTime.DateTime; } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs index e4187bd..c301dfb 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs @@ -8,26 +8,26 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation public class ExcelColumnInfo { public string PropertyName { get; set; } - public ExcelColumnAttribute ExcelAttribute { get; set; } + public ExcelColumnAttribute ExcelColumnAttribute { get; set; } public string FormatString { get; set; } public string Header { get; set; } public string ExcelNumberFormat { - get { return ExcelAttribute != null ? ExcelAttribute.NumberFormat : null; } + get { return ExcelColumnAttribute != null ? ExcelColumnAttribute.NumberFormat : null; } } public bool IsExcelHeaderDefined { - get { return ExcelAttribute != null && ExcelAttribute.Header != null; } + get { return ExcelColumnAttribute != null && ExcelColumnAttribute.Header != null; } } public ExcelColumnInfo(string propertyName, ExcelColumnAttribute excelAttribute = null, string formatString = null) { PropertyName = propertyName; - ExcelAttribute = excelAttribute; + ExcelColumnAttribute = excelAttribute; FormatString = formatString; - Header = IsExcelHeaderDefined ? ExcelAttribute.Header : propertyName; + Header = IsExcelHeaderDefined ? ExcelColumnAttribute.Header : propertyName; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs index 1adcc84..cbd8b7d 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs @@ -7,23 +7,8 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation /// /// A collection of column information for an Excel document, keyed by field/property name. /// - public class ExcelColumnInfoCollection : KeyedCollection + public class ExcelColumnInfoCollection : KeyedCollectionBase { - public ICollection Keys - { - get - { - if (this.Dictionary != null) - { - return this.Dictionary.Keys; - } - else - { - return new Collection(this.Select(this.GetKeyForItem).ToArray()); - } - } - } - protected override string GetKeyForItem(ExcelColumnInfo item) { return item.PropertyName; diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs new file mode 100644 index 0000000..6e154fa --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Attributes; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class ExcelSheetInfo + { + public string PropertyName { get; set; } + public ExcelSheetAttribute ExcelSheetAttribute { get; set; } + public string SheetName { get; set; } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs new file mode 100644 index 0000000..c8b0c7d --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class ExcelSheetInfoCollection : KeyedCollectionBase + { + protected override string GetKeyForItem(ExcelSheetInfo item) + { + return item.PropertyName; + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs new file mode 100644 index 0000000..6fc4850 --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public interface ISheetResolver + { + ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, IEnumerable data); + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs index aa34f21..466a69b 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs @@ -27,6 +27,8 @@ public interface IXlsxSerialiser /// Type of item being serialised. /// Value passed for serialisation, cast to an IEnumerable if necessary. /// Document builder utility class. - void Serialise(Type itemType, object value, XlsxDocumentBuilder document); + void Serialise(Type itemType, object value, IXlsxDocumentBuilder document); + + } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs new file mode 100644 index 0000000..5c42622 --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class KeyedCollectionBase : KeyedCollection + { + public ICollection Keys + { + get + { + if (this.Dictionary != null) + { + return this.Dictionary.Keys; + } + else + { + return new Collection(this.Select(this.GetKeyForItem).ToArray()); + } + } + } + + protected override string GetKeyForItem(T item) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index dbb96db..8370b54 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -6,11 +6,21 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation { - public class SqadXlsxSerialiser : DefaultXlsxSerialiser + public class SqadXlsxSerialiser : IXlsxSerialiser { - public override void Serialise(Type itemType, object value, XlsxDocumentBuilder document) + private IColumnResolver _columnResolver { get; set; } + private ISheetResolver _sheetResolver { get; set; } + + public bool IgnoreFormatting => throw new NotImplementedException(); + + public bool CanSerialiseType(Type valueType, Type itemType) + { + return true; + } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document) { - base.Serialise(itemType, value, document); + var data = value as IEnumerable; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index 3a5a9df..deb0a40 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -8,7 +8,7 @@ namespace WebApiContrib.Formatting.Xlsx { - public class SqadXlsxDocumentBuilder + public class SqadXlsxDocumentBuilder : IXlsxDocumentBuilder { private ExcelPackage Package { get; set; } @@ -35,7 +35,7 @@ public Task WriteToStream() } - public static bool IsExcelSupportedType(object expression) + public bool IsExcelSupportedType(object expression) { return expression is string || expression is short diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 50af22c..46e4d3e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -64,15 +64,24 @@ + + + + + + + + + diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index de3124c..f7168db 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -9,7 +9,7 @@ namespace WebApiContrib.Formatting.Xlsx { - public class XlsxDocumentBuilder + public class XlsxDocumentBuilder : IXlsxDocumentBuilder { public ExcelPackage Package { get; set; } public ExcelWorksheet Worksheet { get; set; } @@ -62,7 +62,7 @@ public void FormatColumn(int column, string format, bool skipHeaderRow = true) Worksheet.Cells[firstRow, column, RowCount, column].Style.Numberformat.Format = format; } - public static bool IsExcelSupportedType(object expression) + public bool IsExcelSupportedType(object expression) { return expression is string || expression is short diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index 3ae2ac1..a05f366 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -160,8 +160,7 @@ public override Task WriteToStreamAsync(Type type, var valueType = value.GetType(); - // Apply cell styles. - if (CellStyle != null) CellStyle(document.Worksheet.Cells.Style); + // Get the item type. var itemType = (util.IsSimpleType(valueType)) @@ -190,6 +189,9 @@ public override Task WriteToStreamAsync(Type type, serialiser.Serialise(itemType, value, document); + // Apply cell styles. + CellStyle?.Invoke(document.Worksheet.Cells.Style); + // Only format spreadsheet if it has content. if (document.RowCount > 0) { From b58fbcf4e8f22d56eadf9e51dd15325b516e149d Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 9 Jun 2017 13:48:44 -0500 Subject: [PATCH 003/255] library updates --- .../FormatterUtils.cs | 27 +++++ .../IXlsxDocumentBuilder.cs | 6 +- .../Serialisation/DefaultColumnResolver.cs | 12 ++- .../Serialisation/DefaultSheetResolver.cs | 15 ++- .../Serialisation/DefaultXlsxSerialiser.cs | 2 +- .../Serialisation/ExcelSheetInfo.cs | 2 + .../Serialisation/ExpandoSerialiser.cs | 5 + .../Serialisation/IColumnResolver.cs | 3 +- .../Serialisation/ISheetResolver.cs | 2 +- .../Serialisation/IXlsxSerialiser.cs | 2 +- .../Serialisation/PerRequestColumnResolver.cs | 2 +- .../Serialisation/SimpleTypeXlsxSerialiser.cs | 5 + .../Serialisation/SqadXlsxSerialiser.cs | 99 ++++++++++++++++++- .../SqadXlsxDocumentBuilder.cs | 6 +- .../SqadXlsxSheetBuilder.cs | 5 +- .../XlsxDocumentBuilder.cs | 5 + .../XlsxMediaTypeFormatter.cs | 31 +++--- 17 files changed, 192 insertions(+), 37 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index 8e4239f..d746826 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -183,6 +183,21 @@ public static T GetFieldOrPropertyValue(object obj, string name) return (T)value; } + public static List GetUnderlineTypes(Type type) + { + return type.GetProperties(PublicInstanceBindingFlags).Select(s => s.PropertyType).ToList(); + } + + public static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) + { + if (dateTime.Offset.Equals(TimeSpan.Zero)) + return dateTime.UtcDateTime; + else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))) + return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local); + else + return dateTime.DateTime; + } + /// /// Determine whether a type is simple (String, Decimal, DateTime etc.) /// or complex (i.e. custom class with public properties and methods). @@ -205,5 +220,17 @@ public static bool IsSimpleType(Type type) Convert.GetTypeCode(type) != TypeCode.Object; } + public static bool IsExcelSupportedType(object expression) + { + return expression is String + || expression is Int16 + || expression is Int32 + || expression is Int64 + || expression is Decimal + || expression is Single + || expression is Double + || expression is DateTime; + } + } } diff --git a/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs index 8f33f26..5865679 100644 --- a/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs @@ -1,4 +1,5 @@ -using System; +using OfficeOpenXml; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,6 +10,9 @@ namespace WebApiContrib.Formatting.Xlsx public interface IXlsxDocumentBuilder { Task WriteToStream(); + bool IsExcelSupportedType(object expression); + + ExcelWorksheet AppendSheet(string sheetName); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 721a9f5..9841a12 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -20,7 +20,7 @@ public class DefaultColumnResolver : IColumnResolver /// Type of item being serialised. /// The collection of values being serialised. (Not used, provided for use by derived /// types.) - public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnumerable data) + public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data) { var fields = GetSerialisableMemberNames(itemType, data); var properties = GetSerialisablePropertyInfo(itemType, data); @@ -35,7 +35,9 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnum if (prop == null) continue; - fieldInfo.Add(new ExcelColumnInfo(field, util.GetAttribute(prop))); + ExcelColumnAttribute attribute = util.GetAttribute(prop); + if (attribute != null) + fieldInfo.Add(new ExcelColumnInfo(field, attribute)); } PopulateFieldInfoFromMetadata(fieldInfo, itemType, data); @@ -49,7 +51,7 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnum /// Type of item being serialised. /// The collection of values being serialised. (Not used, provided for use by derived /// types.) - public virtual IEnumerable GetSerialisableMemberNames(Type itemType, IEnumerable data) + public virtual IEnumerable GetSerialisableMemberNames(Type itemType, object data) { return util.GetMemberNames(itemType); } @@ -60,7 +62,7 @@ public virtual IEnumerable GetSerialisableMemberNames(Type itemType, IEn /// Type of item being serialised. /// The collection of values being serialised. (Not used, provided for use by derived /// types.) - public virtual IEnumerable GetSerialisablePropertyInfo(Type itemType, IEnumerable data) + public virtual IEnumerable GetSerialisablePropertyInfo(Type itemType, object data) { return (from p in itemType.GetProperties() where p.CanRead & p.GetGetMethod().IsPublic & p.GetGetMethod().GetParameters().Length == 0 @@ -76,7 +78,7 @@ public virtual IEnumerable GetSerialisablePropertyInfo(Type itemTy /// types.) protected virtual void PopulateFieldInfoFromMetadata(ExcelColumnInfoCollection fieldInfo, Type itemType, - IEnumerable data) + object data) { // Populate missing attribute information from metadata. var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, itemType); diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs index aa9e680..3f0ed1e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -10,10 +10,10 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation { public class DefaultSheetResolver : ISheetResolver { - public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, IEnumerable data) + public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, object data) { var sheets = FormatterUtils.GetMemberNames(itemType); - var properties = GetSerialisablePropertyInfo(itemType, data); + var properties = GetSerialisablePropertyInfo(itemType); var sheetCollection = new ExcelSheetInfoCollection(); @@ -21,19 +21,24 @@ public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, IEnumerable p.Name == sheet); - if (prop == null) continue; + ExcelSheetAttribute attr = FormatterUtils.GetAttribute(prop); + + if (prop==null || attr==null ) continue; sheetCollection.Add(new ExcelSheetInfo() { + SheetType = prop.PropertyType, SheetName = sheet, - ExcelSheetAttribute = FormatterUtils.GetAttribute(prop) + ExcelSheetAttribute = attr, + PropertyName = prop.Name, + SheetObject = FormatterUtils.GetFieldOrPropertyValue(data, prop.Name) }); } return sheetCollection; } - public virtual IEnumerable GetSerialisablePropertyInfo(Type itemType, IEnumerable data) + public virtual IEnumerable GetSerialisablePropertyInfo(Type itemType) { return (from p in itemType.GetProperties() where p.CanRead & p.GetGetMethod().IsPublic & p.GetGetMethod().GetParameters().Length == 0 diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index 169ce51..bb4bbc3 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -141,7 +141,7 @@ private static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) return dateTime.DateTime; } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) { throw new NotImplementedException(); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs index 6e154fa..77dd1b3 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs @@ -9,6 +9,8 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation { public class ExcelSheetInfo { + public Type SheetType { get; set; } + public object SheetObject { get; set; } public string PropertyName { get; set; } public ExcelSheetAttribute ExcelSheetAttribute { get; set; } public string SheetName { get; set; } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs index e892c9b..3cd083a 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs @@ -71,5 +71,10 @@ public IDictionary GetDynamicPropertyValues(object item) { return (IDictionary)item; } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs index fa7a6f4..7f83164 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs @@ -17,6 +17,7 @@ public interface IColumnResolver /// /// Type of item being serialised. /// The collection of values being serialised. - ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnumerable data); + //ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnumerable data); + ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs index 6fc4850..8999887 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs @@ -8,6 +8,6 @@ namespace WebApiContrib.Formatting.Xlsx.Serialisation { public interface ISheetResolver { - ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, IEnumerable data); + ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, object data); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs index 466a69b..9d68b66 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs @@ -27,7 +27,7 @@ public interface IXlsxSerialiser /// Type of item being serialised. /// Value passed for serialisation, cast to an IEnumerable if necessary. /// Document builder utility class. - void Serialise(Type itemType, object value, IXlsxDocumentBuilder document); + void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs index 4dc5f4f..3b051f9 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs @@ -40,7 +40,7 @@ public PerRequestColumnResolver(string httpContextItemKey = DEFAULT_KEY, bool us /// types.) /// Any names specified in the per-request dictionary that aren't serialisable will be /// discarded. - public override IEnumerable GetSerialisableMemberNames(Type itemType, IEnumerable data) + public override IEnumerable GetSerialisableMemberNames(Type itemType, object data) { var defaultMemberNames = base.GetSerialisableMemberNames(itemType, data); var httpContextItems = HttpContextFactory.Current.Items; diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs index 0f48820..e0e065c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs @@ -29,5 +29,10 @@ public void Serialise(Type itemType, object value, XlsxDocumentBuilder document) document.AppendRow(new object[] { val }); } } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 8370b54..ba24ee4 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -11,16 +11,109 @@ public class SqadXlsxSerialiser : IXlsxSerialiser private IColumnResolver _columnResolver { get; set; } private ISheetResolver _sheetResolver { get; set; } - public bool IgnoreFormatting => throw new NotImplementedException(); + public bool IgnoreFormatting => false; + + public SqadXlsxSerialiser() : this(new DefaultSheetResolver(), new DefaultColumnResolver()) { } + + public SqadXlsxSerialiser(ISheetResolver sheetResolver, IColumnResolver columnResolver) + { + _sheetResolver = sheetResolver; + _columnResolver = columnResolver; + } public bool CanSerialiseType(Type valueType, Type itemType) { return true; } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) { - var data = value as IEnumerable; + //var data = value as IEnumerable; + + var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value); + string sheetName = string.Empty; + + if (sheetBuilder == null) + { + var sheetAttribute = itemType.GetCustomAttributes(true).SingleOrDefault(s => s is Attributes.ExcelSheetAttribute); + sheetName = sheetAttribute != null ? (sheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); + } + + //adding column header + sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); + + //adding rows data + if (value != null) + { + var columns = columnInfo.Keys.ToList(); + //foreach (var dataObj in value as IEnumerable) + //{ + var row = new List(); + + for (int i = 0; i <= columns.Count - 1; i++) + { + var cellValue = GetFieldOrPropertyValue(value, columns[i]); + var info = columnInfo[i]; + + //row.Add(FormatCellValue(cellValue, info)); + row.Add(FormatCellValue(cellValue, info)); + } + + sheetBuilder.AppendRow(row.ToList()); + //} + } + + + + + + var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); + + foreach (var sheet in sheetsInfo) + { + if (!(sheet.ExcelSheetAttribute is Attributes.ExcelSheetAttribute)) + continue; + + sheetName = sheet.ExcelSheetAttribute != null ? (sheet.ExcelSheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); + + this.Serialise(sheet.SheetType, sheet.SheetObject, document, sheetBuilder); + + //sheetBuilder = null; + } + + } + + protected virtual object GetFieldOrPropertyValue(object rowObject, string name) + { + var rowValue = FormatterUtils.GetFieldOrPropertyValue(rowObject, name); + + if (rowValue is DateTimeOffset) + return FormatterUtils.ConvertFromDateTimeOffset((DateTimeOffset)rowValue); + + else if (FormatterUtils.IsExcelSupportedType(rowValue)) + return rowValue; + + return rowValue == null || DBNull.Value.Equals(rowValue) + ? string.Empty + : rowValue.ToString(); + } + + protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info) + { + // Boolean transformations. + if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.TrueValue != null && cellValue.Equals("True")) + return info.ExcelColumnAttribute.TrueValue; + + else if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.FalseValue != null && cellValue.Equals("False")) + return info.ExcelColumnAttribute.FalseValue; + + else if (!string.IsNullOrWhiteSpace(info.FormatString) & string.IsNullOrEmpty(info.ExcelNumberFormat)) + return string.Format(info.FormatString, cellValue); + + else + return cellValue; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index deb0a40..a453835 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -33,7 +33,11 @@ public Task WriteToStream() { return Task.Factory.StartNew(() => Package.SaveAs(_stream)); } - + + public ExcelWorksheet AppendSheet(string sheetName) + { + return Package.Workbook.Worksheets.Add(sheetName); + } public bool IsExcelSupportedType(object expression) { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 51ced66..8496c14 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -10,12 +10,13 @@ namespace WebApiContrib.Formatting.Xlsx public class SqadXlsxSheetBuilder { private ExcelWorksheet _worksheet { get; set; } + public ExcelWorksheet Worksheet => _worksheet; private int _rowCount { get; set; } - public SqadXlsxSheetBuilder(string SheetName) + public SqadXlsxSheetBuilder(ExcelWorksheet sheet) { _rowCount = 0; - _worksheet = new ExcelWorksheet(null,null,null,null,SheetName,0,0,eWorkSheetHidden.Visible); + _worksheet = sheet; } /// diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index f7168db..2c8e67d 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -73,5 +73,10 @@ public bool IsExcelSupportedType(object expression) || expression is double || expression is DateTime; } + + public ExcelWorksheet AppendSheet(string sheetName) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index a05f366..b836c81 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -92,7 +92,8 @@ public XlsxMediaTypeFormatter(bool autoFit = true, HeaderStyle = headerStyle; // Initialise serialisers. - Serialisers = new List { new ExpandoSerialiser(), + Serialisers = new List { new SqadXlsxSerialiser(), + new ExpandoSerialiser(), new SimpleTypeXlsxSerialiser() }; DefaultSerializer = new DefaultXlsxSerialiser(); @@ -141,7 +142,7 @@ public override void SetDefaultContentHeaders(Type type, // Set content disposition to use this file name. headers.ContentDisposition = new ContentDispositionHeaderValue("inline") - { FileName = fileName }; + { FileName = fileName }; base.SetDefaultContentHeaders(type, headers, mediaType); } @@ -160,7 +161,7 @@ public override Task WriteToStreamAsync(Type type, var valueType = value.GetType(); - + // Get the item type. var itemType = (util.IsSimpleType(valueType)) @@ -171,7 +172,7 @@ public override Task WriteToStreamAsync(Type type, if (itemType == null) { itemType = valueType; - value = new object[] { value }; + //value = new object[] { value }; } // Used if no other matching serialiser can be found. @@ -187,21 +188,21 @@ public override Task WriteToStreamAsync(Type type, } } - serialiser.Serialise(itemType, value, document); + serialiser.Serialise(itemType, value, document, null); // Apply cell styles. - CellStyle?.Invoke(document.Worksheet.Cells.Style); + //CellStyle?.Invoke(document.Worksheet.Cells.Style); // Only format spreadsheet if it has content. - if (document.RowCount > 0) - { - if (serialiser.IgnoreFormatting) - { - // Autofit cells if specified. - if (AutoFit) document.AutoFit(); - } - else FormatDocument(document); - } + //if (document.RowCount > 0) + //{ + // if (serialiser.IgnoreFormatting) + // { + // // Autofit cells if specified. + // if (AutoFit) document.AutoFit(); + // } + // else FormatDocument(document); + //} return document.WriteToStream(); } From 9dd2f42753455837c96ab6a4b02e8df2f9efb856 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Tue, 13 Jun 2017 10:10:39 -0500 Subject: [PATCH 004/255] updates to convertere and fix for autofit column --- .../Serialisation/DefaultSheetResolver.cs | 12 +++- .../Serialisation/SqadXlsxSerialiser.cs | 57 ++++++++++++------- .../SqadXlsxDocumentBuilder.cs | 6 +- .../SqadXlsxSheetBuilder.cs | 6 ++ 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs index 3f0ed1e..a72dede 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -25,14 +25,22 @@ public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, object data) if (prop==null || attr==null ) continue; - sheetCollection.Add(new ExcelSheetInfo() + var sheetInfo = new ExcelSheetInfo() { SheetType = prop.PropertyType, SheetName = sheet, ExcelSheetAttribute = attr, PropertyName = prop.Name, SheetObject = FormatterUtils.GetFieldOrPropertyValue(data, prop.Name) - }); + }; + + if (prop.PropertyType.Name.StartsWith("List")) + { + var dataAsAList = sheetInfo.SheetObject as IEnumerable; + sheetInfo.SheetType = dataAsAList.Count()>0 ? dataAsAList.First().GetType() : itemType; + } + + sheetCollection.Add(sheetInfo); } return sheetCollection; diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index ba24ee4..0e19e5c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -26,10 +26,9 @@ public bool CanSerialiseType(Type valueType, Type itemType) return true; } + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) { - //var data = value as IEnumerable; - var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value); string sheetName = string.Empty; @@ -40,49 +39,69 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); } - //adding column header - sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); + if (columnInfo.Count() > 0) + sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); //adding rows data if (value != null) { var columns = columnInfo.Keys.ToList(); - //foreach (var dataObj in value as IEnumerable) - //{ - var row = new List(); - for (int i = 0; i <= columns.Count - 1; i++) + if (value is IEnumerable) + { + foreach (var dataObj in value as IEnumerable) { - var cellValue = GetFieldOrPropertyValue(value, columns[i]); - var info = columnInfo[i]; - - //row.Add(FormatCellValue(cellValue, info)); - row.Add(FormatCellValue(cellValue, info)); + PopulateRows(columns, dataObj, sheetBuilder, columnInfo); + //this.Serialise(itemType, dataObj, document, sheetBuilder); + var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); + PopulateInnerObjectSheets(deepSheetsInfo, document, itemType, sheetBuilder); } - - sheetBuilder.AppendRow(row.ToList()); - //} + } + else + { + PopulateRows(columns, value, sheetBuilder, columnInfo); + var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); + PopulateInnerObjectSheets(sheetsInfo, document, itemType, sheetBuilder); + } } + sheetBuilder.AutoFit(); + } + private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) + { + var row = new List(); + for (int i = 0; i <= columns.Count - 1; i++) + { + var cellValue = GetFieldOrPropertyValue(value, columns[i]); + var info = columnInfo[i]; - var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); + //row.Add(FormatCellValue(cellValue, info)); + row.Add(FormatCellValue(cellValue, info)); + } + + sheetBuilder.AppendRow(row.ToList()); + } + private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXlsxDocumentBuilder document, Type itemType, SqadXlsxSheetBuilder sheetBuilder) + { foreach (var sheet in sheetsInfo) { if (!(sheet.ExcelSheetAttribute is Attributes.ExcelSheetAttribute)) continue; - sheetName = sheet.ExcelSheetAttribute != null ? (sheet.ExcelSheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + string sheetName = sheet.ExcelSheetAttribute != null ? (sheet.ExcelSheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + if (sheetName == null) + sheetName = sheet.SheetName; + sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); this.Serialise(sheet.SheetType, sheet.SheetObject, document, sheetBuilder); //sheetBuilder = null; } - } protected virtual object GetFieldOrPropertyValue(object rowObject, string name) diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index a453835..024781a 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -23,11 +23,7 @@ public SqadXlsxDocumentBuilder(Stream stream) } - public void AutoFit() - { - throw new NotImplementedException(); - //Worksheet.Cells[Worksheet.Dimension.Address].AutoFitColumns(); - } + public Task WriteToStream() { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 8496c14..46d830c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -41,5 +41,11 @@ public void FormatColumn(int column, string format, bool skipHeaderRow = true) if (firstRow <= _rowCount) _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; } + + public void AutoFit() + { + if (_worksheet.Dimension != null) + _worksheet.Cells[_worksheet.Dimension.Address].AutoFitColumns(); + } } } From 145a75870235593d646a7704e57ff3853ae6fc44 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 15 Jun 2017 16:16:32 -0500 Subject: [PATCH 005/255] support for complex classses as column on the sheet --- .../FormatterUtils.cs | 17 ++++--- .../Serialisation/DefaultColumnResolver.cs | 23 +++++++--- .../Serialisation/DefaultSheetResolver.cs | 5 +-- .../Serialisation/DefaultXlsxSerialiser.cs | 2 +- .../Serialisation/ExpandoSerialiser.cs | 2 +- .../Serialisation/IColumnResolver.cs | 2 +- .../Serialisation/IXlsxSerialiser.cs | 2 +- .../Serialisation/SimpleTypeXlsxSerialiser.cs | 2 +- .../Serialisation/SqadXlsxSerialiser.cs | 45 +++++++++++++------ 9 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index d746826..9cc4b3c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -182,12 +182,7 @@ public static T GetFieldOrPropertyValue(object obj, string name) return (T)value; } - - public static List GetUnderlineTypes(Type type) - { - return type.GetProperties(PublicInstanceBindingFlags).Select(s => s.PropertyType).ToList(); - } - + public static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) { if (dateTime.Offset.Equals(TimeSpan.Zero)) @@ -210,12 +205,20 @@ public static bool IsSimpleType(Type type) type.IsValueType || type.IsPrimitive || new Type[] { + typeof(int), typeof(string), typeof(decimal), typeof(DateTime), typeof(DateTimeOffset), typeof(TimeSpan), - typeof(Guid) + typeof(Guid), + //take nullable types into consideration + typeof(int?), + typeof(decimal?), + typeof(DateTime?), + typeof(DateTimeOffset?), + typeof(TimeSpan?), + typeof(Guid?), }.Contains(type) || Convert.GetTypeCode(type) != TypeCode.Object; } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 9841a12..6283831 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -4,7 +4,6 @@ using System.Reflection; using System.Web.ModelBinding; using WebApiContrib.Formatting.Xlsx.Attributes; -using util = WebApiContrib.Formatting.Xlsx.FormatterUtils; namespace WebApiContrib.Formatting.Xlsx.Serialisation { @@ -20,7 +19,7 @@ public class DefaultColumnResolver : IColumnResolver /// Type of item being serialised. /// The collection of values being serialised. (Not used, provided for use by derived /// types.) - public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data) + public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data, string namePrefix = "", bool isComplexColumn = false) { var fields = GetSerialisableMemberNames(itemType, data); var properties = GetSerialisablePropertyInfo(itemType, data); @@ -35,9 +34,23 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec if (prop == null) continue; - ExcelColumnAttribute attribute = util.GetAttribute(prop); + + ExcelColumnAttribute attribute = FormatterUtils.GetAttribute(prop); if (attribute != null) - fieldInfo.Add(new ExcelColumnInfo(field, attribute)); + { + if (!FormatterUtils.IsSimpleType(prop.PropertyType)) + { + //getting a complex class columns populates as ComplexName:InnerProperty + ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(prop.PropertyType, null, prop.Name, true); + foreach (var subcolumn in columnCollection) + fieldInfo.Add(subcolumn); + } + else + { + string propertyName = isComplexColumn ? $"{namePrefix}:{field}" : field; + fieldInfo.Add(new ExcelColumnInfo(propertyName, attribute, null)); + } + } } PopulateFieldInfoFromMetadata(fieldInfo, itemType, data); @@ -53,7 +66,7 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec /// types.) public virtual IEnumerable GetSerialisableMemberNames(Type itemType, object data) { - return util.GetMemberNames(itemType); + return FormatterUtils.GetMemberNames(itemType); } /// diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs index a72dede..57187ae 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -35,10 +35,7 @@ public ExcelSheetInfoCollection GetExcelSheetInfo(Type itemType, object data) }; if (prop.PropertyType.Name.StartsWith("List")) - { - var dataAsAList = sheetInfo.SheetObject as IEnumerable; - sheetInfo.SheetType = dataAsAList.Count()>0 ? dataAsAList.First().GetType() : itemType; - } + sheetInfo.SheetType = FormatterUtils.GetEnumerableItemType(sheetInfo.SheetObject.GetType()); sheetCollection.Add(sheetInfo); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index bb4bbc3..315e016 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -141,7 +141,7 @@ private static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) return dateTime.DateTime; } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName)//, SqadXlsxSheetBuilder sheetBuilder) { throw new NotImplementedException(); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs index 3cd083a..93c46a2 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs @@ -72,7 +72,7 @@ public IDictionary GetDynamicPropertyValues(object item) return (IDictionary)item; } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document,string sheetName)//, SqadXlsxSheetBuilder sheetBuilder) { throw new NotImplementedException(); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs index 7f83164..efb10f0 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs @@ -18,6 +18,6 @@ public interface IColumnResolver /// Type of item being serialised. /// The collection of values being serialised. //ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, IEnumerable data); - ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data); + ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, object data, string namePrefix = "", bool isComplexColumn=false); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs index 9d68b66..f03af75 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs @@ -27,7 +27,7 @@ public interface IXlsxSerialiser /// Type of item being serialised. /// Value passed for serialisation, cast to an IEnumerable if necessary. /// Document builder utility class. - void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder); + void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName);// SqadXlsxSheetBuilder sheetBuilder); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs index e0e065c..c61fec4 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs @@ -30,7 +30,7 @@ public void Serialise(Type itemType, object value, XlsxDocumentBuilder document) } } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document,string sheetName)//, SqadXlsxSheetBuilder sheetBuilder) { throw new NotImplementedException(); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 0e19e5c..d59d179 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -27,37 +27,39 @@ public bool CanSerialiseType(Type valueType, Type itemType) } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, SqadXlsxSheetBuilder sheetBuilder) + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName = null)//, SqadXlsxSheetBuilder sheetBuilder) { var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value); - string sheetName = string.Empty; - if (sheetBuilder == null) + SqadXlsxSheetBuilder sheetBuilder = null; + + if (sheetName == null) { var sheetAttribute = itemType.GetCustomAttributes(true).SingleOrDefault(s => s is Attributes.ExcelSheetAttribute); sheetName = sheetAttribute != null ? (sheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; - sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); } if (columnInfo.Count() > 0) + { + sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); + } //adding rows data if (value != null) { var columns = columnInfo.Keys.ToList(); - if (value is IEnumerable) + if (value is IEnumerable && (value as IEnumerable).Count() > 0) { foreach (var dataObj in value as IEnumerable) { PopulateRows(columns, dataObj, sheetBuilder, columnInfo); - //this.Serialise(itemType, dataObj, document, sheetBuilder); var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); PopulateInnerObjectSheets(deepSheetsInfo, document, itemType, sheetBuilder); } } - else + else if (!(value is IEnumerable)) { PopulateRows(columns, value, sheetBuilder, columnInfo); var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); @@ -65,21 +67,38 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document } } - sheetBuilder.AutoFit(); + if (sheetBuilder != null) + sheetBuilder.AutoFit(); } private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) { + if (sheetBuilder == null) + return; var row = new List(); for (int i = 0; i <= columns.Count - 1; i++) { - var cellValue = GetFieldOrPropertyValue(value, columns[i]); - var info = columnInfo[i]; + string columnName = columns[i]; + object lookUpObject = value; + if (columnName.Contains(":")) + { + string[] columnPath = columnName.Split(':'); + columnName = columnPath.Last(); - //row.Add(FormatCellValue(cellValue, info)); + + for (int l = 0; l < columnPath.Count() - 1; l++) + { + lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); + } + + } + + var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); + var info = columnInfo[i]; row.Add(FormatCellValue(cellValue, info)); + } sheetBuilder.AppendRow(row.ToList()); @@ -96,9 +115,9 @@ private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXls if (sheetName == null) sheetName = sheet.SheetName; - sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); + //sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); - this.Serialise(sheet.SheetType, sheet.SheetObject, document, sheetBuilder); + this.Serialise(sheet.SheetType, sheet.SheetObject, document, sheetName);//, sheetBuilder); //sheetBuilder = null; } From c1d15c53f9dc1cd701fe8f1710f8dbd323995413 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 16 Jun 2017 15:36:18 -0500 Subject: [PATCH 006/255] updates co export adding proper column path and proper value export, proper datetime formatn if no firmating provided --- .../Serialisation/DefaultColumnResolver.cs | 5 ++++- .../Serialisation/SqadXlsxSerialiser.cs | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 6283831..e3f3728 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -41,7 +41,10 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec if (!FormatterUtils.IsSimpleType(prop.PropertyType)) { //getting a complex class columns populates as ComplexName:InnerProperty - ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(prop.PropertyType, null, prop.Name, true); + + string prefix = string.IsNullOrEmpty(namePrefix)==false ? $"{namePrefix}:{prop.Name}" : prop.Name; + + ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(prop.PropertyType, null, prefix, true); foreach (var subcolumn in columnCollection) fieldInfo.Add(subcolumn); } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index d59d179..3765d0f 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -29,7 +29,7 @@ public bool CanSerialiseType(Type valueType, Type itemType) public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName = null)//, SqadXlsxSheetBuilder sheetBuilder) { - var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value); + var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value, sheetName); SqadXlsxSheetBuilder sheetBuilder = null; @@ -88,7 +88,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild columnName = columnPath.Last(); - for (int l = 0; l < columnPath.Count() - 1; l++) + for (int l = 1; l < columnPath.Count() - 1; l++) { lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); } @@ -150,6 +150,9 @@ protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info) else if (!string.IsNullOrWhiteSpace(info.FormatString) & string.IsNullOrEmpty(info.ExcelNumberFormat)) return string.Format(info.FormatString, cellValue); + else if (cellValue.GetType() == typeof(DateTime)) + return string.Format("{0:MM/dd/yyyy}", cellValue); + else return cellValue; } From acfaa391c1253e602bae028f7565abef18f47d31 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 29 Jun 2017 10:24:14 -0500 Subject: [PATCH 007/255] updates to expoer to support resolver sheets in the end of the list --- .../Attributes/ExcelColumnAttribute.cs | 4 + .../IColumnResolver.cs | 3 +- .../ISheetResolver.cs | 3 +- .../{ => Interfaces}/IXlsxDocumentBuilder.cs | 4 +- .../IXlsxSerialiser.cs | 4 +- .../Serialisation/DefaultColumnResolver.cs | 8 ++ .../Serialisation/DefaultSheetResolver.cs | 1 + .../Serialisation/DefaultXlsxSerialiser.cs | 7 +- .../Serialisation/ExpandoSerialiser.cs | 1 + .../Serialisation/SimpleTypeXlsxSerialiser.cs | 38 ------- .../Serialisation/SqadXlsxSerialiser.cs | 98 ++++++++++++++----- .../SqadXlsxDocumentBuilder.cs | 40 +++++--- .../SqadXlsxSheetBuilder.cs | 44 +++++---- .../WebApiContrib.Formatting.Xlsx.csproj | 9 +- .../XlsxDocumentBuilder.cs | 12 +-- .../XlsxMediaTypeFormatter.cs | 26 ++--- 16 files changed, 171 insertions(+), 131 deletions(-) rename src/WebApiContrib.Formatting.Xlsx/{Serialisation => Interfaces}/IColumnResolver.cs (90%) rename src/WebApiContrib.Formatting.Xlsx/{Serialisation => Interfaces}/ISheetResolver.cs (71%) rename src/WebApiContrib.Formatting.Xlsx/{ => Interfaces}/IXlsxDocumentBuilder.cs (73%) rename src/WebApiContrib.Formatting.Xlsx/{Serialisation => Interfaces}/IXlsxSerialiser.cs (93%) delete mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs index 6f7caaa..b559dc7 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs @@ -59,5 +59,9 @@ public int Order /// Apply the specified Excel number format string to this property in the generated Excel output. /// public string NumberFormat { get; set; } + + public string ResolveFromTable { get; set; } + + public string OverrideResolveTableName { get; set; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs similarity index 90% rename from src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs rename to src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs index efb10f0..c3959bc 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.Reflection; +using WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace WebApiContrib.Formatting.Xlsx.Interfaces { /// /// Allows easy customisation of what columns are generated from a type and how they should be formatted. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs similarity index 71% rename from src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs rename to src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs index 8999887..393ea98 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ISheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs @@ -3,8 +3,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace WebApiContrib.Formatting.Xlsx.Interfaces { public interface ISheetResolver { diff --git a/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs similarity index 73% rename from src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs rename to src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs index 5865679..bd5af98 100644 --- a/src/WebApiContrib.Formatting.Xlsx/IXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace WebApiContrib.Formatting.Xlsx +namespace WebApiContrib.Formatting.Xlsx.Interfaces { public interface IXlsxDocumentBuilder { @@ -13,6 +13,6 @@ public interface IXlsxDocumentBuilder bool IsExcelSupportedType(object expression); - ExcelWorksheet AppendSheet(string sheetName); + void AppendSheet(SqadXlsxSheetBuilder sheet); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs similarity index 93% rename from src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs rename to src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs index f03af75..fbb7878 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs @@ -1,6 +1,6 @@ using System; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace WebApiContrib.Formatting.Xlsx.Interfaces { /// /// Exposes access to serialisation logic for complete customisation of serialised output. @@ -10,7 +10,7 @@ public interface IXlsxSerialiser /// /// If true, no formatting beyond auto-fitting rows should be applied after serialisation. /// - bool IgnoreFormatting { get; } + // bool IgnoreFormatting { get; } /// /// Indicates whether the provided types can be serialised by this serialiser implementation. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index e3f3728..1b1c8e8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -4,6 +4,7 @@ using System.Reflection; using System.Web.ModelBinding; using WebApiContrib.Formatting.Xlsx.Attributes; +using WebApiContrib.Formatting.Xlsx.Interfaces; namespace WebApiContrib.Formatting.Xlsx.Serialisation { @@ -38,6 +39,13 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec ExcelColumnAttribute attribute = FormatterUtils.GetAttribute(prop); if (attribute != null) { + if (prop.PropertyType.Name.StartsWith("List")) + { + Type typeOfList = FormatterUtils.GetEnumerableItemType(prop.PropertyType); + + if (FormatterUtils.IsSimpleType(typeOfList)) + fieldInfo.Add(new ExcelColumnInfo(prop.Name, attribute,null)); + } if (!FormatterUtils.IsSimpleType(prop.PropertyType)) { //getting a complex class columns populates as ComplexName:InnerProperty diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs index 57187ae..75ad123 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using WebApiContrib.Formatting.Xlsx.Attributes; +using WebApiContrib.Formatting.Xlsx.Interfaces; namespace WebApiContrib.Formatting.Xlsx.Serialisation { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index 315e016..70b5fdc 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using WebApiContrib.Formatting.Xlsx.Interfaces; using util = WebApiContrib.Formatting.Xlsx.FormatterUtils; namespace WebApiContrib.Formatting.Xlsx.Serialisation @@ -37,7 +38,7 @@ public virtual void Serialise(Type itemType, object value, XlsxDocumentBuilder d var data = value as IEnumerable; var columnInfo = Resolver.GetExcelColumnInfo(itemType, data); - if (columnInfo.Count == 0) return; + if (columnInfo.Count() == 0) return; var columns = columnInfo.Keys.ToList(); @@ -51,7 +52,7 @@ public virtual void Serialise(Type itemType, object value, XlsxDocumentBuilder d { var row = new List(); - for (int i = 0; i <= columns.Count - 1; i++) + for (int i = 0; i <= (columns.Count() - 1); i++) { var cellValue = GetFieldOrPropertyValue(dataObject, columns[i]); var info = columnInfo[i]; @@ -64,7 +65,7 @@ public virtual void Serialise(Type itemType, object value, XlsxDocumentBuilder d } // Enforce any attributes on columns. - for (int i = 1; i <= columns.Count; i++) + for (int i = 1; i <= columns.Count(); i++) { if (!string.IsNullOrEmpty(columnInfo[i - 1].ExcelNumberFormat)) { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs index 93c46a2..cc939a8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs @@ -3,6 +3,7 @@ using System.Dynamic; using System.Linq; using System.Linq.Expressions; +using WebApiContrib.Formatting.Xlsx.Interfaces; namespace WebApiContrib.Formatting.Xlsx.Serialisation { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs deleted file mode 100644 index c61fec4..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SimpleTypeXlsxSerialiser.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections; -using util = WebApiContrib.Formatting.Xlsx.FormatterUtils; - -namespace WebApiContrib.Formatting.Xlsx.Serialisation -{ - /// - /// Custom serialiser for primitives and other simple types. - /// - public class SimpleTypeXlsxSerialiser : IXlsxSerialiser - { - public bool IgnoreFormatting - { - get { return true; } - } - - public bool CanSerialiseType(Type valueType, Type itemType) - { - return util.IsSimpleType(itemType); - } - - public void Serialise(Type itemType, object value, XlsxDocumentBuilder document) - { - // Can't convert IEnumerable to IEnumerable - var values = (IEnumerable)value; - - foreach (var val in values) - { - document.AppendRow(new object[] { val }); - } - } - - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document,string sheetName)//, SqadXlsxSheetBuilder sheetBuilder) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 3765d0f..5bbd4f3 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Interfaces; namespace WebApiContrib.Formatting.Xlsx.Serialisation { @@ -10,15 +12,19 @@ public class SqadXlsxSerialiser : IXlsxSerialiser { private IColumnResolver _columnResolver { get; set; } private ISheetResolver _sheetResolver { get; set; } - + private Func _staticValuesResolver { get; set; } public bool IgnoreFormatting => false; - public SqadXlsxSerialiser() : this(new DefaultSheetResolver(), new DefaultColumnResolver()) { } + public SqadXlsxSerialiser(Func staticValuesResolver) : this(new DefaultSheetResolver(), new DefaultColumnResolver(), staticValuesResolver) + { + + } - public SqadXlsxSerialiser(ISheetResolver sheetResolver, IColumnResolver columnResolver) + public SqadXlsxSerialiser(ISheetResolver sheetResolver, IColumnResolver columnResolver, Func StaticValuesResolver) { _sheetResolver = sheetResolver; _columnResolver = columnResolver; + this._staticValuesResolver = StaticValuesResolver; } public bool CanSerialiseType(Type valueType, Type itemType) @@ -41,7 +47,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document if (columnInfo.Count() > 0) { - sheetBuilder = new SqadXlsxSheetBuilder(document.AppendSheet(sheetName)); + sheetBuilder = new SqadXlsxSheetBuilder(sheetName); sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); } @@ -56,23 +62,26 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { PopulateRows(columns, dataObj, sheetBuilder, columnInfo); var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); - PopulateInnerObjectSheets(deepSheetsInfo, document, itemType, sheetBuilder); + PopulateInnerObjectSheets(deepSheetsInfo, document, itemType); } } else if (!(value is IEnumerable)) { PopulateRows(columns, value, sheetBuilder, columnInfo); var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); - PopulateInnerObjectSheets(sheetsInfo, document, itemType, sheetBuilder); + PopulateInnerObjectSheets(sheetsInfo, document, itemType); } } if (sheetBuilder != null) sheetBuilder.AutoFit(); + + document.AppendSheet(sheetBuilder); } private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) { + if (sheetBuilder == null) return; @@ -87,24 +96,57 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild string[] columnPath = columnName.Split(':'); columnName = columnPath.Last(); - for (int l = 1; l < columnPath.Count() - 1; l++) { lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); } - } var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); - var info = columnInfo[i]; - row.Add(FormatCellValue(cellValue, info)); - } + ExcelColumnInfo info = null; + if (columnInfo != null) { + info = columnInfo[i]; + + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + { + DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); + columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) + columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; + this.PopulateReferenceSheet(columntResolveTable); + + columntResolveTable = null; + } + } + row.Add(FormatCellValue(cellValue, info)); + } sheetBuilder.AppendRow(row.ToList()); } - private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXlsxDocumentBuilder document, Type itemType, SqadXlsxSheetBuilder sheetBuilder) + private void PopulateReferenceSheet(DataTable ReferenceSheet) + { + List sheetResolveColumns = new List(); + + foreach (DataColumn c in ReferenceSheet.Columns) + sheetResolveColumns.Add(c.Caption); + + SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName,true); + sb.AppendRow(sheetResolveColumns); + + foreach (DataRow r in ReferenceSheet.Rows) + { + Dictionary resolveRow = new Dictionary(); + + foreach (var col in sheetResolveColumns) + resolveRow.Add(col, r[col].ToString()); + + this.PopulateRows(sheetResolveColumns, resolveRow, sb, null); + } + } + + private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXlsxDocumentBuilder document, Type itemType) { foreach (var sheet in sheetsInfo) { @@ -130,31 +172,39 @@ protected virtual object GetFieldOrPropertyValue(object rowObject, string name) if (rowValue is DateTimeOffset) return FormatterUtils.ConvertFromDateTimeOffset((DateTimeOffset)rowValue); + else if (rowObject is Dictionary) + return (rowObject as Dictionary)[name]; + else if (FormatterUtils.IsExcelSupportedType(rowValue)) return rowValue; + else if ((rowValue is IEnumerable)) + return string.Join(",", rowValue as IEnumerable); + return rowValue == null || DBNull.Value.Equals(rowValue) ? string.Empty : rowValue.ToString(); } - protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info) + protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info=null) { - // Boolean transformations. - if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.TrueValue != null && cellValue.Equals("True")) - return info.ExcelColumnAttribute.TrueValue; + if (info != null) + { + // Boolean transformations. + if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.TrueValue != null && cellValue.Equals("True")) + return info.ExcelColumnAttribute.TrueValue; - else if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.FalseValue != null && cellValue.Equals("False")) - return info.ExcelColumnAttribute.FalseValue; + else if (info.ExcelColumnAttribute != null && info.ExcelColumnAttribute.FalseValue != null && cellValue.Equals("False")) + return info.ExcelColumnAttribute.FalseValue; - else if (!string.IsNullOrWhiteSpace(info.FormatString) & string.IsNullOrEmpty(info.ExcelNumberFormat)) - return string.Format(info.FormatString, cellValue); + else if (!string.IsNullOrWhiteSpace(info.FormatString) & string.IsNullOrEmpty(info.ExcelNumberFormat)) + return string.Format(info.FormatString, cellValue); - else if (cellValue.GetType() == typeof(DateTime)) - return string.Format("{0:MM/dd/yyyy}", cellValue); + else if (cellValue.GetType() == typeof(DateTime)) + return string.Format("{0:MM/dd/yyyy}", cellValue); + } - else - return cellValue; + return cellValue; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index 024781a..1c3f939 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -5,46 +5,54 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Interfaces; namespace WebApiContrib.Formatting.Xlsx { public class SqadXlsxDocumentBuilder : IXlsxDocumentBuilder { - private ExcelPackage Package { get; set; } - + //private ExcelPackage Package { get; set; } + private Stream _stream; + + //New Stuff + private List _sheets { get; set; } + + + public SqadXlsxDocumentBuilder(Stream stream) { _stream = stream; // Create a worksheet - Package = new ExcelPackage(); + //Package = new ExcelPackage(); + _sheets = new List(); } - - public Task WriteToStream() + public void AppendSheet(SqadXlsxSheetBuilder sheet) { - return Task.Factory.StartNew(() => Package.SaveAs(_stream)); + _sheets.Add(sheet); } - public ExcelWorksheet AppendSheet(string sheetName) + + public Task WriteToStream() { - return Package.Workbook.Worksheets.Add(sheetName); + //return Task.Factory.StartNew(() => Package.SaveAs(_stream)); + return null; } + //public ExcelWorksheet AppendSheet(string sheetName) + //{ + // //return Package.Workbook.Worksheets.Add(sheetName); + // return null; + //} + public bool IsExcelSupportedType(object expression) { - return expression is string - || expression is short - || expression is int - || expression is long - || expression is decimal - || expression is float - || expression is double - || expression is DateTime; + return FormatterUtils.IsExcelSupportedType(expression); } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 46d830c..6b9f8fc 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -9,14 +9,19 @@ namespace WebApiContrib.Formatting.Xlsx { public class SqadXlsxSheetBuilder { - private ExcelWorksheet _worksheet { get; set; } - public ExcelWorksheet Worksheet => _worksheet; - private int _rowCount { get; set; } + private string _sheetName { get; set; } + public string SheetName => _sheetName; - public SqadXlsxSheetBuilder(ExcelWorksheet sheet) + private bool _isReferenceSheet { get; set; } + public bool IsReferenceSheet => _isReferenceSheet; + + private List> _valueByColumnNumber { get; set; } + + public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet=false) { - _rowCount = 0; - _worksheet = sheet; + _sheetName = SheetName; + _isReferenceSheet = IsReferenceSheet; + _valueByColumnNumber = new List>(); } /// @@ -25,27 +30,30 @@ public SqadXlsxSheetBuilder(ExcelWorksheet sheet) /// The row to append to this instance. public void AppendRow(IEnumerable row) { - _rowCount++; + Dictionary newRow = new Dictionary(); - int i = 0; - foreach (var col in row) + foreach (var colValue in row) { - _worksheet.Cells[_rowCount, ++i].Value = col; + //new ExcelWorksheet().Cells[] + //_worksheet.Cells[_rowCount, ++i].Value = col; + newRow.Add(newRow.Count + 1, colValue); } + + _valueByColumnNumber.Add(newRow); } - public void FormatColumn(int column, string format, bool skipHeaderRow = true) - { - var firstRow = skipHeaderRow ? 2 : 1; + //public void FormatColumn(int column, string format, bool skipHeaderRow = true) + //{ + // var firstRow = skipHeaderRow ? 2 : 1; - if (firstRow <= _rowCount) - _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; - } + // if (firstRow <= _rowCount) + // _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; + //} public void AutoFit() { - if (_worksheet.Dimension != null) - _worksheet.Cells[_worksheet.Dimension.Address].AutoFitColumns(); + //if (_worksheet.Dimension != null) + // _worksheet.Cells[_worksheet.Dimension.Address].AutoFitColumns(); } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 46e4d3e..6eb0ccc 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -64,7 +64,7 @@ - + @@ -73,12 +73,11 @@ - - - + + + - diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index 2c8e67d..6020cb5 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Interfaces; using WebApiContrib.Formatting.Xlsx.Serialisation; namespace WebApiContrib.Formatting.Xlsx @@ -64,17 +65,10 @@ public void FormatColumn(int column, string format, bool skipHeaderRow = true) public bool IsExcelSupportedType(object expression) { - return expression is string - || expression is short - || expression is int - || expression is long - || expression is decimal - || expression is float - || expression is double - || expression is DateTime; + return FormatterUtils.IsExcelSupportedType(expression); } - public ExcelWorksheet AppendSheet(string sheetName) + public void AppendSheet(SqadXlsxSheetBuilder sheet) { throw new NotImplementedException(); } diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index b836c81..f7974ee 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -5,9 +5,10 @@ using System.Net.Http.Headers; using System.Security.Permissions; using System.Threading.Tasks; -using util = WebApiContrib.Formatting.Xlsx.FormatterUtils; -using WebApiContrib.Formatting.Xlsx.Attributes; +using System.Data; +using WebApiContrib.Formatting.Xlsx.Interfaces; using WebApiContrib.Formatting.Xlsx.Serialisation; +using WebApiContrib.Formatting.Xlsx.Attributes; namespace WebApiContrib.Formatting.Xlsx { @@ -78,7 +79,8 @@ public XlsxMediaTypeFormatter(bool autoFit = true, bool freezeHeader = false, double? headerHeight = null, Action cellStyle = null, - Action headerStyle = null) + Action headerStyle = null, + Func staticValuesResolver = null) { SupportedMediaTypes.Clear(); SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); @@ -92,11 +94,11 @@ public XlsxMediaTypeFormatter(bool autoFit = true, HeaderStyle = headerStyle; // Initialise serialisers. - Serialisers = new List { new SqadXlsxSerialiser(), - new ExpandoSerialiser(), - new SimpleTypeXlsxSerialiser() }; + Serialisers = new List { new SqadXlsxSerialiser(staticValuesResolver), + // new ExpandoSerialiser() + }; - DefaultSerializer = new DefaultXlsxSerialiser(); + //DefaultSerializer = new SqadXlsxSerialiser(staticValuesResolver); //new DefaultXlsxSerialiser(); } #endregion @@ -111,8 +113,8 @@ public override void SetDefaultContentHeaders(Type type, string fileName = "data"; // Look for ExcelDocumentAttribute on class. - var itemType = util.GetEnumerableItemType(type); - var excelDocumentAttribute = util.GetAttribute(itemType ?? type); + var itemType = FormatterUtils.GetEnumerableItemType(type); + var excelDocumentAttribute = FormatterUtils.GetAttribute(itemType ?? type); if (excelDocumentAttribute != null && !string.IsNullOrEmpty(excelDocumentAttribute.FileName)) { @@ -164,9 +166,9 @@ public override Task WriteToStreamAsync(Type type, // Get the item type. - var itemType = (util.IsSimpleType(valueType)) + var itemType = (FormatterUtils.IsSimpleType(valueType)) ? null - : util.GetEnumerableItemType(valueType); + : FormatterUtils.GetEnumerableItemType(valueType); // If a single object was passed, treat it like a list with one value. if (itemType == null) @@ -176,7 +178,7 @@ public override Task WriteToStreamAsync(Type type, } // Used if no other matching serialiser can be found. - IXlsxSerialiser serialiser = DefaultSerializer; + IXlsxSerialiser serialiser = null;// new SqadXlsxSerialiser(_staticValuesResolver); //DefaultSerializer; // Determine if a more specific serialiser might apply. foreach (var s in Serialisers) From 45c35a61b28654352b347f9fb59d4763d1f6f5e8 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 29 Jun 2017 13:47:33 -0500 Subject: [PATCH 008/255] major changes to how export gets generating --- .../Serialisation/SqadXlsxSerialiser.cs | 46 ++++++++++++------- .../SqadXlsxDocumentBuilder.cs | 24 ++++++---- .../SqadXlsxSheetBuilder.cs | 27 ++++++++++- 3 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 5bbd4f3..f2f396d 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -49,6 +49,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); + document.AppendSheet(sheetBuilder); } //adding rows data @@ -61,6 +62,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document foreach (var dataObj in value as IEnumerable) { PopulateRows(columns, dataObj, sheetBuilder, columnInfo); + CheckColumnsForResolveSheets(document, columnInfo); var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); PopulateInnerObjectSheets(deepSheetsInfo, document, itemType); } @@ -68,15 +70,14 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document else if (!(value is IEnumerable)) { PopulateRows(columns, value, sheetBuilder, columnInfo); + CheckColumnsForResolveSheets(document, columnInfo); var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); PopulateInnerObjectSheets(sheetsInfo, document, itemType); } } if (sheetBuilder != null) - sheetBuilder.AutoFit(); - - document.AppendSheet(sheetBuilder); + sheetBuilder.ShouldAutoFit = true; } private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) @@ -105,27 +106,38 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); ExcelColumnInfo info = null; - if (columnInfo != null) { + if (columnInfo != null) info = columnInfo[i]; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) - { - DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); - columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) - columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; + row.Add(FormatCellValue(cellValue, info)); + } + sheetBuilder.AppendRow(row.ToList()); + } - this.PopulateReferenceSheet(columntResolveTable); + private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document,ExcelColumnInfoCollection columnInfo) + { + if (columnInfo == null) + return; - columntResolveTable = null; - } + foreach (var cInfo in columnInfo) + { + if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + { + DataTable columntResolveTable = _staticValuesResolver(cInfo.ExcelColumnAttribute.ResolveFromTable); + columntResolveTable.TableName = cInfo.ExcelColumnAttribute.ResolveFromTable; + if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.OverrideResolveTableName) == false) + columntResolveTable.TableName = cInfo.ExcelColumnAttribute.OverrideResolveTableName; + + var referenceSheetBuilder = this.PopulateReferenceSheet(columntResolveTable); + + document.AppendSheet(referenceSheetBuilder); + + columntResolveTable = null; } - row.Add(FormatCellValue(cellValue, info)); } - sheetBuilder.AppendRow(row.ToList()); } - private void PopulateReferenceSheet(DataTable ReferenceSheet) + private SqadXlsxSheetBuilder PopulateReferenceSheet(DataTable ReferenceSheet) { List sheetResolveColumns = new List(); @@ -144,6 +156,8 @@ private void PopulateReferenceSheet(DataTable ReferenceSheet) this.PopulateRows(sheetResolveColumns, resolveRow, sb, null); } + + return sb; } private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXlsxDocumentBuilder document, Type itemType) diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index 1c3f939..aa80e82 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -11,7 +11,7 @@ namespace WebApiContrib.Formatting.Xlsx { public class SqadXlsxDocumentBuilder : IXlsxDocumentBuilder { - //private ExcelPackage Package { get; set; } + //private { get; set; } private Stream _stream; @@ -37,18 +37,24 @@ public void AppendSheet(SqadXlsxSheetBuilder sheet) _sheets.Add(sheet); } - public Task WriteToStream() { - //return Task.Factory.StartNew(() => Package.SaveAs(_stream)); - return null; + ExcelPackage package = Compile(); + + return Task.Factory.StartNew(() => package.SaveAs(_stream)); } - //public ExcelWorksheet AppendSheet(string sheetName) - //{ - // //return Package.Workbook.Worksheets.Add(sheetName); - // return null; - //} + private ExcelPackage Compile() + { + ExcelPackage package = new ExcelPackage(); + + foreach (var sheet in _sheets.OrderBy(o=>o.IsReferenceSheet)) + { + sheet.CompileSheet(package); + } + + return package; + } public bool IsExcelSupportedType(object expression) { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 6b9f8fc..aac26af 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -15,6 +15,8 @@ public class SqadXlsxSheetBuilder private bool _isReferenceSheet { get; set; } public bool IsReferenceSheet => _isReferenceSheet; + public bool ShouldAutoFit { get; set; } + private List> _valueByColumnNumber { get; set; } public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet=false) @@ -42,6 +44,28 @@ public void AppendRow(IEnumerable row) _valueByColumnNumber.Add(newRow); } + public void CompileSheet(ExcelPackage package) + { + if (_valueByColumnNumber.Count() == 0) + return ; + + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(SheetName) ; + + int rowCount = 0; + foreach (var row in _valueByColumnNumber) + { + rowCount++; + foreach (var col in row) + { + worksheet.Cells[rowCount, col.Key].Value = col.Value; + } + } + + if (worksheet.Dimension != null && ShouldAutoFit) + worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); + + } + //public void FormatColumn(int column, string format, bool skipHeaderRow = true) //{ // var firstRow = skipHeaderRow ? 2 : 1; @@ -52,8 +76,7 @@ public void AppendRow(IEnumerable row) public void AutoFit() { - //if (_worksheet.Dimension != null) - // _worksheet.Cells[_worksheet.Dimension.Address].AutoFitColumns(); + } } } From a860a88065cd41c05bffd3849d9fd11fb883b37d Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 29 Jun 2017 14:45:27 -0500 Subject: [PATCH 009/255] proper serialization order is now done, helper sheets are in the end of the sheets row. dropdownlist for reference is next --- .../Serialisation/SqadXlsxSerialiser.cs | 35 ++++++++++++++----- .../SqadXlsxSheetBuilder.cs | 4 --- .../XlsxMediaTypeFormatter.cs | 14 -------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index f2f396d..cb58224 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -114,7 +114,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild sheetBuilder.AppendRow(row.ToList()); } - private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document,ExcelColumnInfoCollection columnInfo) + private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelColumnInfoCollection columnInfo) { if (columnInfo == null) return; @@ -144,15 +144,34 @@ private SqadXlsxSheetBuilder PopulateReferenceSheet(DataTable ReferenceSheet) foreach (DataColumn c in ReferenceSheet.Columns) sheetResolveColumns.Add(c.Caption); - SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName,true); + SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName, true); sb.AppendRow(sheetResolveColumns); + sb.ShouldAutoFit = true; foreach (DataRow r in ReferenceSheet.Rows) { - Dictionary resolveRow = new Dictionary(); + Dictionary resolveRow = new Dictionary(); - foreach (var col in sheetResolveColumns) - resolveRow.Add(col, r[col].ToString()); + + foreach (DataColumn c in ReferenceSheet.Columns) + { + + if (c.DataType == typeof(int)) + { + resolveRow.Add(c.Caption, Convert.ToInt32(r[c])); + } + else if (c.DataType == typeof(DateTime)) + { + resolveRow.Add(c.Caption, Convert.ToDateTime(r[c])); + } + else + resolveRow.Add(c.Caption, r[c].ToString()); + + } + + + //foreach (var col in sheetResolveColumns) + // resolveRow.Add(col, r[col].ToString()); this.PopulateRows(sheetResolveColumns, resolveRow, sb, null); } @@ -186,8 +205,8 @@ protected virtual object GetFieldOrPropertyValue(object rowObject, string name) if (rowValue is DateTimeOffset) return FormatterUtils.ConvertFromDateTimeOffset((DateTimeOffset)rowValue); - else if (rowObject is Dictionary) - return (rowObject as Dictionary)[name]; + else if (rowObject is Dictionary) + return (rowObject as Dictionary)[name]; else if (FormatterUtils.IsExcelSupportedType(rowValue)) return rowValue; @@ -200,7 +219,7 @@ protected virtual object GetFieldOrPropertyValue(object rowObject, string name) : rowValue.ToString(); } - protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info=null) + protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info = null) { if (info != null) { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index aac26af..c7395f9 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -74,9 +74,5 @@ public void CompileSheet(ExcelPackage package) // _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; //} - public void AutoFit() - { - - } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index f7974ee..edaf66b 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -192,20 +192,6 @@ public override Task WriteToStreamAsync(Type type, serialiser.Serialise(itemType, value, document, null); - // Apply cell styles. - //CellStyle?.Invoke(document.Worksheet.Cells.Style); - - // Only format spreadsheet if it has content. - //if (document.RowCount > 0) - //{ - // if (serialiser.IgnoreFormatting) - // { - // // Autofit cells if specified. - // if (AutoFit) document.AutoFit(); - // } - // else FormatDocument(document); - //} - return document.WriteToStream(); } From 55bf00ce2f1494494369bb4afa746db10b6366ce Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 7 Jul 2017 08:18:46 -0500 Subject: [PATCH 010/255] updates to export process --- .../Serialisation/ExcelCell.cs | 17 +++++++ .../Serialisation/ExcelColumnInfo.cs | 2 + .../Serialisation/SqadXlsxSerialiser.cs | 51 ++++++++++++------- .../SqadXlsxSheetBuilder.cs | 36 ++++++++++--- .../WebApiContrib.Formatting.Xlsx.csproj | 1 + 5 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs new file mode 100644 index 0000000..7942d3b --- /dev/null +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiContrib.Formatting.Xlsx.Serialisation +{ + public class ExcelCell + { + public string CellHeader { get; set; } + public object CellValue { get; set; } + public string DataValidationSheet { get; set; } + public string DataValidationValue { get; set; } = "ID"; + public string DataValidationName { get; set; } = "Name"; + } +} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs index c301dfb..0c149c7 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs @@ -12,6 +12,8 @@ public class ExcelColumnInfo public string FormatString { get; set; } public string Header { get; set; } + + public string ExcelNumberFormat { get { return ExcelColumnAttribute != null ? ExcelColumnAttribute.NumberFormat : null; } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index cb58224..6c603e6 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -48,7 +48,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document if (columnInfo.Count() > 0) { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); - sheetBuilder.AppendRow(columnInfo.Select(s => s.Header)); + sheetBuilder.AppendHeaderRow(columnInfo.Select(s => s.Header )); document.AppendSheet(sheetBuilder); } @@ -61,16 +61,16 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { foreach (var dataObj in value as IEnumerable) { - PopulateRows(columns, dataObj, sheetBuilder, columnInfo); - CheckColumnsForResolveSheets(document, columnInfo); + PopulateRows(document,columns, dataObj, sheetBuilder, columnInfo); + //CheckColumnsForResolveSheets(document, columnInfo); var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); PopulateInnerObjectSheets(deepSheetsInfo, document, itemType); } } else if (!(value is IEnumerable)) { - PopulateRows(columns, value, sheetBuilder, columnInfo); - CheckColumnsForResolveSheets(document, columnInfo); + PopulateRows(document,columns, value, sheetBuilder, columnInfo); + //CheckColumnsForResolveSheets(document, columnInfo); var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); PopulateInnerObjectSheets(sheetsInfo, document, itemType); } @@ -80,16 +80,18 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document sheetBuilder.ShouldAutoFit = true; } - private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) + private void PopulateRows(IXlsxDocumentBuilder document, List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) { if (sheetBuilder == null) return; - var row = new List(); + var row = new List(); for (int i = 0; i <= columns.Count - 1; i++) { + ExcelCell cell = new ExcelCell(); + string columnName = columns[i]; object lookUpObject = value; if (columnName.Contains(":")) @@ -107,9 +109,27 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild ExcelColumnInfo info = null; if (columnInfo != null) + { info = columnInfo[i]; + #region Reference Row + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + { + DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); + columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) + columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; + + cell.DataValidationSheet = columntResolveTable.TableName; + + var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); + document.AppendSheet(referenceSheetBuilder); + } + #endregion Reference Row + } - row.Add(FormatCellValue(cellValue, info)); + cell.CellValue = FormatCellValue(cellValue, info); + + row.Add(cell); } sheetBuilder.AppendRow(row.ToList()); } @@ -128,7 +148,7 @@ private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelCo if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.OverrideResolveTableName) == false) columntResolveTable.TableName = cInfo.ExcelColumnAttribute.OverrideResolveTableName; - var referenceSheetBuilder = this.PopulateReferenceSheet(columntResolveTable); + var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); document.AppendSheet(referenceSheetBuilder); @@ -137,15 +157,17 @@ private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelCo } } - private SqadXlsxSheetBuilder PopulateReferenceSheet(DataTable ReferenceSheet) + private SqadXlsxSheetBuilder PopulateReferenceSheet(IXlsxDocumentBuilder document,DataTable ReferenceSheet) { List sheetResolveColumns = new List(); foreach (DataColumn c in ReferenceSheet.Columns) + { sheetResolveColumns.Add(c.Caption); + } SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName, true); - sb.AppendRow(sheetResolveColumns); + sb.AppendHeaderRow(sheetResolveColumns); sb.ShouldAutoFit = true; foreach (DataRow r in ReferenceSheet.Rows) @@ -166,14 +188,9 @@ private SqadXlsxSheetBuilder PopulateReferenceSheet(DataTable ReferenceSheet) } else resolveRow.Add(c.Caption, r[c].ToString()); - } - - //foreach (var col in sheetResolveColumns) - // resolveRow.Add(col, r[col].ToString()); - - this.PopulateRows(sheetResolveColumns, resolveRow, sb, null); + this.PopulateRows(document, sheetResolveColumns, resolveRow, sb, null); } return sb; diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index c7395f9..7871b78 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using WebApiContrib.Formatting.Xlsx.Serialisation; namespace WebApiContrib.Formatting.Xlsx { @@ -12,32 +13,44 @@ public class SqadXlsxSheetBuilder private string _sheetName { get; set; } public string SheetName => _sheetName; - private bool _isReferenceSheet { get; set; } + private bool _isReferenceSheet { get; set; } public bool IsReferenceSheet => _isReferenceSheet; public bool ShouldAutoFit { get; set; } private List> _valueByColumnNumber { get; set; } - public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet=false) + public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet = false) { _sheetName = SheetName; _isReferenceSheet = IsReferenceSheet; _valueByColumnNumber = new List>(); } + public void AppendHeaderRow(IEnumerable row) + { + Dictionary newRow = new Dictionary(); + + foreach (var colValue in row) + { + //new ExcelWorksheet().Cells[] + //_worksheet.Cells[_rowCount, ++i].Value = col; + newRow.Add(newRow.Count + 1, colValue); + } + + _valueByColumnNumber.Add(newRow); + } + /// /// Append a row to the XLSX worksheet. /// /// The row to append to this instance. - public void AppendRow(IEnumerable row) + public void AppendRow(IEnumerable row) { Dictionary newRow = new Dictionary(); foreach (var colValue in row) { - //new ExcelWorksheet().Cells[] - //_worksheet.Cells[_rowCount, ++i].Value = col; newRow.Add(newRow.Count + 1, colValue); } @@ -47,9 +60,9 @@ public void AppendRow(IEnumerable row) public void CompileSheet(ExcelPackage package) { if (_valueByColumnNumber.Count() == 0) - return ; + return; - ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(SheetName) ; + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(SheetName); int rowCount = 0; foreach (var row in _valueByColumnNumber) @@ -57,7 +70,14 @@ public void CompileSheet(ExcelPackage package) rowCount++; foreach (var col in row) { - worksheet.Cells[rowCount, col.Key].Value = col.Value; + if (col.Value is string) + { + worksheet.Cells[rowCount, col.Key].Value = col.Value; + } + else if(col.Value is ExcelCell) + { + aaa + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 6eb0ccc..3ba5f04 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -68,6 +68,7 @@ + From 1bb4cb80b48bbf0f4d4f2b7c81d083e31ee0c52f Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 28 Jul 2017 10:38:21 -0500 Subject: [PATCH 011/255] -update excel column attribute -rename and include cell index for name and value and row count of reference sheet rows count -filling up reference above -data validatin to referece sheet is now creating automatically in code --- .../Attributes/ExcelColumnAttribute.cs | 2 ++ .../Serialisation/ExcelCell.cs | 5 +++-- .../Serialisation/SqadXlsxSerialiser.cs | 19 +++++++++++++++++ .../SqadXlsxSheetBuilder.cs | 21 +++++++++++++++++-- .../WebApiContrib.Formatting.Xlsx.csproj | 4 ++++ 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs index b559dc7..38adc3b 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs @@ -63,5 +63,7 @@ public int Order public string ResolveFromTable { get; set; } public string OverrideResolveTableName { get; set; } + public string ResolveValue { get; set; } = "ID"; + public string ResolveName { get; set; } = "Name"; } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs index 7942d3b..56f49d1 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs @@ -11,7 +11,8 @@ public class ExcelCell public string CellHeader { get; set; } public object CellValue { get; set; } public string DataValidationSheet { get; set; } - public string DataValidationValue { get; set; } = "ID"; - public string DataValidationName { get; set; } = "Name"; + public int DataValidationValueCellIndex { get; set; } + public int DataValidationNameCellIndex { get; set; } + public int DataValidationRowsCount { get; set; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 6c603e6..2564347 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -122,6 +122,25 @@ private void PopulateRows(IXlsxDocumentBuilder document, List columns, o cell.DataValidationSheet = columntResolveTable.TableName; var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); + + cell.DataValidationRowsCount = referenceSheetBuilder.ValueByColumnNumber.Count(); + + var firstRow = referenceSheetBuilder.ValueByColumnNumber.FirstOrDefault(); + if (firstRow != null) + { + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) + { + if (firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveName.ToLower()).Any()) + cell.DataValidationNameCellIndex = firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveName.ToLower()).Select(s => s.Key).First(); + } + + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) + { + if (firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveValue.ToLower()).Any()) + cell.DataValidationValueCellIndex = firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveValue.ToLower()).Select(s => s.Key).First(); + } + } + document.AppendSheet(referenceSheetBuilder); } #endregion Reference Row diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 7871b78..0594360 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -19,6 +19,7 @@ public class SqadXlsxSheetBuilder public bool ShouldAutoFit { get; set; } private List> _valueByColumnNumber { get; set; } + public List> ValueByColumnNumber => _valueByColumnNumber; public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet = false) { @@ -74,9 +75,25 @@ public void CompileSheet(ExcelPackage package) { worksheet.Cells[rowCount, col.Key].Value = col.Value; } - else if(col.Value is ExcelCell) + else if (col.Value is ExcelCell) { - aaa + ExcelCell cell = col.Value as ExcelCell; + + worksheet.Cells[rowCount, col.Key].Value = cell.CellValue; + + if (!string.IsNullOrEmpty(cell.DataValidationSheet)) + { + var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, col.Key].Address); + dataValidation.ShowErrorMessage = true; + + string validationAddress = cell.DataValidationSheet; + if (validationAddress.Contains(" ")) + validationAddress = $"'{validationAddress}'!{worksheet.Cells[2,cell.DataValidationNameCellIndex,cell.DataValidationRowsCount, cell.DataValidationNameCellIndex]}"; + + dataValidation.Formula.ExcelFormula = validationAddress; + + } + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 3ba5f04..0e009c2 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -38,6 +38,10 @@ mt50.snk + + False + ..\..\..\MTMediaTools-5.5\MTDesktopComponents\DocumentFormat.OpenXml.dll + ..\..\..\MTMediaTools-5.5\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll From e689a177a1add8d8152214d30db2286418a1f01f Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Wed, 2 Aug 2017 11:18:11 -0500 Subject: [PATCH 012/255] modifications made to storing data and comping sheets --- .../Attributes/ExcelColumnAttribute.cs | 6 + .../Interfaces/IXlsxDocumentBuilder.cs | 3 + .../Serialisation/ExcelCell.cs | 1 + .../Serialisation/SqadXlsxSerialiser.cs | 90 +++++---- .../SqadXlsxDocumentBuilder.cs | 7 + .../SqadXlsxSheetBuilder.cs | 188 +++++++++++++----- .../XlsxDocumentBuilder.cs | 11 + .../XlsxMediaTypeFormatter.cs | 2 +- 8 files changed, 209 insertions(+), 99 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs index 38adc3b..f1f45b7 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs @@ -63,7 +63,13 @@ public int Order public string ResolveFromTable { get; set; } public string OverrideResolveTableName { get; set; } + /// + /// Default Value is ID + /// public string ResolveValue { get; set; } = "ID"; + /// + /// Default Value is Name + /// public string ResolveName { get; set; } = "Name"; } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs index bd5af98..d77ed18 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs @@ -1,6 +1,7 @@ using OfficeOpenXml; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -14,5 +15,7 @@ public interface IXlsxDocumentBuilder bool IsExcelSupportedType(object expression); void AppendSheet(SqadXlsxSheetBuilder sheet); + + SqadXlsxSheetBuilder GetReferenceSheet(); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs index 56f49d1..1650afa 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs @@ -13,6 +13,7 @@ public class ExcelCell public string DataValidationSheet { get; set; } public int DataValidationValueCellIndex { get; set; } public int DataValidationNameCellIndex { get; set; } + public int DataValidationBeginRow { get; set; } public int DataValidationRowsCount { get; set; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 2564347..12c2748 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -32,7 +32,6 @@ public bool CanSerialiseType(Type valueType, Type itemType) return true; } - public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName = null)//, SqadXlsxSheetBuilder sheetBuilder) { var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value, sheetName); @@ -48,7 +47,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document if (columnInfo.Count() > 0) { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); - sheetBuilder.AppendHeaderRow(columnInfo.Select(s => s.Header )); + sheetBuilder.AppendHeaderRow(columnInfo.Select(s => s.Header)); document.AppendSheet(sheetBuilder); } @@ -61,7 +60,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { foreach (var dataObj in value as IEnumerable) { - PopulateRows(document,columns, dataObj, sheetBuilder, columnInfo); + PopulateRows(columns, dataObj, sheetBuilder, columnInfo, document); //CheckColumnsForResolveSheets(document, columnInfo); var deepSheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, dataObj); PopulateInnerObjectSheets(deepSheetsInfo, document, itemType); @@ -69,7 +68,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document } else if (!(value is IEnumerable)) { - PopulateRows(document,columns, value, sheetBuilder, columnInfo); + PopulateRows(columns, value, sheetBuilder, columnInfo, document); //CheckColumnsForResolveSheets(document, columnInfo); var sheetsInfo = _sheetResolver.GetExcelSheetInfo(itemType, value); PopulateInnerObjectSheets(sheetsInfo, document, itemType); @@ -80,7 +79,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document sheetBuilder.ShouldAutoFit = true; } - private void PopulateRows(IXlsxDocumentBuilder document, List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo) + private void PopulateRows(List columns, object value, SqadXlsxSheetBuilder sheetBuilder, ExcelColumnInfoCollection columnInfo = null, IXlsxDocumentBuilder document = null) { if (sheetBuilder == null) @@ -116,32 +115,35 @@ private void PopulateRows(IXlsxDocumentBuilder document, List columns, o { DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; cell.DataValidationSheet = columntResolveTable.TableName; - var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); - - cell.DataValidationRowsCount = referenceSheetBuilder.ValueByColumnNumber.Count(); + var referenceSheet = document.GetReferenceSheet(); - var firstRow = referenceSheetBuilder.ValueByColumnNumber.FirstOrDefault(); - if (firstRow != null) + if (referenceSheet == null) + { + referenceSheet = new SqadXlsxSheetBuilder(cell.DataValidationSheet, true); + document.AppendSheet(referenceSheet); + } + else { - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) - { - if (firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveName.ToLower()).Any()) - cell.DataValidationNameCellIndex = firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveName.ToLower()).Select(s => s.Key).First(); - } - - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) - { - if (firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveValue.ToLower()).Any()) - cell.DataValidationValueCellIndex = firstRow.Where(w => w.Value.ToString().ToLower() == info.ExcelColumnAttribute.ResolveValue.ToLower()).Select(s => s.Key).First(); - } + referenceSheet.AddAndActivateNewTable(cell.DataValidationSheet); } - document.AppendSheet(referenceSheetBuilder); + cell.DataValidationBeginRow = referenceSheet.GetNextAvailalbleRow(); + + this.PopulateReferenceSheet(referenceSheet, columntResolveTable); + + cell.DataValidationRowsCount = referenceSheet.GetCurrentRowCount; + + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) + cell.DataValidationNameCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveName); + + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) + cell.DataValidationValueCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveValue); + } #endregion Reference Row } @@ -153,30 +155,30 @@ private void PopulateRows(IXlsxDocumentBuilder document, List columns, o sheetBuilder.AppendRow(row.ToList()); } - private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelColumnInfoCollection columnInfo) - { - if (columnInfo == null) - return; + //private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelColumnInfoCollection columnInfo) + //{ + // if (columnInfo == null) + // return; - foreach (var cInfo in columnInfo) - { - if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) - { - DataTable columntResolveTable = _staticValuesResolver(cInfo.ExcelColumnAttribute.ResolveFromTable); - columntResolveTable.TableName = cInfo.ExcelColumnAttribute.ResolveFromTable; - if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.OverrideResolveTableName) == false) - columntResolveTable.TableName = cInfo.ExcelColumnAttribute.OverrideResolveTableName; + // foreach (var cInfo in columnInfo) + // { + // if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + // { + // DataTable columntResolveTable = _staticValuesResolver(cInfo.ExcelColumnAttribute.ResolveFromTable); + // columntResolveTable.TableName = cInfo.ExcelColumnAttribute.ResolveFromTable; + // if (string.IsNullOrEmpty(cInfo.ExcelColumnAttribute.OverrideResolveTableName) == false) + // columntResolveTable.TableName = cInfo.ExcelColumnAttribute.OverrideResolveTableName; - var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); + // var referenceSheetBuilder = this.PopulateReferenceSheet(document,columntResolveTable); - document.AppendSheet(referenceSheetBuilder); + // document.AppendSheet(referenceSheetBuilder); - columntResolveTable = null; - } - } - } + // columntResolveTable = null; + // } + // } + //} - private SqadXlsxSheetBuilder PopulateReferenceSheet(IXlsxDocumentBuilder document,DataTable ReferenceSheet) + private void PopulateReferenceSheet(SqadXlsxSheetBuilder referenceSheet, DataTable ReferenceSheet) { List sheetResolveColumns = new List(); @@ -209,10 +211,10 @@ private SqadXlsxSheetBuilder PopulateReferenceSheet(IXlsxDocumentBuilder documen resolveRow.Add(c.Caption, r[c].ToString()); } - this.PopulateRows(document, sheetResolveColumns, resolveRow, sb, null); + this.PopulateRows(sheetResolveColumns, resolveRow, sb); } - return sb; + //return sb; } private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXlsxDocumentBuilder document, Type itemType) diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index aa80e82..25b05c4 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -37,6 +37,11 @@ public void AppendSheet(SqadXlsxSheetBuilder sheet) _sheets.Add(sheet); } + public SqadXlsxSheetBuilder GetReferenceSheet() + { + return _sheets.Where(w=>w.IsReferenceSheet).FirstOrDefault(); + } + public Task WriteToStream() { ExcelPackage package = Compile(); @@ -60,5 +65,7 @@ public bool IsExcelSupportedType(object expression) { return FormatterUtils.IsExcelSupportedType(expression); } + + } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 0594360..9695133 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -1,6 +1,7 @@ using OfficeOpenXml; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,106 +11,185 @@ namespace WebApiContrib.Formatting.Xlsx { public class SqadXlsxSheetBuilder { - private string _sheetName { get; set; } - public string SheetName => _sheetName; + private readonly int __ROWS_BETWEEN_REFERENCE_SHEETS__ = 2; + private DataTable _currentTable { get; set; } + + public string CurrentTableName => _currentTable.TableName; private bool _isReferenceSheet { get; set; } public bool IsReferenceSheet => _isReferenceSheet; public bool ShouldAutoFit { get; set; } - private List> _valueByColumnNumber { get; set; } - public List> ValueByColumnNumber => _valueByColumnNumber; + private List _sheetTables { get; set; } + + public SqadXlsxSheetBuilder(string sheetName, bool isReferenceSheet = false) + { + _isReferenceSheet = isReferenceSheet; + _sheetTables = new List(); + + _currentTable = new DataTable(sheetName); + _sheetTables.Add(_currentTable); + } - public SqadXlsxSheetBuilder(string SheetName, bool IsReferenceSheet = false) + public void AddAndActivateNewTable(string sheetName) { - _sheetName = SheetName; - _isReferenceSheet = IsReferenceSheet; - _valueByColumnNumber = new List>(); + _currentTable = new DataTable(sheetName); + _sheetTables.Add(_currentTable); } public void AppendHeaderRow(IEnumerable row) { - Dictionary newRow = new Dictionary(); + _currentTable.Columns.AddRange(row.Select(s => new DataColumn(s)).ToArray()); + } - foreach (var colValue in row) + public void AppendRow(IEnumerable row) + { + var dRow = _currentTable.NewRow(); + int index = 0; + foreach (var cell in row) { - //new ExcelWorksheet().Cells[] - //_worksheet.Cells[_rowCount, ++i].Value = col; - newRow.Add(newRow.Count + 1, colValue); + if (cell.CellValue is string) + _currentTable.Columns[index].DataType = typeof(string); + else if (cell.CellValue is int) + _currentTable.Columns[index].DataType = typeof(int); + else if (cell.CellValue is decimal) + _currentTable.Columns[index].DataType = typeof(decimal); + else if (cell.CellValue is double) + _currentTable.Columns[index].DataType = typeof(double); + else if (cell.CellValue is DateTime) + _currentTable.Columns[index].DataType = typeof(DateTime); + + + dRow.SetField(index++, cell.CellValue); } + _currentTable.Rows.Add(dRow); + } - _valueByColumnNumber.Add(newRow); + public int GetNextAvailalbleRow() + { + //to get next available row, we get total of all rows plus number of all reference sheets + //multiply by two (rows between the sheets) + int totalRows = _sheetTables.Select(s => s.Rows.Count).Sum(); + if (totalRows == 0) + return 0; // completely new reference sheet no need to shift from top + else + return totalRows + (_sheetTables.Count() * __ROWS_BETWEEN_REFERENCE_SHEETS__);//already rows there, need to make space for next reference table } - /// - /// Append a row to the XLSX worksheet. - /// - /// The row to append to this instance. - public void AppendRow(IEnumerable row) + public int GetCurrentRowCount => _currentTable.Rows.Count; + + public int GetColumnIndexByColumnName(string columnName) { - Dictionary newRow = new Dictionary(); + int index = 0; - foreach (var colValue in row) - { - newRow.Add(newRow.Count + 1, colValue); - } + var column = _currentTable.Columns[columnName]; + if (column != null) + index = column.Ordinal + 1; - _valueByColumnNumber.Add(newRow); + return index; } public void CompileSheet(ExcelPackage package) { - if (_valueByColumnNumber.Count() == 0) + if (_sheetTables.Count() == 0) return; - ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(SheetName); + List sheetCodeColumnStatements = new List(); + ExcelWorksheet worksheet = null; + + if (_isReferenceSheet == true) + worksheet = package.Workbook.Worksheets.Add("Reference"); + else + worksheet = package.Workbook.Worksheets.Add(_currentTable.TableName); - int rowCount = 0; - foreach (var row in _valueByColumnNumber) + int rowCount = 1; + foreach (var table in _sheetTables) { - rowCount++; - foreach (var col in row) + if (_isReferenceSheet == true) { - if (col.Value is string) - { - worksheet.Cells[rowCount, col.Key].Value = col.Value; - } - else if (col.Value is ExcelCell) - { - ExcelCell cell = col.Value as ExcelCell; + var mergeTitleCell = worksheet.Cells[rowCount, 1, rowCount, 3]; + mergeTitleCell.Value = table.TableName; + mergeTitleCell.Merge = true; + } - worksheet.Cells[rowCount, col.Key].Value = cell.CellValue; + foreach (DataColumn col in table.Columns) + worksheet.Cells[rowCount, col.Ordinal+1].Value = col.ColumnName; - if (!string.IsNullOrEmpty(cell.DataValidationSheet)) + foreach (DataRow row in table.Rows) + { + rowCount++; + foreach (DataColumn col in table.Columns) + { + var colObject = row[col]; + int excelColumnIndex = col.Ordinal + 1; //adjustment for excel column count index (start from 1. nondevelopment count, duh!) + if (colObject is string) + { + worksheet.Cells[rowCount, excelColumnIndex].Value = colObject; + } + else if (colObject is ExcelCell) { - var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, col.Key].Address); - dataValidation.ShowErrorMessage = true; + ExcelCell cell = colObject as ExcelCell; - string validationAddress = cell.DataValidationSheet; - if (validationAddress.Contains(" ")) - validationAddress = $"'{validationAddress}'!{worksheet.Cells[2,cell.DataValidationNameCellIndex,cell.DataValidationRowsCount, cell.DataValidationNameCellIndex]}"; + worksheet.Cells[rowCount, excelColumnIndex].Value = cell.CellValue; - dataValidation.Formula.ExcelFormula = validationAddress; + if (!string.IsNullOrEmpty(cell.DataValidationSheet)) + { + var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, excelColumnIndex].Address); + dataValidation.ShowErrorMessage = true; - } + string validationAddress = cell.DataValidationSheet; + if (validationAddress.Contains(" ")) + validationAddress = $"'{validationAddress}'!{worksheet.Cells[2, cell.DataValidationNameCellIndex, cell.DataValidationRowsCount, cell.DataValidationNameCellIndex]}"; + + dataValidation.Formula.ExcelFormula = validationAddress; + string code = string.Empty; + code += $"If Target.Column = {excelColumnIndex} Then \n"; + code += $" matchVal = Application.Match(Target.Value, Worksheets(\"{cell.DataValidationSheet}\").Range(\"{worksheet.Cells[2, cell.DataValidationNameCellIndex, cell.DataValidationRowsCount, cell.DataValidationNameCellIndex].Address}\"), 0) \n"; + code += $" selectedNum = Application.Index(Worksheets(\"{cell.DataValidationSheet}\").Range(\"{worksheet.Cells[2, cell.DataValidationValueCellIndex, cell.DataValidationRowsCount, cell.DataValidationValueCellIndex].Address}\"), matchVal, 1) \n"; + code += " If Not IsError(selectedNum) Then \n"; + code += " Target.Value = selectedNum \n"; + code += " End If \n"; + code += "End If \n"; + + sheetCodeColumnStatements.Add(code); + } + + } } } + } + + + + if (worksheet.Dimension != null && ShouldAutoFit) worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); - } + #region sheet code to resolve reference column + if (sheetCodeColumnStatements.Count() > 0) + { + string worksheetOnChangeCode = string.Empty; + worksheetOnChangeCode += "Private Sub Worksheet_Change(ByVal Target As Range) \n"; + worksheetOnChangeCode += " If Target.Value = Empty Then \n"; + worksheetOnChangeCode += " Exit Sub \n"; + worksheetOnChangeCode += " End If \n"; - //public void FormatColumn(int column, string format, bool skipHeaderRow = true) - //{ - // var firstRow = skipHeaderRow ? 2 : 1; + foreach (var codePiece in sheetCodeColumnStatements) + { + worksheetOnChangeCode += codePiece; + } - // if (firstRow <= _rowCount) - // _worksheet.Cells[firstRow, column, _rowCount, column].Style.Numberformat.Format = format; - //} + worksheetOnChangeCode += "End Sub"; + worksheet.Workbook.CreateVBAProject(); + worksheet.CodeModule.Code = worksheetOnChangeCode; + } + #endregion sheet code to resolve reference column + + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index 6020cb5..7ea480e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using WebApiContrib.Formatting.Xlsx.Interfaces; using WebApiContrib.Formatting.Xlsx.Serialisation; +using System.Data; namespace WebApiContrib.Formatting.Xlsx { @@ -68,6 +69,16 @@ public bool IsExcelSupportedType(object expression) return FormatterUtils.IsExcelSupportedType(expression); } + public SqadXlsxSheetBuilder GetReferenceSheet() + { + throw new NotImplementedException(); + } + + public void AppendSheet(DataTable sheet) + { + throw new NotImplementedException(); + } + public void AppendSheet(SqadXlsxSheetBuilder sheet) { throw new NotImplementedException(); diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index edaf66b..15b3028 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -140,7 +140,7 @@ public override void SetDefaultContentHeaders(Type type, } // Add XLSX extension if not present. - if (!fileName.EndsWith("xlsx", StringComparison.CurrentCultureIgnoreCase)) fileName += ".xlsx"; + if (!fileName.EndsWith("xlsm", StringComparison.CurrentCultureIgnoreCase)) fileName += ".xlsm"; // Set content disposition to use this file name. headers.ContentDisposition = new ContentDispositionHeaderValue("inline") From 1c9a9ed36f1b78e8784ea335e5f0fbc8abf435fd Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 3 Aug 2017 07:36:56 -0500 Subject: [PATCH 013/255] updates to table --- .../Serialisation/DefaultColumnResolver.cs | 34 +++++++++---- .../Serialisation/ExcelColumnInfo.cs | 8 ++-- .../Serialisation/SqadXlsxSerialiser.cs | 25 +++++----- .../SqadXlsxSheetBuilder.cs | 48 ++++++++++++------- .../WebApiContrib.Formatting.Xlsx.csproj | 1 + 5 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 1b1c8e8..18370e8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -35,31 +35,40 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec if (prop == null) continue; + Type propertyType = prop.PropertyType; + if (propertyType.IsGenericType && + propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + propertyType = propertyType.GetGenericArguments()[0]; + } ExcelColumnAttribute attribute = FormatterUtils.GetAttribute(prop); if (attribute != null) { - if (prop.PropertyType.Name.StartsWith("List")) + if (propertyType.Name.StartsWith("List")) { - Type typeOfList = FormatterUtils.GetEnumerableItemType(prop.PropertyType); + Type typeOfList = FormatterUtils.GetEnumerableItemType(propertyType); if (FormatterUtils.IsSimpleType(typeOfList)) - fieldInfo.Add(new ExcelColumnInfo(prop.Name, attribute,null)); + fieldInfo.Add(new ExcelColumnInfo(prop.Name, propertyType, attribute, null)); } - if (!FormatterUtils.IsSimpleType(prop.PropertyType)) + else if (!FormatterUtils.IsSimpleType(propertyType)) { //getting a complex class columns populates as ComplexName:InnerProperty - string prefix = string.IsNullOrEmpty(namePrefix)==false ? $"{namePrefix}:{prop.Name}" : prop.Name; + string prefix = string.IsNullOrEmpty(namePrefix) == false ? $"{namePrefix}:{prop.Name}" : prop.Name; - ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(prop.PropertyType, null, prefix, true); + ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(propertyType, null, prefix, true); foreach (var subcolumn in columnCollection) fieldInfo.Add(subcolumn); } else { - string propertyName = isComplexColumn ? $"{namePrefix}:{field}" : field; - fieldInfo.Add(new ExcelColumnInfo(propertyName, attribute, null)); + string propertyName = isComplexColumn ? $"{namePrefix}:{field}" : field; + if (FormatterUtils.IsExcelSupportedType(propertyType)) + fieldInfo.Add(new ExcelColumnInfo(propertyName, propertyType, attribute, null)); + else + fieldInfo.Add(new ExcelColumnInfo(propertyName, typeof(string), attribute, null)); } } } @@ -116,6 +125,15 @@ protected virtual void PopulateFieldInfoFromMetadata(ExcelColumnInfoCollection f if (!fieldInfo.Contains(propertyName)) continue; var field = fieldInfo[propertyName]; + + field.PropertyType = modelProp.ModelType; + if (field.PropertyType.IsGenericType && + field.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + field.PropertyType = field.PropertyType.GetGenericArguments()[0]; + } + + var attribute = field.ExcelColumnAttribute; if (!field.IsExcelHeaderDefined) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs index 0c149c7..43a7f79 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs @@ -1,4 +1,5 @@ -using WebApiContrib.Formatting.Xlsx.Attributes; +using System; +using WebApiContrib.Formatting.Xlsx.Attributes; namespace WebApiContrib.Formatting.Xlsx.Serialisation { @@ -11,7 +12,7 @@ public class ExcelColumnInfo public ExcelColumnAttribute ExcelColumnAttribute { get; set; } public string FormatString { get; set; } public string Header { get; set; } - + public Type PropertyType { get; set; } public string ExcelNumberFormat @@ -24,12 +25,13 @@ public bool IsExcelHeaderDefined get { return ExcelColumnAttribute != null && ExcelColumnAttribute.Header != null; } } - public ExcelColumnInfo(string propertyName, ExcelColumnAttribute excelAttribute = null, string formatString = null) + public ExcelColumnInfo(string propertyName, Type propType, ExcelColumnAttribute excelAttribute = null, string formatString = null) { PropertyName = propertyName; ExcelColumnAttribute = excelAttribute; FormatString = formatString; Header = IsExcelHeaderDefined ? ExcelColumnAttribute.Header : propertyName; + PropertyType = propType; } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 12c2748..22862d6 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -47,7 +47,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document if (columnInfo.Count() > 0) { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); - sheetBuilder.AppendHeaderRow(columnInfo.Select(s => s.Header)); + sheetBuilder.AppendHeaderRow(columnInfo); document.AppendSheet(sheetBuilder); } @@ -92,6 +92,9 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild ExcelCell cell = new ExcelCell(); string columnName = columns[i]; + + cell.CellHeader = columnName; + object lookUpObject = value; if (columnName.Contains(":")) { @@ -148,6 +151,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild #endregion Reference Row } + cell.CellValue = FormatCellValue(cellValue, info); row.Add(cell); @@ -180,25 +184,17 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild private void PopulateReferenceSheet(SqadXlsxSheetBuilder referenceSheet, DataTable ReferenceSheet) { - List sheetResolveColumns = new List(); + //SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName, true); + referenceSheet.AppendHeaderRow(ReferenceSheet.Columns); + referenceSheet.ShouldAutoFit = true; - foreach (DataColumn c in ReferenceSheet.Columns) - { - sheetResolveColumns.Add(c.Caption); - } - - SqadXlsxSheetBuilder sb = new SqadXlsxSheetBuilder(ReferenceSheet.TableName, true); - sb.AppendHeaderRow(sheetResolveColumns); - sb.ShouldAutoFit = true; foreach (DataRow r in ReferenceSheet.Rows) { Dictionary resolveRow = new Dictionary(); - foreach (DataColumn c in ReferenceSheet.Columns) { - if (c.DataType == typeof(int)) { resolveRow.Add(c.Caption, Convert.ToInt32(r[c])); @@ -211,7 +207,7 @@ private void PopulateReferenceSheet(SqadXlsxSheetBuilder referenceSheet, DataTab resolveRow.Add(c.Caption, r[c].ToString()); } - this.PopulateRows(sheetResolveColumns, resolveRow, sb); + this.PopulateRows(resolveRow.Keys.ToList(), resolveRow, referenceSheet); } //return sb; @@ -250,7 +246,8 @@ protected virtual object GetFieldOrPropertyValue(object rowObject, string name) return rowValue; else if ((rowValue is IEnumerable)) - return string.Join(",", rowValue as IEnumerable); + return rowValue; + // return string.Join(",", rowValue as IEnumerable); return rowValue == null || DBNull.Value.Equals(rowValue) ? string.Empty diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 9695133..bfdc9d2 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -38,30 +38,37 @@ public void AddAndActivateNewTable(string sheetName) _sheetTables.Add(_currentTable); } - public void AppendHeaderRow(IEnumerable row) + public void AppendHeaderRow(ExcelColumnInfoCollection columns) { - _currentTable.Columns.AddRange(row.Select(s => new DataColumn(s)).ToArray()); + _currentTable.Columns.AddRange(columns.Select(s => new DataColumn(s.PropertyName, s.PropertyType)).ToArray()); + } + + public void AppendHeaderRow(DataColumnCollection columns) + { + foreach (DataColumn c in columns) + { + _currentTable.Columns.Add(c.ColumnName); + } } public void AppendRow(IEnumerable row) { var dRow = _currentTable.NewRow(); - int index = 0; foreach (var cell in row) { - if (cell.CellValue is string) - _currentTable.Columns[index].DataType = typeof(string); - else if (cell.CellValue is int) - _currentTable.Columns[index].DataType = typeof(int); - else if (cell.CellValue is decimal) - _currentTable.Columns[index].DataType = typeof(decimal); - else if (cell.CellValue is double) - _currentTable.Columns[index].DataType = typeof(double); - else if (cell.CellValue is DateTime) - _currentTable.Columns[index].DataType = typeof(DateTime); - - - dRow.SetField(index++, cell.CellValue); + //if (cell.CellValue is string) + // _currentTable.Columns[index].DataType = typeof(string); + //else if (cell.CellValue is int) + // _currentTable.Columns[index].DataType = typeof(int); + //else if (cell.CellValue is decimal) + // _currentTable.Columns[index].DataType = typeof(decimal); + //else if (cell.CellValue is double) + // _currentTable.Columns[index].DataType = typeof(double); + //else if (cell.CellValue is DateTime) + // _currentTable.Columns[index].DataType = typeof(DateTime); + + if (string.IsNullOrEmpty(cell.CellValue.ToString()) == false) + dRow.SetField(cell.CellHeader, cell.CellValue); } _currentTable.Rows.Add(dRow); } @@ -111,10 +118,13 @@ public void CompileSheet(ExcelPackage package) var mergeTitleCell = worksheet.Cells[rowCount, 1, rowCount, 3]; mergeTitleCell.Value = table.TableName; mergeTitleCell.Merge = true; + mergeTitleCell.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; + mergeTitleCell.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGreen); + rowCount++; } foreach (DataColumn col in table.Columns) - worksheet.Cells[rowCount, col.Ordinal+1].Value = col.ColumnName; + worksheet.Cells[rowCount, col.Ordinal + 1].Value = col.ColumnName; foreach (DataRow row in table.Rows) { @@ -123,7 +133,7 @@ public void CompileSheet(ExcelPackage package) { var colObject = row[col]; int excelColumnIndex = col.Ordinal + 1; //adjustment for excel column count index (start from 1. nondevelopment count, duh!) - if (colObject is string) + if (!(colObject is ExcelCell)) { worksheet.Cells[rowCount, excelColumnIndex].Value = colObject; } @@ -160,6 +170,8 @@ public void CompileSheet(ExcelPackage package) } } + rowCount += __ROWS_BETWEEN_REFERENCE_SHEETS__; + } diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 0e009c2..659c8c8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -51,6 +51,7 @@ + ..\..\..\MTMediaTools-5.5\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll From faffbd1265cfec50d74ed421f793ef0d1a1eea8b Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 4 Aug 2017 08:07:15 -0500 Subject: [PATCH 014/255] fixes to extention change, added fix to proper excel type, --- .../SqadXlsxDocumentBuilder.cs | 18 ++----- .../SqadXlsxSheetBuilder.cs | 49 +++++++++---------- .../XlsxMediaTypeFormatter.cs | 8 ++- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index 25b05c4..fe3cd86 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -19,15 +19,9 @@ public class SqadXlsxDocumentBuilder : IXlsxDocumentBuilder //New Stuff private List _sheets { get; set; } - - public SqadXlsxDocumentBuilder(Stream stream) { _stream = stream; - - // Create a worksheet - //Package = new ExcelPackage(); - _sheets = new List(); } @@ -37,22 +31,20 @@ public void AppendSheet(SqadXlsxSheetBuilder sheet) _sheets.Add(sheet); } - public SqadXlsxSheetBuilder GetReferenceSheet() - { - return _sheets.Where(w=>w.IsReferenceSheet).FirstOrDefault(); - } + public SqadXlsxSheetBuilder GetReferenceSheet() => _sheets.Where(w=>w.IsReferenceSheet).FirstOrDefault(); + + public bool IsVBA => _sheets.Any(a => a.IsReferenceSheet); public Task WriteToStream() { ExcelPackage package = Compile(); - return Task.Factory.StartNew(() => package.SaveAs(_stream)); } private ExcelPackage Compile() { ExcelPackage package = new ExcelPackage(); - + foreach (var sheet in _sheets.OrderBy(o=>o.IsReferenceSheet)) { sheet.CompileSheet(package); @@ -65,7 +57,5 @@ public bool IsExcelSupportedType(object expression) { return FormatterUtils.IsExcelSupportedType(expression); } - - } } diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index bfdc9d2..1d65b72 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -40,35 +40,24 @@ public void AddAndActivateNewTable(string sheetName) public void AppendHeaderRow(ExcelColumnInfoCollection columns) { - _currentTable.Columns.AddRange(columns.Select(s => new DataColumn(s.PropertyName, s.PropertyType)).ToArray()); + _currentTable.Columns.AddRange(columns.Select(s => new DataColumn(s.PropertyName, typeof(ExcelCell))).ToArray()); } public void AppendHeaderRow(DataColumnCollection columns) { foreach (DataColumn c in columns) { - _currentTable.Columns.Add(c.ColumnName); + _currentTable.Columns.Add(c.ColumnName, typeof(ExcelCell)); } } public void AppendRow(IEnumerable row) { - var dRow = _currentTable.NewRow(); + DataRow dRow = _currentTable.NewRow(); foreach (var cell in row) { - //if (cell.CellValue is string) - // _currentTable.Columns[index].DataType = typeof(string); - //else if (cell.CellValue is int) - // _currentTable.Columns[index].DataType = typeof(int); - //else if (cell.CellValue is decimal) - // _currentTable.Columns[index].DataType = typeof(decimal); - //else if (cell.CellValue is double) - // _currentTable.Columns[index].DataType = typeof(double); - //else if (cell.CellValue is DateTime) - // _currentTable.Columns[index].DataType = typeof(DateTime); - - if (string.IsNullOrEmpty(cell.CellValue.ToString()) == false) - dRow.SetField(cell.CellHeader, cell.CellValue); + //if (string.IsNullOrEmpty(cell.CellValue.ToString()) == false) + dRow.SetField(cell.CellHeader, cell); } _currentTable.Rows.Add(dRow); } @@ -79,9 +68,10 @@ public int GetNextAvailalbleRow() //multiply by two (rows between the sheets) int totalRows = _sheetTables.Select(s => s.Rows.Count).Sum(); if (totalRows == 0) - return 0; // completely new reference sheet no need to shift from top + return 1 + __ROWS_BETWEEN_REFERENCE_SHEETS__; // completely new reference sheet no need to shift from top else - return totalRows + (_sheetTables.Count() * __ROWS_BETWEEN_REFERENCE_SHEETS__);//already rows there, need to make space for next reference table + //total rows plus number or tables adjustment for emptry row increast everytime plus number of sheets multiply rows between sheets + return totalRows + _sheetTables.Count() + (_sheetTables.Count() * __ROWS_BETWEEN_REFERENCE_SHEETS__);//already rows there, need to make space for next reference table } public int GetCurrentRowCount => _currentTable.Rows.Count; @@ -106,7 +96,10 @@ public void CompileSheet(ExcelPackage package) ExcelWorksheet worksheet = null; if (_isReferenceSheet == true) + { worksheet = package.Workbook.Worksheets.Add("Reference"); + worksheet.Hidden = eWorkSheetHidden.VeryHidden; + } else worksheet = package.Workbook.Worksheets.Add(_currentTable.TableName); @@ -148,16 +141,13 @@ public void CompileSheet(ExcelPackage package) var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, excelColumnIndex].Address); dataValidation.ShowErrorMessage = true; - string validationAddress = cell.DataValidationSheet; - if (validationAddress.Contains(" ")) - validationAddress = $"'{validationAddress}'!{worksheet.Cells[2, cell.DataValidationNameCellIndex, cell.DataValidationRowsCount, cell.DataValidationNameCellIndex]}"; - + string validationAddress = $"'Reference'!{worksheet.Cells[cell.DataValidationBeginRow, cell.DataValidationNameCellIndex, (cell.DataValidationBeginRow + cell.DataValidationRowsCount) - 1, cell.DataValidationNameCellIndex]}"; dataValidation.Formula.ExcelFormula = validationAddress; string code = string.Empty; code += $"If Target.Column = {excelColumnIndex} Then \n"; - code += $" matchVal = Application.Match(Target.Value, Worksheets(\"{cell.DataValidationSheet}\").Range(\"{worksheet.Cells[2, cell.DataValidationNameCellIndex, cell.DataValidationRowsCount, cell.DataValidationNameCellIndex].Address}\"), 0) \n"; - code += $" selectedNum = Application.Index(Worksheets(\"{cell.DataValidationSheet}\").Range(\"{worksheet.Cells[2, cell.DataValidationValueCellIndex, cell.DataValidationRowsCount, cell.DataValidationValueCellIndex].Address}\"), matchVal, 1) \n"; + code += $" matchVal = Application.Match(Target.Value, Worksheets(\"Reference\").Range(\"{worksheet.Cells[cell.DataValidationBeginRow, cell.DataValidationNameCellIndex, (cell.DataValidationBeginRow + cell.DataValidationRowsCount) - 1, cell.DataValidationNameCellIndex].Address}\"), 0) \n"; + code += $" selectedNum = Application.Index(Worksheets(\"Reference\").Range(\"{worksheet.Cells[cell.DataValidationBeginRow, cell.DataValidationValueCellIndex, (cell.DataValidationBeginRow + cell.DataValidationRowsCount) - 1, cell.DataValidationValueCellIndex].Address}\"), matchVal, 1) \n"; code += " If Not IsError(selectedNum) Then \n"; code += " Target.Value = selectedNum \n"; code += " End If \n"; @@ -165,7 +155,13 @@ public void CompileSheet(ExcelPackage package) sheetCodeColumnStatements.Add(code); } - + else if (bool.TryParse(cell.CellValue.ToString(), out var result)) + { + var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, excelColumnIndex].Address); + dataValidation.ShowErrorMessage = true; + dataValidation.Formula.Values.Add("True"); + dataValidation.Formula.Values.Add("False"); + } } } } @@ -197,7 +193,8 @@ public void CompileSheet(ExcelPackage package) worksheetOnChangeCode += "End Sub"; - worksheet.Workbook.CreateVBAProject(); + if (worksheet.Workbook.VbaProject == null) + worksheet.Workbook.CreateVBAProject(); worksheet.CodeModule.Code = worksheetOnChangeCode; } #endregion sheet code to resolve reference column diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index 15b3028..6059910 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -159,7 +159,8 @@ public override Task WriteToStreamAsync(Type type, // Create a document builder. var document = new SqadXlsxDocumentBuilder(writeStream); - if (value == null) return document.WriteToStream(); + if (value == null) + return document.WriteToStream(); var valueType = value.GetType(); @@ -192,6 +193,11 @@ public override Task WriteToStreamAsync(Type type, serialiser.Serialise(itemType, value, document, null); + if (!document.IsVBA) + { + content.Headers.ContentDisposition.FileName = content.Headers.ContentDisposition.FileName.Replace("xlsm", "xlsx"); + } + return document.WriteToStream(); } From 765f7647110dc4d9c515ef38aef4fe64bf9e7bcb Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 4 Aug 2017 13:26:25 -0500 Subject: [PATCH 015/255] fix parsing DBNULL to int exception --- .../Serialisation/SqadXlsxSerialiser.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 22862d6..76936d8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -197,7 +197,9 @@ private void PopulateReferenceSheet(SqadXlsxSheetBuilder referenceSheet, DataTab { if (c.DataType == typeof(int)) { - resolveRow.Add(c.Caption, Convert.ToInt32(r[c])); + int i = 0; + if (int.TryParse(r[c].ToString(), out i)) + resolveRow.Add(c.Caption, Convert.ToInt32(i)); } else if (c.DataType == typeof(DateTime)) { From 47386ed68750ab58783474ca25786b32bdddd6c2 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Fri, 4 Aug 2017 14:55:02 -0500 Subject: [PATCH 016/255] fix for doublicate columns on the same sheet --- .../Serialisation/DefaultColumnResolver.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 18370e8..52e5846 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -51,6 +51,13 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec if (FormatterUtils.IsSimpleType(typeOfList)) fieldInfo.Add(new ExcelColumnInfo(prop.Name, propertyType, attribute, null)); + else + { + string prefix = string.IsNullOrEmpty(namePrefix) == false ? $"{namePrefix}:{prop.Name}" : prop.Name; + ExcelColumnInfoCollection columnCollection = GetExcelColumnInfo(typeOfList, null, prefix, true); + foreach (var subcolumn in columnCollection) + fieldInfo.Add(subcolumn); + } } else if (!FormatterUtils.IsSimpleType(propertyType)) { @@ -65,10 +72,15 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec else { string propertyName = isComplexColumn ? $"{namePrefix}:{field}" : field; - if (FormatterUtils.IsExcelSupportedType(propertyType)) - fieldInfo.Add(new ExcelColumnInfo(propertyName, propertyType, attribute, null)); - else - fieldInfo.Add(new ExcelColumnInfo(propertyName, typeof(string), attribute, null)); + + bool columnAlreadyadded = fieldInfo.Any(a => a.PropertyName == propertyName); + if (!columnAlreadyadded) + { + if (FormatterUtils.IsExcelSupportedType(propertyType)) + fieldInfo.Add(new ExcelColumnInfo(propertyName, propertyType, attribute, null)); + else + fieldInfo.Add(new ExcelColumnInfo(propertyName, typeof(string), attribute, null)); + } } } } From f4e2777005a86028b54a77dfab38d3067ab07d4c Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Mon, 7 Aug 2017 08:40:02 -0500 Subject: [PATCH 017/255] fixes and changes --- .../Interfaces/IXlsxDocumentBuilder.cs | 2 + .../Interfaces/IXlsxSerialiser.cs | 1 + .../Serialisation/DefaultXlsxSerialiser.cs | 5 + .../Serialisation/ExpandoSerialiser.cs | 5 + .../Serialisation/SqadXlsxSerialiser.cs | 96 ++++++++++++------- .../SqadXlsxDocumentBuilder.cs | 2 + .../SqadXlsxSheetBuilder.cs | 2 + .../XlsxDocumentBuilder.cs | 5 + 8 files changed, 81 insertions(+), 37 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs index d77ed18..be59dd8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs @@ -17,5 +17,7 @@ public interface IXlsxDocumentBuilder void AppendSheet(SqadXlsxSheetBuilder sheet); SqadXlsxSheetBuilder GetReferenceSheet(); + + SqadXlsxSheetBuilder GetSheetByName(string name); } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs index fbb7878..382381c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace WebApiContrib.Formatting.Xlsx.Interfaces { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index 70b5fdc..e707c15 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -146,5 +146,10 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { throw new NotImplementedException(); } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName, List columnsOverride) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs index cc939a8..d13484a 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs @@ -77,5 +77,10 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document { throw new NotImplementedException(); } + + public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName, List columnsOverride) + { + throw new NotImplementedException(); + } } } diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 76936d8..84e0ba8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -34,7 +34,7 @@ public bool CanSerialiseType(Type valueType, Type itemType) public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document, string sheetName = null)//, SqadXlsxSheetBuilder sheetBuilder) { - var columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value, sheetName); + ExcelColumnInfoCollection columnInfo = _columnResolver.GetExcelColumnInfo(itemType, value, sheetName); SqadXlsxSheetBuilder sheetBuilder = null; @@ -43,7 +43,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document var sheetAttribute = itemType.GetCustomAttributes(true).SingleOrDefault(s => s is Attributes.ExcelSheetAttribute); sheetName = sheetAttribute != null ? (sheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; } - + if (columnInfo.Count() > 0) { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); @@ -51,6 +51,11 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document document.AppendSheet(sheetBuilder); } + if (sheetName != null && sheetBuilder == null) + { + sheetBuilder = document.GetSheetByName(sheetName); + } + //adding rows data if (value != null) { @@ -95,6 +100,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild cell.CellHeader = columnName; + bool lookUpObjectIsList = false; object lookUpObject = value; if (columnName.Contains(":")) { @@ -104,59 +110,75 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild for (int l = 1; l < columnPath.Count() - 1; l++) { lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); + + if (lookUpObject != null && lookUpObject.GetType().Name.StartsWith("List")) + { + lookUpObjectIsList = true; + break; + } + } } - var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); - - ExcelColumnInfo info = null; - if (columnInfo != null) + if (lookUpObjectIsList) + { + this.Serialise(FormatterUtils.GetEnumerableItemType(lookUpObject.GetType()), lookUpObject as IEnumerable, document, sheetBuilder.CurrentTableName); + + } + else { - info = columnInfo[i]; - #region Reference Row - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); + + ExcelColumnInfo info = null; + if (columnInfo != null) { - DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); - columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) - columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; + info = columnInfo[i]; + #region Reference Row + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + { + DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); + columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) + columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; - cell.DataValidationSheet = columntResolveTable.TableName; + cell.DataValidationSheet = columntResolveTable.TableName; - var referenceSheet = document.GetReferenceSheet(); + var referenceSheet = document.GetReferenceSheet(); - if (referenceSheet == null) - { - referenceSheet = new SqadXlsxSheetBuilder(cell.DataValidationSheet, true); - document.AppendSheet(referenceSheet); - } - else - { - referenceSheet.AddAndActivateNewTable(cell.DataValidationSheet); - } + if (referenceSheet == null) + { + referenceSheet = new SqadXlsxSheetBuilder(cell.DataValidationSheet, true); + document.AppendSheet(referenceSheet); + } + else + { + referenceSheet.AddAndActivateNewTable(cell.DataValidationSheet); + } - cell.DataValidationBeginRow = referenceSheet.GetNextAvailalbleRow(); + cell.DataValidationBeginRow = referenceSheet.GetNextAvailalbleRow(); - this.PopulateReferenceSheet(referenceSheet, columntResolveTable); + this.PopulateReferenceSheet(referenceSheet, columntResolveTable); - cell.DataValidationRowsCount = referenceSheet.GetCurrentRowCount; + cell.DataValidationRowsCount = referenceSheet.GetCurrentRowCount; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) - cell.DataValidationNameCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveName); + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) + cell.DataValidationNameCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveName); - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) - cell.DataValidationValueCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveValue); + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) + cell.DataValidationValueCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveValue); + } + #endregion Reference Row } - #endregion Reference Row - } - - cell.CellValue = FormatCellValue(cellValue, info); + cell.CellValue = FormatCellValue(cellValue, info); - row.Add(cell); + row.Add(cell); + } } - sheetBuilder.AppendRow(row.ToList()); + + if (row.Count() > 0) + sheetBuilder.AppendRow(row.ToList()); } //private void CheckColumnsForResolveSheets(IXlsxDocumentBuilder document, ExcelColumnInfoCollection columnInfo) diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index fe3cd86..f6deda7 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -33,6 +33,8 @@ public void AppendSheet(SqadXlsxSheetBuilder sheet) public SqadXlsxSheetBuilder GetReferenceSheet() => _sheets.Where(w=>w.IsReferenceSheet).FirstOrDefault(); + public SqadXlsxSheetBuilder GetSheetByName(string name) => _sheets.Where(w => w.SheetTables.Select(s => s.TableName).Contains(name)).FirstOrDefault(); + public bool IsVBA => _sheets.Any(a => a.IsReferenceSheet); public Task WriteToStream() diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 1d65b72..48ce8a3 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -23,6 +23,8 @@ public class SqadXlsxSheetBuilder private List _sheetTables { get; set; } + public List SheetTables => _sheetTables; + public SqadXlsxSheetBuilder(string sheetName, bool isReferenceSheet = false) { _isReferenceSheet = isReferenceSheet; diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index 7ea480e..53c4c77 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -83,5 +83,10 @@ public void AppendSheet(SqadXlsxSheetBuilder sheet) { throw new NotImplementedException(); } + + public SqadXlsxSheetBuilder GetSheetByName(string name) + { + throw new NotImplementedException(); + } } } From 335276acd32601ac3023fcc3068b02e4c9fd804e Mon Sep 17 00:00:00 2001 From: Ilya Beyrak Date: Mon, 7 Aug 2017 11:08:20 -0500 Subject: [PATCH 018/255] index on master: c1d15c5 updates co export adding proper column path and proper value export, proper datetime formatn if no firmating provided --- .../WebApiContrib.Formatting.Xlsx.csproj | 9 ++++----- src/WebApiContrib.Formatting.Xlsx/app.config | 2 +- src/WebApiContrib.Formatting.Xlsx/packages.config | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 46e4d3e..2c4fd2f 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -39,17 +39,16 @@ - ..\..\..\MTMediaTools-5.5\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll + ..\..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll - - ..\..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll - True + + ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\..\..\MTMediaTools-5.5\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + ..\..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll diff --git a/src/WebApiContrib.Formatting.Xlsx/app.config b/src/WebApiContrib.Formatting.Xlsx/app.config index de5386a..dde2c3c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/app.config +++ b/src/WebApiContrib.Formatting.Xlsx/app.config @@ -4,7 +4,7 @@ - + diff --git a/src/WebApiContrib.Formatting.Xlsx/packages.config b/src/WebApiContrib.Formatting.Xlsx/packages.config index 54db11c..4d4fa3c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/packages.config +++ b/src/WebApiContrib.Formatting.Xlsx/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file From b88efa4c8104a3ab5d58cf189af471ef6bc82b92 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Tue, 15 Aug 2017 14:19:22 -0500 Subject: [PATCH 019/255] updates to a function --- .../Serialisation/SqadXlsxSerialiser.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 84e0ba8..3ad7202 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -46,9 +46,14 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document if (columnInfo.Count() > 0) { - sheetBuilder = new SqadXlsxSheetBuilder(sheetName); - sheetBuilder.AppendHeaderRow(columnInfo); - document.AppendSheet(sheetBuilder); + sheetBuilder = document.GetSheetByName(sheetName); + + if (sheetBuilder == null) + { + sheetBuilder = new SqadXlsxSheetBuilder(sheetName); + sheetBuilder.AppendHeaderRow(columnInfo); + document.AppendSheet(sheetBuilder); + } } if (sheetName != null && sheetBuilder == null) @@ -114,6 +119,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild if (lookUpObject != null && lookUpObject.GetType().Name.StartsWith("List")) { lookUpObjectIsList = true; + columnName = columnPath[l]; break; } @@ -122,7 +128,7 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild if (lookUpObjectIsList) { - this.Serialise(FormatterUtils.GetEnumerableItemType(lookUpObject.GetType()), lookUpObject as IEnumerable, document, sheetBuilder.CurrentTableName); + this.Serialise(FormatterUtils.GetEnumerableItemType(lookUpObject.GetType()), lookUpObject as IEnumerable, document, columnName); //sheetBuilder.CurrentTableName); } else From fa2c3ca57bba6590df2f36bb70ad88c8ab9d9f57 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 17 Aug 2017 08:16:07 -0500 Subject: [PATCH 020/255] update submodels --- .../FormatterUtils.cs | 2 +- .../Serialisation/SqadXlsxSerialiser.cs | 122 +++++++++--------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index 9cc4b3c..0ec7920 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -199,7 +199,7 @@ public static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) /// /// /// - public static bool IsSimpleType(Type type) + public static bool IsSimpleType(this Type type) { return type.IsValueType || diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 84e0ba8..8badda0 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -43,7 +43,7 @@ public void Serialise(Type itemType, object value, IXlsxDocumentBuilder document var sheetAttribute = itemType.GetCustomAttributes(true).SingleOrDefault(s => s is Attributes.ExcelSheetAttribute); sheetName = sheetAttribute != null ? (sheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; } - + if (columnInfo.Count() > 0) { sheetBuilder = new SqadXlsxSheetBuilder(sheetName); @@ -100,81 +100,81 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild cell.CellHeader = columnName; - bool lookUpObjectIsList = false; - object lookUpObject = value; - if (columnName.Contains(":")) + //bool lookUpObjectIsList = false; + //object lookUpObject = value; + //if (columnName.Contains(":")) + //{ + // string[] columnPath = columnName.Split(':'); + // columnName = columnPath.Last(); + + // for (int l = 1; l < columnPath.Count() - 1; l++) + // { + // lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); + + // if (lookUpObject != null && lookUpObject.GetType().Name.StartsWith("List")) + // { + // lookUpObjectIsList = true; + // break; + // } + + // } + //} + + //if (lookUpObjectIsList) + //{ + // this.Serialise(FormatterUtils.GetEnumerableItemType(lookUpObject.GetType()), lookUpObject as IEnumerable, document, sheetBuilder.CurrentTableName); + + //} + //else + //{ + var cellValue = GetFieldOrPropertyValue(value, columnName); + + ExcelColumnInfo info = null; + if (columnInfo != null) { - string[] columnPath = columnName.Split(':'); - columnName = columnPath.Last(); - - for (int l = 1; l < columnPath.Count() - 1; l++) + info = columnInfo[i]; + #region Reference Row + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) { - lookUpObject = FormatterUtils.GetFieldOrPropertyValue(lookUpObject, columnPath[l]); - - if (lookUpObject != null && lookUpObject.GetType().Name.StartsWith("List")) - { - lookUpObjectIsList = true; - break; - } + DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); + columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) + columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; - } - } + cell.DataValidationSheet = columntResolveTable.TableName; - if (lookUpObjectIsList) - { - this.Serialise(FormatterUtils.GetEnumerableItemType(lookUpObject.GetType()), lookUpObject as IEnumerable, document, sheetBuilder.CurrentTableName); - - } - else - { - var cellValue = GetFieldOrPropertyValue(lookUpObject, columnName); + var referenceSheet = document.GetReferenceSheet(); - ExcelColumnInfo info = null; - if (columnInfo != null) - { - info = columnInfo[i]; - #region Reference Row - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveFromTable) == false && _staticValuesResolver != null) + if (referenceSheet == null) { - DataTable columntResolveTable = _staticValuesResolver(info.ExcelColumnAttribute.ResolveFromTable); - columntResolveTable.TableName = info.ExcelColumnAttribute.ResolveFromTable; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.OverrideResolveTableName) == false) - columntResolveTable.TableName = info.ExcelColumnAttribute.OverrideResolveTableName; - - cell.DataValidationSheet = columntResolveTable.TableName; - - var referenceSheet = document.GetReferenceSheet(); - - if (referenceSheet == null) - { - referenceSheet = new SqadXlsxSheetBuilder(cell.DataValidationSheet, true); - document.AppendSheet(referenceSheet); - } - else - { - referenceSheet.AddAndActivateNewTable(cell.DataValidationSheet); - } + referenceSheet = new SqadXlsxSheetBuilder(cell.DataValidationSheet, true); + document.AppendSheet(referenceSheet); + } + else + { + referenceSheet.AddAndActivateNewTable(cell.DataValidationSheet); + } - cell.DataValidationBeginRow = referenceSheet.GetNextAvailalbleRow(); + cell.DataValidationBeginRow = referenceSheet.GetNextAvailalbleRow(); - this.PopulateReferenceSheet(referenceSheet, columntResolveTable); + this.PopulateReferenceSheet(referenceSheet, columntResolveTable); - cell.DataValidationRowsCount = referenceSheet.GetCurrentRowCount; + cell.DataValidationRowsCount = referenceSheet.GetCurrentRowCount; - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) - cell.DataValidationNameCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveName); + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveName) == false) + cell.DataValidationNameCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveName); - if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) - cell.DataValidationValueCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveValue); + if (string.IsNullOrEmpty(info.ExcelColumnAttribute.ResolveValue) == false) + cell.DataValidationValueCellIndex = referenceSheet.GetColumnIndexByColumnName(info.ExcelColumnAttribute.ResolveValue); - } - #endregion Reference Row } + #endregion Reference Row + } - cell.CellValue = FormatCellValue(cellValue, info); + cell.CellValue = FormatCellValue(cellValue, info); - row.Add(cell); - } + row.Add(cell); + //} } if (row.Count() > 0) From 90576b25683feebbdcb79f5407c7718813c72ae5 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 17 Aug 2017 09:02:34 -0500 Subject: [PATCH 021/255] . --- src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index 0ec7920..9cc4b3c 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -199,7 +199,7 @@ public static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) /// /// /// - public static bool IsSimpleType(this Type type) + public static bool IsSimpleType(Type type) { return type.IsValueType || From 46e4f35a9539e4ef517da92a1fb344c7bdf2aa7c Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Mon, 21 Aug 2017 14:58:33 -0500 Subject: [PATCH 022/255] update to list objects --- .../Serialisation/DefaultColumnResolver.cs | 5 +- .../Serialisation/SqadXlsxSerialiser.cs | 84 ++++++++++++++++++- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index 52e5846..d026efe 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -50,7 +50,10 @@ public virtual ExcelColumnInfoCollection GetExcelColumnInfo(Type itemType, objec Type typeOfList = FormatterUtils.GetEnumerableItemType(propertyType); if (FormatterUtils.IsSimpleType(typeOfList)) - fieldInfo.Add(new ExcelColumnInfo(prop.Name, propertyType, attribute, null)); + { + string prefix = string.IsNullOrEmpty(namePrefix) == false ? $"{namePrefix}:{prop.Name}" : prop.Name; + fieldInfo.Add(new ExcelColumnInfo(prefix, typeOfList, attribute, null)); + } else { string prefix = string.IsNullOrEmpty(namePrefix) == false ? $"{namePrefix}:{prop.Name}" : prop.Name; diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 857721b..c49c4b0 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using WebApiContrib.Formatting.Xlsx.Interfaces; @@ -134,6 +135,11 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild //{ var cellValue = GetFieldOrPropertyValue(value, columnName); + if (columnName.Contains(":") && (cellValue == null || (cellValue != null && string.IsNullOrEmpty(cellValue.ToString())))) + { + cellValue = GetFieldPathValue(value, columnName); + } + ExcelColumnInfo info = null; if (columnInfo != null) { @@ -176,7 +182,8 @@ private void PopulateRows(List columns, object value, SqadXlsxSheetBuild #endregion Reference Row } - cell.CellValue = FormatCellValue(cellValue, info); + if (cellValue != null) + cell.CellValue = FormatCellValue(cellValue, info); row.Add(cell); //} @@ -283,6 +290,81 @@ protected virtual object GetFieldOrPropertyValue(object rowObject, string name) : rowValue.ToString(); } + private object GetFieldPathValue(object rowObject, string path) + { + string[] pathSplit = path.Split(':').Skip(1).ToArray(); + + List resultsList = new List(); + + List itemsToProcess = new List() { rowObject }; + + int index = 0; + foreach (string objName in pathSplit) + { + index++; + + var tempItemsToProcess = itemsToProcess.ToList(); + itemsToProcess.Clear(); + + foreach (var obj in tempItemsToProcess) + { + if (obj == null) + continue; + + Type type = obj.GetType(); + System.Reflection.MemberInfo member = type.GetField(objName) ?? type.GetProperty(objName) as System.Reflection.MemberInfo; + if (member == null) + { + return null; + } + var result = new object(); + + switch (member.MemberType) + { + case MemberTypes.Property: + result = ((PropertyInfo)member).GetValue(obj, null); + break; + case MemberTypes.Field: + result = ((FieldInfo)member).GetValue(obj); + break; + default: + result = null; + break; + } + + if (index == pathSplit.Count()) + { + if (result != null) + { + if (result.GetType().Name.StartsWith("List")) + { + List list = new List(); + var enumerator = ((System.Collections.IEnumerable)result).GetEnumerator(); + while (enumerator.MoveNext()) + { + resultsList.Add(enumerator.Current); + } + } + else + resultsList.Add(result); + } + } + else + { + if (result != null) + { + if (result.GetType().Name.StartsWith("List")) + itemsToProcess.AddRange(result as IEnumerable); + else + itemsToProcess.Add(result); + } + } + } + } + + return string.Join(":", resultsList); + } + protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info = null) { if (info != null) From ca52e9344a54bf2b353e8b0215732cfa5a8de501 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Mon, 21 Aug 2017 17:12:23 -0500 Subject: [PATCH 023/255] fix for the issue where when property overwritten getting exception about ambitious property name overwritten property does not hide from reflection --- .../Serialisation/SqadXlsxSerialiser.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index c49c4b0..29f459e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -312,7 +312,19 @@ private object GetFieldPathValue(object rowObject, string path) continue; Type type = obj.GetType(); - System.Reflection.MemberInfo member = type.GetField(objName) ?? type.GetProperty(objName) as System.Reflection.MemberInfo; + + System.Reflection.MemberInfo member = null; + + var matchingProperties = type.GetProperties().Where(w => w.Name == "Value").ToList(); + if (matchingProperties.Count() > 1) + { + //property overwriten, and must take first + member = matchingProperties.First(); + } + else + { + member = type.GetField(objName) ?? type.GetProperty(objName) as System.Reflection.MemberInfo; + } if (member == null) { return null; From 49d1a8922fc2a24be1d3297d876152c4f4128614 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 7 Sep 2017 09:39:43 -0500 Subject: [PATCH 024/255] update and fix an issue where instead of proper value default "value" was pulled from reflection --- .../Serialisation/SqadXlsxSerialiser.cs | 10 +++++++--- .../SqadXlsxSheetBuilder.cs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 29f459e..964f21e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -315,15 +315,19 @@ private object GetFieldPathValue(object rowObject, string path) System.Reflection.MemberInfo member = null; - var matchingProperties = type.GetProperties().Where(w => w.Name == "Value").ToList(); - if (matchingProperties.Count() > 1) + var matchingProperties = type.GetProperties().Where(w => w.Name == objName).ToList(); + if (matchingProperties.Count() > 0) + { + member = matchingProperties.First(); + } + else if ((matchingProperties = type.GetProperties().Where(w => w.Name == "Value").ToList()).Count() > 1) { //property overwriten, and must take first member = matchingProperties.First(); } else { - member = type.GetField(objName) ?? type.GetProperty(objName) as System.Reflection.MemberInfo; + member = type.GetField(objName) ?? type.GetProperty(objName) as System.Reflection.MemberInfo; } if (member == null) { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 48ce8a3..32b72ed 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -157,7 +157,7 @@ public void CompileSheet(ExcelPackage package) sheetCodeColumnStatements.Add(code); } - else if (bool.TryParse(cell.CellValue.ToString(), out var result)) + else if (cell.CellValue !=null && bool.TryParse(cell.CellValue.ToString(), out var result)) { var dataValidation = worksheet.DataValidations.AddListValidation(worksheet.Cells[rowCount, excelColumnIndex].Address); dataValidation.ShowErrorMessage = true; From 87635c06a11acb37194e0c7c818a6df210176b52 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Thu, 7 Sep 2017 13:47:23 -0500 Subject: [PATCH 025/255] updates to list items separations --- .../Serialisation/SqadXlsxSerialiser.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 964f21e..0671d69 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -378,7 +378,12 @@ private object GetFieldPathValue(object rowObject, string path) } } - return string.Join(":", resultsList); + string returnString = string.Empty; + for (int i = 1; i <= resultsList.Count(); i++) + { + returnString += $"{i}->{resultsList[i-1]}, "; + } + return returnString; } protected virtual object FormatCellValue(object cellValue, ExcelColumnInfo info = null) From bc9d0e96eb954824af7197e4e6c728e26635c4c9 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Mon, 11 Sep 2017 11:10:42 -0500 Subject: [PATCH 026/255] updates to exporter hows the lists items are generating --- .../Serialisation/SqadXlsxSerialiser.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 0671d69..949fe35 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -298,6 +298,8 @@ private object GetFieldPathValue(object rowObject, string path) List itemsToProcess = new List() { rowObject }; + bool isResultList = false; + int index = 0; foreach (string objName in pathSplit) { @@ -360,6 +362,7 @@ private object GetFieldPathValue(object rowObject, string path) { resultsList.Add(enumerator.Current); } + isResultList = true; } else resultsList.Add(result); @@ -379,9 +382,17 @@ private object GetFieldPathValue(object rowObject, string path) } string returnString = string.Empty; - for (int i = 1; i <= resultsList.Count(); i++) + + if (isResultList) + { + for (int i = 1; i <= resultsList.Count(); i++) + { + returnString += $"{i}->{resultsList[i - 1]}, "; + } + } + else { - returnString += $"{i}->{resultsList[i-1]}, "; + returnString = resultsList.Count() > 0 ? resultsList.First().ToString() : string.Empty; } return returnString; } From a1dc15cc1a047ebc204de13b2d148d6d2f0cba9a Mon Sep 17 00:00:00 2001 From: Ilya Beyrak Date: Wed, 27 Sep 2017 14:22:34 -0500 Subject: [PATCH 027/255] solutiondir fix --- .../WebApiContrib.Formatting.Xlsx.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 03d18e2..61bf6a5 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -11,7 +11,7 @@ WebApiContrib.Formatting.Xlsx v4.5 512 - ..\..\ + ..\..\..\ true From 1392299a29af1838fad14be061af8858e5706602 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Tue, 27 Mar 2018 15:07:13 -0500 Subject: [PATCH 028/255] update openoffice xml to use nuget --- .../WebApiContrib.Formatting.Xlsx.csproj | 16 +++++++--------- .../packages.config | 1 + 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 61bf6a5..c4bba0e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -38,22 +38,22 @@ mt50.snk - - False - ..\..\..\MTMediaTools-5.5\MTDesktopComponents\DocumentFormat.OpenXml.dll + + ..\..\packages\DocumentFormat.OpenXml.2.5\lib\DocumentFormat.OpenXml.dll + True - ..\..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll + ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + ..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll @@ -95,9 +95,7 @@ - - Designer - + diff --git a/src/WebApiContrib.Formatting.Xlsx/packages.config b/src/WebApiContrib.Formatting.Xlsx/packages.config index 4d4fa3c..ea7f2fd 100644 --- a/src/WebApiContrib.Formatting.Xlsx/packages.config +++ b/src/WebApiContrib.Formatting.Xlsx/packages.config @@ -1,5 +1,6 @@  + From 1ae1016e8bb48521a9be07488aa0f599d8d0b229 Mon Sep 17 00:00:00 2001 From: Stepan Kobzey Date: Tue, 27 Mar 2018 16:12:55 -0500 Subject: [PATCH 029/255] update openoffice xml --- .../WebApiContrib.Formatting.Xlsx.csproj | 6 +++--- src/WebApiContrib.Formatting.Xlsx/packages.config | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index c4bba0e..9f09bf2 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -38,9 +38,8 @@ mt50.snk - - ..\..\packages\DocumentFormat.OpenXml.2.5\lib\DocumentFormat.OpenXml.dll - True + + ..\..\..\packages\DocumentFormat.OpenXml.2.7.1\lib\net45\DocumentFormat.OpenXml.dll ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll @@ -63,6 +62,7 @@ + diff --git a/src/WebApiContrib.Formatting.Xlsx/packages.config b/src/WebApiContrib.Formatting.Xlsx/packages.config index ea7f2fd..5163d8f 100644 --- a/src/WebApiContrib.Formatting.Xlsx/packages.config +++ b/src/WebApiContrib.Formatting.Xlsx/packages.config @@ -1,6 +1,6 @@  - + From 64a8f77c366682cf03e87bcba706e3eb5fe918c7 Mon Sep 17 00:00:00 2001 From: Ilya Beyrak Date: Wed, 28 Mar 2018 09:51:32 -0500 Subject: [PATCH 030/255] conslidate nuget --- .../WebApiContrib.Formatting.Xlsx.csproj | 19 +++++++++++-------- src/WebApiContrib.Formatting.Xlsx/app.config | 2 +- .../packages.config | 8 ++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj index 9f09bf2..0960485 100644 --- a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj @@ -38,24 +38,27 @@ mt50.snk - - ..\..\..\packages\DocumentFormat.OpenXml.2.7.1\lib\net45\DocumentFormat.OpenXml.dll + + ..\..\..\packages\DocumentFormat.OpenXml.2.8.1\lib\net40\DocumentFormat.OpenXml.dll - - ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll + + ..\..\..\packages\EPPlus.4.5.1\lib\net40\EPPlus.dll - - ..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + - - ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + + ..\..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.4\lib\net45\System.Net.Http.Formatting.dll + diff --git a/src/WebApiContrib.Formatting.Xlsx/app.config b/src/WebApiContrib.Formatting.Xlsx/app.config index dde2c3c..2bbe771 100644 --- a/src/WebApiContrib.Formatting.Xlsx/app.config +++ b/src/WebApiContrib.Formatting.Xlsx/app.config @@ -4,7 +4,7 @@ - + diff --git a/src/WebApiContrib.Formatting.Xlsx/packages.config b/src/WebApiContrib.Formatting.Xlsx/packages.config index 5163d8f..d3f1456 100644 --- a/src/WebApiContrib.Formatting.Xlsx/packages.config +++ b/src/WebApiContrib.Formatting.Xlsx/packages.config @@ -1,7 +1,7 @@  - - - - + + + + \ No newline at end of file From a4f45b6e3a1530b104063da88474a4f00d1e860c Mon Sep 17 00:00:00 2001 From: stepankobzey Date: Tue, 24 Apr 2018 12:51:46 -0500 Subject: [PATCH 031/255] renaming namespaces --- .../v15/Server/sqlite3/db.lock | 0 .../v15/Server/sqlite3/storage.ide | Bin 0 -> 2121728 bytes .vs/config/applicationhost.config | 2 +- WebApiContrib.Formatting.Xlsx.sln | 26 ++++-------------- .../FormatterUtils.cs | 2 +- .../Interfaces/IColumnResolver.cs | 6 ++-- .../Interfaces/ISheetResolver.cs | 6 ++-- .../Interfaces/IXlsxDocumentBuilder.cs | 3 +- .../Interfaces/IXlsxSerialiser.cs | 2 +- ...Next.WebApiContrib.Formatting.Xlsx.csproj} | 0 .../Serialisation/DefaultColumnResolver.cs | 7 +++-- .../Serialisation/DefaultSheetResolver.cs | 7 +++-- .../Serialisation/DefaultXlsxSerialiser.cs | 9 +++--- .../Serialisation/ExcelCell.cs | 2 +- .../Serialisation/ExcelColumnInfo.cs | 2 +- .../ExcelColumnInfoCollection.cs | 2 +- .../Serialisation/ExcelSheetInfo.cs | 2 +- .../Serialisation/ExcelSheetInfoCollection.cs | 2 +- .../Serialisation/ExpandoSerialiser.cs | 7 +++-- .../Serialisation/KeyedCollectionBase.cs | 2 +- .../Serialisation/PerRequestColumnResolver.cs | 6 ++-- .../Serialisation/SqadXlsxSerialiser.cs | 7 +++-- .../SqadXlsxDocumentBuilder.cs | 4 +-- .../SqadXlsxSheetBuilder.cs | 4 +-- .../Utils/HttpContextFactory.cs | 2 +- .../XlsxDocumentBuilder.cs | 5 ++-- .../XlsxMediaTypeFormatter.cs | 6 ++-- 27 files changed, 57 insertions(+), 66 deletions(-) create mode 100644 .vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/db.lock create mode 100644 .vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/storage.ide rename src/WebApiContrib.Formatting.Xlsx/{WebApiContrib.Formatting.Xlsx.csproj => SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj} (100%) diff --git a/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/db.lock b/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/db.lock new file mode 100644 index 0000000..e69de29 diff --git a/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/storage.ide b/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/storage.ide new file mode 100644 index 0000000000000000000000000000000000000000..faba2092da30f1dd0798775c84b48086d4e41def GIT binary patch literal 2121728 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 /// Allows easy customisation of what columns are generated from a type and how they should be formatted. diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs index 393ea98..9313f47 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/ISheetResolver.cs @@ -1,11 +1,11 @@ -using System; +using SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx.Interfaces +namespace SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces { public interface ISheetResolver { diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs index be59dd8..38946df 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxDocumentBuilder.cs @@ -1,4 +1,5 @@ using OfficeOpenXml; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; using System; using System.Collections.Generic; using System.Data; @@ -6,7 +7,7 @@ using System.Text; using System.Threading.Tasks; -namespace WebApiContrib.Formatting.Xlsx.Interfaces +namespace SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces { public interface IXlsxDocumentBuilder { diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs index 382381c..69b1901 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IXlsxSerialiser.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace WebApiContrib.Formatting.Xlsx.Interfaces +namespace SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces { /// /// Exposes access to serialisation logic for complete customisation of serialised output. diff --git a/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj similarity index 100% rename from src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj rename to src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs index d026efe..7bb2047 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultColumnResolver.cs @@ -1,12 +1,13 @@ -using System; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web.ModelBinding; using WebApiContrib.Formatting.Xlsx.Attributes; -using WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// Resolves all public, parameterless properties of an object, respecting any ExcelColumnAttribute diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs index 75ad123..788aad0 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultSheetResolver.cs @@ -1,13 +1,14 @@ -using System; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WebApiContrib.Formatting.Xlsx.Attributes; -using WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class DefaultSheetResolver : ISheetResolver { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs index e707c15..5158e07 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/DefaultXlsxSerialiser.cs @@ -1,10 +1,11 @@ -using System; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; +using System; using System.Collections.Generic; using System.Linq; -using WebApiContrib.Formatting.Xlsx.Interfaces; -using util = WebApiContrib.Formatting.Xlsx.FormatterUtils; +using util = SQAD.MTNext.WebApiContrib.Formatting.Xlsx.FormatterUtils; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// Serialises public, parameterless properties of a class, taking account of any custom attributes. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs index 1650afa..def303a 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelCell.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class ExcelCell { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs index 43a7f79..05ebba1 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfo.cs @@ -1,7 +1,7 @@ using System; using WebApiContrib.Formatting.Xlsx.Attributes; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// Formatting information for an Excel column based on attribute values specified on a class. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs index cbd8b7d..7695f6e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelColumnInfoCollection.cs @@ -2,7 +2,7 @@ using System.Collections.ObjectModel; using System.Linq; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// A collection of column information for an Excel document, keyed by field/property name. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs index 77dd1b3..ee1573d 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfo.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using WebApiContrib.Formatting.Xlsx.Attributes; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class ExcelSheetInfo { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs index c8b0c7d..f563383 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExcelSheetInfoCollection.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class ExcelSheetInfoCollection : KeyedCollectionBase { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs index d13484a..fa7824e 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/ExpandoSerialiser.cs @@ -1,11 +1,12 @@ -using System; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; +using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Linq.Expressions; -using WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// Custom serialiser for ExpandoObject. diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs index 5c42622..968a50f 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/KeyedCollectionBase.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class KeyedCollectionBase : KeyedCollection { diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs index 3b051f9..e1efb41 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs @@ -1,11 +1,11 @@ -using System; +using SQAD.MTNext.Utils.WebApiContrib.Formatting.Xlsx.Utils; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Utils; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { /// /// Resolves the properties whitelisted by name in an item (default XlsxSerialisableProperties) of the diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs index 949fe35..96363fc 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SqadXlsxSerialiser.cs @@ -1,13 +1,14 @@ -using System; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.WebApiContrib.Formatting.Xlsx; +using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx.Serialisation +namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation { public class SqadXlsxSerialiser : IXlsxSerialiser { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs index f6deda7..3f3edf8 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxDocumentBuilder.cs @@ -1,13 +1,13 @@ using OfficeOpenXml; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx +namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { public class SqadXlsxDocumentBuilder : IXlsxDocumentBuilder { diff --git a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs index 32b72ed..386545b 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/SqadXlsxSheetBuilder.cs @@ -1,13 +1,13 @@ using OfficeOpenXml; +using SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx +namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { public class SqadXlsxSheetBuilder { diff --git a/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs b/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs index 8442c90..d0f8c02 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs @@ -1,7 +1,7 @@ using System; using System.Web; -namespace WebApiContrib.Formatting.Xlsx.Utils { +namespace SQAD.MTNext.Utils.WebApiContrib.Formatting.Xlsx.Utils { public class HttpContextFactory { private static HttpContextBase currentContext; diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs index 53c4c77..2a00252 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxDocumentBuilder.cs @@ -5,11 +5,10 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -using WebApiContrib.Formatting.Xlsx.Interfaces; -using WebApiContrib.Formatting.Xlsx.Serialisation; using System.Data; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; -namespace WebApiContrib.Formatting.Xlsx +namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { public class XlsxDocumentBuilder : IXlsxDocumentBuilder { diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index 6059910..2115d09 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -6,11 +6,11 @@ using System.Security.Permissions; using System.Threading.Tasks; using System.Data; -using WebApiContrib.Formatting.Xlsx.Interfaces; -using WebApiContrib.Formatting.Xlsx.Serialisation; using WebApiContrib.Formatting.Xlsx.Attributes; +using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; +using SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx +namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { /// From 7759be97d67a68b245b1ed7682af044fcd8c76a7 Mon Sep 17 00:00:00 2001 From: stepankobzey Date: Tue, 24 Apr 2018 13:04:22 -0500 Subject: [PATCH 032/255] more fixes to rename --- .../v15/Server/sqlite3/storage.ide | Bin 2121728 -> 2285568 bytes .../Attributes/ExcelColumnAttribute.cs | 2 +- .../Attributes/ExcelDocumentAttribute.cs | 2 +- .../Attributes/ExcelSheetAttribute.cs | 2 +- .../FormatterUtils.cs | 4 ++-- .../Serialisation/DefaultColumnResolver.cs | 4 ++-- .../Serialisation/DefaultSheetResolver.cs | 4 ++-- .../Serialisation/ExcelColumnInfo.cs | 4 ++-- .../Serialisation/ExcelSheetInfo.cs | 4 ++-- .../Serialisation/SqadXlsxSerialiser.cs | 11 ++++++----- .../XlsxMediaTypeFormatter.cs | 2 +- 11 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/storage.ide b/.vs/WebApiContrib.Formatting.Xlsx/v15/Server/sqlite3/storage.ide index faba2092da30f1dd0798775c84b48086d4e41def..9dff4207998916ff0cb9d7c22e41847fa7f3072a 100644 GIT binary patch delta 61451 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 DMT|K0 delta 5744 zcmZ8l3wTt;8J*epd-EV!@_>X0B4P*uMMWe*K%memlrB!1 zd>;z4ZwjlE{H4C*zA5&Swr&G|>(O%0OxAoo`Uae7<^ow-T^p(i-W05>A6Fl&9WcAj zp|zY|rj?w#)B;bRR{TSSgJhW{64vD4A*!P)WstUic)E0GpA2u1PVLjRTOC$38SXnE zG)Hk*9%xI>{lFZ*rBcpuG3Eo2g>7&BYEUn?|B&$d>(Nv$);yss`JtAa8)@4bTJKZ; zj^=gG{KhOqcT}_3GRFk#OM?rlD{89iDzy6WOp9@Mx%j5y)`t@}~;YInq4@4mx5-96Dg%6+Xn-+hVv*ll*5a((Fflj{a&yR+D_$I;*Z zu-$A6SwFBASenhp&DWV8k>6bySpTh+tgK`P)@q-vU7ek7E-(!%T{5@6V)0E2g28cf zD}#%Ni<6N{Ezya{$^z{#MJby9!5nSGhWoVKwR^PBqf@okqDj`DTI_7>W7CGMSljm8 z$_bY1<%c3etP^6L9AxVBSNi_syTrTH^R;J;dz(Ae)!;nl9OZb{k!4?J_u7;#$-2sN z)-u+tOk>1C|GmiCHEP-1lpJd$%M!izr}10UtlB@~ZVMK1oVI(@Q^=-Jk+~^lT5(aT z_VVHTw7nU9tctEMFTsJWFdI*4*~ogVoNRn@t0Y z3q%jGUC80`1;5p|!k6M*<#l=*JsxD)>iV@yi0#gM96vbf?C0$TFGz~_iwc6bGW@^RzlC;;pOi308{Y}E}lp}}EoU~xxox#~!($OmI)Ozc8{48C^G#ZA?gRHWoNjJ7 zEddi?1}yQ0)7BL)4a+c<3IAAMJC;XzyLrOyAKVLE-@2wd-*px_S{<487Q5ZnWc`nI zsin)Z+)Uolds6@#dE5-)z+xW_hdS><+t9hj_;E$Y11Aky-O`Wy=r`+HNa!*{$LYG169J_Q#9cZP%FO+bVS4 z_ogk<#}XZHQb{v%A2W&0=9BwufE{oEPQV4Y0T1AfpWNpQTrn(N>=&lpzRBK~yoH|i z9-F(ybxiDcm04~!zavZK`{q&hJlh(Z-CAS$++Xke#O1NKI%`bF97i0tVNsjn`#XFm zZD!Nf+1krf`>6I^nFCes0oycH(dqj_J2JU1E(B|+$fzt)<$uiVgEg}JC1EOmF|)Td zVzETsYW{iOJPW$bia8lAJTefjc8twl6V-{!QL z3Jc#q;XZKqvlC^vKKkTgzWM`a|>Uf82EYGr5P(w0!jZ zJ1X;mBTb*p8hy@@ecU^J=GFbqKRm_0AT=ZZP0y*+=A2Is)nAj}GP)tP@S`Cq-Jg1* zu~@t3q-p1&SFPjTXzPCEA4Xmk?h48;PVfG)mm_DD`nVxbDEq6zDJg~4X;O$}l{_Ic zLoK{JkS4FExxbqCY+kxl>Th=k2AiHWsUAxMH^`VOUm6%FZ&oc!0|j!KdU7fvDYlPIxJN-UHb3w4Wy(qf_XSSSz+b&rKIc7-xWjIoP(`429hRvy3 z?{bZ3em$NUe?6YH=S|x}Yjk{j19#(=ZYeKjT)!bMW*oX@kyz3=zWm^m8~x3rW7$9t zpl5t^ENAalRT!0lcz#sonN{HJyz%O;Ci%FUKO#Fzb*{>7RY@u@pt|nuH7P!`S$a%r z*5SN~;Yaj{`RGDP#yct@~5yO+_=4fH0)aP%Yj`wuLjS;i=6ftAmQu5lfI__ z4weTj!@vxb_Ok#v?O{xY?VB;axF6wUKokJ4pn}oyW&aTf2WSQ+ARuOi&V}GvI=>A( zpmP&=s?O8EvvocVPiAEvFdads;kgKS6~QHA{6us&;GlHVE0)07X!Ip)jG7J`^)|i1 zqu^W`+Oxqq0rI!NlksGmHvk578L$E1d1RY+5d=RD$iv_34itMaFgxu9j7KAKruQ{H zy$XwTGffMjHdo#OQ?=3;4>_LabNeZB7oXFJ+g0UMEB^3}kTXoG&jiP`6%BX(K< z1korHPo}*TJVoaNFaT$EIZy=78IYI5m)WB4JOs`5J%M#-Lp}|ds!uW(d>GS?=WO7R zME(OHobg@gh@2f=iH^uQ`>Wv0%c~FY4eaFo0Kaa(6TB3@w9|JqII}`tgb8q2n*qN* za25DaWRyWPas9v21=AbB0GvH%5CzER0guAYO-K737??blK&KpxosLI8h zU@Zu$61P|pp4^P|-GzR7;K^lbK|c(lH?RjFzYN%Sk$rU-sX*ov8}JEqO3qm_h1^g~ z;~0&voA_@LOPKn56u;2J$2Is z2QW+ucm$dYf=5C>c~SctVT(ia;35}dEbuCH2A(Xx0**l^b8$ET4IMBTGnfQzMuiVg zm<4q*H1{)g3D6JP2zWB|P-qUwdg^h|Jdo6-z!Y7BikpB6XdlK;6dL$y;i04h^^%Jm zra(9SOt(Pu@@8TE@1Rrg#3P}1gBSr$gY6KsF#+l?p~F~%#DF*Bc^(FKz)}Wyu~J8A`babGO z>m7n7?$rIzTwfO6u?L}zlv5vu=B8tr1^gA-$Po4SX5`zT=(6})Yh59RKZW}u0?l*Hl->dGOV5b78afDV z>>28X&_;mNt95_&N3AaMzZ3e2|I=9iXLJYDC0@w8pp9KjhkekPbfQqd2F+8z0jQ5c za}QC^0Xm?$L@YIc#rD5FK%D}OCW%sm@kIazV?Z|O4eh*8pXea}XZ8HDGd3;TPk=T8 zq@DzATx8Ue z2&()|GJwBSM{kljvQz~($xHHC!P}I3Xd*yI9$of#9pD1S03M)9J+nz(EpJmNHendv zv9$IB5OLyTm}!`-e)$-NnXZD5$s8v$&c3FqRj`I{0_Fba^}-yE26*5q0p_F};E+5! zY&S>OJlyP@w**7vPBR0y0L(3O#P-zy`!&f)!aPDws>bYVV6DUHS|I9F*BaU7e0)aa z@}K^c&Zk`bliU(7jAf6M&KCwp7FnayI(n)d1Cx65pD+ s is Attributes.ExcelSheetAttribute); - sheetName = sheetAttribute != null ? (sheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + var sheetAttribute = itemType.GetCustomAttributes(true).SingleOrDefault(s => s is ExcelSheetAttribute); + sheetName = sheetAttribute != null ? (sheetAttribute as ExcelSheetAttribute).SheetName : itemType.Name; } if (columnInfo.Count() > 0) @@ -254,10 +255,10 @@ private void PopulateInnerObjectSheets(ExcelSheetInfoCollection sheetsInfo, IXls { foreach (var sheet in sheetsInfo) { - if (!(sheet.ExcelSheetAttribute is Attributes.ExcelSheetAttribute)) + if (!(sheet.ExcelSheetAttribute is ExcelSheetAttribute)) continue; - string sheetName = sheet.ExcelSheetAttribute != null ? (sheet.ExcelSheetAttribute as Attributes.ExcelSheetAttribute).SheetName : itemType.Name; + string sheetName = sheet.ExcelSheetAttribute != null ? (sheet.ExcelSheetAttribute as ExcelSheetAttribute).SheetName : itemType.Name; if (sheetName == null) sheetName = sheet.SheetName; diff --git a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs index 2115d09..4b59269 100644 --- a/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs +++ b/src/WebApiContrib.Formatting.Xlsx/XlsxMediaTypeFormatter.cs @@ -6,9 +6,9 @@ using System.Security.Permissions; using System.Threading.Tasks; using System.Data; -using WebApiContrib.Formatting.Xlsx.Attributes; using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; using SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation; +using SQAD.MTNext.Attributes.WebApiContrib.Formatting.Xlsx.Attributes; namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { From d5a88c0757f8303241d2e69f6f3c607495371b4e Mon Sep 17 00:00:00 2001 From: stepankobzey Date: Tue, 1 May 2018 14:29:34 -0500 Subject: [PATCH 033/255] update to xlx exporter. fixes to namespaces --- .../Attributes/ExcelColumnAttribute.cs | 75 ------------------- .../Attributes/ExcelDocumentAttribute.cs | 28 ------- .../Attributes/ExcelSheetAttribute.cs | 28 ------- .../FormatterUtils.cs | 2 +- ...TNext.WebApiContrib.Formatting.Xlsx.csproj | 23 ++++-- .../Serialisation/DefaultColumnResolver.cs | 2 +- .../Serialisation/DefaultSheetResolver.cs | 2 +- .../Serialisation/ExcelColumnInfo.cs | 2 +- .../Serialisation/ExcelSheetInfo.cs | 2 +- .../Serialisation/SqadXlsxSerialiser.cs | 66 +++------------- .../SqadXlsxSheetBuilder.cs | 42 +++++++++-- .../XlsxMediaTypeFormatter.cs | 6 +- src/WebApiContrib.Formatting.Xlsx/app.config | 8 +- .../packages.config | 2 +- 14 files changed, 73 insertions(+), 215 deletions(-) delete mode 100644 src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs delete mode 100644 src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelDocumentAttribute.cs delete mode 100644 src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs deleted file mode 100644 index 9d87cdf..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelColumnAttribute.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace SQAD.MTNext.Attributes.WebApiContrib.Formatting.Xlsx.Attributes -{ - [AttributeUsage(AttributeTargets.Property)] - public class ExcelColumnAttribute : Attribute - { - // Nullable parameters not allowed on attributes. :( - internal int? _order; - - ///

- /// Control the output of this property when serialized to Excel. - /// - public ExcelColumnAttribute() { } - - /// - /// Control the output of this property when serialized to Excel. - /// - public ExcelColumnAttribute(string header) : this() - { - Header = header; - } - - /// - /// Column header to use for this property. - /// - public string Header { get; set; } - - /// - /// Value to use if this field is a boolean value and equals true. - /// - public string TrueValue { get; set; } - - /// - /// Value to use if this field is a boolean value and equals false. - /// - public string FalseValue { get; set; } - - /// - /// Whether to use the display format string set for this field. - /// - public bool UseDisplayFormatString { get; set; } - - /// - /// Ignore this property when serializing to Excel. - /// - public bool Ignore { get; set; } - - /// - /// Override the serialized order of this property in the generated Excel document. - /// public int Order - public int Order - { - get { return _order ?? default(int); } - set { _order = value; } - } - - /// - /// Apply the specified Excel number format string to this property in the generated Excel output. - /// - public string NumberFormat { get; set; } - - public string ResolveFromTable { get; set; } - - public string OverrideResolveTableName { get; set; } - /// - /// Default Value is ID - /// - public string ResolveValue { get; set; } = "ID"; - /// - /// Default Value is Name - /// - public string ResolveName { get; set; } = "Name"; - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelDocumentAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelDocumentAttribute.cs deleted file mode 100644 index 16c568c..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelDocumentAttribute.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace SQAD.MTNext.Attributes.WebApiContrib.Formatting.Xlsx.Attributes -{ - [AttributeUsage(AttributeTargets.Class)] - public class ExcelDocumentAttribute : Attribute - { - - /// - /// Set properties of Excel documents generated from this type. - /// - public ExcelDocumentAttribute() { } - - /// - /// Set properties of Excel documents generated from this type. - /// - /// The preferred file name for an Excel document generated from this type. - public ExcelDocumentAttribute(string fileName) - { - FileName = fileName; - } - - /// - /// The preferred file name for an Excel document generated from this type. - /// - public string FileName { get; set; } - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs b/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs deleted file mode 100644 index f7106d4..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Attributes/ExcelSheetAttribute.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SQAD.MTNext.Attributes.WebApiContrib.Formatting.Xlsx.Attributes -{ - public class ExcelSheetAttribute : Attribute - { - private int? _order; - - public int Order - { - get { return _order ?? default(int); } - set { _order = value; } - } - - public ExcelSheetAttribute() { } - - public ExcelSheetAttribute(string SheetName) : this() - { - this.SheetName = SheetName; - } - - public string SheetName { get; set; } - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index 2ba806a..6a6d054 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -1,4 +1,4 @@ -using SQAD.MTNext.Attributes.WebApiContrib.Formatting.Xlsx.Attributes; +using SQAD.MTNext.Business.Models.Attributes; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj b/src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj index 0960485..0e7e5d2 100644 --- a/src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj +++ b/src/WebApiContrib.Formatting.Xlsx/SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj @@ -7,12 +7,13 @@ {B6A319B2-82A4-41BA-A895-4FC02A0D53EF} Library Properties - WebApiContrib.Formatting.Xlsx - WebApiContrib.Formatting.Xlsx - v4.5 + SQAD.MTNext.WebApiContrib.Formatting.Xlsx + SQAD.MTNext.WebApiContrib.Formatting.Xlsx + v4.6.1 512 ..\..\..\ true + true @@ -32,7 +33,7 @@ 4 - true + false mt50.snk @@ -68,9 +69,6 @@ - - - @@ -100,7 +98,16 @@ - + + + {c46b1bed-a17c-42f7-9ebf-6d179e897856} + SQAD.MTNext.Business + + + {52a526e9-4153-42cd-aa70-19db0d23965b} + SQAD.MTNext.Resources + + - \ No newline at end of file diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs deleted file mode 100644 index e1efb41..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/PerRequestColumnResolver.cs +++ /dev/null @@ -1,61 +0,0 @@ -using SQAD.MTNext.Utils.WebApiContrib.Formatting.Xlsx.Utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation -{ - /// - /// Resolves the properties whitelisted by name in an item (default XlsxSerialisableProperties) of the - /// current request's HttpContext, optionally respecting the whitelist order. - /// - public class PerRequestColumnResolver : DefaultColumnResolver - { - public const string DEFAULT_KEY = "XlsxSerialisableProperties"; - - /// - /// The key to look up in the HttpContext.Current.Items collection. - /// - public string HttpContextItemKey { get; set; } - - /// - /// Override output order with the order that properties are defined in. - /// - public bool UseCustomOrder { get; set; } - - public PerRequestColumnResolver(string httpContextItemKey = DEFAULT_KEY, bool useCustomOrder = false) - { - HttpContextItemKey = httpContextItemKey; - UseCustomOrder = useCustomOrder; - } - - /// - /// Get member names from System.Web.HttpContext.Current.Items[HttpContextItemKey] if key was defined, - /// or default member names from base class implementation if not. - /// - /// Type of item being serialised. - /// The collection of values being serialised. (Not used, provided for use by derived - /// types.) - /// Any names specified in the per-request dictionary that aren't serialisable will be - /// discarded. - public override IEnumerable GetSerialisableMemberNames(Type itemType, object data) - { - var defaultMemberNames = base.GetSerialisableMemberNames(itemType, data); - var httpContextItems = HttpContextFactory.Current.Items; - - if (!httpContextItems.Contains(HttpContextItemKey)) return defaultMemberNames; - - var itemValue = httpContextItems[HttpContextItemKey]; - - if (!(itemValue is IEnumerable)) return defaultMemberNames; - - var requestProperties = (IEnumerable)itemValue; - - return UseCustomOrder - ? requestProperties.Where(name => defaultMemberNames.Contains(name)) - : defaultMemberNames.Where(name => requestProperties.Contains(name)); - } - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SQADActulasXlsSerialiser.cs b/src/WebApiContrib.Formatting.Xlsx/Serialisation/SQADActulasXlsSerialiser.cs deleted file mode 100644 index 0d73a9a..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Serialisation/SQADActulasXlsSerialiser.cs +++ /dev/null @@ -1,13 +0,0 @@ -using SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx.Serialisation -{ - public class SQADActulasXlsSerialiser : IXlsxSerialiser - { - } -} diff --git a/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs b/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs deleted file mode 100644 index d0f8c02..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/Utils/HttpContextFactory.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Web; - -namespace SQAD.MTNext.Utils.WebApiContrib.Formatting.Xlsx.Utils { - public class HttpContextFactory - { - private static HttpContextBase currentContext; - - public static HttpContextBase Current - { - get - { - if (currentContext != null) return currentContext; - - if (HttpContext.Current == null) - throw new InvalidOperationException("HttpContext is not available."); - - return new HttpContextWrapper(HttpContext.Current); - } - } - - public static void SetCurrentContext(HttpContextBase context) - { - HttpContextFactory.currentContext = context; - } - } -} \ No newline at end of file diff --git a/src/WebApiContrib.Formatting.Xlsx/packages.config b/src/WebApiContrib.Formatting.Xlsx/packages.config deleted file mode 100644 index baae81d..0000000 --- a/src/WebApiContrib.Formatting.Xlsx/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/FormatterUtilsTests.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/FormatterUtilsTests.cs deleted file mode 100644 index 118a831..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/FormatterUtilsTests.cs +++ /dev/null @@ -1,269 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; -using WebApiContrib.Formatting.Xlsx.Tests.TestData; -using WebApiContrib.Formatting.Xlsx.Attributes; - -namespace WebApiContrib.Formatting.Xlsx.Tests -{ - [TestClass] - public class FormatterUtilsTests - { - [TestMethod] - public void GetAttribute_ExcelColumnAttributeOfComplexTestItemValue2_ExcelColumnAttribute() - { - var value2 = typeof(ComplexTestItem).GetMember("Value2")[0]; - var excelAttribute = FormatterUtils.GetAttribute(value2); - - Assert.IsNotNull(excelAttribute); - Assert.AreEqual(2, excelAttribute.Order); - } - - [TestMethod] - public void GetAttribute_ExcelDocumentAttributeOfComplexTestItem_ExcelDocumentAttribute() - { - var complexTestItem = typeof(ComplexTestItem); - var excelAttribute = FormatterUtils.GetAttribute(complexTestItem); - - Assert.IsNotNull(excelAttribute); - Assert.AreEqual("Complex test item", excelAttribute.FileName); - } - - [TestMethod] - public void MemberOrder_SimpleTestItem_ReturnsMemberOrder() - { - var testItemType = typeof(SimpleTestItem); - var value1 = testItemType.GetMember("Value1")[0]; - var value2 = testItemType.GetMember("Value2")[0]; - - Assert.AreEqual(-1, FormatterUtils.MemberOrder(value1), "Value1 should have order -1."); - Assert.AreEqual(-1, FormatterUtils.MemberOrder(value2), "Value2 should have order -1."); - } - - [TestMethod] - public void MemberOrder_ComplexTestItem_ReturnsMemberOrder() - { - var testItemType = typeof(ComplexTestItem); - var value1 = testItemType.GetMember("Value1")[0]; - var value2 = testItemType.GetMember("Value2")[0]; - var value3 = testItemType.GetMember("Value3")[0]; - var value4 = testItemType.GetMember("Value4")[0]; - var value5 = testItemType.GetMember("Value5")[0]; - var value6 = testItemType.GetMember("Value6")[0]; - - Assert.AreEqual(-1, FormatterUtils.MemberOrder(value1), "Value1 should have order -1."); - Assert.AreEqual( 2, FormatterUtils.MemberOrder(value2), "Value2 should have order 2." ); - Assert.AreEqual( 1, FormatterUtils.MemberOrder(value3), "Value3 should have order 1." ); - Assert.AreEqual(-2, FormatterUtils.MemberOrder(value4), "Value4 should have order -2."); - Assert.AreEqual(-1, FormatterUtils.MemberOrder(value5), "Value5 should have order -1."); - Assert.AreEqual(-1, FormatterUtils.MemberOrder(value6), "Value6 should have order -1."); - } - - [TestMethod] - public void GetMemberNames_SimpleTestItem_ReturnsMemberNamesInOrder() - { - var memberNames = FormatterUtils.GetMemberNames(typeof(SimpleTestItem)); - - Assert.IsNotNull(memberNames); - Assert.AreEqual(2, memberNames.Count); - Assert.AreEqual("Value1", memberNames[0]); - Assert.AreEqual("Value2", memberNames[1]); - } - - [TestMethod] - public void GetMemberNames_ComplexTestItem_ReturnsMemberNamesInOrder() - { - var memberNames = FormatterUtils.GetMemberNames(typeof(ComplexTestItem)); - - Assert.IsNotNull(memberNames); - Assert.AreEqual(5, memberNames.Count); - Assert.AreEqual("Value4", memberNames[0]); - Assert.AreEqual("Value1", memberNames[1]); - Assert.AreEqual("Value5", memberNames[2]); - Assert.AreEqual("Value3", memberNames[3]); - Assert.AreEqual("Value2", memberNames[4]); - } - - [TestMethod] - public void GetMemberNames_AnonymousType_ReturnsMemberNamesInOrderDefined() - { - var anonymous = new { prop1 = "value1", prop2 = "value2" }; - var memberNames = FormatterUtils.GetMemberNames(anonymous.GetType()); - - Assert.IsNotNull(memberNames); - Assert.AreEqual(2, memberNames.Count); - Assert.AreEqual("prop1", memberNames[0]); - Assert.AreEqual("prop2", memberNames[1]); - } - - [TestMethod] - public void GetMemberInfo_SimpleTestItem_ReturnsMemberInfoList() - { - var memberInfo = FormatterUtils.GetMemberInfo(typeof(SimpleTestItem)); - - Assert.IsNotNull(memberInfo); - Assert.AreEqual(2, memberInfo.Count); - } - - [TestMethod] - public void GetMemberInfo_AnonymousType_ReturnsMemberInfoList() - { - var anonymous = new { prop1 = "value1", prop2 = "value2" }; - var memberInfo = FormatterUtils.GetMemberInfo(anonymous.GetType()); - - Assert.IsNotNull(memberInfo); - Assert.AreEqual(2, memberInfo.Count); - } - - [TestMethod] - public void GetEnumerableItemType_ListOfSimpleTestItem_ReturnsTestItemType() - { - var testItemList = typeof(List); - var itemType = FormatterUtils.GetEnumerableItemType(testItemList); - - Assert.IsNotNull(itemType); - Assert.AreEqual(typeof(SimpleTestItem), itemType); - } - - [TestMethod] - public void GetEnumerableItemType_IEnumerableOfSimpleTestItem_ReturnsTestItemType() - { - var testItemList = typeof(IEnumerable); - var itemType = FormatterUtils.GetEnumerableItemType(testItemList); - - Assert.IsNotNull(itemType); - Assert.AreEqual(typeof(SimpleTestItem), itemType); - } - - [TestMethod] - public void GetEnumerableItemType_ArrayOfSimpleTestItem_ReturnsTestItemType() - { - var testItemArray = typeof(SimpleTestItem[]); - var itemType = FormatterUtils.GetEnumerableItemType(testItemArray); - - Assert.IsNotNull(itemType); - Assert.AreEqual(typeof(SimpleTestItem), itemType); - } - - [TestMethod] - public void GetEnumerableItemType_ArrayOfAnonymousObject_ReturnsTestItemType() - { - var anonymous = new { prop1 = "value1", prop2 = "value2" }; - var anonymousArray = new[] { anonymous }; - - var itemType = FormatterUtils.GetEnumerableItemType(anonymousArray.GetType()); - - Assert.IsNotNull(itemType); - Assert.AreEqual(anonymous.GetType(), itemType); - } - - [TestMethod] - public void GetEnumerableItemType_ListOfAnonymousObject_ReturnsTestItemType() - { - var anonymous = new { prop1 = "value1", prop2 = "value2" }; - var anonymousList = new[] { anonymous }.ToList(); - - var itemType = FormatterUtils.GetEnumerableItemType(anonymousList.GetType()); - - Assert.IsNotNull(itemType); - Assert.AreEqual(anonymous.GetType(), itemType); - } - - [TestMethod] - public void GetFieldOrPropertyValue_ComplexTestItem_ReturnsPropertyValues() - { - var obj = new ComplexTestItem() { - Value1 = "Value 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.Second, - Value6 = "Value 6" - }; - - Assert.AreEqual(obj.Value1, FormatterUtils.GetFieldOrPropertyValue(obj, "Value1")); - Assert.AreEqual(obj.Value2, FormatterUtils.GetFieldOrPropertyValue(obj, "Value2")); - Assert.AreEqual(obj.Value3, FormatterUtils.GetFieldOrPropertyValue(obj, "Value3")); - Assert.AreEqual(obj.Value4, FormatterUtils.GetFieldOrPropertyValue(obj, "Value4")); - Assert.AreEqual(obj.Value5, FormatterUtils.GetFieldOrPropertyValue(obj, "Value5")); - Assert.AreEqual(obj.Value6, FormatterUtils.GetFieldOrPropertyValue(obj, "Value6")); - } - - [TestMethod] - public void GetFieldOrPropertyValueT_ComplexTestItem_ReturnsPropertyValues() - { - var obj = new ComplexTestItem() { - Value1 = "Value 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.Second, - Value6 = "Value 6" - }; - - Assert.AreEqual(obj.Value1, FormatterUtils.GetFieldOrPropertyValue(obj, "Value1")); - Assert.AreEqual(obj.Value2, FormatterUtils.GetFieldOrPropertyValue(obj, "Value2")); - Assert.AreEqual(obj.Value3, FormatterUtils.GetFieldOrPropertyValue(obj, "Value3")); - Assert.AreEqual(obj.Value4, FormatterUtils.GetFieldOrPropertyValue(obj, "Value4")); - Assert.AreEqual(obj.Value5, FormatterUtils.GetFieldOrPropertyValue(obj, "Value5")); - Assert.AreEqual(obj.Value6, FormatterUtils.GetFieldOrPropertyValue(obj, "Value6")); - } - - [TestMethod] - public void GetFieldOrPropertyValue_AnonymousObject_ReturnsPropertyValues() - { - var obj = new { prop1 = "test", prop2 = 2.0, prop3 = DateTime.Today }; - - Assert.AreEqual(obj.prop1, FormatterUtils.GetFieldOrPropertyValue(obj, "prop1")); - Assert.AreEqual(obj.prop2, FormatterUtils.GetFieldOrPropertyValue(obj, "prop2")); - Assert.AreEqual(obj.prop3, FormatterUtils.GetFieldOrPropertyValue(obj, "prop3")); - } - - [TestMethod] - public void GetFieldOrPropertyValueT_AnonymousObject_ReturnsPropertyValues() - { - var obj = new { prop1 = "test", prop2 = 2.0, prop3 = DateTime.Today }; - - Assert.AreEqual(obj.prop1, FormatterUtils.GetFieldOrPropertyValue(obj, "prop1")); - Assert.AreEqual(obj.prop2, FormatterUtils.GetFieldOrPropertyValue(obj, "prop2")); - Assert.AreEqual(obj.prop3, FormatterUtils.GetFieldOrPropertyValue(obj, "prop3")); - } - - [TestMethod] - public void IsSimpleType_SimpleTypes_ReturnsTrue() - { - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(bool))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(byte))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(sbyte))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(char))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(DateTime))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(DateTimeOffset))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(decimal))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(double))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(float))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(Guid))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(int))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(uint))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(long))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(ulong))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(short))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(TimeSpan))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(ushort))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(string))); - Assert.IsTrue(FormatterUtils.IsSimpleType(typeof(TestEnum))); - } - - [TestMethod] - public void IsSimpleType_ComplexTypes_ReturnsFalse() - { - var anonymous = new { prop = "val" }; - - Assert.IsFalse(FormatterUtils.IsSimpleType(anonymous.GetType())); - Assert.IsFalse(FormatterUtils.IsSimpleType(typeof(Array))); - Assert.IsFalse(FormatterUtils.IsSimpleType(typeof(IEnumerable<>))); - Assert.IsFalse(FormatterUtils.IsSimpleType(typeof(object))); - Assert.IsFalse(FormatterUtils.IsSimpleType(typeof(SimpleTestItem))); - } - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/Properties/AssemblyInfo.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index c64e2ff..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("WebApiContrib.Formatters.Xlsx unit tests")] -[assembly: AssemblyDescription("Unit tests for the WebApiContrib.Formatters.Xlsx project")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("WebApiContrib")] -[assembly: AssemblyProduct("WebApiContrib.Formatting.Xlsx.Tests")] -[assembly: AssemblyCopyright("2014 Jordan Gray, WebApiContrib team")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: Guid("354d91e0-c63a-4235-b4d5-cc058999787f")] -[assembly: AssemblyVersion("2.0.*")] -[assembly: AssemblyInformationalVersion("2.0.0-pre")] diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/BooleanTestItem.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/BooleanTestItem.cs deleted file mode 100644 index 23860f2..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/BooleanTestItem.cs +++ /dev/null @@ -1,17 +0,0 @@ -using WebApiContrib.Formatting.Xlsx.Attributes; - -namespace WebApiContrib.Formatting.Xlsx.Tests.TestData -{ - public class BooleanTestItem - { - public bool Value1 { get; set; } - - [ExcelColumn(TrueValue="Yes", FalseValue="No")] - public bool Value2 { get; set; } - - public bool? Value3 { get; set; } - - [ExcelColumn(TrueValue = "Yes", FalseValue = "No")] - public bool? Value4 { get; set; } - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/ComplexTestItem.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/ComplexTestItem.cs deleted file mode 100644 index 98e21dd..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/ComplexTestItem.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using WebApiContrib.Formatting.Xlsx.Attributes; - -namespace WebApiContrib.Formatting.Xlsx.Tests.TestData -{ - [ExcelDocument("Complex test item")] - public class ComplexTestItem - { - public string Value1 { get; set; } - - [ExcelColumn(Order = 2)] - public DateTime Value2 { get; set; } - - [ExcelColumn(Header = "Header 3", Order = 1)] - public bool Value3 { get; set; } - - [ExcelColumn(Header = "Header 4", Order = -2, NumberFormat = "???.???")] - public double Value4 { get; set; } - - [ExcelColumn(Header = "Header 5")] - public TestEnum Value5 { get; set; } - - [ExcelColumn(Ignore = true)] - public string Value6 { get; set; } - } - - public enum TestEnum - { - First, - Second - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/FormatStringTestItem.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/FormatStringTestItem.cs deleted file mode 100644 index 2a58cb1..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/FormatStringTestItem.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using WebApiContrib.Formatting.Xlsx.Attributes; - -namespace WebApiContrib.Formatting.Xlsx.Tests.TestData -{ - public class FormatStringTestItem - { - [DisplayFormat(DataFormatString = "{0:D}")] - public DateTime Value1 { get; set; } - - [DisplayFormat(DataFormatString = "{0:D}")] - [ExcelColumn(UseDisplayFormatString = true)] - public DateTime? Value2 { get; set; } - - [DisplayFormat(DataFormatString = "{0:D}")] - [ExcelColumn(UseDisplayFormatString = false)] - public DateTime? Value3 { get; set; } - - [ExcelColumn(UseDisplayFormatString = true)] - public DateTime Value4 { get; set; } - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/SimpleTestItem.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/SimpleTestItem.cs deleted file mode 100644 index c5c871a..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/TestData/SimpleTestItem.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Tests.TestData -{ - public class SimpleTestItem - { - public string Value1 { get; set; } - public string Value2 { get; set; } - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/WebApiContrib.Formatting.Xlsx.Tests.csproj b/test/WebApiContrib.Formatting.Xlsx.Tests/WebApiContrib.Formatting.Xlsx.Tests.csproj deleted file mode 100644 index c6d8cef..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/WebApiContrib.Formatting.Xlsx.Tests.csproj +++ /dev/null @@ -1,118 +0,0 @@ - - - - Debug - AnyCPU - {91831A5B-8286-466A-8CC5-07A630493D9B} - Library - Properties - WebApiContrib.Formatting.Xlsx.Tests - WebApiContrib.Formatting.Xlsx.Tests - v4.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - ..\..\ - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\EPPlus.4.1.0\lib\net40\EPPlus.dll - - - - ..\..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll - True - - - - - - ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {b6a319b2-82a4-41ba-a895-4fc02a0d53ef} - WebApiContrib.Formatting.Xlsx - - - - - - - False - - - False - - - False - - - False - - - - - - - - - \ No newline at end of file diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/XlsxMediaTypeFormatterTests.cs b/test/WebApiContrib.Formatting.Xlsx.Tests/XlsxMediaTypeFormatterTests.cs deleted file mode 100644 index 3a9e27a..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/XlsxMediaTypeFormatterTests.cs +++ /dev/null @@ -1,596 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using OfficeOpenXml; -using OfficeOpenXml.Style; -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Security.Authentication.ExtendedProtection; -using System.Threading.Tasks; -using System.Web; -using WebApiContrib.Formatting.Xlsx.Serialisation; -using WebApiContrib.Formatting.Xlsx.Tests.TestData; -using WebApiContrib.Formatting.Xlsx.Utils; -using System.Collections; - -namespace WebApiContrib.Formatting.Xlsx.Tests -{ - [TestClass] - public class XlsxMediaTypeFormatterTests - { - const string XlsMimeType = "application/vnd.ms-excel"; - const string XlsxMimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; - - [TestMethod] - public void SupportedMediaTypes_SupportsExcelMediaTypes() - { - var formatter = new XlsxMediaTypeFormatter(); - - Assert.IsTrue(formatter.SupportedMediaTypes.Any(s => s.MediaType == XlsMimeType), - "XLS media type not supported."); - - Assert.IsTrue(formatter.SupportedMediaTypes.Any(s => s.MediaType == XlsxMimeType), - "XLSX media type not supported."); - } - - [TestMethod] - public void CanWriteType_AnyType_ReturnsTrue() - { - var types = new[] { // Simple types - typeof(bool), typeof(byte), typeof(sbyte), typeof(char), - typeof(DateTime), typeof(DateTimeOffset), typeof(decimal), - typeof(float), typeof(Guid), typeof(int), typeof(uint), - typeof(long), typeof(ulong), typeof(short), typeof(ushort), - typeof(TimeSpan), typeof(string), typeof(TestEnum), - - // Complex types - new { anonymous = true }.GetType(), typeof(Array), - typeof(IEnumerable<>), typeof(object), typeof(SimpleTestItem) }; - - - var formatter = new XlsxMediaTypeFormatter(); - - foreach (var type in types) - { - Assert.IsTrue(formatter.CanWriteType(type)); - } - } - - [TestMethod] - public void CanReadType_TypeObject_ReturnsFalse() - { - var formatter = new XlsxMediaTypeFormatter(); - - Assert.IsFalse(formatter.CanReadType(typeof(object))); - } - - [TestMethod] - public void WriteToStreamAsync_WithListOfSimpleTestItem_WritesExcelDocumentToStream() - { - var data = new[] { new SimpleTestItem { Value1 = "2,1", Value2 = "2,2" }, - new SimpleTestItem { Value1 = "3,1", Value2 = "3,2" } }.ToList(); - - var expected = new[] { new object[] { "Value1", "Value2" }, - new object[] { data[0].Value1, data[0].Value2 }, - new object[] { data[1].Value1, data[1].Value2 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfSimpleTestItem_WritesExcelDocumentToStream() - { - var data = new[] { new SimpleTestItem { Value1 = "2,1", Value2 = "2,2" }, - new SimpleTestItem { Value1 = "3,1", Value2 = "3,2" } }; - - var expected = new[] { new object[] { "Value1", "Value2" }, - new object[] { data[0].Value1, data[0].Value2 }, - new object[] { data[1].Value1, data[1].Value2 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfFormatStringTestItem_ValuesFormattedAppropriately() - { - var tomorrow = DateTime.Today.AddDays(1); - var formattedDate = tomorrow.ToString("D"); - - // Let 1 Jan 1990 = day 1 and add 1 for each day since, counting 1990 as a leap year due to an Excel bug. - var excelDate = (tomorrow - new DateTime(1900, 1, 1)).TotalDays + 2; - var excelDateStr = excelDate.ToString(); - - - var data = new[] { new FormatStringTestItem { Value1 = tomorrow, - Value2 = tomorrow, - Value3 = tomorrow, - Value4 = tomorrow }, - - new FormatStringTestItem { Value1 = tomorrow, - Value2 = null, - Value3 = null, - Value4 = tomorrow } }; - - var expected = new[] { new[] { "Value1", "Value2", "Value3", "Value4" }, - new[] { excelDateStr, formattedDate, excelDateStr, excelDateStr }, - new[] { excelDateStr, string.Empty, string.Empty, excelDateStr } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfBooleanTestItem_TrueOrFalseValueUsedAsAppropriate() - { - var data = new[] { new BooleanTestItem { Value1 = true, - Value2 = true, - Value3 = true, - Value4 = true }, - - new BooleanTestItem { Value1 = false, - Value2 = false, - Value3 = false, - Value4 = false }, - - new BooleanTestItem { Value1 = true, - Value2 = true, - Value3 = null, - Value4 = null } }; - - var expected = new[] { new[] { "Value1", "Value2", "Value3", "Value4" }, - new[] { "True", "Yes", "True", "Yes" }, - new[] { "False", "No", "False", "No" }, - new[] { "True", "Yes", string.Empty, string.Empty } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithSimpleTestItem_WritesExcelDocumentToStream() - { - var data = new SimpleTestItem { Value1 = "2,1", Value2 = "2,2" }; - - var expected = new[] { new[] { "Value1", "Value2" }, - new[] { data.Value1, data.Value2 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithEmptyListOfComplexTestItem_DoesNotCrash() - { - var data = new ComplexTestItem[0]; - - var expected = new[] { new object[] { "Header 4", "Value1", "Header 5", "Header 3", "Value2" } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithComplexTestItem_WritesExcelDocumentToStream() - { - var data = new ComplexTestItem { Value1 = "Item 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.First, - Value6 = "Ignored" }; - - var expected = new[] { new object[] { "Header 4", "Value1", "Header 5", "Header 3", "Value2" }, - new object[] { data.Value4, data.Value1, data.Value5.ToString(), data.Value3.ToString(), data.Value2 } }; - - var sheet = GenerateAndCompareWorksheet(data, expected); - - Assert.AreEqual("???.???", sheet.Cells[2, 1].Style.Numberformat.Format, "NumberFormat of A2 is incorrect."); - } - - [TestMethod] - public void WriteToStreamAsync_WithListOfComplexTestItem_WritesExcelDocumentToStream() - { - var data = new[] { new ComplexTestItem { Value1 = "Item 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.First, - Value6 = "Ignored" }, - - new ComplexTestItem { Value1 = "Item 2", - Value2 = DateTime.Today.AddDays(1), - Value3 = false, - Value4 = 200.2, - Value5 = TestEnum.Second, - Value6 = "Also ignored" } }.ToList(); - - - var expected = new[] { new object[] { "Header 4", "Value1", "Header 5", "Header 3", "Value2" }, - new object[] { data[0].Value4, data[0].Value1, data[0].Value5.ToString(), data[0].Value3.ToString(), data[0].Value2 }, - new object[] { data[1].Value4, data[1].Value1, data[1].Value5.ToString(), data[1].Value3.ToString(), data[1].Value2 } }; - - var sheet = GenerateAndCompareWorksheet(data, expected); - - Assert.AreEqual("???.???", sheet.Cells[2, 1].Style.Numberformat.Format, "NumberFormat of A2 is incorrect."); - Assert.AreEqual("???.???", sheet.Cells[3, 1].Style.Numberformat.Format, "NumberFormat of A3 is incorrect."); - } - - [TestMethod] - public void WriteToStreamAsync_WithAnonymousObject_WritesExcelDocumentToStream() - { - var data = new { prop1 = "val1", prop2 = 1.0, prop3 = DateTime.Today }; - - var expected = new[] { new object[] { "prop1", "prop2", "prop3" }, - new object[] { data.prop1, data.prop2, data.prop3 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfAnonymousObject_WritesExcelDocumentToStream() - { - var data = new[] { - new { prop1 = "val1", prop2 = 1.0, prop3 = DateTime.Today }, - new { prop1 = "val2", prop2 = 2.0, prop3 = DateTime.Today.AddDays(1) } - }; - - var expected = new[] { new object[] { "prop1", "prop2", "prop3" }, - new object[] { data[0].prop1, data[0].prop2, data[0].prop3 }, - new object[] { data[1].prop1, data[1].prop2, data[1].prop3 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithString_WritesExcelDocumentToStream() - { - var data = "Test"; - - var expected = new[] { new[] { data } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfString_WritesExcelDocumentToStream() - { - var data = new[] { "1,1", "2,1" }; - - var expected = new[] { new[] { data[0] }, - new[] { data[1] } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithInt32_WritesExcelDocumentToStream() - { - var data = 100; - - var expected = new[] { new[] { data } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfInt32_WritesExcelDocumentToStream() - { - var data = new[] { 100, 200 }; - - var expected = new[] { new[] { data[0] }, - new[] { data[1] } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithDateTime_WritesExcelDocumentToStream() - { - var data = DateTime.Today; - - var expected = new[] { new object[] { data } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfDateTime_WritesExcelDocumentToStream() - { - var data = new[] { DateTime.Today, DateTime.Today.AddDays(1) }; - - var expected = new[] { new[] { data[0] }, - new[] { data[1] } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithExpandoObject_WritesExcelDocumentToStream() - { - dynamic data = new ExpandoObject(); - - data.Value1 = "Test"; - data.Value2 = 1; - - var expected = new[] { new object[] { "Value1", "Value2" }, - new object[] { data.Value1, data.Value2 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void WriteToStreamAsync_WithArrayOfExpandoObject_WritesExcelDocumentToStream() - { - dynamic row1 = new ExpandoObject(); - dynamic row2 = new ExpandoObject(); - - row1.Value1 = "Test"; - row1.Value2 = 1; - row2.Value1 = true; - row2.Value2 = DateTime.Today; - - var data = new[] { row1, row2 }; - - var expected = new[] { new object[] { "Value1", "Value2" }, - new object[] { data[0].Value1, data[0].Value2 }, - new object[] { data[1].Value1, data[1].Value2 } }; - - GenerateAndCompareWorksheet(data, expected); - } - - [TestMethod] - public void XlsxMediaTypeFormatter_WithDefaultHeaderHeight_DefaultsToSameHeightForAllCells() - { - var data = new[] { new SimpleTestItem { Value1 = "A1", Value2 = "B1" }, - new SimpleTestItem { Value1 = "A1", Value2 = "B2" } }; - - var formatter = new XlsxMediaTypeFormatter(); - - var sheet = GetWorksheetFromStream(formatter, data); - - Assert.AreNotEqual(sheet.Row(1).Height, 0d, "HeaderHeight should not be zero"); - Assert.AreEqual(sheet.Row(1).Height, sheet.Row(2).Height, "HeaderHeight should be the same as other rows"); - } - - [TestMethod] - public void WriteToStreamAsync_WithCellAndHeaderFormats_WritesFormattedExcelDocumentToStream() - { - var data = new[] { new SimpleTestItem { Value1 = "2,1", Value2 = "2,2" }, - new SimpleTestItem { Value1 = "3,1", Value2 = "3,2" } }; - - var formatter = new XlsxMediaTypeFormatter( - cellStyle: (ExcelStyle s) => - { - s.Font.Size = 15f; - s.Font.Bold = true; - }, - headerStyle: (ExcelStyle s) => - { - s.Font.Size = 18f; - s.Border.Bottom.Style = ExcelBorderStyle.Thick; - } - ); - - var sheet = GetWorksheetFromStream(formatter, data); - - Assert.IsTrue(sheet.Cells[1, 1].Style.Font.Bold, "Header in A1 should be bold."); - Assert.IsTrue(sheet.Cells[3, 3].Style.Font.Bold, "Value in C3 should be bold."); - Assert.AreEqual(18f, sheet.Cells[1, 1].Style.Font.Size, "Header in A1 should be in size 18 font."); - Assert.AreEqual(18f, sheet.Cells[1, 3].Style.Font.Size, "Header in C1 should be in size 18 font."); - Assert.AreEqual(15f, sheet.Cells[2, 1].Style.Font.Size, "Value in A2 should be in size 15 font."); - Assert.AreEqual(15f, sheet.Cells[3, 3].Style.Font.Size, "Value in C3 should be in size 15 font."); - Assert.AreEqual(ExcelBorderStyle.Thick, sheet.Cells[1, 1].Style.Border.Bottom.Style, "Header in A1 should have a thick border."); - Assert.AreEqual(ExcelBorderStyle.Thick, sheet.Cells[1, 3].Style.Border.Bottom.Style, "Header in C1 should have a thick border."); - Assert.AreEqual(ExcelBorderStyle.None, sheet.Cells[2, 1].Style.Border.Bottom.Style, "Value in A2 should have no border."); - Assert.AreEqual(ExcelBorderStyle.None, sheet.Cells[3, 3].Style.Border.Bottom.Style, "Value in C3 should have no border."); - } - - [TestMethod] - public void WriteToStreamAsync_WithHeaderRowHeight_WritesFormattedExcelDocumentToStream() - { - var data = new[] { new SimpleTestItem { Value1 = "2,1", Value2 = "2,2" }, - new SimpleTestItem { Value1 = "3,1", Value2 = "3,2" } }; - - var formatter = new XlsxMediaTypeFormatter(headerHeight: 30f); - - var sheet = GetWorksheetFromStream(formatter, data); - - Assert.AreEqual(30f, sheet.Row(1).Height, "Row 1 should have height 30."); - } - - [TestMethod] - public void XlsxMediaTypeFormatter_WithPerRequestColumnResolver_ReturnsSpecifiedProperties() - { - - var data = new[] { new ComplexTestItem { Value1 = "Item 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.First, - Value6 = "Ignored" }, - - new ComplexTestItem { Value1 = "Item 2", - Value2 = DateTime.Today.AddDays(1), - Value3 = false, - Value4 = 200.2, - Value5 = TestEnum.Second, - Value6 = "Also ignored" } }.ToList(); - - - var expected = new[] { new object[] { "Header 4", "Value1", "Header 5" }, - new object[] { data[0].Value4, data[0].Value1, data[0].Value5.ToString() }, - new object[] { data[1].Value4, data[1].Value1, data[1].Value5.ToString() } }; - - var serialiseValues = new[] { "Value1", "Value4", "Value5" }; - - var formatter = new XlsxMediaTypeFormatter(); - formatter.DefaultSerializer.Resolver = new PerRequestColumnResolver(); - - HttpContextFactory.SetCurrentContext(new FakeHttpContext()); - HttpContextFactory.Current.Items[PerRequestColumnResolver.DEFAULT_KEY] = serialiseValues; - - var sheet = GenerateAndCompareWorksheet(data, expected, formatter); - } - - [TestMethod] - public void XlsxMediaTypeFormatter_WithPerRequestColumnResolverCustomOrder_ReturnsSpecifiedProperties() - { - - var data = new[] { new ComplexTestItem { Value1 = "Item 1", - Value2 = DateTime.Today, - Value3 = true, - Value4 = 100.1, - Value5 = TestEnum.First, - Value6 = "Ignored" }, - - new ComplexTestItem { Value1 = "Item 2", - Value2 = DateTime.Today.AddDays(1), - Value3 = false, - Value4 = 200.2, - Value5 = TestEnum.Second, - Value6 = "Also ignored" } }.ToList(); - - - var expected = new[] { new object[] { "Value1", "Header 4", "Header 5" }, - new object[] { data[0].Value1, data[0].Value4, data[0].Value5.ToString() }, - new object[] { data[1].Value1, data[1].Value4, data[1].Value5.ToString() } }; - - var serialiseValues = new[] { "Value1", "Value4", "Value5" }; - - var formatter = new XlsxMediaTypeFormatter(); - formatter.DefaultSerializer.Resolver = new PerRequestColumnResolver(useCustomOrder: true); - - HttpContextFactory.SetCurrentContext(new FakeHttpContext()); - HttpContextFactory.Current.Items[PerRequestColumnResolver.DEFAULT_KEY] = serialiseValues; - - var sheet = GenerateAndCompareWorksheet(data, expected, formatter); - } - - #region Fakes and test-related classes - public class FakeContent : HttpContent - { - public FakeContent() : base() { } - - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) - { - throw new NotImplementedException(); - } - - protected override bool TryComputeLength(out long length) - { - throw new NotImplementedException(); - } - } - - public class FakeTransport : TransportContext - { - public override ChannelBinding GetChannelBinding(ChannelBindingKind kind) - { - throw new NotImplementedException(); - } - } - - public class FakeHttpContext : HttpContextBase - { - private IDictionary _items = new Dictionary(); - - public override IDictionary Items - { - get - { - return _items; - } - } - } - #endregion - - #region Utilities - /// - /// Generate the serialised worksheet and ensure that it is formatted as expected. - /// - /// Type of items to be serialised. - /// Type of items in expected results array, usually object. - /// Data to be serialised. - /// Expected format of the generated worksheet. - /// Optional custom formatter instance to use for serialisation. - /// The generated ExcelWorksheet containing the serialised data. - public ExcelWorksheet GenerateAndCompareWorksheet(TItem data, - TExpected[][] expected, - XlsxMediaTypeFormatter formatter = null) - { - var sheet = GetWorksheetFromStream(formatter ?? new XlsxMediaTypeFormatter(), data); - - CompareWorksheet(sheet, expected); - - return sheet; - } - - /// - /// Generate a worksheet containing the specified data using the provided XlsxMediaTypeFormatter - /// instance. - /// - /// Type of items to be serialised. - /// Formatter instance to use for serialisation. - /// Data to be serialised. - /// - public ExcelWorksheet GetWorksheetFromStream(XlsxMediaTypeFormatter formatter, TItem data) - { - var ms = new MemoryStream(); - - var content = new FakeContent(); - content.Headers.ContentType = new MediaTypeHeaderValue("application/atom+xml"); - - var task = formatter.WriteToStreamAsync(typeof(IEnumerable), - data, - ms, - content, - new FakeTransport()); - - task.Wait(); - - ms.Seek(0, SeekOrigin.Begin); - - var package = new ExcelPackage(ms); - return package.Workbook.Worksheets[1]; - - } - - /// - /// Ensure that the data in a generated worksheet is serialised as expected. - /// - /// Type of items in expected results array, usually object. - /// The generated ExcelWorksheet containing the serialised data. - /// Expected format of the generated worksheet. - public void CompareWorksheet(ExcelWorksheet sheet, TExpected[][] expected) - { - Assert.IsNotNull(sheet.Dimension, "Worksheet has no cells."); - - Assert.AreEqual(expected.Length, sheet.Dimension.End.Row, "Wrong number of rows."); - Assert.AreEqual(expected[0].Length, sheet.Dimension.End.Column, "Wrong number of columns."); - - for (var i = 0; i < expected.Length; i++) - { - for (var j = 0; j < expected[i].Length; j++) - { - var value = expected[i][j]; - - var method = typeof(ExcelWorksheet).GetMethods() - .Where(m => m.Name == "GetValue") - .First(m => m.ContainsGenericParameters); - - var type = typeof(TExpected) == typeof(object) ? value.GetType() : typeof(TExpected); - - var cellValue = method.MakeGenericMethod(type) - .Invoke(sheet, new object[] { i + 1, j + 1 }); - - var column = (char)('A' + j); - var row = i + 1; - var message = String.Format("Value in {0}{1} is incorrect.", column, row); - - Assert.AreEqual(value, cellValue, message); - } - } - } - #endregion - } -} diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/app.config b/test/WebApiContrib.Formatting.Xlsx.Tests/app.config deleted file mode 100644 index de5386a..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config b/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config deleted file mode 100644 index 54db11c..0000000 --- a/test/WebApiContrib.Formatting.Xlsx.Tests/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tools/psake/default.ps1 b/tools/psake/default.ps1 deleted file mode 100644 index 3a4aa13..0000000 --- a/tools/psake/default.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -Properties { - $base_dir = resolve-path .\..\..\ - $packages_dir = "$base_dir\packages" - $build_artifacts_dir = "$base_dir\build" - $solution_name = "$base_dir\WebApiContrib.Formatting.Xlsx.sln" - $test_dll = "$build_artifacts_dir\WebApiContrib.Formatting.Xlsx.Tests.dll" - $nuget_exe = "$base_dir\.nuget\Nuget.exe" - $test_result_path = "$base_dir\TestResults\" - $test_result_file = [System.IO.Path]::Combine($test_result_path, "TestResults.trx") - $vscomntools_path = VSCommonToolsPath - $mstest_path = (Get-Item $vscomntools_path).Parent.FullName - $mstest_exe = [System.IO.Path]::Combine($mstest_path, "IDE\MSTest.exe") -} - -Task Default -Depends BuildWebApiContrib, RunUnitTests, NuGetBuild - -Task BuildWebApiContrib -Depends Clean, Build - -Task Clean { - Exec { msbuild $solution_name /v:Quiet /t:Clean /p:Configuration=Release } -} - -Task Build -depends Clean { - Exec { msbuild $solution_name /v:Quiet /t:Build /p:Configuration=Release /p:OutDir=$build_artifacts_dir\ } -} - -Task NuGetBuild -depends Clean { - & $nuget_exe pack "$base_dir/src/WebApiContrib.Formatting.Xlsx/WebApiContrib.Formatting.Xlsx.csproj" -Build -OutputDirectory $build_artifacts_dir -Verbose -Properties Configuration=Release -} - -Task RunUnitTests -depends Build { - New-Item -ItemType Directory -Force -Path "$test_result_path" - $test_arguments = @("/resultsFile:$test_result_file") - $test_arguments += "/testcontainer:$test_dll" - - If (Test-Path $test_result_file) { Remove-Item $test_result_file } - - # psake will terminate the execution if mstest throws an exception. - Exec { & $mstest_exe $test_arguments } -} - -# Find VS Common Tools directory path for the most recent version of Visual Studio. -Function VSCommonToolsPath { - If (Test-Path Env:VS150COMNTOOLS) { Return (Get-ChildItem env:VS150COMNTOOLS).Value } - If (Test-Path Env:VS140COMNTOOLS) { Return (Get-ChildItem env:VS140COMNTOOLS).Value } - If (Test-Path Env:VS130COMNTOOLS) { Return (Get-ChildItem env:VS130COMNTOOLS).Value } - If (Test-Path Env:VS120COMNTOOLS) { Return (Get-ChildItem env:VS120COMNTOOLS).Value } - If (Test-Path Env:VS110COMNTOOLS) { Return (Get-ChildItem env:VS110COMNTOOLS).Value } - If (Test-Path Env:VS100COMNTOOLS) { Return (Get-ChildItem env:VS100COMNTOOLS).Value } - If (Test-Path Env:VS90COMNTOOLS ) { Return (Get-ChildItem env:VS90COMNTOOLS).Value } - If (Test-Path Env:VS80COMNTOOLS ) { Return (Get-ChildItem env:VS80COMNTOOLS).Value } -} \ No newline at end of file diff --git a/tools/psake/psake.bat b/tools/psake/psake.bat deleted file mode 100644 index 1135dc0..0000000 --- a/tools/psake/psake.bat +++ /dev/null @@ -1 +0,0 @@ -powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "& {Import-Module '.\tools\psake\psake.psm1'; invoke-psake .\tools\psake\default.ps1 %1 -parameters @{"version"="'%2'";"appPrefix"="'%3'";"filePath"="'%4'"}; if ($lastexitcode -ne 0) {write-host "ERROR: $lastexitcode" -fore RED; exit $lastexitcode} }" \ No newline at end of file diff --git a/tools/psake/psake.psm1 b/tools/psake/psake.psm1 deleted file mode 100644 index c0d8ded..0000000 --- a/tools/psake/psake.psm1 +++ /dev/null @@ -1,847 +0,0 @@ -# psake -# Copyright (c) 2012 James Kovacs -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -#Requires -Version 2.0 - -#-- Public Module Functions --# - -# .ExternalHelp psake.psm1-help.xml -function Invoke-Task -{ - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)] [string]$taskName - ) - - Assert $taskName ($msgs.error_invalid_task_name) - - $taskKey = $taskName.ToLower() - - if ($currentContext.aliases.Contains($taskKey)) { - $taskName = $currentContext.aliases.$taskKey.Name - $taskKey = $taskName.ToLower() - } - - $currentContext = $psake.context.Peek() - - Assert ($currentContext.tasks.Contains($taskKey)) ($msgs.error_task_name_does_not_exist -f $taskName) - - if ($currentContext.executedTasks.Contains($taskKey)) { return } - - Assert (!$currentContext.callStack.Contains($taskKey)) ($msgs.error_circular_reference -f $taskName) - - $currentContext.callStack.Push($taskKey) - - $task = $currentContext.tasks.$taskKey - - $precondition_is_valid = & $task.Precondition - - if (!$precondition_is_valid) { - WriteColoredOutput ($msgs.precondition_was_false -f $taskName) -foregroundcolor Cyan - } else { - if ($taskKey -ne 'default') { - - if ($task.PreAction -or $task.PostAction) { - Assert ($task.Action -ne $null) ($msgs.error_missing_action_parameter -f $taskName) - } - - if ($task.Action) { - try { - foreach($childTask in $task.DependsOn) { - Invoke-Task $childTask - } - - $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() - $currentContext.currentTaskName = $taskName - - & $currentContext.taskSetupScriptBlock - - if ($task.PreAction) { - & $task.PreAction - } - - if ($currentContext.config.taskNameFormat -is [ScriptBlock]) { - & $currentContext.config.taskNameFormat $taskName - } else { - WriteColoredOutput ($currentContext.config.taskNameFormat -f $taskName) -foregroundcolor Cyan - } - - foreach ($variable in $task.requiredVariables) { - Assert ((test-path "variable:$variable") -and ((get-variable $variable).Value -ne $null)) ($msgs.required_variable_not_set -f $variable, $taskName) - } - - & $task.Action - - if ($task.PostAction) { - & $task.PostAction - } - - & $currentContext.taskTearDownScriptBlock - $task.Duration = $stopwatch.Elapsed - } catch { - if ($task.ContinueOnError) { - "-"*70 - WriteColoredOutput ($msgs.continue_on_error -f $taskName,$_) -foregroundcolor Yellow - "-"*70 - $task.Duration = $stopwatch.Elapsed - } else { - throw $_ - } - } - } else { - # no action was specified but we still execute all the dependencies - foreach($childTask in $task.DependsOn) { - Invoke-Task $childTask - } - } - } else { - foreach($childTask in $task.DependsOn) { - Invoke-Task $childTask - } - } - - Assert (& $task.Postcondition) ($msgs.postcondition_failed -f $taskName) - } - - $poppedTaskKey = $currentContext.callStack.Pop() - Assert ($poppedTaskKey -eq $taskKey) ($msgs.error_corrupt_callstack -f $taskKey,$poppedTaskKey) - - $currentContext.executedTasks.Push($taskKey) -} - -# .ExternalHelp psake.psm1-help.xml -function Exec -{ - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd, - [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd), - [Parameter(Position=2,Mandatory=0)][int]$maxRetries = 0, - [Parameter(Position=3,Mandatory=0)][string]$retryTriggerErrorPattern = $null - ) - - $tryCount = 1 - - do { - try { - $global:lastexitcode = 0 - & $cmd - if ($lastexitcode -ne 0) { - throw ("Exec: " + $errorMessage) - } - break - } - catch [Exception] - { - if ($tryCount -gt $maxRetries) { - throw $_ - } - - if ($retryTriggerErrorPattern -ne $null) { - $isMatch = [regex]::IsMatch($_.Exception.Message, $retryTriggerErrorPattern) - - if ($isMatch -eq $false) { - throw $_ - } - } - - Write-Host "Try $tryCount failed, retrying again in 1 second..." - - $tryCount++ - - [System.Threading.Thread]::Sleep([System.TimeSpan]::FromSeconds(1)) - } - } - while ($true) -} - -# .ExternalHelp psake.psm1-help.xml -function Assert -{ - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)]$conditionToCheck, - [Parameter(Position=1,Mandatory=1)]$failureMessage - ) - if (!$conditionToCheck) { - throw ("Assert: " + $failureMessage) - } -} - -# .ExternalHelp psake.psm1-help.xml -function Task -{ - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][string]$name = $null, - [Parameter(Position=1,Mandatory=0)][scriptblock]$action = $null, - [Parameter(Position=2,Mandatory=0)][scriptblock]$preaction = $null, - [Parameter(Position=3,Mandatory=0)][scriptblock]$postaction = $null, - [Parameter(Position=4,Mandatory=0)][scriptblock]$precondition = {$true}, - [Parameter(Position=5,Mandatory=0)][scriptblock]$postcondition = {$true}, - [Parameter(Position=6,Mandatory=0)][switch]$continueOnError = $false, - [Parameter(Position=7,Mandatory=0)][string[]]$depends = @(), - [Parameter(Position=8,Mandatory=0)][string[]]$requiredVariables = @(), - [Parameter(Position=9,Mandatory=0)][string]$description = $null, - [Parameter(Position=10,Mandatory=0)][string]$alias = $null, - [Parameter(Position=11,Mandatory=0)][string]$maxRetries = 0, - [Parameter(Position=12,Mandatory=0)][string]$retryTriggerErrorPattern = $null - ) - if ($name -eq 'default') { - Assert (!$action) ($msgs.error_default_task_cannot_have_action) - } - - $newTask = @{ - Name = $name - DependsOn = $depends - PreAction = $preaction - Action = $action - PostAction = $postaction - Precondition = $precondition - Postcondition = $postcondition - ContinueOnError = $continueOnError - Description = $description - Duration = [System.TimeSpan]::Zero - RequiredVariables = $requiredVariables - Alias = $alias - MaxRetries = $maxRetries - RetryTriggerErrorPattern = $retryTriggerErrorPattern - } - - $taskKey = $name.ToLower() - - $currentContext = $psake.context.Peek() - - Assert (!$currentContext.tasks.ContainsKey($taskKey)) ($msgs.error_duplicate_task_name -f $name) - - $currentContext.tasks.$taskKey = $newTask - - if($alias) - { - $aliasKey = $alias.ToLower() - - Assert (!$currentContext.aliases.ContainsKey($aliasKey)) ($msgs.error_duplicate_alias_name -f $alias) - - $currentContext.aliases.$aliasKey = $newTask - } -} - -# .ExternalHelp psake.psm1-help.xml -function Properties { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][scriptblock]$properties - ) - $psake.context.Peek().properties += $properties -} - -# .ExternalHelp psake.psm1-help.xml -function Include { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][string]$fileNamePathToInclude - ) - Assert (test-path $fileNamePathToInclude -pathType Leaf) ($msgs.error_invalid_include_path -f $fileNamePathToInclude) - $psake.context.Peek().includes.Enqueue((Resolve-Path $fileNamePathToInclude)); -} - -# .ExternalHelp psake.psm1-help.xml -function FormatTaskName { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)]$format - ) - $psake.context.Peek().config.taskNameFormat = $format -} - -# .ExternalHelp psake.psm1-help.xml -function TaskSetup { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][scriptblock]$setup - ) - $psake.context.Peek().taskSetupScriptBlock = $setup -} - -# .ExternalHelp psake.psm1-help.xml -function TaskTearDown { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][scriptblock]$teardown - ) - $psake.context.Peek().taskTearDownScriptBlock = $teardown -} - -# .ExternalHelp psake.psm1-help.xml -function Framework { - [CmdletBinding()] - param( - [Parameter(Position=0,Mandatory=1)][string]$framework - ) - $psake.context.Peek().config.framework = $framework - ConfigureBuildEnvironment -} - -# .ExternalHelp psake.psm1-help.xml -function Invoke-psake { - [CmdletBinding()] - param( - [Parameter(Position = 0, Mandatory = 0)][string] $buildFile, - [Parameter(Position = 1, Mandatory = 0)][string[]] $taskList = @(), - [Parameter(Position = 2, Mandatory = 0)][string] $framework, - [Parameter(Position = 3, Mandatory = 0)][switch] $docs = $false, - [Parameter(Position = 4, Mandatory = 0)][hashtable] $parameters = @{}, - [Parameter(Position = 5, Mandatory = 0)][hashtable] $properties = @{}, - [Parameter(Position = 6, Mandatory = 0)][alias("init")][scriptblock] $initialization = {}, - [Parameter(Position = 7, Mandatory = 0)][switch] $nologo = $false - ) - try { - if (-not $nologo) { - "psake version {0}`nCopyright (c) 2010 James Kovacs`n" -f $psake.version - } - - if (!$buildFile) { - $buildFile = $psake.config_default.buildFileName - } - elseif (!(test-path $buildFile -pathType Leaf) -and (test-path $psake.config_default.buildFileName -pathType Leaf)) { - # If the $config.buildFileName file exists and the given "buildfile" isn 't found assume that the given - # $buildFile is actually the target Tasks to execute in the $config.buildFileName script. - $taskList = $buildFile.Split(', ') - $buildFile = $psake.config_default.buildFileName - } - - # Execute the build file to set up the tasks and defaults - Assert (test-path $buildFile -pathType Leaf) ($msgs.error_build_file_not_found -f $buildFile) - - $psake.build_script_file = get-item $buildFile - $psake.build_script_dir = $psake.build_script_file.DirectoryName - $psake.build_success = $false - - $psake.context.push(@{ - "taskSetupScriptBlock" = {}; - "taskTearDownScriptBlock" = {}; - "executedTasks" = new-object System.Collections.Stack; - "callStack" = new-object System.Collections.Stack; - "originalEnvPath" = $env:path; - "originalDirectory" = get-location; - "originalErrorActionPreference" = $global:ErrorActionPreference; - "tasks" = @{}; - "aliases" = @{}; - "properties" = @(); - "includes" = new-object System.Collections.Queue; - "config" = CreateConfigurationForNewContext $buildFile $framework - }) - - LoadConfiguration $psake.build_script_dir - - $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() - - set-location $psake.build_script_dir - - LoadModules - - $frameworkOldValue = $framework - . $psake.build_script_file.FullName - - $currentContext = $psake.context.Peek() - - if ($framework -ne $frameworkOldValue) { - writecoloredoutput $msgs.warning_deprecated_framework_variable -foregroundcolor Yellow - $currentContext.config.framework = $framework - } - - ConfigureBuildEnvironment - - while ($currentContext.includes.Count -gt 0) { - $includeFilename = $currentContext.includes.Dequeue() - . $includeFilename - } - - if ($docs) { - WriteDocumentation - CleanupEnvironment - return - } - - foreach ($key in $parameters.keys) { - if (test-path "variable:\$key") { - set-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null - } else { - new-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null - } - } - - # The initial dot (.) indicates that variables initialized/modified in the propertyBlock are available in the parent scope. - foreach ($propertyBlock in $currentContext.properties) { - . $propertyBlock - } - - foreach ($key in $properties.keys) { - if (test-path "variable:\$key") { - set-item -path "variable:\$key" -value $properties.$key -WhatIf:$false -Confirm:$false | out-null - } - } - - # Simple dot sourcing will not work. We have to force the script block into our - # module's scope in order to initialize variables properly. - . $MyInvocation.MyCommand.Module $initialization - - # Execute the list of tasks or the default task - if ($taskList) { - foreach ($task in $taskList) { - invoke-task $task - } - } elseif ($currentContext.tasks.default) { - invoke-task default - } else { - throw $msgs.error_no_default_task - } - - WriteColoredOutput ("`n" + $msgs.build_success + "`n") -foregroundcolor Green - - WriteTaskTimeSummary $stopwatch.Elapsed - - $psake.build_success = $true - } catch { - $currentConfig = GetCurrentConfigurationOrDefault - if ($currentConfig.verboseError) { - $error_message = "{0}: An Error Occurred. See Error Details Below: `n" -f (Get-Date) - $error_message += ("-" * 70) + "`n" - $error_message += "Error: {0}`n" -f (ResolveError $_ -Short) - $error_message += ("-" * 70) + "`n" - $error_message += ResolveError $_ - $error_message += ("-" * 70) + "`n" - $error_message += "Script Variables" + "`n" - $error_message += ("-" * 70) + "`n" - $error_message += get-variable -scope script | format-table | out-string - } else { - # ($_ | Out-String) gets error messages with source information included. - $error_message = "Error: {0}: `n{1}" -f (Get-Date), (ResolveError $_ -Short) - } - - $psake.build_success = $false - - # if we are running in a nested scope (i.e. running a psake script from a psake script) then we need to re-throw the exception - # so that the parent script will fail otherwise the parent script will report a successful build - $inNestedScope = ($psake.context.count -gt 1) - if ( $inNestedScope ) { - throw $_ - } else { - if (!$psake.run_by_psake_build_tester) { - WriteColoredOutput $error_message -foregroundcolor Red - } - } - } finally { - CleanupEnvironment - } -} - -#-- Private Module Functions --# -function WriteColoredOutput { - param( - [string] $message, - [System.ConsoleColor] $foregroundcolor - ) - - $currentConfig = GetCurrentConfigurationOrDefault - if ($currentConfig.coloredOutput -eq $true) { - if (($Host.UI -ne $null) -and ($Host.UI.RawUI -ne $null) -and ($Host.UI.RawUI.ForegroundColor -ne $null)) { - $previousColor = $Host.UI.RawUI.ForegroundColor - $Host.UI.RawUI.ForegroundColor = $foregroundcolor - } - } - - $message - - if ($previousColor -ne $null) { - $Host.UI.RawUI.ForegroundColor = $previousColor - } -} - -function LoadModules { - $currentConfig = $psake.context.peek().config - if ($currentConfig.modules) { - - $scope = $currentConfig.moduleScope - - $global = [string]::Equals($scope, "global", [StringComparison]::CurrentCultureIgnoreCase) - - $currentConfig.modules | foreach { - resolve-path $_ | foreach { - "Loading module: $_" - $module = import-module $_ -passthru -DisableNameChecking -global:$global - if (!$module) { - throw ($msgs.error_loading_module -f $_.Name) - } - } - } - "" - } -} - -function LoadConfiguration { - param( - [string] $configdir = $PSScriptRoot - ) - - $psakeConfigFilePath = (join-path $configdir "psake-config.ps1") - - if (test-path $psakeConfigFilePath -pathType Leaf) { - try { - $config = GetCurrentConfigurationOrDefault - . $psakeConfigFilePath - } catch { - throw "Error Loading Configuration from psake-config.ps1: " + $_ - } - } -} - -function GetCurrentConfigurationOrDefault() { - if ($psake.context.count -gt 0) { - return $psake.context.peek().config - } else { - return $psake.config_default - } -} - -function CreateConfigurationForNewContext { - param( - [string] $buildFile, - [string] $framework - ) - - $previousConfig = GetCurrentConfigurationOrDefault - - $config = new-object psobject -property @{ - buildFileName = $previousConfig.buildFileName; - framework = $previousConfig.framework; - taskNameFormat = $previousConfig.taskNameFormat; - verboseError = $previousConfig.verboseError; - coloredOutput = $previousConfig.coloredOutput; - modules = $previousConfig.modules; - moduleScope = $previousConfig.moduleScope; - } - - if ($framework) { - $config.framework = $framework; - } - - if ($buildFile) { - $config.buildFileName = $buildFile; - } - - return $config -} - -function ConfigureBuildEnvironment { - $framework = $psake.context.peek().config.framework - if ($framework -cmatch '^((?:\d+\.\d+)(?:\.\d+){0,1})(x86|x64){0,1}$') { - $versionPart = $matches[1] - $bitnessPart = $matches[2] - } else { - throw ($msgs.error_invalid_framework -f $framework) - } - $versions = $null - $buildToolsVersions = $null - switch ($versionPart) { - '1.0' { - $versions = @('v1.0.3705') - } - '1.1' { - $versions = @('v1.1.4322') - } - '2.0' { - $versions = @('v2.0.50727') - } - '3.0' { - $versions = @('v2.0.50727') - } - '3.5' { - $versions = @('v3.5', 'v2.0.50727') - } - '4.0' { - $versions = @('v4.0.30319') - } - '4.5.1' { - $versions = @('v4.0.30319') - $buildToolsVersions = @('12.0') - } - default { - throw ($msgs.error_unknown_framework -f $versionPart, $framework) - } - } - - $bitness = 'Framework' - if ($versionPart -ne '1.0' -and $versionPart -ne '1.1') { - switch ($bitnessPart) { - 'x86' { - $bitness = 'Framework' - $buildToolsKey = 'MSBuildToolsPath32' - } - 'x64' { - $bitness = 'Framework64' - $buildToolsKey = 'MSBuildToolsPath' - } - { [string]::IsNullOrEmpty($_) } { - $ptrSize = [System.IntPtr]::Size - switch ($ptrSize) { - 4 { - $bitness = 'Framework' - $buildToolsKey = 'MSBuildToolsPath32' - } - 8 { - $bitness = 'Framework64' - $buildToolsKey = 'MSBuildToolsPath' - } - default { - throw ($msgs.error_unknown_pointersize -f $ptrSize) - } - } - } - default { - throw ($msgs.error_unknown_bitnesspart -f $bitnessPart, $framework) - } - } - } - $frameworkDirs = @() - if ($buildToolsVersions -ne $null) { - $frameworkDirs = @($buildToolsVersions | foreach { (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$_" -Name $buildToolsKey).$buildToolsKey }) - } - $frameworkDirs = $frameworkDirs + @($versions | foreach { "$env:windir\Microsoft.NET\$bitness\$_\" }) - - for ($i = 0; $i -lt $frameworkDirs.Count; $i++) { - $dir = $frameworkDirs[$i] - if ($dir -Match "\$\(Registry:HKEY_LOCAL_MACHINE(.*?)@(.*)\)") { - $key = "HKLM:" + $matches[1] - $name = $matches[2] - $dir = (Get-ItemProperty -Path $key -Name $name).$name - $frameworkDirs[$i] = $dir - } - } - - $frameworkDirs | foreach { Assert (test-path $_ -pathType Container) ($msgs.error_no_framework_install_dir_found -f $_)} - - $env:path = ($frameworkDirs -join ";") + ";$env:path" - # if any error occurs in a PS function then "stop" processing immediately - # this does not effect any external programs that return a non-zero exit code - $global:ErrorActionPreference = "Stop" -} - -function CleanupEnvironment { - if ($psake.context.Count -gt 0) { - $currentContext = $psake.context.Peek() - $env:path = $currentContext.originalEnvPath - Set-Location $currentContext.originalDirectory - $global:ErrorActionPreference = $currentContext.originalErrorActionPreference - [void] $psake.context.Pop() - } -} - -function SelectObjectWithDefault -{ - [CmdletBinding()] - param( - [Parameter(ValueFromPipeline=$true)] - [PSObject] - $InputObject, - [string] - $Name, - $Value - ) - - process { - if ($_ -eq $null) { $Value } - elseif ($_ | Get-Member -Name $Name) { - $_.$Name - } - elseif (($_ -is [Hashtable]) -and ($_.Keys -contains $Name)) { - $_.$Name - } - else { $Value } - } -} - -# borrowed from Jeffrey Snover http://blogs.msdn.com/powershell/archive/2006/12/07/resolve-error.aspx -# modified to better handle SQL errors -function ResolveError -{ - [CmdletBinding()] - param( - [Parameter(ValueFromPipeline=$true)] - $ErrorRecord=$Error[0], - [Switch] - $Short - ) - - process { - if ($_ -eq $null) { $_ = $ErrorRecord } - $ex = $_.Exception - - if (-not $Short) { - $error_message = "`nErrorRecord:{0}ErrorRecord.InvocationInfo:{1}Exception:`n{2}" - $formatted_errorRecord = $_ | format-list * -force | out-string - $formatted_invocationInfo = $_.InvocationInfo | format-list * -force | out-string - $formatted_exception = '' - - $i = 0 - while ($ex -ne $null) { - $i++ - $formatted_exception += ("$i" * 70) + "`n" + - ($ex | format-list * -force | out-string) + "`n" - $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null - } - - return $error_message -f $formatted_errorRecord, $formatted_invocationInfo, $formatted_exception - } - - $lastException = @() - while ($ex -ne $null) { - $lastMessage = $ex | SelectObjectWithDefault -Name 'Message' -Value '' - $lastException += ($lastMessage -replace "`n", '') - if ($ex -is [Data.SqlClient.SqlException]) { - $lastException += "(Line [$($ex.LineNumber)] " + - "Procedure [$($ex.Procedure)] Class [$($ex.Class)] " + - " Number [$($ex.Number)] State [$($ex.State)] )" - } - $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null - } - $shortException = $lastException -join ' --> ' - - $header = $null - $current = $_ - $header = (($_.InvocationInfo | - SelectObjectWithDefault -Name 'PositionMessage' -Value '') -replace "`n", ' '), - ($_ | SelectObjectWithDefault -Name 'Message' -Value ''), - ($_ | SelectObjectWithDefault -Name 'Exception' -Value '') | - ? { -not [String]::IsNullOrEmpty($_) } | - Select -First 1 - - $delimiter = '' - if ((-not [String]::IsNullOrEmpty($header)) -and - (-not [String]::IsNullOrEmpty($shortException))) - { $delimiter = ' [<<==>>] ' } - - return "$($header)$($delimiter)Exception: $($shortException)" - } -} - -function WriteDocumentation { - $currentContext = $psake.context.Peek() - - if ($currentContext.tasks.default) { - $defaultTaskDependencies = $currentContext.tasks.default.DependsOn - } else { - $defaultTaskDependencies = @() - } - - $currentContext.tasks.Keys | foreach-object { - if ($_ -eq "default") { - return - } - - $task = $currentContext.tasks.$_ - new-object PSObject -property @{ - Name = $task.Name; - Alias = $task.Alias; - Description = $task.Description; - "Depends On" = $task.DependsOn -join ", " - Default = if ($defaultTaskDependencies -contains $task.Name) { $true } - } - } | sort 'Name' | format-table -autoSize -wrap -property Name,Alias,"Depends On",Default,Description -} - -function WriteTaskTimeSummary($invokePsakeDuration) { - "-" * 70 - "Build Time Report" - "-" * 70 - $list = @() - $currentContext = $psake.context.Peek() - while ($currentContext.executedTasks.Count -gt 0) { - $taskKey = $currentContext.executedTasks.Pop() - $task = $currentContext.tasks.$taskKey - if ($taskKey -eq "default") { - continue - } - $list += new-object PSObject -property @{ - Name = $task.Name; - Duration = $task.Duration - } - } - [Array]::Reverse($list) - $list += new-object PSObject -property @{ - Name = "Total:"; - Duration = $invokePsakeDuration - } - # using "out-string | where-object" to filter out the blank line that format-table prepends - $list | format-table -autoSize -property Name,Duration | out-string -stream | where-object { $_ } -} - -DATA msgs { -convertfrom-stringdata @' - error_invalid_task_name = Task name should not be null or empty string. - error_task_name_does_not_exist = Task {0} does not exist. - error_circular_reference = Circular reference found for task {0}. - error_missing_action_parameter = Action parameter must be specified when using PreAction or PostAction parameters for task {0}. - error_corrupt_callstack = Call stack was corrupt. Expected {0}, but got {1}. - error_invalid_framework = Invalid .NET Framework version, {0} specified. - error_unknown_framework = Unknown .NET Framework version, {0} specified in {1}. - error_unknown_pointersize = Unknown pointer size ({0}) returned from System.IntPtr. - error_unknown_bitnesspart = Unknown .NET Framework bitness, {0}, specified in {1}. - error_no_framework_install_dir_found = No .NET Framework installation directory found at {0}. - error_bad_command = Error executing command {0}. - error_default_task_cannot_have_action = 'default' task cannot specify an action. - error_duplicate_task_name = Task {0} has already been defined. - error_duplicate_alias_name = Alias {0} has already been defined. - error_invalid_include_path = Unable to include {0}. File not found. - error_build_file_not_found = Could not find the build file {0}. - error_no_default_task = 'default' task required. - error_loading_module = Error loading module {0}. - warning_deprecated_framework_variable = Warning: Using global variable $framework to set .NET framework version used is deprecated. Instead use Framework function or configuration file psake-config.ps1. - required_variable_not_set = Variable {0} must be set to run task {1}. - postcondition_failed = Postcondition failed for task {0}. - precondition_was_false = Precondition was false, not executing task {0}. - continue_on_error = Error in task {0}. {1} - build_success = Build Succeeded! -'@ -} - -import-localizeddata -bindingvariable msgs -erroraction silentlycontinue - -$script:psake = @{} -$psake.version = "4.3.2" # contains the current version of psake -$psake.context = new-object system.collections.stack # holds onto the current state of all variables -$psake.run_by_psake_build_tester = $false # indicates that build is being run by psake-BuildTester -$psake.config_default = new-object psobject -property @{ - buildFileName = "default.ps1"; - framework = "4.0"; - taskNameFormat = "Executing {0}"; - verboseError = $false; - coloredOutput = $true; - modules = $null; - moduleScope = ""; -} # contains default configuration, can be overriden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script - -$psake.build_success = $false # indicates that the current build was successful -$psake.build_script_file = $null # contains a System.IO.FileInfo for the current build script -$psake.build_script_dir = "" # contains a string with fully-qualified path to current build script - -LoadConfiguration - -export-modulemember -function Invoke-psake, Invoke-Task, Task, Properties, Include, FormatTaskName, TaskSetup, TaskTearDown, Framework, Assert, Exec -variable psake From bdd6139c302809d33d870298c1a9ba10170f4d4f Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 26 Apr 2019 12:29:08 -0500 Subject: [PATCH 091/255] cleanup --- .../App_Start/BundleConfig.cs | 27 - .../App_Start/FilterConfig.cs | 12 - .../App_Start/RouteConfig.cs | 19 - .../App_Start/WebApiConfig.cs | 46 - .../HelpPage/ApiDescriptionExtensions.cs | 39 - .../HelpPage/App_Start/HelpPageConfig.cs | 113 - .../HelpPage/Controllers/HelpController.cs | 63 - .../Areas/HelpPage/HelpPage.css | 134 - .../HelpPage/HelpPageAreaRegistration.cs | 26 - .../HelpPageConfigurationExtensions.cs | 467 - .../CollectionModelDescription.cs | 7 - .../ComplexTypeModelDescription.cs | 14 - .../DictionaryModelDescription.cs | 6 - .../EnumTypeModelDescription.cs | 15 - .../ModelDescriptions/EnumValueDescription.cs | 11 - .../IModelDocumentationProvider.cs | 12 - .../KeyValuePairModelDescription.cs | 9 - .../ModelDescriptions/ModelDescription.cs | 16 - .../ModelDescriptionGenerator.cs | 451 - .../ModelDescriptions/ModelNameAttribute.cs | 18 - .../ModelDescriptions/ModelNameHelper.cs | 36 - .../ModelDescriptions/ParameterAnnotation.cs | 11 - .../ModelDescriptions/ParameterDescription.cs | 21 - .../SimpleTypeModelDescription.cs | 6 - .../Areas/HelpPage/Models/HelpPageApiModel.cs | 108 - .../HelpPageSampleGenerator.cs | 445 - .../SampleGeneration/HelpPageSampleKey.cs | 172 - .../HelpPage/SampleGeneration/ImageSample.cs | 41 - .../SampleGeneration/InvalidSample.cs | 37 - .../SampleGeneration/ObjectGenerator.cs | 456 - .../SampleGeneration/SampleDirection.cs | 11 - .../HelpPage/SampleGeneration/TextSample.cs | 37 - .../Areas/HelpPage/Views/Help/Api.cshtml | 22 - .../Help/DisplayTemplates/ApiGroup.cshtml | 41 - .../CollectionModelDescription.cshtml | 6 - .../ComplexTypeModelDescription.cshtml | 3 - .../DictionaryModelDescription.cshtml | 4 - .../EnumTypeModelDescription.cshtml | 24 - .../DisplayTemplates/HelpPageApiModel.cshtml | 67 - .../Help/DisplayTemplates/ImageSample.cshtml | 4 - .../DisplayTemplates/InvalidSample.cshtml | 13 - .../KeyValuePairModelDescription.cshtml | 4 - .../ModelDescriptionLink.cshtml | 26 - .../Help/DisplayTemplates/Parameters.cshtml | 48 - .../Help/DisplayTemplates/Samples.cshtml | 30 - .../SimpleTypeModelDescription.cshtml | 3 - .../Help/DisplayTemplates/TextSample.cshtml | 6 - .../Areas/HelpPage/Views/Help/Index.cshtml | 38 - .../HelpPage/Views/Help/ResourceModel.cshtml | 19 - .../HelpPage/Views/Shared/_Layout.cshtml | 12 - .../Areas/HelpPage/Views/Web.config | 41 - .../Areas/HelpPage/Views/_ViewStart.cshtml | 4 - .../HelpPage/XmlDocumentationProvider.cs | 161 - .../Content/Site.css | 42 - .../Content/bootstrap-theme.css | 587 - .../Content/bootstrap-theme.css.map | 1 - .../Content/bootstrap-theme.min.css | 6 - .../Content/bootstrap.css | 6760 ------------ .../Content/bootstrap.css.map | 1 - .../Content/bootstrap.min.css | 6 - .../Controllers/HomeController.cs | 14 - .../Controllers/ValuesController.cs | 58 - .../Global.asax | 1 - .../Global.asax.cs | 19 - .../Models/CiaWorldFactBookData.cs | 30 - .../Project_Readme.html | 149 - .../Properties/AssemblyInfo.cs | 16 - .../Scripts/_references.js | Bin 630 -> 0 bytes .../Scripts/bootstrap.js | 2363 ---- .../Scripts/bootstrap.min.js | 7 - .../Scripts/jquery-2.2.0.intellisense.js | 2670 ----- .../Scripts/jquery-2.2.0.js | 9831 ----------------- .../Scripts/jquery-2.2.0.min.js | 4 - .../Scripts/modernizr-2.8.3.js | 1406 --- .../Scripts/respond.js | 224 - .../Scripts/respond.matchmedia.addListener.js | 273 - .../respond.matchmedia.addListener.min.js | 5 - .../Scripts/respond.min.js | 5 - .../Views/Home/Index.cshtml | 16 - .../Views/Shared/Error.cshtml | 17 - .../Views/Shared/_Layout.cshtml | 41 - .../Views/Web.config | 35 - .../Views/_ViewStart.cshtml | 3 - .../Web.Debug.config | 30 - .../Web.Release.config | 31 - .../Web.config | 69 - ...ebApiContrib.Formatting.Xlsx.Sample.csproj | 281 - .../cia-data.txt | 231 - .../favicon.ico | Bin 32038 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../packages.config | 21 - 95 files changed, 29003 deletions(-) delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/BundleConfig.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/FilterConfig.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/RouteConfig.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/WebApiConfig.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ApiDescriptionExtensions.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/App_Start/HelpPageConfig.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Controllers/HelpController.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPage.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageAreaRegistration.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageConfigurationExtensions.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Models/HelpPageApiModel.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ImageSample.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/InvalidSample.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/SampleDirection.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/TextSample.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Api.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Index.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/ResourceModel.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Shared/_Layout.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Web.config delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/_ViewStart.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/XmlDocumentationProvider.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/Site.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css.map delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.min.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css.map delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.min.css delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/HomeController.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/ValuesController.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Models/CiaWorldFactBookData.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Project_Readme.html delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Properties/AssemblyInfo.cs delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/_references.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.min.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.intellisense.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.min.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/modernizr-2.8.3.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/respond.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/respond.matchmedia.addListener.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/respond.matchmedia.addListener.min.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/respond.min.js delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Views/Home/Index.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Views/Shared/Error.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Views/Shared/_Layout.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Views/Web.config delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Views/_ViewStart.cshtml delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Web.Debug.config delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Web.Release.config delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/Web.config delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/WebApiContrib.Formatting.Xlsx.Sample.csproj delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/cia-data.txt delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/favicon.ico delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/fonts/glyphicons-halflings-regular.eot delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/fonts/glyphicons-halflings-regular.svg delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/fonts/glyphicons-halflings-regular.ttf delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/fonts/glyphicons-halflings-regular.woff delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 samples/WebApiContrib.Formatting.Xlsx.Sample/packages.config diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/BundleConfig.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/BundleConfig.cs deleted file mode 100644 index 274a77f..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/BundleConfig.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Web.Optimization; - -namespace WebApiContrib.Formatting.Xlsx.Sample -{ - public class BundleConfig - { - // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862 - public static void RegisterBundles(BundleCollection bundles) - { - bundles.Add(new ScriptBundle("~/bundles/jquery").Include( - "~/Scripts/jquery-{version}.js")); - - // Use the development version of Modernizr to develop with and learn from. Then, when you're - // ready for production, use the build tool at http://modernizr.com to pick only the tests you need. - bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( - "~/Scripts/modernizr-*")); - - bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( - "~/Scripts/bootstrap.js", - "~/Scripts/respond.js")); - - bundles.Add(new StyleBundle("~/Content/css").Include( - "~/Content/bootstrap.css", - "~/Content/site.css")); - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/FilterConfig.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/FilterConfig.cs deleted file mode 100644 index 4c6de1b..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/FilterConfig.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Web.Mvc; - -namespace WebApiContrib.Formatting.Xlsx.Sample -{ - public class FilterConfig - { - public static void RegisterGlobalFilters(GlobalFilterCollection filters) - { - filters.Add(new HandleErrorAttribute()); - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/RouteConfig.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/RouteConfig.cs deleted file mode 100644 index c4a2a8a..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/RouteConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Web.Mvc; -using System.Web.Routing; - -namespace WebApiContrib.Formatting.Xlsx.Sample -{ - public 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/WebApiContrib.Formatting.Xlsx.Sample/App_Start/WebApiConfig.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/WebApiConfig.cs deleted file mode 100644 index c1753ba..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/App_Start/WebApiConfig.cs +++ /dev/null @@ -1,46 +0,0 @@ -using OfficeOpenXml.Style; -using System.Drawing; -using System.Web.Http; - -namespace WebApiContrib.Formatting.Xlsx.Sample -{ - public static class WebApiConfig - { - public static void Register(HttpConfiguration config) - { - // Web API configuration and services - - // Remove all other formatters (not required, used here - // to force XlsxMediaTypeFormatter as default) - config.Formatters.Clear(); - - // Set up the XlsxMediaTypeFormatter - var formatter = new XlsxMediaTypeFormatter( - autoFilter: true, - freezeHeader: true, - headerHeight: 25f, - cellStyle: (ExcelStyle s) => { - s.Font.SetFromFont(new Font("Segoe UI", 13f, FontStyle.Regular)); - }, - headerStyle: (ExcelStyle s) => { - s.Fill.PatternType = ExcelFillStyle.Solid; - s.Fill.BackgroundColor.SetColor(Color.FromArgb(0, 114, 51)); - s.Font.Color.SetColor(Color.White); - s.Font.Size = 15f; - } - ); - - // Add XlsxMediaTypeFormatter to the collection - config.Formatters.Add(formatter); - - // Web API routes - config.MapHttpAttributeRoutes(); - - config.Routes.MapHttpRoute( - name: "DefaultApi", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional } - ); - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ApiDescriptionExtensions.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ApiDescriptionExtensions.cs deleted file mode 100644 index 4062c0a..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ApiDescriptionExtensions.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Text; -using System.Web; -using System.Web.Http.Description; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - public static class ApiDescriptionExtensions - { - /// - /// Generates an URI-friendly ID for the . E.g. "Get-Values-id_name" instead of "GetValues/{id}?name={name}" - /// - /// The . - /// The ID as a string. - public static string GetFriendlyId(this ApiDescription description) - { - string path = description.RelativePath; - string[] urlParts = path.Split('?'); - string localPath = urlParts[0]; - string queryKeyString = null; - if (urlParts.Length > 1) - { - string query = urlParts[1]; - string[] queryKeys = HttpUtility.ParseQueryString(query).AllKeys; - queryKeyString = String.Join("_", queryKeys); - } - - StringBuilder friendlyPath = new StringBuilder(); - friendlyPath.AppendFormat("{0}-{1}", - description.HttpMethod.Method, - localPath.Replace("/", "-").Replace("{", String.Empty).Replace("}", String.Empty)); - if (queryKeyString != null) - { - friendlyPath.AppendFormat("_{0}", queryKeyString.Replace('.', '-')); - } - return friendlyPath.ToString(); - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/App_Start/HelpPageConfig.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/App_Start/HelpPageConfig.cs deleted file mode 100644 index f962dda..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/App_Start/HelpPageConfig.cs +++ /dev/null @@ -1,113 +0,0 @@ -// Uncomment the following to provide samples for PageResult. Must also add the Microsoft.AspNet.WebApi.OData -// package to your project. -////#define Handle_PageResultOfT - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Net.Http.Headers; -using System.Reflection; -using System.Web; -using System.Web.Http; -#if Handle_PageResultOfT -using System.Web.Http.OData; -#endif - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// Use this class to customize the Help Page. - /// For example you can set a custom to supply the documentation - /// or you can provide the samples for the requests/responses. - /// - public static class HelpPageConfig - { - [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", - MessageId = "WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.TextSample.#ctor(System.String)", - Justification = "End users may choose to merge this string with existing localized resources.")] - [SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", - MessageId = "bsonspec", - Justification = "Part of a URI.")] - public static void Register(HttpConfiguration config) - { - //// Uncomment the following to use the documentation from XML documentation file. - //config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml"))); - - //// Uncomment the following to use "sample string" as the sample for all actions that have string as the body parameter or return type. - //// Also, the string arrays will be used for IEnumerable. The sample objects will be serialized into different media type - //// formats by the available formatters. - //config.SetSampleObjects(new Dictionary - //{ - // {typeof(string), "sample string"}, - // {typeof(IEnumerable), new string[]{"sample 1", "sample 2"}} - //}); - - // Extend the following to provide factories for types not handled automatically (those lacking parameterless - // constructors) or for which you prefer to use non-default property values. Line below provides a fallback - // since automatic handling will fail and GeneratePageResult handles only a single type. -#if Handle_PageResultOfT - config.GetHelpPageSampleGenerator().SampleObjectFactories.Add(GeneratePageResult); -#endif - - // Extend the following to use a preset object directly as the sample for all actions that support a media - // type, regardless of the body parameter or return type. The lines below avoid display of binary content. - // The BsonMediaTypeFormatter (if available) is not used to serialize the TextSample object. - config.SetSampleForMediaType( - new TextSample("Binary JSON content. See http://bsonspec.org for details."), - new MediaTypeHeaderValue("application/bson")); - - //// Uncomment the following to use "[0]=foo&[1]=bar" directly as the sample for all actions that support form URL encoded format - //// and have IEnumerable as the body parameter or return type. - //config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable)); - - //// Uncomment the following to use "1234" directly as the request sample for media type "text/plain" on the controller named "Values" - //// and action named "Put". - //config.SetSampleRequest("1234", new MediaTypeHeaderValue("text/plain"), "Values", "Put"); - - //// Uncomment the following to use the image on "../images/aspNetHome.png" directly as the response sample for media type "image/png" - //// on the controller named "Values" and action named "Get" with parameter "id". - //config.SetSampleResponse(new ImageSample("../images/aspNetHome.png"), new MediaTypeHeaderValue("image/png"), "Values", "Get", "id"); - - //// Uncomment the following to correct the sample request when the action expects an HttpRequestMessage with ObjectContent. - //// The sample will be generated as if the controller named "Values" and action named "Get" were having string as the body parameter. - //config.SetActualRequestType(typeof(string), "Values", "Get"); - - //// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent. - //// The sample will be generated as if the controller named "Values" and action named "Post" were returning a string. - //config.SetActualResponseType(typeof(string), "Values", "Post"); - } - -#if Handle_PageResultOfT - private static object GeneratePageResult(HelpPageSampleGenerator sampleGenerator, Type type) - { - if (type.IsGenericType) - { - Type openGenericType = type.GetGenericTypeDefinition(); - if (openGenericType == typeof(PageResult<>)) - { - // Get the T in PageResult - Type[] typeParameters = type.GetGenericArguments(); - Debug.Assert(typeParameters.Length == 1); - - // Create an enumeration to pass as the first parameter to the PageResult constuctor - Type itemsType = typeof(List<>).MakeGenericType(typeParameters); - object items = sampleGenerator.GetSampleObject(itemsType); - - // Fill in the other information needed to invoke the PageResult constuctor - Type[] parameterTypes = new Type[] { itemsType, typeof(Uri), typeof(long?), }; - object[] parameters = new object[] { items, null, (long)ObjectGenerator.DefaultCollectionSize, }; - - // Call PageResult(IEnumerable items, Uri nextPageLink, long? count) constructor - ConstructorInfo constructor = type.GetConstructor(parameterTypes); - return constructor.Invoke(parameters); - } - } - - return null; - } -#endif - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Controllers/HelpController.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Controllers/HelpController.cs deleted file mode 100644 index 61d9197..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Controllers/HelpController.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Web.Http; -using System.Web.Mvc; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Controllers -{ - /// - /// The controller that will handle requests for the help page. - /// - public class HelpController : Controller - { - private const string ErrorViewName = "Error"; - - public HelpController() - : this(GlobalConfiguration.Configuration) - { - } - - public HelpController(HttpConfiguration config) - { - Configuration = config; - } - - public HttpConfiguration Configuration { get; private set; } - - public ActionResult Index() - { - ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider(); - return View(Configuration.Services.GetApiExplorer().ApiDescriptions); - } - - public ActionResult Api(string apiId) - { - if (!String.IsNullOrEmpty(apiId)) - { - HelpPageApiModel apiModel = Configuration.GetHelpPageApiModel(apiId); - if (apiModel != null) - { - return View(apiModel); - } - } - - return View(ErrorViewName); - } - - public ActionResult ResourceModel(string modelName) - { - if (!String.IsNullOrEmpty(modelName)) - { - ModelDescriptionGenerator modelDescriptionGenerator = Configuration.GetModelDescriptionGenerator(); - ModelDescription modelDescription; - if (modelDescriptionGenerator.GeneratedModels.TryGetValue(modelName, out modelDescription)) - { - return View(modelDescription); - } - } - - return View(ErrorViewName); - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPage.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPage.css deleted file mode 100644 index aff2230..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPage.css +++ /dev/null @@ -1,134 +0,0 @@ -.help-page h1, -.help-page .h1, -.help-page h2, -.help-page .h2, -.help-page h3, -.help-page .h3, -#body.help-page, -.help-page-table th, -.help-page-table pre, -.help-page-table p { - font-family: "Segoe UI Light", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; -} - -.help-page pre.wrapped { - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - white-space: pre-wrap; -} - -.help-page .warning-message-container { - margin-top: 20px; - padding: 0 10px; - color: #525252; - background: #EFDCA9; - border: 1px solid #CCCCCC; -} - -.help-page-table { - width: 100%; - border-collapse: collapse; - text-align: left; - margin: 0px 0px 20px 0px; - border-top: 1px solid #D4D4D4; -} - -.help-page-table th { - text-align: left; - font-weight: bold; - border-bottom: 1px solid #D4D4D4; - padding: 5px 6px 5px 6px; -} - -.help-page-table td { - border-bottom: 1px solid #D4D4D4; - padding: 10px 8px 10px 8px; - vertical-align: top; -} - -.help-page-table pre, -.help-page-table p { - margin: 0px; - padding: 0px; - font-family: inherit; - font-size: 100%; -} - -.help-page-table tbody tr:hover td { - background-color: #F3F3F3; -} - -.help-page a:hover { - background-color: transparent; -} - -.help-page .sample-header { - border: 2px solid #D4D4D4; - background: #00497E; - color: #FFFFFF; - padding: 8px 15px; - border-bottom: none; - display: inline-block; - margin: 10px 0px 0px 0px; -} - -.help-page .sample-content { - display: block; - border-width: 0; - padding: 15px 20px; - background: #FFFFFF; - border: 2px solid #D4D4D4; - margin: 0px 0px 10px 0px; -} - -.help-page .api-name { - width: 40%; -} - -.help-page .api-documentation { - width: 60%; -} - -.help-page .parameter-name { - width: 20%; -} - -.help-page .parameter-documentation { - width: 40%; -} - -.help-page .parameter-type { - width: 20%; -} - -.help-page .parameter-annotations { - width: 20%; -} - -.help-page h1, -.help-page .h1 { - font-size: 36px; - line-height: normal; -} - -.help-page h2, -.help-page .h2 { - font-size: 24px; -} - -.help-page h3, -.help-page .h3 { - font-size: 20px; -} - -#body.help-page { - font-size: 14px; - line-height: 143%; - color: #333; -} - -.help-page a { - color: #0000EE; - text-decoration: none; -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageAreaRegistration.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageAreaRegistration.cs deleted file mode 100644 index 1c033a7..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageAreaRegistration.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Web.Http; -using System.Web.Mvc; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - public class HelpPageAreaRegistration : AreaRegistration - { - public override string AreaName - { - get - { - return "HelpPage"; - } - } - - public override void RegisterArea(AreaRegistrationContext context) - { - context.MapRoute( - "HelpPage_Default", - "Help/{action}/{apiId}", - new { controller = "Help", action = "Index", apiId = UrlParameter.Optional }); - - HelpPageConfig.Register(GlobalConfiguration.Configuration); - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageConfigurationExtensions.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageConfigurationExtensions.cs deleted file mode 100644 index 9c59095..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/HelpPageConfigurationExtensions.cs +++ /dev/null @@ -1,467 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Description; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - public static class HelpPageConfigurationExtensions - { - private const string ApiModelPrefix = "MS_HelpPageApiModel_"; - - /// - /// Sets the documentation provider for help page. - /// - /// The . - /// The documentation provider. - public static void SetDocumentationProvider(this HttpConfiguration config, IDocumentationProvider documentationProvider) - { - config.Services.Replace(typeof(IDocumentationProvider), documentationProvider); - } - - /// - /// Sets the objects that will be used by the formatters to produce sample requests/responses. - /// - /// The . - /// The sample objects. - public static void SetSampleObjects(this HttpConfiguration config, IDictionary sampleObjects) - { - config.GetHelpPageSampleGenerator().SampleObjects = sampleObjects; - } - - /// - /// Sets the sample request directly for the specified media type and action. - /// - /// The . - /// The sample request. - /// The media type. - /// Name of the controller. - /// Name of the action. - public static void SetSampleRequest(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Request, controllerName, actionName, new[] { "*" }), sample); - } - - /// - /// Sets the sample request directly for the specified media type and action with parameters. - /// - /// The . - /// The sample request. - /// The media type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetSampleRequest(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Request, controllerName, actionName, parameterNames), sample); - } - - /// - /// Sets the sample request directly for the specified media type of the action. - /// - /// The . - /// The sample response. - /// The media type. - /// Name of the controller. - /// Name of the action. - public static void SetSampleResponse(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Response, controllerName, actionName, new[] { "*" }), sample); - } - - /// - /// Sets the sample response directly for the specified media type of the action with specific parameters. - /// - /// The . - /// The sample response. - /// The media type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetSampleResponse(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, SampleDirection.Response, controllerName, actionName, parameterNames), sample); - } - - /// - /// Sets the sample directly for all actions with the specified media type. - /// - /// The . - /// The sample. - /// The media type. - public static void SetSampleForMediaType(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType), sample); - } - - /// - /// Sets the sample directly for all actions with the specified type and media type. - /// - /// The . - /// The sample. - /// The media type. - /// The parameter type or return type of an action. - public static void SetSampleForType(this HttpConfiguration config, object sample, MediaTypeHeaderValue mediaType, Type type) - { - config.GetHelpPageSampleGenerator().ActionSamples.Add(new HelpPageSampleKey(mediaType, type), sample); - } - - /// - /// Specifies the actual type of passed to the in an action. - /// The help page will use this information to produce more accurate request samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - public static void SetActualRequestType(this HttpConfiguration config, Type type, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Request, controllerName, actionName, new[] { "*" }), type); - } - - /// - /// Specifies the actual type of passed to the in an action. - /// The help page will use this information to produce more accurate request samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetActualRequestType(this HttpConfiguration config, Type type, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Request, controllerName, actionName, parameterNames), type); - } - - /// - /// Specifies the actual type of returned as part of the in an action. - /// The help page will use this information to produce more accurate response samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - public static void SetActualResponseType(this HttpConfiguration config, Type type, string controllerName, string actionName) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Response, controllerName, actionName, new[] { "*" }), type); - } - - /// - /// Specifies the actual type of returned as part of the in an action. - /// The help page will use this information to produce more accurate response samples. - /// - /// The . - /// The type. - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public static void SetActualResponseType(this HttpConfiguration config, Type type, string controllerName, string actionName, params string[] parameterNames) - { - config.GetHelpPageSampleGenerator().ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Response, controllerName, actionName, parameterNames), type); - } - - /// - /// Gets the help page sample generator. - /// - /// The . - /// The help page sample generator. - public static HelpPageSampleGenerator GetHelpPageSampleGenerator(this HttpConfiguration config) - { - return (HelpPageSampleGenerator)config.Properties.GetOrAdd( - typeof(HelpPageSampleGenerator), - k => new HelpPageSampleGenerator()); - } - - /// - /// Sets the help page sample generator. - /// - /// The . - /// The help page sample generator. - public static void SetHelpPageSampleGenerator(this HttpConfiguration config, HelpPageSampleGenerator sampleGenerator) - { - config.Properties.AddOrUpdate( - typeof(HelpPageSampleGenerator), - k => sampleGenerator, - (k, o) => sampleGenerator); - } - - /// - /// Gets the model description generator. - /// - /// The configuration. - /// The - public static ModelDescriptionGenerator GetModelDescriptionGenerator(this HttpConfiguration config) - { - return (ModelDescriptionGenerator)config.Properties.GetOrAdd( - typeof(ModelDescriptionGenerator), - k => InitializeModelDescriptionGenerator(config)); - } - - /// - /// Gets the model that represents an API displayed on the help page. The model is initialized on the first call and cached for subsequent calls. - /// - /// The . - /// The ID. - /// - /// An - /// - public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId) - { - object model; - string modelId = ApiModelPrefix + apiDescriptionId; - if (!config.Properties.TryGetValue(modelId, out model)) - { - Collection apiDescriptions = config.Services.GetApiExplorer().ApiDescriptions; - ApiDescription apiDescription = apiDescriptions.FirstOrDefault(api => String.Equals(api.GetFriendlyId(), apiDescriptionId, StringComparison.OrdinalIgnoreCase)); - if (apiDescription != null) - { - model = GenerateApiModel(apiDescription, config); - config.Properties.TryAdd(modelId, model); - } - } - - return (HelpPageApiModel)model; - } - - private static HelpPageApiModel GenerateApiModel(ApiDescription apiDescription, HttpConfiguration config) - { - HelpPageApiModel apiModel = new HelpPageApiModel() - { - ApiDescription = apiDescription, - }; - - ModelDescriptionGenerator modelGenerator = config.GetModelDescriptionGenerator(); - HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); - GenerateUriParameters(apiModel, modelGenerator); - GenerateRequestModelDescription(apiModel, modelGenerator, sampleGenerator); - GenerateResourceDescription(apiModel, modelGenerator); - GenerateSamples(apiModel, sampleGenerator); - - return apiModel; - } - - private static void GenerateUriParameters(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) - { - ApiDescription apiDescription = apiModel.ApiDescription; - foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) - { - if (apiParameter.Source == ApiParameterSource.FromUri) - { - HttpParameterDescriptor parameterDescriptor = apiParameter.ParameterDescriptor; - Type parameterType = null; - ModelDescription typeDescription = null; - ComplexTypeModelDescription complexTypeDescription = null; - if (parameterDescriptor != null) - { - parameterType = parameterDescriptor.ParameterType; - typeDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - complexTypeDescription = typeDescription as ComplexTypeModelDescription; - } - - // Example: - // [TypeConverter(typeof(PointConverter))] - // public class Point - // { - // public Point(int x, int y) - // { - // X = x; - // Y = y; - // } - // public int X { get; set; } - // public int Y { get; set; } - // } - // Class Point is bindable with a TypeConverter, so Point will be added to UriParameters collection. - // - // public class Point - // { - // public int X { get; set; } - // public int Y { get; set; } - // } - // Regular complex class Point will have properties X and Y added to UriParameters collection. - if (complexTypeDescription != null - && !IsBindableWithTypeConverter(parameterType)) - { - foreach (ParameterDescription uriParameter in complexTypeDescription.Properties) - { - apiModel.UriParameters.Add(uriParameter); - } - } - else if (parameterDescriptor != null) - { - ParameterDescription uriParameter = - AddParameterDescription(apiModel, apiParameter, typeDescription); - - if (!parameterDescriptor.IsOptional) - { - uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Required" }); - } - - object defaultValue = parameterDescriptor.DefaultValue; - if (defaultValue != null) - { - uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Default value is " + Convert.ToString(defaultValue, CultureInfo.InvariantCulture) }); - } - } - else - { - Debug.Assert(parameterDescriptor == null); - - // If parameterDescriptor is null, this is an undeclared route parameter which only occurs - // when source is FromUri. Ignored in request model and among resource parameters but listed - // as a simple string here. - ModelDescription modelDescription = modelGenerator.GetOrCreateModelDescription(typeof(string)); - AddParameterDescription(apiModel, apiParameter, modelDescription); - } - } - } - } - - private static bool IsBindableWithTypeConverter(Type parameterType) - { - if (parameterType == null) - { - return false; - } - - return TypeDescriptor.GetConverter(parameterType).CanConvertFrom(typeof(string)); - } - - private static ParameterDescription AddParameterDescription(HelpPageApiModel apiModel, - ApiParameterDescription apiParameter, ModelDescription typeDescription) - { - ParameterDescription parameterDescription = new ParameterDescription - { - Name = apiParameter.Name, - Documentation = apiParameter.Documentation, - TypeDescription = typeDescription, - }; - - apiModel.UriParameters.Add(parameterDescription); - return parameterDescription; - } - - private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator) - { - ApiDescription apiDescription = apiModel.ApiDescription; - foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) - { - if (apiParameter.Source == ApiParameterSource.FromBody) - { - Type parameterType = apiParameter.ParameterDescriptor.ParameterType; - apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - apiModel.RequestDocumentation = apiParameter.Documentation; - } - else if (apiParameter.ParameterDescriptor != null && - apiParameter.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage)) - { - Type parameterType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription); - - if (parameterType != null) - { - apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); - } - } - } - } - - private static void GenerateResourceDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) - { - ResponseDescription response = apiModel.ApiDescription.ResponseDescription; - Type responseType = response.ResponseType ?? response.DeclaredType; - if (responseType != null && responseType != typeof(void)) - { - apiModel.ResourceDescription = modelGenerator.GetOrCreateModelDescription(responseType); - } - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as ErrorMessages.")] - private static void GenerateSamples(HelpPageApiModel apiModel, HelpPageSampleGenerator sampleGenerator) - { - try - { - foreach (var item in sampleGenerator.GetSampleRequests(apiModel.ApiDescription)) - { - apiModel.SampleRequests.Add(item.Key, item.Value); - LogInvalidSampleAsError(apiModel, item.Value); - } - - foreach (var item in sampleGenerator.GetSampleResponses(apiModel.ApiDescription)) - { - apiModel.SampleResponses.Add(item.Key, item.Value); - LogInvalidSampleAsError(apiModel, item.Value); - } - } - catch (Exception e) - { - apiModel.ErrorMessages.Add(String.Format(CultureInfo.CurrentCulture, - "An exception has occurred while generating the sample. Exception message: {0}", - HelpPageSampleGenerator.UnwrapException(e).Message)); - } - } - - private static bool TryGetResourceParameter(ApiDescription apiDescription, HttpConfiguration config, out ApiParameterDescription parameterDescription, out Type resourceType) - { - parameterDescription = apiDescription.ParameterDescriptions.FirstOrDefault( - p => p.Source == ApiParameterSource.FromBody || - (p.ParameterDescriptor != null && p.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage))); - - if (parameterDescription == null) - { - resourceType = null; - return false; - } - - resourceType = parameterDescription.ParameterDescriptor.ParameterType; - - if (resourceType == typeof(HttpRequestMessage)) - { - HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator(); - resourceType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription); - } - - if (resourceType == null) - { - parameterDescription = null; - return false; - } - - return true; - } - - private static ModelDescriptionGenerator InitializeModelDescriptionGenerator(HttpConfiguration config) - { - ModelDescriptionGenerator modelGenerator = new ModelDescriptionGenerator(config); - Collection apis = config.Services.GetApiExplorer().ApiDescriptions; - foreach (ApiDescription api in apis) - { - ApiParameterDescription parameterDescription; - Type parameterType; - if (TryGetResourceParameter(api, config, out parameterDescription, out parameterType)) - { - modelGenerator.GetOrCreateModelDescription(parameterType); - } - } - return modelGenerator; - } - - private static void LogInvalidSampleAsError(HelpPageApiModel apiModel, object sample) - { - InvalidSample invalidSample = sample as InvalidSample; - if (invalidSample != null) - { - apiModel.ErrorMessages.Add(invalidSample.ErrorMessage); - } - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs deleted file mode 100644 index 2f46aa1..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class CollectionModelDescription : ModelDescription - { - public ModelDescription ElementDescription { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs deleted file mode 100644 index 3369183..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.ObjectModel; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class ComplexTypeModelDescription : ModelDescription - { - public ComplexTypeModelDescription() - { - Properties = new Collection(); - } - - public Collection Properties { get; private set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs deleted file mode 100644 index 83fc3db..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class DictionaryModelDescription : KeyValuePairModelDescription - { - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs deleted file mode 100644 index 744f4bc..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class EnumTypeModelDescription : ModelDescription - { - public EnumTypeModelDescription() - { - Values = new Collection(); - } - - public Collection Values { get; private set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs deleted file mode 100644 index a0b6663..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class EnumValueDescription - { - public string Documentation { get; set; } - - public string Name { get; set; } - - public string Value { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs deleted file mode 100644 index 9314850..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Reflection; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public interface IModelDocumentationProvider - { - string GetDocumentation(MemberInfo member); - - string GetDocumentation(Type type); - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs deleted file mode 100644 index 25cb7fd..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class KeyValuePairModelDescription : ModelDescription - { - public ModelDescription KeyModelDescription { get; set; } - - public ModelDescription ValueModelDescription { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescription.cs deleted file mode 100644 index a6c9e80..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescription.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - /// - /// Describes a type model. - /// - public abstract class ModelDescription - { - public string Documentation { get; set; } - - public Type ModelType { get; set; } - - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs deleted file mode 100644 index 9751c85..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs +++ /dev/null @@ -1,451 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel.DataAnnotations; -using System.Globalization; -using System.Reflection; -using System.Runtime.Serialization; -using System.Web.Http; -using System.Web.Http.Description; -using System.Xml.Serialization; -using Newtonsoft.Json; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - /// - /// Generates model descriptions for given types. - /// - public class ModelDescriptionGenerator - { - // Modify this to support more data annotation attributes. - private readonly IDictionary> AnnotationTextGenerator = new Dictionary> - { - { typeof(RequiredAttribute), a => "Required" }, - { typeof(RangeAttribute), a => - { - RangeAttribute range = (RangeAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Range: inclusive between {0} and {1}", range.Minimum, range.Maximum); - } - }, - { typeof(MaxLengthAttribute), a => - { - MaxLengthAttribute maxLength = (MaxLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Max length: {0}", maxLength.Length); - } - }, - { typeof(MinLengthAttribute), a => - { - MinLengthAttribute minLength = (MinLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Min length: {0}", minLength.Length); - } - }, - { typeof(StringLengthAttribute), a => - { - StringLengthAttribute strLength = (StringLengthAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "String length: inclusive between {0} and {1}", strLength.MinimumLength, strLength.MaximumLength); - } - }, - { typeof(DataTypeAttribute), a => - { - DataTypeAttribute dataType = (DataTypeAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Data type: {0}", dataType.CustomDataType ?? dataType.DataType.ToString()); - } - }, - { typeof(RegularExpressionAttribute), a => - { - RegularExpressionAttribute regularExpression = (RegularExpressionAttribute)a; - return String.Format(CultureInfo.CurrentCulture, "Matching regular expression pattern: {0}", regularExpression.Pattern); - } - }, - }; - - // Modify this to add more default documentations. - private readonly IDictionary DefaultTypeDocumentation = new Dictionary - { - { typeof(Int16), "integer" }, - { typeof(Int32), "integer" }, - { typeof(Int64), "integer" }, - { typeof(UInt16), "unsigned integer" }, - { typeof(UInt32), "unsigned integer" }, - { typeof(UInt64), "unsigned integer" }, - { typeof(Byte), "byte" }, - { typeof(Char), "character" }, - { typeof(SByte), "signed byte" }, - { typeof(Uri), "URI" }, - { typeof(Single), "decimal number" }, - { typeof(Double), "decimal number" }, - { typeof(Decimal), "decimal number" }, - { typeof(String), "string" }, - { typeof(Guid), "globally unique identifier" }, - { typeof(TimeSpan), "time interval" }, - { typeof(DateTime), "date" }, - { typeof(DateTimeOffset), "date" }, - { typeof(Boolean), "boolean" }, - }; - - private Lazy _documentationProvider; - - public ModelDescriptionGenerator(HttpConfiguration config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - - _documentationProvider = new Lazy(() => config.Services.GetDocumentationProvider() as IModelDocumentationProvider); - GeneratedModels = new Dictionary(StringComparer.OrdinalIgnoreCase); - } - - public Dictionary GeneratedModels { get; private set; } - - private IModelDocumentationProvider DocumentationProvider - { - get - { - return _documentationProvider.Value; - } - } - - public ModelDescription GetOrCreateModelDescription(Type modelType) - { - if (modelType == null) - { - throw new ArgumentNullException("modelType"); - } - - Type underlyingType = Nullable.GetUnderlyingType(modelType); - if (underlyingType != null) - { - modelType = underlyingType; - } - - ModelDescription modelDescription; - string modelName = ModelNameHelper.GetModelName(modelType); - if (GeneratedModels.TryGetValue(modelName, out modelDescription)) - { - if (modelType != modelDescription.ModelType) - { - throw new InvalidOperationException( - String.Format( - CultureInfo.CurrentCulture, - "A model description could not be created. Duplicate model name '{0}' was found for types '{1}' and '{2}'. " + - "Use the [ModelName] attribute to change the model name for at least one of the types so that it has a unique name.", - modelName, - modelDescription.ModelType.FullName, - modelType.FullName)); - } - - return modelDescription; - } - - if (DefaultTypeDocumentation.ContainsKey(modelType)) - { - return GenerateSimpleTypeModelDescription(modelType); - } - - if (modelType.IsEnum) - { - return GenerateEnumTypeModelDescription(modelType); - } - - if (modelType.IsGenericType) - { - Type[] genericArguments = modelType.GetGenericArguments(); - - if (genericArguments.Length == 1) - { - Type enumerableType = typeof(IEnumerable<>).MakeGenericType(genericArguments); - if (enumerableType.IsAssignableFrom(modelType)) - { - return GenerateCollectionModelDescription(modelType, genericArguments[0]); - } - } - if (genericArguments.Length == 2) - { - Type dictionaryType = typeof(IDictionary<,>).MakeGenericType(genericArguments); - if (dictionaryType.IsAssignableFrom(modelType)) - { - return GenerateDictionaryModelDescription(modelType, genericArguments[0], genericArguments[1]); - } - - Type keyValuePairType = typeof(KeyValuePair<,>).MakeGenericType(genericArguments); - if (keyValuePairType.IsAssignableFrom(modelType)) - { - return GenerateKeyValuePairModelDescription(modelType, genericArguments[0], genericArguments[1]); - } - } - } - - if (modelType.IsArray) - { - Type elementType = modelType.GetElementType(); - return GenerateCollectionModelDescription(modelType, elementType); - } - - if (modelType == typeof(NameValueCollection)) - { - return GenerateDictionaryModelDescription(modelType, typeof(string), typeof(string)); - } - - if (typeof(IDictionary).IsAssignableFrom(modelType)) - { - return GenerateDictionaryModelDescription(modelType, typeof(object), typeof(object)); - } - - if (typeof(IEnumerable).IsAssignableFrom(modelType)) - { - return GenerateCollectionModelDescription(modelType, typeof(object)); - } - - return GenerateComplexTypeModelDescription(modelType); - } - - // Change this to provide different name for the member. - private static string GetMemberName(MemberInfo member, bool hasDataContractAttribute) - { - JsonPropertyAttribute jsonProperty = member.GetCustomAttribute(); - if (jsonProperty != null && !String.IsNullOrEmpty(jsonProperty.PropertyName)) - { - return jsonProperty.PropertyName; - } - - if (hasDataContractAttribute) - { - DataMemberAttribute dataMember = member.GetCustomAttribute(); - if (dataMember != null && !String.IsNullOrEmpty(dataMember.Name)) - { - return dataMember.Name; - } - } - - return member.Name; - } - - private static bool ShouldDisplayMember(MemberInfo member, bool hasDataContractAttribute) - { - JsonIgnoreAttribute jsonIgnore = member.GetCustomAttribute(); - XmlIgnoreAttribute xmlIgnore = member.GetCustomAttribute(); - IgnoreDataMemberAttribute ignoreDataMember = member.GetCustomAttribute(); - NonSerializedAttribute nonSerialized = member.GetCustomAttribute(); - ApiExplorerSettingsAttribute apiExplorerSetting = member.GetCustomAttribute(); - - bool hasMemberAttribute = member.DeclaringType.IsEnum ? - member.GetCustomAttribute() != null : - member.GetCustomAttribute() != null; - - // Display member only if all the followings are true: - // no JsonIgnoreAttribute - // no XmlIgnoreAttribute - // no IgnoreDataMemberAttribute - // no NonSerializedAttribute - // no ApiExplorerSettingsAttribute with IgnoreApi set to true - // no DataContractAttribute without DataMemberAttribute or EnumMemberAttribute - return jsonIgnore == null && - xmlIgnore == null && - ignoreDataMember == null && - nonSerialized == null && - (apiExplorerSetting == null || !apiExplorerSetting.IgnoreApi) && - (!hasDataContractAttribute || hasMemberAttribute); - } - - private string CreateDefaultDocumentation(Type type) - { - string documentation; - if (DefaultTypeDocumentation.TryGetValue(type, out documentation)) - { - return documentation; - } - if (DocumentationProvider != null) - { - documentation = DocumentationProvider.GetDocumentation(type); - } - - return documentation; - } - - private void GenerateAnnotations(MemberInfo property, ParameterDescription propertyModel) - { - List annotations = new List(); - - IEnumerable attributes = property.GetCustomAttributes(); - foreach (Attribute attribute in attributes) - { - Func textGenerator; - if (AnnotationTextGenerator.TryGetValue(attribute.GetType(), out textGenerator)) - { - annotations.Add( - new ParameterAnnotation - { - AnnotationAttribute = attribute, - Documentation = textGenerator(attribute) - }); - } - } - - // Rearrange the annotations - annotations.Sort((x, y) => - { - // Special-case RequiredAttribute so that it shows up on top - if (x.AnnotationAttribute is RequiredAttribute) - { - return -1; - } - if (y.AnnotationAttribute is RequiredAttribute) - { - return 1; - } - - // Sort the rest based on alphabetic order of the documentation - return String.Compare(x.Documentation, y.Documentation, StringComparison.OrdinalIgnoreCase); - }); - - foreach (ParameterAnnotation annotation in annotations) - { - propertyModel.Annotations.Add(annotation); - } - } - - private CollectionModelDescription GenerateCollectionModelDescription(Type modelType, Type elementType) - { - ModelDescription collectionModelDescription = GetOrCreateModelDescription(elementType); - if (collectionModelDescription != null) - { - return new CollectionModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - ElementDescription = collectionModelDescription - }; - } - - return null; - } - - private ModelDescription GenerateComplexTypeModelDescription(Type modelType) - { - ComplexTypeModelDescription complexModelDescription = new ComplexTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - - GeneratedModels.Add(complexModelDescription.Name, complexModelDescription); - bool hasDataContractAttribute = modelType.GetCustomAttribute() != null; - PropertyInfo[] properties = modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance); - foreach (PropertyInfo property in properties) - { - if (ShouldDisplayMember(property, hasDataContractAttribute)) - { - ParameterDescription propertyModel = new ParameterDescription - { - Name = GetMemberName(property, hasDataContractAttribute) - }; - - if (DocumentationProvider != null) - { - propertyModel.Documentation = DocumentationProvider.GetDocumentation(property); - } - - GenerateAnnotations(property, propertyModel); - complexModelDescription.Properties.Add(propertyModel); - propertyModel.TypeDescription = GetOrCreateModelDescription(property.PropertyType); - } - } - - FieldInfo[] fields = modelType.GetFields(BindingFlags.Public | BindingFlags.Instance); - foreach (FieldInfo field in fields) - { - if (ShouldDisplayMember(field, hasDataContractAttribute)) - { - ParameterDescription propertyModel = new ParameterDescription - { - Name = GetMemberName(field, hasDataContractAttribute) - }; - - if (DocumentationProvider != null) - { - propertyModel.Documentation = DocumentationProvider.GetDocumentation(field); - } - - complexModelDescription.Properties.Add(propertyModel); - propertyModel.TypeDescription = GetOrCreateModelDescription(field.FieldType); - } - } - - return complexModelDescription; - } - - private DictionaryModelDescription GenerateDictionaryModelDescription(Type modelType, Type keyType, Type valueType) - { - ModelDescription keyModelDescription = GetOrCreateModelDescription(keyType); - ModelDescription valueModelDescription = GetOrCreateModelDescription(valueType); - - return new DictionaryModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - KeyModelDescription = keyModelDescription, - ValueModelDescription = valueModelDescription - }; - } - - private EnumTypeModelDescription GenerateEnumTypeModelDescription(Type modelType) - { - EnumTypeModelDescription enumDescription = new EnumTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - bool hasDataContractAttribute = modelType.GetCustomAttribute() != null; - foreach (FieldInfo field in modelType.GetFields(BindingFlags.Public | BindingFlags.Static)) - { - if (ShouldDisplayMember(field, hasDataContractAttribute)) - { - EnumValueDescription enumValue = new EnumValueDescription - { - Name = field.Name, - Value = field.GetRawConstantValue().ToString() - }; - if (DocumentationProvider != null) - { - enumValue.Documentation = DocumentationProvider.GetDocumentation(field); - } - enumDescription.Values.Add(enumValue); - } - } - GeneratedModels.Add(enumDescription.Name, enumDescription); - - return enumDescription; - } - - private KeyValuePairModelDescription GenerateKeyValuePairModelDescription(Type modelType, Type keyType, Type valueType) - { - ModelDescription keyModelDescription = GetOrCreateModelDescription(keyType); - ModelDescription valueModelDescription = GetOrCreateModelDescription(valueType); - - return new KeyValuePairModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - KeyModelDescription = keyModelDescription, - ValueModelDescription = valueModelDescription - }; - } - - private ModelDescription GenerateSimpleTypeModelDescription(Type modelType) - { - SimpleTypeModelDescription simpleModelDescription = new SimpleTypeModelDescription - { - Name = ModelNameHelper.GetModelName(modelType), - ModelType = modelType, - Documentation = CreateDefaultDocumentation(modelType) - }; - GeneratedModels.Add(simpleModelDescription.Name, simpleModelDescription); - - return simpleModelDescription; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs deleted file mode 100644 index 0ad0074..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - /// - /// Use this attribute to change the name of the generated for a type. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, AllowMultiple = false, Inherited = false)] - public sealed class ModelNameAttribute : Attribute - { - public ModelNameAttribute(string name) - { - Name = name; - } - - public string Name { get; private set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs deleted file mode 100644 index f8984aa..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Reflection; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - internal static class ModelNameHelper - { - // Modify this to provide custom model name mapping. - public static string GetModelName(Type type) - { - ModelNameAttribute modelNameAttribute = type.GetCustomAttribute(); - if (modelNameAttribute != null && !String.IsNullOrEmpty(modelNameAttribute.Name)) - { - return modelNameAttribute.Name; - } - - string modelName = type.Name; - if (type.IsGenericType) - { - // Format the generic type name to something like: GenericOfAgurment1AndArgument2 - Type genericType = type.GetGenericTypeDefinition(); - Type[] genericArguments = type.GetGenericArguments(); - string genericTypeName = genericType.Name; - - // Trim the generic parameter counts from the name - genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`')); - string[] argumentTypeNames = genericArguments.Select(t => GetModelName(t)).ToArray(); - modelName = String.Format(CultureInfo.InvariantCulture, "{0}Of{1}", genericTypeName, String.Join("And", argumentTypeNames)); - } - - return modelName; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs deleted file mode 100644 index 1acb21a..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class ParameterAnnotation - { - public Attribute AnnotationAttribute { get; set; } - - public string Documentation { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs deleted file mode 100644 index 6ef1d26..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class ParameterDescription - { - public ParameterDescription() - { - Annotations = new Collection(); - } - - public Collection Annotations { get; private set; } - - public string Documentation { get; set; } - - public string Name { get; set; } - - public ModelDescription TypeDescription { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs deleted file mode 100644 index 533dcc1..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -{ - public class SimpleTypeModelDescription : ModelDescription - { - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Models/HelpPageApiModel.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Models/HelpPageApiModel.cs deleted file mode 100644 index 43976c1..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Models/HelpPageApiModel.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Net.Http.Headers; -using System.Web.Http.Description; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models -{ - /// - /// The model that represents an API displayed on the help page. - /// - public class HelpPageApiModel - { - /// - /// Initializes a new instance of the class. - /// - public HelpPageApiModel() - { - UriParameters = new Collection(); - SampleRequests = new Dictionary(); - SampleResponses = new Dictionary(); - ErrorMessages = new Collection(); - } - - /// - /// Gets or sets the that describes the API. - /// - public ApiDescription ApiDescription { get; set; } - - /// - /// Gets or sets the collection that describes the URI parameters for the API. - /// - public Collection UriParameters { get; private set; } - - /// - /// Gets or sets the documentation for the request. - /// - public string RequestDocumentation { get; set; } - - /// - /// Gets or sets the that describes the request body. - /// - public ModelDescription RequestModelDescription { get; set; } - - /// - /// Gets the request body parameter descriptions. - /// - public IList RequestBodyParameters - { - get - { - return GetParameterDescriptions(RequestModelDescription); - } - } - - /// - /// Gets or sets the that describes the resource. - /// - public ModelDescription ResourceDescription { get; set; } - - /// - /// Gets the resource property descriptions. - /// - public IList ResourceProperties - { - get - { - return GetParameterDescriptions(ResourceDescription); - } - } - - /// - /// Gets the sample requests associated with the API. - /// - public IDictionary SampleRequests { get; private set; } - - /// - /// Gets the sample responses associated with the API. - /// - public IDictionary SampleResponses { get; private set; } - - /// - /// Gets the error messages associated with this model. - /// - public Collection ErrorMessages { get; private set; } - - private static IList GetParameterDescriptions(ModelDescription modelDescription) - { - ComplexTypeModelDescription complexTypeModelDescription = modelDescription as ComplexTypeModelDescription; - if (complexTypeModelDescription != null) - { - return complexTypeModelDescription.Properties; - } - - CollectionModelDescription collectionModelDescription = modelDescription as CollectionModelDescription; - if (collectionModelDescription != null) - { - complexTypeModelDescription = collectionModelDescription.ElementDescription as ComplexTypeModelDescription; - if (complexTypeModelDescription != null) - { - return complexTypeModelDescription.Properties; - } - } - - return null; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs deleted file mode 100644 index 6761fce..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Formatting; -using System.Net.Http.Headers; -using System.Web.Http.Description; -using System.Xml.Linq; -using Newtonsoft.Json; -using FormattingEnum = Newtonsoft.Json.Formatting; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This class will generate the samples for the help page. - /// - public class HelpPageSampleGenerator - { - /// - /// Initializes a new instance of the class. - /// - public HelpPageSampleGenerator() - { - ActualHttpMessageTypes = new Dictionary(); - ActionSamples = new Dictionary(); - SampleObjects = new Dictionary(); - SampleObjectFactories = new List> - { - DefaultSampleObjectFactory, - }; - } - - /// - /// Gets CLR types that are used as the content of or . - /// - public IDictionary ActualHttpMessageTypes { get; internal set; } - - /// - /// Gets the objects that are used directly as samples for certain actions. - /// - public IDictionary ActionSamples { get; internal set; } - - /// - /// Gets the objects that are serialized as samples by the supported formatters. - /// - public IDictionary SampleObjects { get; internal set; } - - /// - /// Gets factories for the objects that the supported formatters will serialize as samples. Processed in order, - /// stopping when the factory successfully returns a non- object. - /// - /// - /// Collection includes just initially. Use - /// SampleObjectFactories.Insert(0, func) to provide an override and - /// SampleObjectFactories.Add(func) to provide a fallback. - [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", - Justification = "This is an appropriate nesting of generic types")] - public IList> SampleObjectFactories { get; private set; } - - /// - /// Gets the request body samples for a given . - /// - /// The . - /// The samples keyed by media type. - public IDictionary GetSampleRequests(ApiDescription api) - { - return GetSample(api, SampleDirection.Request); - } - - /// - /// Gets the response body samples for a given . - /// - /// The . - /// The samples keyed by media type. - public IDictionary GetSampleResponses(ApiDescription api) - { - return GetSample(api, SampleDirection.Response); - } - - /// - /// Gets the request or response body samples. - /// - /// The . - /// The value indicating whether the sample is for a request or for a response. - /// The samples keyed by media type. - public virtual IDictionary GetSample(ApiDescription api, SampleDirection sampleDirection) - { - if (api == null) - { - throw new ArgumentNullException("api"); - } - string controllerName = api.ActionDescriptor.ControllerDescriptor.ControllerName; - string actionName = api.ActionDescriptor.ActionName; - IEnumerable parameterNames = api.ParameterDescriptions.Select(p => p.Name); - Collection formatters; - Type type = ResolveType(api, controllerName, actionName, parameterNames, sampleDirection, out formatters); - var samples = new Dictionary(); - - // Use the samples provided directly for actions - var actionSamples = GetAllActionSamples(controllerName, actionName, parameterNames, sampleDirection); - foreach (var actionSample in actionSamples) - { - samples.Add(actionSample.Key.MediaType, WrapSampleIfString(actionSample.Value)); - } - - // Do the sample generation based on formatters only if an action doesn't return an HttpResponseMessage. - // Here we cannot rely on formatters because we don't know what's in the HttpResponseMessage, it might not even use formatters. - if (type != null && !typeof(HttpResponseMessage).IsAssignableFrom(type)) - { - object sampleObject = GetSampleObject(type); - foreach (var formatter in formatters) - { - foreach (MediaTypeHeaderValue mediaType in formatter.SupportedMediaTypes) - { - if (!samples.ContainsKey(mediaType)) - { - object sample = GetActionSample(controllerName, actionName, parameterNames, type, formatter, mediaType, sampleDirection); - - // If no sample found, try generate sample using formatter and sample object - if (sample == null && sampleObject != null) - { - sample = WriteSampleObjectUsingFormatter(formatter, sampleObject, type, mediaType); - } - - samples.Add(mediaType, WrapSampleIfString(sample)); - } - } - } - } - - return samples; - } - - /// - /// Search for samples that are provided directly through . - /// - /// Name of the controller. - /// Name of the action. - /// The parameter names. - /// The CLR type. - /// The formatter. - /// The media type. - /// The value indicating whether the sample is for a request or for a response. - /// The sample that matches the parameters. - public virtual object GetActionSample(string controllerName, string actionName, IEnumerable parameterNames, Type type, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType, SampleDirection sampleDirection) - { - object sample; - - // First, try to get the sample provided for the specified mediaType, sampleDirection, controllerName, actionName and parameterNames. - // If not found, try to get the sample provided for the specified mediaType, sampleDirection, controllerName and actionName regardless of the parameterNames. - // If still not found, try to get the sample provided for the specified mediaType and type. - // Finally, try to get the sample provided for the specified mediaType. - if (ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, sampleDirection, controllerName, actionName, parameterNames), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, sampleDirection, controllerName, actionName, new[] { "*" }), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType, type), out sample) || - ActionSamples.TryGetValue(new HelpPageSampleKey(mediaType), out sample)) - { - return sample; - } - - return null; - } - - /// - /// Gets the sample object that will be serialized by the formatters. - /// First, it will look at the . If no sample object is found, it will try to create - /// one using (which wraps an ) and other - /// factories in . - /// - /// The type. - /// The sample object. - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", - Justification = "Even if all items in SampleObjectFactories throw, problem will be visible as missing sample.")] - public virtual object GetSampleObject(Type type) - { - object sampleObject; - - if (!SampleObjects.TryGetValue(type, out sampleObject)) - { - // No specific object available, try our factories. - foreach (Func factory in SampleObjectFactories) - { - if (factory == null) - { - continue; - } - - try - { - sampleObject = factory(this, type); - if (sampleObject != null) - { - break; - } - } - catch - { - // Ignore any problems encountered in the factory; go on to the next one (if any). - } - } - } - - return sampleObject; - } - - /// - /// Resolves the actual type of passed to the in an action. - /// - /// The . - /// The type. - public virtual Type ResolveHttpRequestMessageType(ApiDescription api) - { - string controllerName = api.ActionDescriptor.ControllerDescriptor.ControllerName; - string actionName = api.ActionDescriptor.ActionName; - IEnumerable parameterNames = api.ParameterDescriptions.Select(p => p.Name); - Collection formatters; - return ResolveType(api, controllerName, actionName, parameterNames, SampleDirection.Request, out formatters); - } - - /// - /// Resolves the type of the action parameter or return value when or is used. - /// - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - /// The value indicating whether the sample is for a request or a response. - /// The formatters. - [SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", Justification = "This is only used in advanced scenarios.")] - public virtual Type ResolveType(ApiDescription api, string controllerName, string actionName, IEnumerable parameterNames, SampleDirection sampleDirection, out Collection formatters) - { - if (!Enum.IsDefined(typeof(SampleDirection), sampleDirection)) - { - throw new InvalidEnumArgumentException("sampleDirection", (int)sampleDirection, typeof(SampleDirection)); - } - if (api == null) - { - throw new ArgumentNullException("api"); - } - Type type; - if (ActualHttpMessageTypes.TryGetValue(new HelpPageSampleKey(sampleDirection, controllerName, actionName, parameterNames), out type) || - ActualHttpMessageTypes.TryGetValue(new HelpPageSampleKey(sampleDirection, controllerName, actionName, new[] { "*" }), out type)) - { - // Re-compute the supported formatters based on type - Collection newFormatters = new Collection(); - foreach (var formatter in api.ActionDescriptor.Configuration.Formatters) - { - if (IsFormatSupported(sampleDirection, formatter, type)) - { - newFormatters.Add(formatter); - } - } - formatters = newFormatters; - } - else - { - switch (sampleDirection) - { - case SampleDirection.Request: - ApiParameterDescription requestBodyParameter = api.ParameterDescriptions.FirstOrDefault(p => p.Source == ApiParameterSource.FromBody); - type = requestBodyParameter == null ? null : requestBodyParameter.ParameterDescriptor.ParameterType; - formatters = api.SupportedRequestBodyFormatters; - break; - case SampleDirection.Response: - default: - type = api.ResponseDescription.ResponseType ?? api.ResponseDescription.DeclaredType; - formatters = api.SupportedResponseFormatters; - break; - } - } - - return type; - } - - /// - /// Writes the sample object using formatter. - /// - /// The formatter. - /// The value. - /// The type. - /// Type of the media. - /// - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is recorded as InvalidSample.")] - public virtual object WriteSampleObjectUsingFormatter(MediaTypeFormatter formatter, object value, Type type, MediaTypeHeaderValue mediaType) - { - if (formatter == null) - { - throw new ArgumentNullException("formatter"); - } - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - object sample = String.Empty; - MemoryStream ms = null; - HttpContent content = null; - try - { - if (formatter.CanWriteType(type)) - { - ms = new MemoryStream(); - content = new ObjectContent(type, value, formatter, mediaType); - formatter.WriteToStreamAsync(type, value, ms, content, null).Wait(); - ms.Position = 0; - StreamReader reader = new StreamReader(ms); - string serializedSampleString = reader.ReadToEnd(); - if (mediaType.MediaType.ToUpperInvariant().Contains("XML")) - { - serializedSampleString = TryFormatXml(serializedSampleString); - } - else if (mediaType.MediaType.ToUpperInvariant().Contains("JSON")) - { - serializedSampleString = TryFormatJson(serializedSampleString); - } - - sample = new TextSample(serializedSampleString); - } - else - { - sample = new InvalidSample(String.Format( - CultureInfo.CurrentCulture, - "Failed to generate the sample for media type '{0}'. Cannot use formatter '{1}' to write type '{2}'.", - mediaType, - formatter.GetType().Name, - type.Name)); - } - } - catch (Exception e) - { - sample = new InvalidSample(String.Format( - CultureInfo.CurrentCulture, - "An exception has occurred while using the formatter '{0}' to generate sample for media type '{1}'. Exception message: {2}", - formatter.GetType().Name, - mediaType.MediaType, - UnwrapException(e).Message)); - } - finally - { - if (ms != null) - { - ms.Dispose(); - } - if (content != null) - { - content.Dispose(); - } - } - - return sample; - } - - internal static Exception UnwrapException(Exception exception) - { - AggregateException aggregateException = exception as AggregateException; - if (aggregateException != null) - { - return aggregateException.Flatten().InnerException; - } - return exception; - } - - // Default factory for sample objects - private static object DefaultSampleObjectFactory(HelpPageSampleGenerator sampleGenerator, Type type) - { - // Try to create a default sample object - ObjectGenerator objectGenerator = new ObjectGenerator(); - return objectGenerator.GenerateObject(type); - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Handling the failure by returning the original string.")] - private static string TryFormatJson(string str) - { - try - { - object parsedJson = JsonConvert.DeserializeObject(str); - return JsonConvert.SerializeObject(parsedJson, FormattingEnum.Indented); - } - catch - { - // can't parse JSON, return the original string - return str; - } - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Handling the failure by returning the original string.")] - private static string TryFormatXml(string str) - { - try - { - XDocument xml = XDocument.Parse(str); - return xml.ToString(); - } - catch - { - // can't parse XML, return the original string - return str; - } - } - - private static bool IsFormatSupported(SampleDirection sampleDirection, MediaTypeFormatter formatter, Type type) - { - switch (sampleDirection) - { - case SampleDirection.Request: - return formatter.CanReadType(type); - case SampleDirection.Response: - return formatter.CanWriteType(type); - } - return false; - } - - private IEnumerable> GetAllActionSamples(string controllerName, string actionName, IEnumerable parameterNames, SampleDirection sampleDirection) - { - HashSet parameterNamesSet = new HashSet(parameterNames, StringComparer.OrdinalIgnoreCase); - foreach (var sample in ActionSamples) - { - HelpPageSampleKey sampleKey = sample.Key; - if (String.Equals(controllerName, sampleKey.ControllerName, StringComparison.OrdinalIgnoreCase) && - String.Equals(actionName, sampleKey.ActionName, StringComparison.OrdinalIgnoreCase) && - (sampleKey.ParameterNames.SetEquals(new[] { "*" }) || parameterNamesSet.SetEquals(sampleKey.ParameterNames)) && - sampleDirection == sampleKey.SampleDirection) - { - yield return sample; - } - } - } - - private static object WrapSampleIfString(object sample) - { - string stringSample = sample as string; - if (stringSample != null) - { - return new TextSample(stringSample); - } - - return sample; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs deleted file mode 100644 index b1cef7f..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Net.Http.Headers; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This is used to identify the place where the sample should be applied. - /// - public class HelpPageSampleKey - { - /// - /// Creates a new based on media type. - /// - /// The media type. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType) - { - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - ActionName = String.Empty; - ControllerName = String.Empty; - MediaType = mediaType; - ParameterNames = new HashSet(StringComparer.OrdinalIgnoreCase); - } - - /// - /// Creates a new based on media type and CLR type. - /// - /// The media type. - /// The CLR type. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType, Type type) - : this(mediaType) - { - if (type == null) - { - throw new ArgumentNullException("type"); - } - - ParameterType = type; - } - - /// - /// Creates a new based on , controller name, action name and parameter names. - /// - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public HelpPageSampleKey(SampleDirection sampleDirection, string controllerName, string actionName, IEnumerable parameterNames) - { - if (!Enum.IsDefined(typeof(SampleDirection), sampleDirection)) - { - throw new InvalidEnumArgumentException("sampleDirection", (int)sampleDirection, typeof(SampleDirection)); - } - if (controllerName == null) - { - throw new ArgumentNullException("controllerName"); - } - if (actionName == null) - { - throw new ArgumentNullException("actionName"); - } - if (parameterNames == null) - { - throw new ArgumentNullException("parameterNames"); - } - - ControllerName = controllerName; - ActionName = actionName; - ParameterNames = new HashSet(parameterNames, StringComparer.OrdinalIgnoreCase); - SampleDirection = sampleDirection; - } - - /// - /// Creates a new based on media type, , controller name, action name and parameter names. - /// - /// The media type. - /// The . - /// Name of the controller. - /// Name of the action. - /// The parameter names. - public HelpPageSampleKey(MediaTypeHeaderValue mediaType, SampleDirection sampleDirection, string controllerName, string actionName, IEnumerable parameterNames) - : this(sampleDirection, controllerName, actionName, parameterNames) - { - if (mediaType == null) - { - throw new ArgumentNullException("mediaType"); - } - - MediaType = mediaType; - } - - /// - /// Gets the name of the controller. - /// - /// - /// The name of the controller. - /// - public string ControllerName { get; private set; } - - /// - /// Gets the name of the action. - /// - /// - /// The name of the action. - /// - public string ActionName { get; private set; } - - /// - /// Gets the media type. - /// - /// - /// The media type. - /// - public MediaTypeHeaderValue MediaType { get; private set; } - - /// - /// Gets the parameter names. - /// - public HashSet ParameterNames { get; private set; } - - public Type ParameterType { get; private set; } - - /// - /// Gets the . - /// - public SampleDirection? SampleDirection { get; private set; } - - public override bool Equals(object obj) - { - HelpPageSampleKey otherKey = obj as HelpPageSampleKey; - if (otherKey == null) - { - return false; - } - - return String.Equals(ControllerName, otherKey.ControllerName, StringComparison.OrdinalIgnoreCase) && - String.Equals(ActionName, otherKey.ActionName, StringComparison.OrdinalIgnoreCase) && - (MediaType == otherKey.MediaType || (MediaType != null && MediaType.Equals(otherKey.MediaType))) && - ParameterType == otherKey.ParameterType && - SampleDirection == otherKey.SampleDirection && - ParameterNames.SetEquals(otherKey.ParameterNames); - } - - public override int GetHashCode() - { - int hashCode = ControllerName.ToUpperInvariant().GetHashCode() ^ ActionName.ToUpperInvariant().GetHashCode(); - if (MediaType != null) - { - hashCode ^= MediaType.GetHashCode(); - } - if (SampleDirection != null) - { - hashCode ^= SampleDirection.GetHashCode(); - } - if (ParameterType != null) - { - hashCode ^= ParameterType.GetHashCode(); - } - foreach (string parameterName in ParameterNames) - { - hashCode ^= parameterName.ToUpperInvariant().GetHashCode(); - } - - return hashCode; - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ImageSample.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ImageSample.cs deleted file mode 100644 index 9af6b03..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ImageSample.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This represents an image sample on the help page. There's a display template named ImageSample associated with this class. - /// - public class ImageSample - { - /// - /// Initializes a new instance of the class. - /// - /// The URL of an image. - public ImageSample(string src) - { - if (src == null) - { - throw new ArgumentNullException("src"); - } - Src = src; - } - - public string Src { get; private set; } - - public override bool Equals(object obj) - { - ImageSample other = obj as ImageSample; - return other != null && Src == other.Src; - } - - public override int GetHashCode() - { - return Src.GetHashCode(); - } - - public override string ToString() - { - return Src; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/InvalidSample.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/InvalidSample.cs deleted file mode 100644 index d7ab8b3..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/InvalidSample.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This represents an invalid sample on the help page. There's a display template named InvalidSample associated with this class. - /// - public class InvalidSample - { - public InvalidSample(string errorMessage) - { - if (errorMessage == null) - { - throw new ArgumentNullException("errorMessage"); - } - ErrorMessage = errorMessage; - } - - public string ErrorMessage { get; private set; } - - public override bool Equals(object obj) - { - InvalidSample other = obj as InvalidSample; - return other != null && ErrorMessage == other.ErrorMessage; - } - - public override int GetHashCode() - { - return ErrorMessage.GetHashCode(); - } - - public override string ToString() - { - return ErrorMessage; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs deleted file mode 100644 index 9602a76..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs +++ /dev/null @@ -1,456 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Reflection; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This class will create an object of a given type and populate it with sample data. - /// - public class ObjectGenerator - { - internal const int DefaultCollectionSize = 2; - private readonly SimpleTypeObjectGenerator SimpleObjectGenerator = new SimpleTypeObjectGenerator(); - - /// - /// Generates an object for a given type. The type needs to be public, have a public default constructor and settable public properties/fields. Currently it supports the following types: - /// Simple types: , , , , , etc. - /// Complex types: POCO types. - /// Nullables: . - /// Arrays: arrays of simple types or complex types. - /// Key value pairs: - /// Tuples: , , etc - /// Dictionaries: or anything deriving from . - /// Collections: , , , , , or anything deriving from or . - /// Queryables: , . - /// - /// The type. - /// An object of the given type. - public object GenerateObject(Type type) - { - return GenerateObject(type, new Dictionary()); - } - - [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Here we just want to return null if anything goes wrong.")] - private object GenerateObject(Type type, Dictionary createdObjectReferences) - { - try - { - if (SimpleTypeObjectGenerator.CanGenerateObject(type)) - { - return SimpleObjectGenerator.GenerateObject(type); - } - - if (type.IsArray) - { - return GenerateArray(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type.IsGenericType) - { - return GenerateGenericType(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IDictionary)) - { - return GenerateDictionary(typeof(Hashtable), DefaultCollectionSize, createdObjectReferences); - } - - if (typeof(IDictionary).IsAssignableFrom(type)) - { - return GenerateDictionary(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IList) || - type == typeof(IEnumerable) || - type == typeof(ICollection)) - { - return GenerateCollection(typeof(ArrayList), DefaultCollectionSize, createdObjectReferences); - } - - if (typeof(IList).IsAssignableFrom(type)) - { - return GenerateCollection(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type == typeof(IQueryable)) - { - return GenerateQueryable(type, DefaultCollectionSize, createdObjectReferences); - } - - if (type.IsEnum) - { - return GenerateEnum(type); - } - - if (type.IsPublic || type.IsNestedPublic) - { - return GenerateComplexObject(type, createdObjectReferences); - } - } - catch - { - // Returns null if anything fails - return null; - } - - return null; - } - - private static object GenerateGenericType(Type type, int collectionSize, Dictionary createdObjectReferences) - { - Type genericTypeDefinition = type.GetGenericTypeDefinition(); - if (genericTypeDefinition == typeof(Nullable<>)) - { - return GenerateNullable(type, createdObjectReferences); - } - - if (genericTypeDefinition == typeof(KeyValuePair<,>)) - { - return GenerateKeyValuePair(type, createdObjectReferences); - } - - if (IsTuple(genericTypeDefinition)) - { - return GenerateTuple(type, createdObjectReferences); - } - - Type[] genericArguments = type.GetGenericArguments(); - if (genericArguments.Length == 1) - { - if (genericTypeDefinition == typeof(IList<>) || - genericTypeDefinition == typeof(IEnumerable<>) || - genericTypeDefinition == typeof(ICollection<>)) - { - Type collectionType = typeof(List<>).MakeGenericType(genericArguments); - return GenerateCollection(collectionType, collectionSize, createdObjectReferences); - } - - if (genericTypeDefinition == typeof(IQueryable<>)) - { - return GenerateQueryable(type, collectionSize, createdObjectReferences); - } - - Type closedCollectionType = typeof(ICollection<>).MakeGenericType(genericArguments[0]); - if (closedCollectionType.IsAssignableFrom(type)) - { - return GenerateCollection(type, collectionSize, createdObjectReferences); - } - } - - if (genericArguments.Length == 2) - { - if (genericTypeDefinition == typeof(IDictionary<,>)) - { - Type dictionaryType = typeof(Dictionary<,>).MakeGenericType(genericArguments); - return GenerateDictionary(dictionaryType, collectionSize, createdObjectReferences); - } - - Type closedDictionaryType = typeof(IDictionary<,>).MakeGenericType(genericArguments[0], genericArguments[1]); - if (closedDictionaryType.IsAssignableFrom(type)) - { - return GenerateDictionary(type, collectionSize, createdObjectReferences); - } - } - - if (type.IsPublic || type.IsNestedPublic) - { - return GenerateComplexObject(type, createdObjectReferences); - } - - return null; - } - - private static object GenerateTuple(Type type, Dictionary createdObjectReferences) - { - Type[] genericArgs = type.GetGenericArguments(); - object[] parameterValues = new object[genericArgs.Length]; - bool failedToCreateTuple = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < genericArgs.Length; i++) - { - parameterValues[i] = objectGenerator.GenerateObject(genericArgs[i], createdObjectReferences); - failedToCreateTuple &= parameterValues[i] == null; - } - if (failedToCreateTuple) - { - return null; - } - object result = Activator.CreateInstance(type, parameterValues); - return result; - } - - private static bool IsTuple(Type genericTypeDefinition) - { - return genericTypeDefinition == typeof(Tuple<>) || - genericTypeDefinition == typeof(Tuple<,>) || - genericTypeDefinition == typeof(Tuple<,,>) || - genericTypeDefinition == typeof(Tuple<,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,,>) || - genericTypeDefinition == typeof(Tuple<,,,,,,,>); - } - - private static object GenerateKeyValuePair(Type keyValuePairType, Dictionary createdObjectReferences) - { - Type[] genericArgs = keyValuePairType.GetGenericArguments(); - Type typeK = genericArgs[0]; - Type typeV = genericArgs[1]; - ObjectGenerator objectGenerator = new ObjectGenerator(); - object keyObject = objectGenerator.GenerateObject(typeK, createdObjectReferences); - object valueObject = objectGenerator.GenerateObject(typeV, createdObjectReferences); - if (keyObject == null && valueObject == null) - { - // Failed to create key and values - return null; - } - object result = Activator.CreateInstance(keyValuePairType, keyObject, valueObject); - return result; - } - - private static object GenerateArray(Type arrayType, int size, Dictionary createdObjectReferences) - { - Type type = arrayType.GetElementType(); - Array result = Array.CreateInstance(type, size); - bool areAllElementsNull = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object element = objectGenerator.GenerateObject(type, createdObjectReferences); - result.SetValue(element, i); - areAllElementsNull &= element == null; - } - - if (areAllElementsNull) - { - return null; - } - - return result; - } - - private static object GenerateDictionary(Type dictionaryType, int size, Dictionary createdObjectReferences) - { - Type typeK = typeof(object); - Type typeV = typeof(object); - if (dictionaryType.IsGenericType) - { - Type[] genericArgs = dictionaryType.GetGenericArguments(); - typeK = genericArgs[0]; - typeV = genericArgs[1]; - } - - object result = Activator.CreateInstance(dictionaryType); - MethodInfo addMethod = dictionaryType.GetMethod("Add") ?? dictionaryType.GetMethod("TryAdd"); - MethodInfo containsMethod = dictionaryType.GetMethod("Contains") ?? dictionaryType.GetMethod("ContainsKey"); - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object newKey = objectGenerator.GenerateObject(typeK, createdObjectReferences); - if (newKey == null) - { - // Cannot generate a valid key - return null; - } - - bool containsKey = (bool)containsMethod.Invoke(result, new object[] { newKey }); - if (!containsKey) - { - object newValue = objectGenerator.GenerateObject(typeV, createdObjectReferences); - addMethod.Invoke(result, new object[] { newKey, newValue }); - } - } - - return result; - } - - private static object GenerateEnum(Type enumType) - { - Array possibleValues = Enum.GetValues(enumType); - if (possibleValues.Length > 0) - { - return possibleValues.GetValue(0); - } - return null; - } - - private static object GenerateQueryable(Type queryableType, int size, Dictionary createdObjectReferences) - { - bool isGeneric = queryableType.IsGenericType; - object list; - if (isGeneric) - { - Type listType = typeof(List<>).MakeGenericType(queryableType.GetGenericArguments()); - list = GenerateCollection(listType, size, createdObjectReferences); - } - else - { - list = GenerateArray(typeof(object[]), size, createdObjectReferences); - } - if (list == null) - { - return null; - } - if (isGeneric) - { - Type argumentType = typeof(IEnumerable<>).MakeGenericType(queryableType.GetGenericArguments()); - MethodInfo asQueryableMethod = typeof(Queryable).GetMethod("AsQueryable", new[] { argumentType }); - return asQueryableMethod.Invoke(null, new[] { list }); - } - - return Queryable.AsQueryable((IEnumerable)list); - } - - private static object GenerateCollection(Type collectionType, int size, Dictionary createdObjectReferences) - { - Type type = collectionType.IsGenericType ? - collectionType.GetGenericArguments()[0] : - typeof(object); - object result = Activator.CreateInstance(collectionType); - MethodInfo addMethod = collectionType.GetMethod("Add"); - bool areAllElementsNull = true; - ObjectGenerator objectGenerator = new ObjectGenerator(); - for (int i = 0; i < size; i++) - { - object element = objectGenerator.GenerateObject(type, createdObjectReferences); - addMethod.Invoke(result, new object[] { element }); - areAllElementsNull &= element == null; - } - - if (areAllElementsNull) - { - return null; - } - - return result; - } - - private static object GenerateNullable(Type nullableType, Dictionary createdObjectReferences) - { - Type type = nullableType.GetGenericArguments()[0]; - ObjectGenerator objectGenerator = new ObjectGenerator(); - return objectGenerator.GenerateObject(type, createdObjectReferences); - } - - private static object GenerateComplexObject(Type type, Dictionary createdObjectReferences) - { - object result = null; - - if (createdObjectReferences.TryGetValue(type, out result)) - { - // The object has been created already, just return it. This will handle the circular reference case. - return result; - } - - if (type.IsValueType) - { - result = Activator.CreateInstance(type); - } - else - { - ConstructorInfo defaultCtor = type.GetConstructor(Type.EmptyTypes); - if (defaultCtor == null) - { - // Cannot instantiate the type because it doesn't have a default constructor - return null; - } - - result = defaultCtor.Invoke(new object[0]); - } - createdObjectReferences.Add(type, result); - SetPublicProperties(type, result, createdObjectReferences); - SetPublicFields(type, result, createdObjectReferences); - return result; - } - - private static void SetPublicProperties(Type type, object obj, Dictionary createdObjectReferences) - { - PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); - ObjectGenerator objectGenerator = new ObjectGenerator(); - foreach (PropertyInfo property in properties) - { - if (property.CanWrite) - { - object propertyValue = objectGenerator.GenerateObject(property.PropertyType, createdObjectReferences); - property.SetValue(obj, propertyValue, null); - } - } - } - - private static void SetPublicFields(Type type, object obj, Dictionary createdObjectReferences) - { - FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); - ObjectGenerator objectGenerator = new ObjectGenerator(); - foreach (FieldInfo field in fields) - { - object fieldValue = objectGenerator.GenerateObject(field.FieldType, createdObjectReferences); - field.SetValue(obj, fieldValue); - } - } - - private class SimpleTypeObjectGenerator - { - private long _index = 0; - private static readonly Dictionary> DefaultGenerators = InitializeGenerators(); - - [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These are simple type factories and cannot be split up.")] - private static Dictionary> InitializeGenerators() - { - return new Dictionary> - { - { typeof(Boolean), index => true }, - { typeof(Byte), index => (Byte)64 }, - { typeof(Char), index => (Char)65 }, - { typeof(DateTime), index => DateTime.Now }, - { typeof(DateTimeOffset), index => new DateTimeOffset(DateTime.Now) }, - { typeof(DBNull), index => DBNull.Value }, - { typeof(Decimal), index => (Decimal)index }, - { typeof(Double), index => (Double)(index + 0.1) }, - { typeof(Guid), index => Guid.NewGuid() }, - { typeof(Int16), index => (Int16)(index % Int16.MaxValue) }, - { typeof(Int32), index => (Int32)(index % Int32.MaxValue) }, - { typeof(Int64), index => (Int64)index }, - { typeof(Object), index => new object() }, - { typeof(SByte), index => (SByte)64 }, - { typeof(Single), index => (Single)(index + 0.1) }, - { - typeof(String), index => - { - return String.Format(CultureInfo.CurrentCulture, "sample string {0}", index); - } - }, - { - typeof(TimeSpan), index => - { - return TimeSpan.FromTicks(1234567); - } - }, - { typeof(UInt16), index => (UInt16)(index % UInt16.MaxValue) }, - { typeof(UInt32), index => (UInt32)(index % UInt32.MaxValue) }, - { typeof(UInt64), index => (UInt64)index }, - { - typeof(Uri), index => - { - return new Uri(String.Format(CultureInfo.CurrentCulture, "http://webapihelppage{0}.com", index)); - } - }, - }; - } - - public static bool CanGenerateObject(Type type) - { - return DefaultGenerators.ContainsKey(type); - } - - public object GenerateObject(Type type) - { - return DefaultGenerators[type](++_index); - } - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/SampleDirection.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/SampleDirection.cs deleted file mode 100644 index 5d2da0a..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/SampleDirection.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// Indicates whether the sample is used for request or response - /// - public enum SampleDirection - { - Request = 0, - Response - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/TextSample.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/TextSample.cs deleted file mode 100644 index 19d0116..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/SampleGeneration/TextSample.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// This represents a preformatted text sample on the help page. There's a display template named TextSample associated with this class. - /// - public class TextSample - { - public TextSample(string text) - { - if (text == null) - { - throw new ArgumentNullException("text"); - } - Text = text; - } - - public string Text { get; private set; } - - public override bool Equals(object obj) - { - TextSample other = obj as TextSample; - return other != null && Text == other.Text; - } - - public override int GetHashCode() - { - return Text.GetHashCode(); - } - - public override string ToString() - { - return Text; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Api.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Api.cshtml deleted file mode 100644 index 8a6bcb2..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Api.cshtml +++ /dev/null @@ -1,22 +0,0 @@ -@using System.Web.Http -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models -@model HelpPageApiModel - -@{ - var description = Model.ApiDescription; - ViewBag.Title = description.HttpMethod.Method + " " + description.RelativePath; -} - - -
- -
- @Html.DisplayForModel() -
-
diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml deleted file mode 100644 index 704925c..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml +++ /dev/null @@ -1,41 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Controllers -@using System.Web.Http.Description -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models -@model IGrouping - -@{ - var controllerDocumentation = ViewBag.DocumentationProvider != null ? - ViewBag.DocumentationProvider.GetDocumentation(Model.Key) : - null; -} - -

@Model.Key.ControllerName

-@if (!String.IsNullOrEmpty(controllerDocumentation)) -{ -

@controllerDocumentation

-} - - - - - - @foreach (var api in Model) - { - - - - - } - -
APIDescription
@api.HttpMethod.Method @api.RelativePath - @if (api.Documentation != null) - { -

@api.Documentation

- } - else - { -

No documentation available.

- } -
\ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml deleted file mode 100644 index 983d328..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model CollectionModelDescription -@if (Model.ElementDescription is ComplexTypeModelDescription) -{ - @Html.DisplayFor(m => m.ElementDescription) -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml deleted file mode 100644 index 380fd79..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model ComplexTypeModelDescription -@Html.DisplayFor(m => m.Properties, "Parameters") \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml deleted file mode 100644 index 0ad8543..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model DictionaryModelDescription -Dictionary of @Html.DisplayFor(m => Model.KeyModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.KeyModelDescription }) [key] -and @Html.DisplayFor(m => Model.ValueModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ValueModelDescription }) [value] \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml deleted file mode 100644 index 511f5c3..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml +++ /dev/null @@ -1,24 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model EnumTypeModelDescription - -

Possible enumeration values:

- - - - - - - @foreach (EnumValueDescription value in Model.Values) - { - - - - - - } - -
NameValueDescription
@value.Name -

@value.Value

-
-

@value.Documentation

-
\ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml deleted file mode 100644 index b35cc1d..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml +++ /dev/null @@ -1,67 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Description -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model HelpPageApiModel - -@{ - ApiDescription description = Model.ApiDescription; -} -

@description.HttpMethod.Method @description.RelativePath

-
-

@description.Documentation

- -

Request Information

- -

URI Parameters

- @Html.DisplayFor(m => m.UriParameters, "Parameters") - -

Body Parameters

- -

@Model.RequestDocumentation

- - @if (Model.RequestModelDescription != null) - { - @Html.DisplayFor(m => m.RequestModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.RequestModelDescription }) - if (Model.RequestBodyParameters != null) - { - @Html.DisplayFor(m => m.RequestBodyParameters, "Parameters") - } - } - else - { -

None.

- } - - @if (Model.SampleRequests.Count > 0) - { -

Request Formats

- @Html.DisplayFor(m => m.SampleRequests, "Samples") - } - -

Response Information

- -

Resource Description

- -

@description.ResponseDescription.Documentation

- - @if (Model.ResourceDescription != null) - { - @Html.DisplayFor(m => m.ResourceDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ResourceDescription }) - if (Model.ResourceProperties != null) - { - @Html.DisplayFor(m => m.ResourceProperties, "Parameters") - } - } - else - { -

None.

- } - - @if (Model.SampleResponses.Count > 0) - { -

Response Formats

- @Html.DisplayFor(m => m.SampleResponses, "Samples") - } - -
\ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml deleted file mode 100644 index adb0ee2..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -@model ImageSample - - \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml deleted file mode 100644 index 673a0ad..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml +++ /dev/null @@ -1,13 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -@model InvalidSample - -@if (HttpContext.Current.IsDebuggingEnabled) -{ -
-

@Model.ErrorMessage

-
-} -else -{ -

Sample not available.

-} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml deleted file mode 100644 index 36bf41a..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model KeyValuePairModelDescription -Pair of @Html.DisplayFor(m => Model.KeyModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.KeyModelDescription }) [key] -and @Html.DisplayFor(m => Model.ValueModelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = Model.ValueModelDescription }) [value] \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml deleted file mode 100644 index 2f71616..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml +++ /dev/null @@ -1,26 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model Type -@{ - ModelDescription modelDescription = ViewBag.modelDescription; - if (modelDescription is ComplexTypeModelDescription || modelDescription is EnumTypeModelDescription) - { - if (Model == typeof(Object)) - { - @:Object - } - else - { - @Html.ActionLink(modelDescription.Name, "ResourceModel", "Help", new { modelName = modelDescription.Name }, null) - } - } - else if (modelDescription is CollectionModelDescription) - { - var collectionDescription = modelDescription as CollectionModelDescription; - var elementDescription = collectionDescription.ElementDescription; - @:Collection of @Html.DisplayFor(m => elementDescription.ModelType, "ModelDescriptionLink", new { modelDescription = elementDescription }) - } - else - { - @Html.DisplayFor(m => modelDescription) - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml deleted file mode 100644 index e4a09c2..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml +++ /dev/null @@ -1,48 +0,0 @@ -@using System.Collections.Generic -@using System.Collections.ObjectModel -@using System.Web.Http.Description -@using System.Threading -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model IList - -@if (Model.Count > 0) -{ - - - - - - @foreach (ParameterDescription parameter in Model) - { - ModelDescription modelDescription = parameter.TypeDescription; - - - - - - - } - -
NameDescriptionTypeAdditional information
@parameter.Name -

@parameter.Documentation

-
- @Html.DisplayFor(m => modelDescription.ModelType, "ModelDescriptionLink", new { modelDescription = modelDescription }) - - @if (parameter.Annotations.Count > 0) - { - foreach (var annotation in parameter.Annotations) - { -

@annotation.Documentation

- } - } - else - { -

None.

- } -
-} -else -{ -

None.

-} - diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml deleted file mode 100644 index c19596f..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml +++ /dev/null @@ -1,30 +0,0 @@ -@using System.Net.Http.Headers -@model Dictionary - -@{ - // Group the samples into a single tab if they are the same. - Dictionary samples = Model.GroupBy(pair => pair.Value).ToDictionary( - pair => String.Join(", ", pair.Select(m => m.Key.ToString()).ToArray()), - pair => pair.Key); - var mediaTypes = samples.Keys; -} -
- @foreach (var mediaType in mediaTypes) - { -

@mediaType

-
- Sample: - @{ - var sample = samples[mediaType]; - if (sample == null) - { -

Sample not available.

- } - else - { - @Html.DisplayFor(s => sample); - } - } -
- } -
\ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml deleted file mode 100644 index 76e6cbb..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model SimpleTypeModelDescription -@Model.Documentation \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml deleted file mode 100644 index bce0093..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -@model TextSample - -
-@Model.Text
-
\ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Index.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Index.cshtml deleted file mode 100644 index 95b8ab2..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/Index.cshtml +++ /dev/null @@ -1,38 +0,0 @@ -@using System.Web.Http -@using System.Web.Http.Controllers -@using System.Web.Http.Description -@using System.Collections.ObjectModel -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.Models -@model Collection - -@{ - ViewBag.Title = "ASP.NET Web API Help Page"; - - // Group APIs by controller - ILookup apiGroups = Model.ToLookup(api => api.ActionDescriptor.ControllerDescriptor); -} - - -
-
-
-

@ViewBag.Title

-
-
-
-
- -
- @foreach (var group in apiGroups) - { - @Html.DisplayFor(m => group, "ApiGroup") - } -
-
diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/ResourceModel.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/ResourceModel.cshtml deleted file mode 100644 index 6f7d37f..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Help/ResourceModel.cshtml +++ /dev/null @@ -1,19 +0,0 @@ -@using System.Web.Http -@using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions -@model ModelDescription - - -
- -

@Model.Name

-

@Model.Documentation

-
- @Html.DisplayFor(m => Model) -
-
diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Shared/_Layout.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Shared/_Layout.cshtml deleted file mode 100644 index 896c833..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - @ViewBag.Title - @RenderSection("scripts", required: false) - - - @RenderBody() - - \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Web.config b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Web.config deleted file mode 100644 index 0971732..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/Web.config +++ /dev/null @@ -1,41 +0,0 @@ - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/_ViewStart.cshtml b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/_ViewStart.cshtml deleted file mode 100644 index a925950..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/Views/_ViewStart.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@{ - // Change the Layout path below to blend the look and feel of the help page with your existing web pages. - Layout = "~/Areas/HelpPage/Views/Shared/_Layout.cshtml"; -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/XmlDocumentationProvider.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/XmlDocumentationProvider.cs deleted file mode 100644 index f8db2f1..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Areas/HelpPage/XmlDocumentationProvider.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Reflection; -using System.Web.Http.Controllers; -using System.Web.Http.Description; -using System.Xml.XPath; -using WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage.ModelDescriptions; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Areas.HelpPage -{ - /// - /// A custom that reads the API documentation from an XML documentation file. - /// - public class XmlDocumentationProvider : IDocumentationProvider, IModelDocumentationProvider - { - private XPathNavigator _documentNavigator; - private const string TypeExpression = "/doc/members/member[@name='T:{0}']"; - private const string MethodExpression = "/doc/members/member[@name='M:{0}']"; - private const string PropertyExpression = "/doc/members/member[@name='P:{0}']"; - private const string FieldExpression = "/doc/members/member[@name='F:{0}']"; - private const string ParameterExpression = "param[@name='{0}']"; - - /// - /// Initializes a new instance of the class. - /// - /// The physical path to XML document. - public XmlDocumentationProvider(string documentPath) - { - if (documentPath == null) - { - throw new ArgumentNullException("documentPath"); - } - XPathDocument xpath = new XPathDocument(documentPath); - _documentNavigator = xpath.CreateNavigator(); - } - - public string GetDocumentation(HttpControllerDescriptor controllerDescriptor) - { - XPathNavigator typeNode = GetTypeNode(controllerDescriptor.ControllerType); - return GetTagValue(typeNode, "summary"); - } - - public virtual string GetDocumentation(HttpActionDescriptor actionDescriptor) - { - XPathNavigator methodNode = GetMethodNode(actionDescriptor); - return GetTagValue(methodNode, "summary"); - } - - public virtual string GetDocumentation(HttpParameterDescriptor parameterDescriptor) - { - ReflectedHttpParameterDescriptor reflectedParameterDescriptor = parameterDescriptor as ReflectedHttpParameterDescriptor; - if (reflectedParameterDescriptor != null) - { - XPathNavigator methodNode = GetMethodNode(reflectedParameterDescriptor.ActionDescriptor); - if (methodNode != null) - { - string parameterName = reflectedParameterDescriptor.ParameterInfo.Name; - XPathNavigator parameterNode = methodNode.SelectSingleNode(String.Format(CultureInfo.InvariantCulture, ParameterExpression, parameterName)); - if (parameterNode != null) - { - return parameterNode.Value.Trim(); - } - } - } - - return null; - } - - public string GetResponseDocumentation(HttpActionDescriptor actionDescriptor) - { - XPathNavigator methodNode = GetMethodNode(actionDescriptor); - return GetTagValue(methodNode, "returns"); - } - - public string GetDocumentation(MemberInfo member) - { - string memberName = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetTypeName(member.DeclaringType), member.Name); - string expression = member.MemberType == MemberTypes.Field ? FieldExpression : PropertyExpression; - string selectExpression = String.Format(CultureInfo.InvariantCulture, expression, memberName); - XPathNavigator propertyNode = _documentNavigator.SelectSingleNode(selectExpression); - return GetTagValue(propertyNode, "summary"); - } - - public string GetDocumentation(Type type) - { - XPathNavigator typeNode = GetTypeNode(type); - return GetTagValue(typeNode, "summary"); - } - - private XPathNavigator GetMethodNode(HttpActionDescriptor actionDescriptor) - { - ReflectedHttpActionDescriptor reflectedActionDescriptor = actionDescriptor as ReflectedHttpActionDescriptor; - if (reflectedActionDescriptor != null) - { - string selectExpression = String.Format(CultureInfo.InvariantCulture, MethodExpression, GetMemberName(reflectedActionDescriptor.MethodInfo)); - return _documentNavigator.SelectSingleNode(selectExpression); - } - - return null; - } - - private static string GetMemberName(MethodInfo method) - { - string name = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetTypeName(method.DeclaringType), method.Name); - ParameterInfo[] parameters = method.GetParameters(); - if (parameters.Length != 0) - { - string[] parameterTypeNames = parameters.Select(param => GetTypeName(param.ParameterType)).ToArray(); - name += String.Format(CultureInfo.InvariantCulture, "({0})", String.Join(",", parameterTypeNames)); - } - - return name; - } - - private static string GetTagValue(XPathNavigator parentNode, string tagName) - { - if (parentNode != null) - { - XPathNavigator node = parentNode.SelectSingleNode(tagName); - if (node != null) - { - return node.Value.Trim(); - } - } - - return null; - } - - private XPathNavigator GetTypeNode(Type type) - { - string controllerTypeName = GetTypeName(type); - string selectExpression = String.Format(CultureInfo.InvariantCulture, TypeExpression, controllerTypeName); - return _documentNavigator.SelectSingleNode(selectExpression); - } - - private static string GetTypeName(Type type) - { - string name = type.FullName; - if (type.IsGenericType) - { - // Format the generic type name to something like: Generic{System.Int32,System.String} - Type genericType = type.GetGenericTypeDefinition(); - Type[] genericArguments = type.GetGenericArguments(); - string genericTypeName = genericType.FullName; - - // Trim the generic parameter counts from the name - genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`')); - string[] argumentTypeNames = genericArguments.Select(t => GetTypeName(t)).ToArray(); - name = String.Format(CultureInfo.InvariantCulture, "{0}{{{1}}}", genericTypeName, String.Join(",", argumentTypeNames)); - } - if (type.IsNested) - { - // Changing the nested type name from OuterType+InnerType to OuterType.InnerType to match the XML documentation syntax. - name = name.Replace("+", "."); - } - - return name; - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/Site.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/Site.css deleted file mode 100644 index ad542f3..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/Site.css +++ /dev/null @@ -1,42 +0,0 @@ -body { - padding-top: 50px; - padding-bottom: 20px; -} - -/* Set padding to keep content from hitting the edges */ -.body-content { - padding-left: 15px; - padding-right: 15px; -} - -/* Set width on the form input elements since they're 100% wide by default */ -input, -select, -textarea { - max-width: 280px; -} - -/* styles for validation helpers */ -.field-validation-error { - color: #b94a48; -} - -.field-validation-valid { - display: none; -} - -input.input-validation-error { - border: 1px solid #b94a48; -} - -input[type="checkbox"].input-validation-error { - border: 0 none; -} - -.validation-summary-errors { - color: #b94a48; -} - -.validation-summary-valid { - display: none; -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css deleted file mode 100644 index ebe57fb..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css +++ /dev/null @@ -1,587 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-default.disabled, -.btn-primary.disabled, -.btn-success.disabled, -.btn-info.disabled, -.btn-warning.disabled, -.btn-danger.disabled, -.btn-default[disabled], -.btn-primary[disabled], -.btn-success[disabled], -.btn-info[disabled], -.btn-warning[disabled], -.btn-danger[disabled], -fieldset[disabled] .btn-default, -fieldset[disabled] .btn-primary, -fieldset[disabled] .btn-success, -fieldset[disabled] .btn-info, -fieldset[disabled] .btn-warning, -fieldset[disabled] .btn-danger { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-default .badge, -.btn-primary .badge, -.btn-success .badge, -.btn-info .badge, -.btn-warning .badge, -.btn-danger .badge { - text-shadow: none; -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.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, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); - background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #245580; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #265a88; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #265a88; - border-color: #245580; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.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, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #265a88; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.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, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.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, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.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, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.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, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #2e6da4; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); - background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); - background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); - background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); - background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -@media (max-width: 767px) { - .navbar .navbar-nav .open .dropdown-menu > .active > a, - .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; - } -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); - background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #286090; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); - background-repeat: repeat-x; - border-color: #2b669a; -} -.list-group-item.active .badge, -.list-group-item.active:hover .badge, -.list-group-item.active:focus .badge { - text-shadow: none; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css.map b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css.map deleted file mode 100644 index 21e1910..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.min.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.min.css deleted file mode 100644 index dc95d8e..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap-theme.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css deleted file mode 100644 index 42c79d6..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css +++ /dev/null @@ -1,6760 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\002a"; -} -.glyphicon-plus:before { - content: "\002b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover, -a.text-info:focus { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - min-height: .01%; - overflow-x: auto; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - min-height: 34px; - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 11px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, -.btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, -.btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #337ab7; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #337ab7; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group .form-control:focus { - z-index: 3; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #337ab7; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 2; - color: #23527c; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 3; - color: #fff; - cursor: default; - background-color: #337ab7; - border-color: #337ab7; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - padding-right: 15px; - padding-left: 15px; - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border .2s ease-in-out; - -o-transition: border .2s ease-in-out; - transition: border .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - cursor: not-allowed; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-right: 15px; - padding-left: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - filter: alpha(opacity=0); - opacity: 0; - - line-break: auto; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - right: 5px; - bottom: 0; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - - line-break: auto; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: -o-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - background-color: rgba(0, 0, 0, 0); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - margin-top: -10px; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - font-family: serif; - line-height: 1; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -10px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -10px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -10px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-header:before, -.modal-header:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-header:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css.map b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css.map deleted file mode 100644 index 09f8cda..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAwOA;IA1OI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ9nCH;IAhFM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAqEF;IAvEI,aAAA;Gb+hDD;CACF;Aa3hDC;EAkEF;IApEI,aAAA;GbiiDD;CACF;Aa7hDD;EA+DA;IAjEI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n 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');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.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 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.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 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .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 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .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 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .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 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n \n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.min.css b/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.min.css deleted file mode 100644 index 4cf729e..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Content/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{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 td,.table-bordered th{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:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro: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}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{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-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{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-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.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],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody: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:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>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.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-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}td.visible-xs,th.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}td.visible-sm,th.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}td.visible-md,th.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}td.visible-lg,th.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}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/HomeController.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/HomeController.cs deleted file mode 100644 index 6d8894f..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/HomeController.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Web.Mvc; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Controllers -{ - public class HomeController : Controller - { - public ActionResult Index() - { - ViewBag.Title = "Sample web application"; - - return View(); - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/ValuesController.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/ValuesController.cs deleted file mode 100644 index 7222134..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Controllers/ValuesController.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Text; -using System.Web.Http; -using WebApiContrib.Formatting.Xlsx.Sample.Models; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Controllers -{ - public class ValuesController : ApiController - { - /// - /// Get a list of countries with data from the CIA World Factbook. - /// - public IEnumerable Get() - { - var path = AppDomain.CurrentDomain.BaseDirectory + @"\cia-data.txt"; - var data = File.ReadAllLines(path, Encoding.UTF8); - - var ciaData = from line in data - select line.Split('|') - into row - select new CiaWorldFactBookData() - { - Country = row[0], - EstimatedPopulationIn2010 = int.Parse(row[1]), - PercentOfWorldPopulation = decimal.Parse(row[2]), - InternetUsers = row[3].ToNullable(), - Penetration = row[4].ToNullable(), - Region = row[5], - IncomeGroup = row[6], - GdpPerCapita = row[7].ToNullable() - }; - - return ciaData; - } - } - - internal static class StringExtensions - { - public static Nullable ToNullable(this string s) where T : struct - { - Nullable result = new Nullable(); - try - { - if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0) - { - TypeConverter conv = TypeDescriptor.GetConverter(typeof(T)); - result = (T)conv.ConvertFrom(s); - } - } - catch { } - return result; - } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax b/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax deleted file mode 100644 index 158c3f0..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="WebApiContrib.Formatting.Xlsx.Sample.WebApiApplication" Language="C#" %> diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax.cs deleted file mode 100644 index 9a21558..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Global.asax.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Web.Http; -using System.Web.Mvc; -using System.Web.Optimization; -using System.Web.Routing; - -namespace WebApiContrib.Formatting.Xlsx.Sample -{ - public class WebApiApplication : System.Web.HttpApplication - { - protected void Application_Start() - { - AreaRegistration.RegisterAllAreas(); - GlobalConfiguration.Configure(WebApiConfig.Register); - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - RouteConfig.RegisterRoutes(RouteTable.Routes); - BundleConfig.RegisterBundles(BundleTable.Bundles); - } - } -} diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Models/CiaWorldFactBookData.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Models/CiaWorldFactBookData.cs deleted file mode 100644 index e804421..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Models/CiaWorldFactBookData.cs +++ /dev/null @@ -1,30 +0,0 @@ -using WebApiContrib.Formatting.Xlsx.Attributes; - -namespace WebApiContrib.Formatting.Xlsx.Sample.Models -{ - [ExcelDocument("CIA World Factbook - Internet Penetration")] - public class CiaWorldFactBookData - { - public string Country { get; set; } - - [ExcelColumn(Header = "Population in 2010 (estimated)", NumberFormat = "#,0.##,,\" M\"")] - public int EstimatedPopulationIn2010 { get; set; } - - [ExcelColumn(Header = "% of world population", NumberFormat = "0%")] - public decimal PercentOfWorldPopulation { get; set; } - - [ExcelColumn(Header = "Internet users", NumberFormat = "#,0.##,,\" M\"")] - public int? InternetUsers { get; set; } - - [ExcelColumn(NumberFormat = "0%")] - public decimal? Penetration { get; set; } - - public string Region { get; set; } - - [ExcelColumn(Header = "Income group")] - public string IncomeGroup { get; set; } - - [ExcelColumn(Header = "GDP per capita", NumberFormat = "$#,###")] - public int? GdpPerCapita { get; set; } - } -} \ No newline at end of file diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Project_Readme.html b/samples/WebApiContrib.Formatting.Xlsx.Sample/Project_Readme.html deleted file mode 100644 index 7b7e35e..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Project_Readme.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - Your ASP.NET application - - - - - - - - - diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Properties/AssemblyInfo.cs b/samples/WebApiContrib.Formatting.Xlsx.Sample/Properties/AssemblyInfo.cs deleted file mode 100644 index 49c09d1..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("WebApiContrib.Formatting.Xlsx sample app")] -[assembly: AssemblyDescription("Sample application to demonstrate use of WebApiContrib.Formatting.Xlsx.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("WebApiContrib")] -[assembly: AssemblyProduct("WebApiContrib.Formatting.Xlsx.Sample")] -[assembly: AssemblyCopyright("2014 Jordan Gray, WebApiContrib team")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: Guid("7b5cf620-153f-441e-97d2-dcab4d74756c")] -[assembly: AssemblyVersion("2.0.*")] -[assembly: AssemblyInformationalVersion("2.0.0-pre")] - diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/_references.js b/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/_references.js deleted file mode 100644 index fb5fe10bab286cc9d1c7217f4c2c08feb99e48aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmcJM%?^Sv5QOJ!;yV!UqS1>7^<4_Z2(h4m2Yq<;>vGhSXqu+m{h3Z@o{xp%O0<>J zRlOQ@x~W!9uHbaabRzQFX-2)Js~}34+H0zb%?}7Il>#3_`D?O=qAt+&aT? z)KUeN^rouFeurA=Vw_rd&$R+8?&Y5_$MX$n;7z5Pzu!@7V7-CydKBxZdxxqGih7WO fX`iEhpyGMWk#$5KPfPP5Iu#xJg%j`ZfA;nTr^jTu diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.js b/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.js deleted file mode 100644 index 01fbbcb..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.js +++ /dev/null @@ -1,2363 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 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] > 2)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') - } -}(jQuery); - -/* ======================================================================== - * Bootstrap: transition.js v3.3.6 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2015 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.6 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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) - - 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.6 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, 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) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() - }) - .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.6 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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.6 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+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.6' - - 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.6 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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.6 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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 (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.6 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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() - 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 elOffset = isBody ? { top: 0, left: 0 } : $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 - }) - } - - - // 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.6 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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.6 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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.6 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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.6 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2015 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.6' - - 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/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.min.js b/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.min.js deleted file mode 100644 index e79c065..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 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]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(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){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(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.6",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);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.6",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)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},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);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).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.6",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"));return a>this.$items.length-1||0>a?void 0: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(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0: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.6",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.6",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);return 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()?void 0:(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})};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.6",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.6",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.6",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 c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},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/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.intellisense.js b/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.intellisense.js deleted file mode 100644 index a88b6c6..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.intellisense.js +++ /dev/null @@ -1,2670 +0,0 @@ -intellisense.annotate(jQuery, { - 'ajax': function() { - /// - /// Perform an asynchronous HTTP (Ajax) request. - /// A string containing the URL to which the request is sent. - /// A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings. - /// - /// - /// - /// Perform an asynchronous HTTP (Ajax) request. - /// A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). - /// - /// - }, - 'ajaxPrefilter': function() { - /// - /// Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax(). - /// An optional string containing one or more space-separated dataTypes - /// A handler to set default values for future Ajax requests. - /// - }, - 'ajaxSetup': function() { - /// - /// Set default values for future Ajax requests. Its use is not recommended. - /// A set of key/value pairs that configure the default Ajax request. All options are optional. - /// - }, - 'ajaxTransport': function() { - /// - /// Creates an object that handles the actual transmission of Ajax data. - /// A string identifying the data type to use - /// A handler to return the new transport object to use with the data type provided in the first argument. - /// - }, - 'boxModel': function() { - /// Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model. - /// - }, - 'browser': function() { - /// Contains flags for the useragent, read from navigator.userAgent. This property was removed in jQuery 1.9 and is available only through the jQuery.migrate plugin. Please try to use feature detection instead. - /// - }, - 'browser.version': function() { - /// The version number of the rendering engine for the user's browser. This property was removed in jQuery 1.9 and is available only through the jQuery.migrate plugin. - /// - }, - 'Callbacks': function() { - /// - /// A multi-purpose callbacks list object that provides a powerful way to manage callback lists. - /// An optional list of space-separated flags that change how the callback list behaves. - /// - /// - }, - 'contains': function() { - /// - /// Check to see if a DOM element is a descendant of another DOM element. - /// The DOM element that may contain the other element. - /// The DOM element that may be contained by (a descendant of) the other element. - /// - /// - }, - 'cssHooks': function() { - /// Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties. - /// - }, - 'data': function() { - /// - /// Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element. - /// The DOM element to query for the data. - /// Name of the data stored. - /// - /// - /// - /// Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element. - /// The DOM element to query for the data. - /// - /// - }, - 'Deferred': function() { - /// - /// A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function. - /// A function that is called just before the constructor returns. - /// - /// - }, - 'dequeue': function() { - /// - /// Execute the next function on the queue for the matched element. - /// A DOM element from which to remove and execute a queued function. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - }, - 'each': function() { - /// - /// A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. - /// The object or array to iterate over. - /// The function that will be executed on every object. - /// - /// - }, - 'error': function() { - /// - /// Takes a string and throws an exception containing it. - /// The message to send out. - /// - }, - 'extend': function() { - /// - /// Merge the contents of two or more objects together into the first object. - /// An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument. - /// An object containing additional properties to merge in. - /// Additional objects containing properties to merge in. - /// - /// - /// - /// Merge the contents of two or more objects together into the first object. - /// If true, the merge becomes recursive (aka. deep copy). - /// The object to extend. It will receive the new properties. - /// An object containing additional properties to merge in. - /// Additional objects containing properties to merge in. - /// - /// - }, - 'fn.extend': function() { - /// - /// Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods. - /// An object to merge onto the jQuery prototype. - /// - /// - }, - 'get': function() { - /// - /// Load data from the server using a HTTP GET request. - /// A string containing the URL to which the request is sent. - /// A plain object or string that is sent to the server with the request. - /// A callback function that is executed if the request succeeds. - /// The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html). - /// - /// - }, - 'getJSON': function() { - /// - /// Load JSON-encoded data from the server using a GET HTTP request. - /// A string containing the URL to which the request is sent. - /// A plain object or string that is sent to the server with the request. - /// A callback function that is executed if the request succeeds. - /// - /// - }, - 'getScript': function() { - /// - /// Load a JavaScript file from the server using a GET HTTP request, then execute it. - /// A string containing the URL to which the request is sent. - /// A callback function that is executed if the request succeeds. - /// - /// - }, - 'globalEval': function() { - /// - /// Execute some JavaScript code globally. - /// The JavaScript code to execute. - /// - }, - 'grep': function() { - /// - /// Finds the elements of an array which satisfy a filter function. The original array is not affected. - /// The array to search through. - /// The function to process each item against. The first argument to the function is the item, and the second argument is the index. The function should return a Boolean value. this will be the global window object. - /// If "invert" is false, or not provided, then the function returns an array consisting of all elements for which "callback" returns true. If "invert" is true, then the function returns an array consisting of all elements for which "callback" returns false. - /// - /// - }, - 'hasData': function() { - /// - /// Determine whether an element has any jQuery data associated with it. - /// A DOM element to be checked for data. - /// - /// - }, - 'holdReady': function() { - /// - /// Holds or releases the execution of jQuery's ready event. - /// Indicates whether the ready hold is being requested or released - /// - }, - 'inArray': function() { - /// - /// Search for a specified value within an array and return its index (or -1 if not found). - /// The value to search for. - /// An array through which to search. - /// The index of the array at which to begin the search. The default is 0, which will search the whole array. - /// - /// - }, - 'isArray': function() { - /// - /// Determine whether the argument is an array. - /// Object to test whether or not it is an array. - /// - /// - }, - 'isEmptyObject': function() { - /// - /// Check to see if an object is empty (contains no enumerable properties). - /// The object that will be checked to see if it's empty. - /// - /// - }, - 'isFunction': function() { - /// - /// Determine if the argument passed is a Javascript function object. - /// Object to test whether or not it is a function. - /// - /// - }, - 'isNumeric': function() { - /// - /// Determines whether its argument is a number. - /// The value to be tested. - /// - /// - }, - 'isPlainObject': function() { - /// - /// Check to see if an object is a plain object (created using "{}" or "new Object"). - /// The object that will be checked to see if it's a plain object. - /// - /// - }, - 'isWindow': function() { - /// - /// Determine whether the argument is a window. - /// Object to test whether or not it is a window. - /// - /// - }, - 'isXMLDoc': function() { - /// - /// Check to see if a DOM node is within an XML document (or is an XML document). - /// The DOM node that will be checked to see if it's in an XML document. - /// - /// - }, - 'makeArray': function() { - /// - /// Convert an array-like object into a true JavaScript array. - /// Any object to turn into a native Array. - /// - /// - }, - 'map': function() { - /// - /// Translate all items in an array or object to new array of items. - /// The Array to translate. - /// The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object. - /// - /// - /// - /// Translate all items in an array or object to new array of items. - /// The Array or Object to translate. - /// The function to process each item against. The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object. - /// - /// - }, - 'merge': function() { - /// - /// Merge the contents of two arrays together into the first array. - /// The first array to merge, the elements of second added. - /// The second array to merge into the first, unaltered. - /// - /// - }, - 'noConflict': function() { - /// - /// Relinquish jQuery's control of the $ variable. - /// A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself). - /// - /// - }, - 'noop': function() { - /// An empty function. - }, - 'now': function() { - /// Return a number representing the current time. - /// - }, - 'param': function() { - /// - /// Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. - /// An array or object to serialize. - /// - /// - /// - /// Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. - /// An array or object to serialize. - /// A Boolean indicating whether to perform a traditional "shallow" serialization. - /// - /// - }, - 'parseHTML': function() { - /// - /// Parses a string into an array of DOM nodes. - /// HTML string to be parsed - /// Document element to serve as the context in which the HTML fragment will be created - /// A Boolean indicating whether to include scripts passed in the HTML string - /// - /// - }, - 'parseJSON': function() { - /// - /// Takes a well-formed JSON string and returns the resulting JavaScript object. - /// The JSON string to parse. - /// - /// - }, - 'parseXML': function() { - /// - /// Parses a string into an XML document. - /// a well-formed XML string to be parsed - /// - /// - }, - 'post': function() { - /// - /// Load data from the server using a HTTP POST request. - /// A string containing the URL to which the request is sent. - /// A plain object or string that is sent to the server with the request. - /// A callback function that is executed if the request succeeds. Required if dataType is provided, but can be null in that case. - /// The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). - /// - /// - }, - 'proxy': function() { - /// - /// Takes a function and returns a new one that will always have a particular context. - /// The function whose context will be changed. - /// The object to which the context (this) of the function should be set. - /// - /// - /// - /// Takes a function and returns a new one that will always have a particular context. - /// The object to which the context of the function should be set. - /// The name of the function whose context will be changed (should be a property of the context object). - /// - /// - /// - /// Takes a function and returns a new one that will always have a particular context. - /// The function whose context will be changed. - /// The object to which the context (this) of the function should be set. - /// Any number of arguments to be passed to the function referenced in the function argument. - /// - /// - /// - /// Takes a function and returns a new one that will always have a particular context. - /// The object to which the context of the function should be set. - /// The name of the function whose context will be changed (should be a property of the context object). - /// Any number of arguments to be passed to the function named in the name argument. - /// - /// - }, - 'queue': function() { - /// - /// Manipulate the queue of functions to be executed on the matched element. - /// A DOM element where the array of queued functions is attached. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// An array of functions to replace the current queue contents. - /// - /// - /// - /// Manipulate the queue of functions to be executed on the matched element. - /// A DOM element on which to add a queued function. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// The new function to add to the queue. - /// - /// - }, - 'removeData': function() { - /// - /// Remove a previously-stored piece of data. - /// A DOM element from which to remove data. - /// A string naming the piece of data to remove. - /// - /// - }, - 'sub': function() { - /// Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object. - /// - }, - 'support': function() { - /// A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance. - /// - }, - 'trim': function() { - /// - /// Remove the whitespace from the beginning and end of a string. - /// The string to trim. - /// - /// - }, - 'type': function() { - /// - /// Determine the internal JavaScript [[Class]] of an object. - /// Object to get the internal JavaScript [[Class]] of. - /// - /// - }, - 'unique': function() { - /// - /// Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers. - /// The Array of DOM elements. - /// - /// - }, - 'when': function() { - /// - /// Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events. - /// One or more Deferred objects, or plain JavaScript objects. - /// - /// - }, -}); - -var _1228819969 = jQuery.Callbacks; -jQuery.Callbacks = function(flags) { -var _object = _1228819969(flags); -intellisense.annotate(_object, { - 'add': function() { - /// - /// Add a callback or a collection of callbacks to a callback list. - /// A function, or array of functions, that are to be added to the callback list. - /// - /// - }, - 'disable': function() { - /// Disable a callback list from doing anything more. - /// - }, - 'disabled': function() { - /// Determine if the callbacks list has been disabled. - /// - }, - 'empty': function() { - /// Remove all of the callbacks from a list. - /// - }, - 'fire': function() { - /// - /// Call all of the callbacks with the given arguments - /// The argument or list of arguments to pass back to the callback list. - /// - /// - }, - 'fired': function() { - /// Determine if the callbacks have already been called at least once. - /// - }, - 'fireWith': function() { - /// - /// Call all callbacks in a list with the given context and arguments. - /// A reference to the context in which the callbacks in the list should be fired. - /// An argument, or array of arguments, to pass to the callbacks in the list. - /// - /// - }, - 'has': function() { - /// - /// Determine whether a supplied callback is in a list - /// The callback to search for. - /// - /// - }, - 'lock': function() { - /// Lock a callback list in its current state. - /// - }, - 'locked': function() { - /// Determine if the callbacks list has been locked. - /// - }, - 'remove': function() { - /// - /// Remove a callback or a collection of callbacks from a callback list. - /// A function, or array of functions, that are to be removed from the callback list. - /// - /// - }, -}); - -return _object; -}; -intellisense.redirectDefinition(jQuery.Callbacks, _1228819969); - -var _731531622 = jQuery.Deferred; -jQuery.Deferred = function(func) { -var _object = _731531622(func); -intellisense.annotate(_object, { - 'always': function() { - /// - /// Add handlers to be called when the Deferred object is either resolved or rejected. - /// A function, or array of functions, that is called when the Deferred is resolved or rejected. - /// Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. - /// - /// - }, - 'done': function() { - /// - /// Add handlers to be called when the Deferred object is resolved. - /// A function, or array of functions, that are called when the Deferred is resolved. - /// Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. - /// - /// - }, - 'fail': function() { - /// - /// Add handlers to be called when the Deferred object is rejected. - /// A function, or array of functions, that are called when the Deferred is rejected. - /// Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. - /// - /// - }, - 'isRejected': function() { - /// Determine whether a Deferred object has been rejected. - /// - }, - 'isResolved': function() { - /// Determine whether a Deferred object has been resolved. - /// - }, - 'notify': function() { - /// - /// Call the progressCallbacks on a Deferred object with the given args. - /// Optional arguments that are passed to the progressCallbacks. - /// - /// - }, - 'notifyWith': function() { - /// - /// Call the progressCallbacks on a Deferred object with the given context and args. - /// Context passed to the progressCallbacks as the this object. - /// Optional arguments that are passed to the progressCallbacks. - /// - /// - }, - 'pipe': function() { - /// - /// Utility method to filter and/or chain Deferreds. - /// An optional function that is called when the Deferred is resolved. - /// An optional function that is called when the Deferred is rejected. - /// - /// - /// - /// Utility method to filter and/or chain Deferreds. - /// An optional function that is called when the Deferred is resolved. - /// An optional function that is called when the Deferred is rejected. - /// An optional function that is called when progress notifications are sent to the Deferred. - /// - /// - }, - 'progress': function() { - /// - /// Add handlers to be called when the Deferred object generates progress notifications. - /// A function, or array of functions, to be called when the Deferred generates progress notifications. - /// - /// - }, - 'promise': function() { - /// - /// Return a Deferred's Promise object. - /// Object onto which the promise methods have to be attached - /// - /// - }, - 'reject': function() { - /// - /// Reject a Deferred object and call any failCallbacks with the given args. - /// Optional arguments that are passed to the failCallbacks. - /// - /// - }, - 'rejectWith': function() { - /// - /// Reject a Deferred object and call any failCallbacks with the given context and args. - /// Context passed to the failCallbacks as the this object. - /// An optional array of arguments that are passed to the failCallbacks. - /// - /// - }, - 'resolve': function() { - /// - /// Resolve a Deferred object and call any doneCallbacks with the given args. - /// Optional arguments that are passed to the doneCallbacks. - /// - /// - }, - 'resolveWith': function() { - /// - /// Resolve a Deferred object and call any doneCallbacks with the given context and args. - /// Context passed to the doneCallbacks as the this object. - /// An optional array of arguments that are passed to the doneCallbacks. - /// - /// - }, - 'state': function() { - /// Determine the current state of a Deferred object. - /// - }, - 'then': function() { - /// - /// Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - /// A function that is called when the Deferred is resolved. - /// An optional function that is called when the Deferred is rejected. - /// An optional function that is called when progress notifications are sent to the Deferred. - /// - /// - /// - /// Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - /// A function, or array of functions, called when the Deferred is resolved. - /// A function, or array of functions, called when the Deferred is rejected. - /// - /// - /// - /// Add handlers to be called when the Deferred object is resolved, rejected, or still in progress. - /// A function, or array of functions, called when the Deferred is resolved. - /// A function, or array of functions, called when the Deferred is rejected. - /// A function, or array of functions, called when the Deferred notifies progress. - /// - /// - }, -}); - -return _object; -}; -intellisense.redirectDefinition(jQuery.Callbacks, _731531622); - -intellisense.annotate(jQuery.Event.prototype, { - 'currentTarget': function() { - /// The current DOM element within the event bubbling phase. - /// - }, - 'data': function() { - /// An optional object of data passed to an event method when the current executing handler is bound. - /// - }, - 'delegateTarget': function() { - /// The element where the currently-called jQuery event handler was attached. - /// - }, - 'isDefaultPrevented': function() { - /// Returns whether event.preventDefault() was ever called on this event object. - /// - }, - 'isImmediatePropagationStopped': function() { - /// Returns whether event.stopImmediatePropagation() was ever called on this event object. - /// - }, - 'isPropagationStopped': function() { - /// Returns whether event.stopPropagation() was ever called on this event object. - /// - }, - 'metaKey': function() { - /// Indicates whether the META key was pressed when the event fired. - /// - }, - 'namespace': function() { - /// The namespace specified when the event was triggered. - /// - }, - 'pageX': function() { - /// The mouse position relative to the left edge of the document. - /// - }, - 'pageY': function() { - /// The mouse position relative to the top edge of the document. - /// - }, - 'preventDefault': function() { - /// If this method is called, the default action of the event will not be triggered. - }, - 'relatedTarget': function() { - /// The other DOM element involved in the event, if any. - /// - }, - 'result': function() { - /// The last value returned by an event handler that was triggered by this event, unless the value was undefined. - /// - }, - 'stopImmediatePropagation': function() { - /// Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. - }, - 'stopPropagation': function() { - /// Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. - }, - 'target': function() { - /// The DOM element that initiated the event. - /// - }, - 'timeStamp': function() { - /// The difference in milliseconds between the time the browser created the event and January 1, 1970. - /// - }, - 'type': function() { - /// Describes the nature of the event. - /// - }, - 'which': function() { - /// For key or mouse events, this property indicates the specific key or button that was pressed. - /// - }, -}); - -intellisense.annotate(jQuery.fn, { - 'add': function() { - /// - /// Add elements to the set of matched elements. - /// A string representing a selector expression to find additional elements to add to the set of matched elements. - /// - /// - /// - /// Add elements to the set of matched elements. - /// One or more elements to add to the set of matched elements. - /// - /// - /// - /// Add elements to the set of matched elements. - /// An HTML fragment to add to the set of matched elements. - /// - /// - /// - /// Add elements to the set of matched elements. - /// An existing jQuery object to add to the set of matched elements. - /// - /// - /// - /// Add elements to the set of matched elements. - /// A string representing a selector expression to find additional elements to add to the set of matched elements. - /// The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method. - /// - /// - }, - 'addBack': function() { - /// - /// Add the previous set of elements on the stack to the current set, optionally filtered by a selector. - /// A string containing a selector expression to match the current set of elements against. - /// - /// - }, - 'addClass': function() { - /// - /// Adds the specified class(es) to each of the set of matched elements. - /// One or more space-separated classes to be added to the class attribute of each matched element. - /// - /// - /// - /// Adds the specified class(es) to each of the set of matched elements. - /// A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set. - /// - /// - }, - 'after': function() { - /// - /// Insert content, specified by the parameter, after each element in the set of matched elements. - /// HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements. - /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements. - /// - /// - /// - /// Insert content, specified by the parameter, after each element in the set of matched elements. - /// A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. - /// - /// - }, - 'ajaxComplete': function() { - /// - /// Register a handler to be called when Ajax requests complete. This is an AjaxEvent. - /// The function to be invoked. - /// - /// - }, - 'ajaxError': function() { - /// - /// Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event. - /// The function to be invoked. - /// - /// - }, - 'ajaxSend': function() { - /// - /// Attach a function to be executed before an Ajax request is sent. This is an Ajax Event. - /// The function to be invoked. - /// - /// - }, - 'ajaxStart': function() { - /// - /// Register a handler to be called when the first Ajax request begins. This is an Ajax Event. - /// The function to be invoked. - /// - /// - }, - 'ajaxStop': function() { - /// - /// Register a handler to be called when all Ajax requests have completed. This is an Ajax Event. - /// The function to be invoked. - /// - /// - }, - 'ajaxSuccess': function() { - /// - /// Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event. - /// The function to be invoked. - /// - /// - }, - 'all': function() { - /// Selects all elements. - }, - 'andSelf': function() { - /// Add the previous set of elements on the stack to the current set. - /// - }, - 'animate': function() { - /// - /// Perform a custom animation of a set of CSS properties. - /// An object of CSS properties and values that the animation will move toward. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - /// - /// Perform a custom animation of a set of CSS properties. - /// An object of CSS properties and values that the animation will move toward. - /// A map of additional options to pass to the method. - /// - /// - }, - 'animated': function() { - /// Select all elements that are in the progress of an animation at the time the selector is run. - }, - 'append': function() { - /// - /// Insert content, specified by the parameter, to the end of each element in the set of matched elements. - /// DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements. - /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements. - /// - /// - /// - /// Insert content, specified by the parameter, to the end of each element in the set of matched elements. - /// A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set. - /// - /// - }, - 'appendTo': function() { - /// - /// Insert every element in the set of matched elements to the end of the target. - /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter. - /// - /// - }, - 'attr': function() { - /// - /// Set one or more attributes for the set of matched elements. - /// The name of the attribute to set. - /// A value to set for the attribute. - /// - /// - /// - /// Set one or more attributes for the set of matched elements. - /// An object of attribute-value pairs to set. - /// - /// - /// - /// Set one or more attributes for the set of matched elements. - /// The name of the attribute to set. - /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments. - /// - /// - }, - 'attributeContains': function() { - /// - /// Selects elements that have the specified attribute with a value containing the a given substring. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeContainsPrefix': function() { - /// - /// Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-). - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeContainsWord': function() { - /// - /// Selects elements that have the specified attribute with a value containing a given word, delimited by spaces. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeEndsWith': function() { - /// - /// Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeEquals': function() { - /// - /// Selects elements that have the specified attribute with a value exactly equal to a certain value. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeHas': function() { - /// - /// Selects elements that have the specified attribute, with any value. - /// An attribute name. - /// - }, - 'attributeMultiple': function() { - /// - /// Matches elements that match all of the specified attribute filters. - /// An attribute filter. - /// Another attribute filter, reducing the selection even more - /// As many more attribute filters as necessary - /// - }, - 'attributeNotEqual': function() { - /// - /// Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'attributeStartsWith': function() { - /// - /// Selects elements that have the specified attribute with a value beginning exactly with a given string. - /// An attribute name. - /// An attribute value. Can be either an unquoted single word or a quoted string. - /// - }, - 'before': function() { - /// - /// Insert content, specified by the parameter, before each element in the set of matched elements. - /// HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements. - /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements. - /// - /// - /// - /// Insert content, specified by the parameter, before each element in the set of matched elements. - /// A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. - /// - /// - }, - 'bind': function() { - /// - /// Attach a handler to an event for the elements. - /// A string containing one or more DOM event types, such as "click" or "submit," or custom event names. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Attach a handler to an event for the elements. - /// A string containing one or more DOM event types, such as "click" or "submit," or custom event names. - /// An object containing data that will be passed to the event handler. - /// Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true. - /// - /// - /// - /// Attach a handler to an event for the elements. - /// An object containing one or more DOM event types and functions to execute for them. - /// - /// - }, - 'blur': function() { - /// - /// Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'button': function() { - /// Selects all button elements and elements of type button. - }, - 'change': function() { - /// - /// Bind an event handler to the "change" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "change" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'checkbox': function() { - /// Selects all elements of type checkbox. - }, - 'checked': function() { - /// Matches all elements that are checked or selected. - }, - 'child': function() { - /// - /// Selects all direct child elements specified by "child" of elements specified by "parent". - /// Any valid selector. - /// A selector to filter the child elements. - /// - }, - 'children': function() { - /// - /// Get the children of each element in the set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'class': function() { - /// - /// Selects all elements with the given class. - /// A class to search for. An element can have multiple classes; only one of them must match. - /// - }, - 'clearQueue': function() { - /// - /// Remove from the queue all items that have not yet been run. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - /// - }, - 'click': function() { - /// - /// Bind an event handler to the "click" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "click" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'clone': function() { - /// - /// Create a deep copy of the set of matched elements. - /// A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well. - /// - /// - /// - /// Create a deep copy of the set of matched elements. - /// A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up. - /// A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false). - /// - /// - }, - 'closest': function() { - /// - /// For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - /// A string containing a selector expression to match elements against. - /// A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead. - /// - /// - /// - /// For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - /// A jQuery object to match elements against. - /// - /// - /// - /// For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - /// An element to match elements against. - /// - /// - }, - 'contains': function() { - /// - /// Select all elements that contain the specified text. - /// A string of text to look for. It's case sensitive. - /// - }, - 'contents': function() { - /// Get the children of each element in the set of matched elements, including text and comment nodes. - /// - }, - 'context': function() { - /// The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document. - /// - }, - 'css': function() { - /// - /// Set one or more CSS properties for the set of matched elements. - /// A CSS property name. - /// A value to set for the property. - /// - /// - /// - /// Set one or more CSS properties for the set of matched elements. - /// A CSS property name. - /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments. - /// - /// - /// - /// Set one or more CSS properties for the set of matched elements. - /// An object of property-value pairs to set. - /// - /// - }, - 'data': function() { - /// - /// Store arbitrary data associated with the matched elements. - /// A string naming the piece of data to set. - /// The new data value; it can be any Javascript type including Array or Object. - /// - /// - /// - /// Store arbitrary data associated with the matched elements. - /// An object of key-value pairs of data to update. - /// - /// - }, - 'dblclick': function() { - /// - /// Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'delay': function() { - /// - /// Set a timer to delay execution of subsequent items in the queue. - /// An integer indicating the number of milliseconds to delay execution of the next item in the queue. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - /// - }, - 'delegate': function() { - /// - /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. - /// A selector to filter the elements that trigger the event. - /// A string containing one or more space-separated JavaScript event types, such as "click" or "keydown," or custom event names. - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. - /// A selector to filter the elements that trigger the event. - /// A string containing one or more space-separated JavaScript event types, such as "click" or "keydown," or custom event names. - /// An object containing data that will be passed to the event handler. - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. - /// A selector to filter the elements that trigger the event. - /// A plain object of one or more event types and functions to execute for them. - /// - /// - }, - 'dequeue': function() { - /// - /// Execute the next function on the queue for the matched elements. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - /// - }, - 'descendant': function() { - /// - /// Selects all elements that are descendants of a given ancestor. - /// Any valid selector. - /// A selector to filter the descendant elements. - /// - }, - 'detach': function() { - /// - /// Remove the set of matched elements from the DOM. - /// A selector expression that filters the set of matched elements to be removed. - /// - /// - }, - 'die': function() { - /// - /// Remove event handlers previously attached using .live() from the elements. - /// A string containing a JavaScript event type, such as click or keydown. - /// The function that is no longer to be executed. - /// - /// - /// - /// Remove event handlers previously attached using .live() from the elements. - /// A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed. - /// - /// - }, - 'disabled': function() { - /// Selects all elements that are disabled. - }, - 'each': function() { - /// - /// Iterate over a jQuery object, executing a function for each matched element. - /// A function to execute for each matched element. - /// - /// - }, - 'element': function() { - /// - /// Selects all elements with the given tag name. - /// An element to search for. Refers to the tagName of DOM nodes. - /// - }, - 'empty': function() { - /// Select all elements that have no children (including text nodes). - }, - 'enabled': function() { - /// Selects all elements that are enabled. - }, - 'end': function() { - /// End the most recent filtering operation in the current chain and return the set of matched elements to its previous state. - /// - }, - 'eq': function() { - /// - /// Select the element at index n within the matched set. - /// Zero-based index of the element to match. - /// - /// - /// Select the element at index n within the matched set. - /// Zero-based index of the element to match, counting backwards from the last element. - /// - }, - 'error': function() { - /// - /// Bind an event handler to the "error" JavaScript event. - /// A function to execute when the event is triggered. - /// - /// - /// - /// Bind an event handler to the "error" JavaScript event. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'even': function() { - /// Selects even elements, zero-indexed. See also odd. - }, - 'fadeIn': function() { - /// - /// Display the matched elements by fading them to opaque. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display the matched elements by fading them to opaque. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Display the matched elements by fading them to opaque. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'fadeOut': function() { - /// - /// Hide the matched elements by fading them to transparent. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Hide the matched elements by fading them to transparent. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Hide the matched elements by fading them to transparent. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'fadeTo': function() { - /// - /// Adjust the opacity of the matched elements. - /// A string or number determining how long the animation will run. - /// A number between 0 and 1 denoting the target opacity. - /// A function to call once the animation is complete. - /// - /// - /// - /// Adjust the opacity of the matched elements. - /// A string or number determining how long the animation will run. - /// A number between 0 and 1 denoting the target opacity. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'fadeToggle': function() { - /// - /// Display or hide the matched elements by animating their opacity. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display or hide the matched elements by animating their opacity. - /// A map of additional options to pass to the method. - /// - /// - }, - 'file': function() { - /// Selects all elements of type file. - }, - 'filter': function() { - /// - /// Reduce the set of matched elements to those that match the selector or pass the function's test. - /// A string containing a selector expression to match the current set of elements against. - /// - /// - /// - /// Reduce the set of matched elements to those that match the selector or pass the function's test. - /// A function used as a test for each element in the set. this is the current DOM element. - /// - /// - /// - /// Reduce the set of matched elements to those that match the selector or pass the function's test. - /// An element to match the current set of elements against. - /// - /// - /// - /// Reduce the set of matched elements to those that match the selector or pass the function's test. - /// An existing jQuery object to match the current set of elements against. - /// - /// - }, - 'find': function() { - /// - /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. - /// A jQuery object to match elements against. - /// - /// - /// - /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. - /// An element to match elements against. - /// - /// - }, - 'finish': function() { - /// - /// Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements. - /// The name of the queue in which to stop animations. - /// - /// - }, - 'first': function() { - /// Selects the first matched element. - }, - 'first-child': function() { - /// Selects all elements that are the first child of their parent. - }, - 'first-of-type': function() { - /// Selects all elements that are the first among siblings of the same element name. - }, - 'focus': function() { - /// - /// Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'focusin': function() { - /// - /// Bind an event handler to the "focusin" event. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "focusin" event. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'focusout': function() { - /// - /// Bind an event handler to the "focusout" JavaScript event. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "focusout" JavaScript event. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'get': function() { - /// - /// Retrieve one of the DOM elements matched by the jQuery object. - /// A zero-based integer indicating which element to retrieve. - /// - /// - }, - 'gt': function() { - /// - /// Select all elements at an index greater than index within the matched set. - /// Zero-based index. - /// - /// - /// Select all elements at an index greater than index within the matched set. - /// Zero-based index, counting backwards from the last element. - /// - }, - 'has': function() { - /// - /// Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. - /// A DOM element to match elements against. - /// - /// - }, - 'hasClass': function() { - /// - /// Determine whether any of the matched elements are assigned the given class. - /// The class name to search for. - /// - /// - }, - 'header': function() { - /// Selects all elements that are headers, like h1, h2, h3 and so on. - }, - 'height': function() { - /// - /// Set the CSS height of every matched element. - /// An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string). - /// - /// - /// - /// Set the CSS height of every matched element. - /// A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set. - /// - /// - }, - 'hidden': function() { - /// Selects all elements that are hidden. - }, - 'hide': function() { - /// - /// Hide the matched elements. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Hide the matched elements. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Hide the matched elements. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'hover': function() { - /// - /// Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements. - /// A function to execute when the mouse pointer enters the element. - /// A function to execute when the mouse pointer leaves the element. - /// - /// - }, - 'html': function() { - /// - /// Set the HTML contents of each element in the set of matched elements. - /// A string of HTML to set as the content of each matched element. - /// - /// - /// - /// Set the HTML contents of each element in the set of matched elements. - /// A function returning the HTML content to set. Receives the index position of the element in the set and the old HTML value as arguments. jQuery empties the element before calling the function; use the oldhtml argument to reference the previous content. Within the function, this refers to the current element in the set. - /// - /// - }, - 'id': function() { - /// - /// Selects a single element with the given id attribute. - /// An ID to search for, specified via the id attribute of an element. - /// - }, - 'image': function() { - /// Selects all elements of type image. - }, - 'index': function() { - /// - /// Search for a given element from among the matched elements. - /// A selector representing a jQuery collection in which to look for an element. - /// - /// - /// - /// Search for a given element from among the matched elements. - /// The DOM element or first element within the jQuery object to look for. - /// - /// - }, - 'init': function() { - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A string containing a selector expression - /// A DOM Element, Document, or jQuery to use as context - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A DOM element to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// An array containing a set of DOM elements to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A plain object to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// An existing jQuery object to clone. - /// - /// - }, - 'innerHeight': function() { - /// Get the current computed height for the first element in the set of matched elements, including padding but not border. - /// - }, - 'innerWidth': function() { - /// Get the current computed width for the first element in the set of matched elements, including padding but not border. - /// - }, - 'input': function() { - /// Selects all input, textarea, select and button elements. - }, - 'insertAfter': function() { - /// - /// Insert every element in the set of matched elements after the target. - /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter. - /// - /// - }, - 'insertBefore': function() { - /// - /// Insert every element in the set of matched elements before the target. - /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter. - /// - /// - }, - 'is': function() { - /// - /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. - /// A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element. - /// - /// - /// - /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. - /// An existing jQuery object to match the current set of elements against. - /// - /// - /// - /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. - /// An element to match the current set of elements against. - /// - /// - }, - 'jquery': function() { - /// A string containing the jQuery version number. - /// - }, - 'keydown': function() { - /// - /// Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'keypress': function() { - /// - /// Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'keyup': function() { - /// - /// Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'lang': function() { - /// - /// Selects all elements of the specified language. - /// A language code. - /// - }, - 'last': function() { - /// Selects the last matched element. - }, - 'last-child': function() { - /// Selects all elements that are the last child of their parent. - }, - 'last-of-type': function() { - /// Selects all elements that are the last among siblings of the same element name. - }, - 'length': function() { - /// The number of elements in the jQuery object. - /// - }, - 'live': function() { - /// - /// Attach an event handler for all elements which match the current selector, now and in the future. - /// A string containing a JavaScript event type, such as "click" or "keydown." As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names. - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Attach an event handler for all elements which match the current selector, now and in the future. - /// A string containing a JavaScript event type, such as "click" or "keydown." As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names. - /// An object containing data that will be passed to the event handler. - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Attach an event handler for all elements which match the current selector, now and in the future. - /// A plain object of one or more JavaScript event types and functions to execute for them. - /// - /// - }, - 'load': function() { - /// - /// Bind an event handler to the "load" JavaScript event. - /// A function to execute when the event is triggered. - /// - /// - /// - /// Bind an event handler to the "load" JavaScript event. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'lt': function() { - /// - /// Select all elements at an index less than index within the matched set. - /// Zero-based index. - /// - /// - /// Select all elements at an index less than index within the matched set. - /// Zero-based index, counting backwards from the last element. - /// - }, - 'map': function() { - /// - /// Pass each element in the current matched set through a function, producing a new jQuery object containing the return values. - /// A function object that will be invoked for each element in the current set. - /// - /// - }, - 'mousedown': function() { - /// - /// Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mouseenter': function() { - /// - /// Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mouseleave': function() { - /// - /// Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mousemove': function() { - /// - /// Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mouseout': function() { - /// - /// Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mouseover': function() { - /// - /// Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'mouseup': function() { - /// - /// Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'multiple': function() { - /// - /// Selects the combined results of all the specified selectors. - /// Any valid selector. - /// Another valid selector. - /// As many more valid selectors as you like. - /// - }, - 'next': function() { - /// - /// Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'next adjacent': function() { - /// - /// Selects all next elements matching "next" that are immediately preceded by a sibling "prev". - /// Any valid selector. - /// A selector to match the element that is next to the first selector. - /// - }, - 'next siblings': function() { - /// - /// Selects all sibling elements that follow after the "prev" element, have the same parent, and match the filtering "siblings" selector. - /// Any valid selector. - /// A selector to filter elements that are the following siblings of the first selector. - /// - }, - 'nextAll': function() { - /// - /// Get all following siblings of each element in the set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'nextUntil': function() { - /// - /// Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. - /// A string containing a selector expression to indicate where to stop matching following sibling elements. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. - /// A DOM node or jQuery object indicating where to stop matching following sibling elements. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'not': function() { - /// - /// Remove elements from the set of matched elements. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Remove elements from the set of matched elements. - /// One or more DOM elements to remove from the matched set. - /// - /// - /// - /// Remove elements from the set of matched elements. - /// A function used as a test for each element in the set. this is the current DOM element. - /// - /// - /// - /// Remove elements from the set of matched elements. - /// An existing jQuery object to match the current set of elements against. - /// - /// - }, - 'nth-child': function() { - /// - /// Selects all elements that are the nth-child of their parent. - /// The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) ) - /// - }, - 'nth-last-child': function() { - /// - /// Selects all elements that are the nth-child of their parent, counting from the last element to the first. - /// The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) ) - /// - }, - 'nth-last-of-type': function() { - /// - /// Selects all elements that are the nth-child of their parent, counting from the last element to the first. - /// The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) ) - /// - }, - 'nth-of-type': function() { - /// - /// Selects all elements that are the nth child of their parent in relation to siblings with the same element name. - /// The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) ) - /// - }, - 'odd': function() { - /// Selects odd elements, zero-indexed. See also even. - }, - 'off': function() { - /// - /// Remove an event handler. - /// One or more space-separated event types and optional namespaces, or just namespaces, such as "click", "keydown.myPlugin", or ".myPlugin". - /// A selector which should match the one originally passed to .on() when attaching event handlers. - /// A handler function previously attached for the event(s), or the special value false. - /// - /// - /// - /// Remove an event handler. - /// An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s). - /// A selector which should match the one originally passed to .on() when attaching event handlers. - /// - /// - }, - 'offset': function() { - /// - /// Set the current coordinates of every element in the set of matched elements, relative to the document. - /// An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements. - /// - /// - /// - /// Set the current coordinates of every element in the set of matched elements, relative to the document. - /// A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties. - /// - /// - }, - 'offsetParent': function() { - /// Get the closest ancestor element that is positioned. - /// - }, - 'on': function() { - /// - /// Attach an event handler function for one or more events to the selected elements. - /// One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - /// A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element. - /// Data to be passed to the handler in event.data when an event is triggered. - /// A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false. - /// - /// - /// - /// Attach an event handler function for one or more events to the selected elements. - /// An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s). - /// A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element. - /// Data to be passed to the handler in event.data when an event occurs. - /// - /// - }, - 'one': function() { - /// - /// Attach a handler to an event for the elements. The handler is executed at most once per element. - /// A string containing one or more JavaScript event types, such as "click" or "submit," or custom event names. - /// An object containing data that will be passed to the event handler. - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Attach a handler to an event for the elements. The handler is executed at most once per element. - /// One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". - /// A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element. - /// Data to be passed to the handler in event.data when an event is triggered. - /// A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false. - /// - /// - /// - /// Attach a handler to an event for the elements. The handler is executed at most once per element. - /// An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s). - /// A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element. - /// Data to be passed to the handler in event.data when an event occurs. - /// - /// - }, - 'only-child': function() { - /// Selects all elements that are the only child of their parent. - }, - 'only-of-type': function() { - /// Selects all elements that have no siblings with the same element name. - }, - 'outerHeight': function() { - /// - /// Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without "px") representation of the value or null if called on an empty set of elements. - /// A Boolean indicating whether to include the element's margin in the calculation. - /// - /// - }, - 'outerWidth': function() { - /// - /// Get the current computed width for the first element in the set of matched elements, including padding and border. - /// A Boolean indicating whether to include the element's margin in the calculation. - /// - /// - }, - 'parent': function() { - /// - /// Get the parent of each element in the current set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'parents': function() { - /// - /// Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'parentsUntil': function() { - /// - /// Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. - /// A string containing a selector expression to indicate where to stop matching ancestor elements. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. - /// A DOM node or jQuery object indicating where to stop matching ancestor elements. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'password': function() { - /// Selects all elements of type password. - }, - 'position': function() { - /// Get the current coordinates of the first element in the set of matched elements, relative to the offset parent. - /// - }, - 'prepend': function() { - /// - /// Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. - /// DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements. - /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements. - /// - /// - /// - /// Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. - /// A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set. - /// - /// - }, - 'prependTo': function() { - /// - /// Insert every element in the set of matched elements to the beginning of the target. - /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter. - /// - /// - }, - 'prev': function() { - /// - /// Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'prevAll': function() { - /// - /// Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'prevUntil': function() { - /// - /// Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. - /// A string containing a selector expression to indicate where to stop matching preceding sibling elements. - /// A string containing a selector expression to match elements against. - /// - /// - /// - /// Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. - /// A DOM node or jQuery object indicating where to stop matching preceding sibling elements. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'promise': function() { - /// - /// Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. - /// The type of queue that needs to be observed. - /// Object onto which the promise methods have to be attached - /// - /// - }, - 'prop': function() { - /// - /// Set one or more properties for the set of matched elements. - /// The name of the property to set. - /// A value to set for the property. - /// - /// - /// - /// Set one or more properties for the set of matched elements. - /// An object of property-value pairs to set. - /// - /// - /// - /// Set one or more properties for the set of matched elements. - /// The name of the property to set. - /// A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element. - /// - /// - }, - 'pushStack': function() { - /// - /// Add a collection of DOM elements onto the jQuery stack. - /// An array of elements to push onto the stack and make into a new jQuery object. - /// - /// - /// - /// Add a collection of DOM elements onto the jQuery stack. - /// An array of elements to push onto the stack and make into a new jQuery object. - /// The name of a jQuery method that generated the array of elements. - /// The arguments that were passed in to the jQuery method (for serialization). - /// - /// - }, - 'queue': function() { - /// - /// Manipulate the queue of functions to be executed, once for each matched element. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// An array of functions to replace the current queue contents. - /// - /// - /// - /// Manipulate the queue of functions to be executed, once for each matched element. - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// The new function to add to the queue, with a function to call that will dequeue the next item. - /// - /// - }, - 'radio': function() { - /// Selects all elements of type radio. - }, - 'ready': function() { - /// - /// Specify a function to execute when the DOM is fully loaded. - /// A function to execute after the DOM is ready. - /// - /// - }, - 'remove': function() { - /// - /// Remove the set of matched elements from the DOM. - /// A selector expression that filters the set of matched elements to be removed. - /// - /// - }, - 'removeAttr': function() { - /// - /// Remove an attribute from each element in the set of matched elements. - /// An attribute to remove; as of version 1.7, it can be a space-separated list of attributes. - /// - /// - }, - 'removeClass': function() { - /// - /// Remove a single class, multiple classes, or all classes from each element in the set of matched elements. - /// One or more space-separated classes to be removed from the class attribute of each matched element. - /// - /// - /// - /// Remove a single class, multiple classes, or all classes from each element in the set of matched elements. - /// A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments. - /// - /// - }, - 'removeData': function() { - /// - /// Remove a previously-stored piece of data. - /// A string naming the piece of data to delete. - /// - /// - /// - /// Remove a previously-stored piece of data. - /// An array or space-separated string naming the pieces of data to delete. - /// - /// - }, - 'removeProp': function() { - /// - /// Remove a property for the set of matched elements. - /// The name of the property to remove. - /// - /// - }, - 'replaceAll': function() { - /// - /// Replace each target element with the set of matched elements. - /// A selector string, jQuery object, or DOM element reference indicating which element(s) to replace. - /// - /// - }, - 'replaceWith': function() { - /// - /// Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed. - /// The content to insert. May be an HTML string, DOM element, or jQuery object. - /// - /// - /// - /// Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed. - /// A function that returns content with which to replace the set of matched elements. - /// - /// - }, - 'reset': function() { - /// Selects all elements of type reset. - }, - 'resize': function() { - /// - /// Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'root': function() { - /// Selects the element that is the root of the document. - }, - 'scroll': function() { - /// - /// Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'scrollLeft': function() { - /// - /// Set the current horizontal position of the scroll bar for each of the set of matched elements. - /// An integer indicating the new position to set the scroll bar to. - /// - /// - }, - 'scrollTop': function() { - /// - /// Set the current vertical position of the scroll bar for each of the set of matched elements. - /// An integer indicating the new position to set the scroll bar to. - /// - /// - }, - 'select': function() { - /// - /// Bind an event handler to the "select" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "select" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'selected': function() { - /// Selects all elements that are selected. - }, - 'selector': function() { - /// A selector representing selector passed to jQuery(), if any, when creating the original set. - /// - }, - 'serialize': function() { - /// Encode a set of form elements as a string for submission. - /// - }, - 'serializeArray': function() { - /// Encode a set of form elements as an array of names and values. - /// - }, - 'show': function() { - /// - /// Display the matched elements. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display the matched elements. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Display the matched elements. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'siblings': function() { - /// - /// Get the siblings of each element in the set of matched elements, optionally filtered by a selector. - /// A string containing a selector expression to match elements against. - /// - /// - }, - 'size': function() { - /// Return the number of elements in the jQuery object. - /// - }, - 'slice': function() { - /// - /// Reduce the set of matched elements to a subset specified by a range of indices. - /// An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set. - /// An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set. - /// - /// - }, - 'slideDown': function() { - /// - /// Display the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display the matched elements with a sliding motion. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Display the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'slideToggle': function() { - /// - /// Display or hide the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display or hide the matched elements with a sliding motion. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Display or hide the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'slideUp': function() { - /// - /// Hide the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Hide the matched elements with a sliding motion. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Hide the matched elements with a sliding motion. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - }, - 'stop': function() { - /// - /// Stop the currently-running animation on the matched elements. - /// A Boolean indicating whether to remove queued animation as well. Defaults to false. - /// A Boolean indicating whether to complete the current animation immediately. Defaults to false. - /// - /// - /// - /// Stop the currently-running animation on the matched elements. - /// The name of the queue in which to stop animations. - /// A Boolean indicating whether to remove queued animation as well. Defaults to false. - /// A Boolean indicating whether to complete the current animation immediately. Defaults to false. - /// - /// - }, - 'submit': function() { - /// - /// Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. - /// A function to execute each time the event is triggered. - /// - /// - /// - /// Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. - /// An object containing data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'target': function() { - /// Selects the target element indicated by the fragment identifier of the document's URI. - }, - 'text': function() { - /// - /// Set the content of each element in the set of matched elements to the specified text. - /// A string of text to set as the content of each matched element. - /// - /// - /// - /// Set the content of each element in the set of matched elements to the specified text. - /// A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments. - /// - /// - }, - 'toArray': function() { - /// Retrieve all the DOM elements contained in the jQuery set, as an array. - /// - }, - 'toggle': function() { - /// - /// Display or hide the matched elements. - /// A string or number determining how long the animation will run. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display or hide the matched elements. - /// A map of additional options to pass to the method. - /// - /// - /// - /// Display or hide the matched elements. - /// A string or number determining how long the animation will run. - /// A string indicating which easing function to use for the transition. - /// A function to call once the animation is complete. - /// - /// - /// - /// Display or hide the matched elements. - /// A Boolean indicating whether to show or hide the elements. - /// - /// - }, - 'toggleClass': function() { - /// - /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. - /// One or more class names (separated by spaces) to be toggled for each element in the matched set. - /// - /// - /// - /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. - /// One or more class names (separated by spaces) to be toggled for each element in the matched set. - /// A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed. - /// - /// - /// - /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. - /// A boolean value to determine whether the class should be added or removed. - /// - /// - /// - /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. - /// A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments. - /// A boolean value to determine whether the class should be added or removed. - /// - /// - }, - 'trigger': function() { - /// - /// Execute all handlers and behaviors attached to the matched elements for the given event type. - /// A string containing a JavaScript event type, such as click or submit. - /// Additional parameters to pass along to the event handler. - /// - /// - /// - /// Execute all handlers and behaviors attached to the matched elements for the given event type. - /// A jQuery.Event object. - /// Additional parameters to pass along to the event handler. - /// - /// - }, - 'triggerHandler': function() { - /// - /// Execute all handlers attached to an element for an event. - /// A string containing a JavaScript event type, such as click or submit. - /// An array of additional parameters to pass along to the event handler. - /// - /// - }, - 'unbind': function() { - /// - /// Remove a previously-attached event handler from the elements. - /// A string containing a JavaScript event type, such as click or submit. - /// The function that is to be no longer executed. - /// - /// - /// - /// Remove a previously-attached event handler from the elements. - /// A string containing a JavaScript event type, such as click or submit. - /// Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ). - /// - /// - /// - /// Remove a previously-attached event handler from the elements. - /// A JavaScript event object as passed to an event handler. - /// - /// - }, - 'undelegate': function() { - /// - /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. - /// A selector which will be used to filter the event results. - /// A string containing a JavaScript event type, such as "click" or "keydown" - /// - /// - /// - /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. - /// A selector which will be used to filter the event results. - /// A string containing a JavaScript event type, such as "click" or "keydown" - /// A function to execute at the time the event is triggered. - /// - /// - /// - /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. - /// A selector which will be used to filter the event results. - /// An object of one or more event types and previously bound functions to unbind from them. - /// - /// - /// - /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. - /// A string containing a namespace to unbind all events from. - /// - /// - }, - 'unload': function() { - /// - /// Bind an event handler to the "unload" JavaScript event. - /// A function to execute when the event is triggered. - /// - /// - /// - /// Bind an event handler to the "unload" JavaScript event. - /// A plain object of data that will be passed to the event handler. - /// A function to execute each time the event is triggered. - /// - /// - }, - 'unwrap': function() { - /// Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place. - /// - }, - 'val': function() { - /// - /// Set the value of each element in the set of matched elements. - /// A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked. - /// - /// - /// - /// Set the value of each element in the set of matched elements. - /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments. - /// - /// - }, - 'visible': function() { - /// Selects all elements that are visible. - }, - 'width': function() { - /// - /// Set the CSS width of each element in the set of matched elements. - /// An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string). - /// - /// - /// - /// Set the CSS width of each element in the set of matched elements. - /// A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set. - /// - /// - }, - 'wrap': function() { - /// - /// Wrap an HTML structure around each element in the set of matched elements. - /// A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements. - /// - /// - /// - /// Wrap an HTML structure around each element in the set of matched elements. - /// A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. - /// - /// - }, - 'wrapAll': function() { - /// - /// Wrap an HTML structure around all elements in the set of matched elements. - /// A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements. - /// - /// - }, - 'wrapInner': function() { - /// - /// Wrap an HTML structure around the content of each element in the set of matched elements. - /// An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements. - /// - /// - /// - /// Wrap an HTML structure around the content of each element in the set of matched elements. - /// A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. - /// - /// - }, -}); - -intellisense.annotate(window, { - '$': function() { - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A string containing a selector expression - /// A DOM Element, Document, or jQuery to use as context - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A DOM element to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// An array containing a set of DOM elements to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// A plain object to wrap in a jQuery object. - /// - /// - /// - /// Accepts a string containing a CSS selector which is then used to match a set of elements. - /// An existing jQuery object to clone. - /// - /// - }, -}); - diff --git a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.js b/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.js deleted file mode 100644 index 1e0ba99..0000000 --- a/samples/WebApiContrib.Formatting.Xlsx.Sample/Scripts/jquery-2.2.0.js +++ /dev/null @@ -1,9831 +0,0 @@ -/*! - * jQuery JavaScript Library v2.2.0 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-01-08T20:02Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -//"use strict"; -var arr = []; - -var document = window.document; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - version = "2.2.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - var realStringObj = obj && obj.toString(); - return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; - }, - - isPlainObject: function( obj ) { - - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf( "use strict" ) === 1 ) { - script = document.createElement( "script" ); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -// JSHint would error on this code due to the Symbol not being defined in ES5. -// Defining this global in .jshintrc would create a danger of using the global -// unguarded in another place, it seems safer to just disable JSHint for these -// three lines. -/* jshint ignore: start */ -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} -/* jshint ignore: end */ - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.1 - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-10-17 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, nidselect, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; - while ( i-- ) { - groups[i] = nidselect + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( (parent = document.defaultView) && parent.top !== parent ) { - // Support: IE 11 - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( document.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - return m ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( (oldCache = uniqueCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - } ); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - - // Inject the element directly into the jQuery object - this.length = 1; - this[ 0 ] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( pos ? - pos.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnotwhite = ( /\S+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], - [ "notify", "progress", jQuery.Callbacks( "memory" ) ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this === promise ? newDefer.promise() : this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( function() { - - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || - ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. - // If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .progress( updateFunc( i, progressContexts, progressValues ) ) - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -} ); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -} ); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE9-10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - register: function( owner, initial ) { - var value = initial || {}; - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable, non-writable property - // configurability must be true to allow the property to be - // deleted with the delete operator - } else { - Object.defineProperty( owner, this.expando, { - value: value, - writable: true, - configurable: true - } ); - } - return owner[ this.expando ]; - }, - cache: function( owner ) { - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( !acceptData( owner ) ) { - return {}; - } - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - owner[ this.expando ] && owner[ this.expando ][ key ]; - }, - access: function( owner, key, value ) { - var stored; - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase( key ) ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key === undefined ) { - this.register( owner ); - - } else { - - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <= 35-45+ - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://code.google.com/p/chromium/issues/detail?id=378607 - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data, camelKey; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // with the key as-is - data = dataUser.get( elem, key ) || - - // Try to find dashed key if it exists (gh-2779) - // This is for 2.2.x only - dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); - - if ( data !== undefined ) { - return data; - } - - camelKey = jQuery.camelCase( key ); - - // Attempt to get data from the cache - // with the key camelized - data = dataUser.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - camelKey = jQuery.camelCase( key ); - this.each( function() { - - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = dataUser.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - dataUser.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf( "-" ) > -1 && data !== undefined ) { - dataUser.set( this, key, value ); - } - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || - !jQuery.contains( elem.ownerDocument, elem ); - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { return tween.cur(); } : - function() { return jQuery.css( elem, prop, "" ); }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([\w:-]+)/ ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
      " ], - col: [ 2, "", "
      " ], - tr: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - - _default: [ 0, "", "" ] -}; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE9-11+ - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== "undefined" ? - context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0-4.3, Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE9 -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Support (at least): Chrome, IE9 - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // - // Support: Firefox<=42+ - // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) - if ( delegateCount && cur.nodeType && - ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push( { elem: cur, handlers: matches } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + - "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split( " " ), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + - "screenX screenY toElement" ).split( " " ), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + - ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + - ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://code.google.com/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, - - // Support: IE 10-11, Edge 10240+ - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -function manipulationTarget( elem, content ) { - if ( jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - - // Keep domManip exposed until 3.0 (gh-2225) - domManip: domManip, - - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); - - -var iframe, - elemdisplay = { - - // Support: Firefox - // We have to pre-define these values for FF (#10227) - HTML: "block", - BODY: "block" - }; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ - -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - display = jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = ( iframe || jQuery( "

xB~ofWIM(4b$G+g?}ZiCXMv-P2qI#y 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%0AST3sSRUyLFn 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 z zM)p@L)%|C(dneg#!cPAlssBT;GtW^pqyGrNK1QZ_Jc+cAO-SvAF$evRU6-ZKFPHI3TeELS^Aw$Kl*)x zH2&xKnYSkW_*@-NJm-A|b$Y&!CckrkoVdlg;%wcwa$o=J@l*c@dF<~+^wv=yfAc(? z_I(BR=4nh3*7p#3j6V~-`7R@<_V*G``4V-RZ#8+X|4WwdgAUZ~dtxN_eGc29Bvj#3 zmU*`a^xq@(@hQ^!ZYPg(sz4pa?S{0DR^+p;Us?Lqz+U}1NbQ@F$GN@5597Rwk@9Wo za9$Uo*X{y_q5rkX|8w$L&qdg&KL$JV^+B5NEQV#A>iC(j4}R*uMcQXe`d5D=_Rgmh z_U4;_wC~4}&hIGtH~xjxXWWe}^B#o1_m?59YY_d~$1~U~@1ZW|IuYr9p3NKxStw6E z{933&{oX$ksogP1{cgmbkcEqh=l=hY`nfRq_eXN8FbyY63S)5c&u&!-?w^$(MEc&Z zgfp!ceo)7%Pf+XMiTl=j7RlBB$g++-@RQfEjQ1!Mlj?Yu z;Lc?+(tQ3qtn8yP{?>U5(!N&`$M|hg>c12vAqy)>hN>_cXXWoK_w8Yn#{C&P<88#r zeLRVxt?NhZ-G^()>;84eS$%VosNYCj_qi{A`fozI-zVbl+y~*W-6-la-{}}x|3&1p z&R+OiXLoK||8(;3SK&hR=Iw!0{{a5_oen$Cb8*(L1xdXBKlJAND(OE=`e(VR{cTDA zJ<@ms=v%)DN&iXGucJTp`%tI*^8oRzYcXKGCu46vSL1Jewb47@7m)V%L$Ys%lX*v{ z{+3d#^>xA7yj^ip-+?^dZ$eW0*_}GP--kHHKZ$zWpP!J{aWD4Hdl7o$+=DZ>3fmBu zTgCrfy?*}?N52R0v))5ezo#Ot^8=*$_Ms{B^+39B_h4-Qm*Q`}kFgy>*RAb$*D{|0I<9jl^F4TH>1Ldh$DuTG%m?Lc`>@WAf{OH12^&=Xom9 zey+mUIK7GE+|NVW$8$*QnUA#JgVQ{^A$>k-vKj8j1@z;5zCrR=p)1Ace+Ek9e~z@@ zLr9|B52bbd1Q>rO?pybMNb?_y)bCoP{r-c!@qgi__QO&iqf`Blr24K+^LU=P&SMbw z2~ik8e(QM~d;1tk{oel1|!{z zlgQ)!ZBm{Y6luJ5NK}QL_+cL_Fvg^CJ;Ci`HpLltXY}S9fYLZyQipYy!-y1xdr9V; z79q{I5BBn5*zs3k7w#MXdz`Je0bG1nVC>wck;Hk{LvQ>WQ@+bmp6Mz6LpYmnB7V;2 zP3){=6vgS+lsM+O9eeNZMZMa0Kx%&<;QYp*w7;(0x6WP2W8LQ?aV?yX=3543v0kKc zYLdh`oJd}IGWNzj2P5Y>0BIeok>)>-dfewNu=6~eNF4o-LOR#IG1l&J;>jzJ#%Y)8 zy#+t>R8IADM&erNN%6*AMzQAmDb-gOKjW;&&ihlav;JGTZ-18%%y{EczFFMYu57Be z6H@!_h-bZJQhmoD^&3eLLKhCg-}xPkwEwEaajw@Qwc7$C?>_+B-%Y8H#S~|Kqljmp zZ7?Q8;Shf4zXs|3HL-R{p<=@=P|^! zuMg?VdfIcdIA@%V|1{FNPsQH(mLtCQGgAE5iSM~+%@6-k(Iz`lp!?0haJn02%#zj?=Tzd3R$+!XmV(meMN)V!zAhjFh$n#Y%b@g7H- zeI`})csw8*cRujy5jwFcw?f7B*RoG)%_=NiGcR4`_SvVUz?<=HpxEE*ZDTBRncSmafdy0PyM$Tg#QvZAL(|#k;`@5z2RmEQaCL}fQ z5B#t%|9@caQw{9Ae-rWT?_Q+)+M8hZ*#%aQIN8S#f*G$1L)Py& zfKm!e_@Uj)^rPLb=$*scfV>gC@wO+9eV#yE&t+$B+V3OellQ>i{QYq<{+ayn{&&>p z9BxN%{qGXrI$99d_|KBe{NJNAZ{2jiH8;(BDnHaePCWfDKySZ2aW>9b=$%J>K>I!@ z%|95az8CfB_dU}4M^cCJ-ofAewNQG08us#_G}pFij^k6^*QL52OY`|I@qXy_e-~%# z`iJ1=eUzrH=Z)0Y+cYP?kJP>^#@2l?l9meNlKtNpSw}tcTj#H-{w3UWzBMrRe0_w} z?`G;XUwQ1zzb(@EE%~8-KYlp>!}+1yle*3OYU<-W^v>seq;Y;hTIZ8#Urwe7)L^I^Rv_vJvsj_X1ApXCUpb4#g@jN`3y1IhwZ>$;{K6 zc=q`>{+^?nB=h|3mHdt&nD!g+vz~KP|10sc-aWbL{c70BZ3wFWjoh@Jlep<~{4LUR z{0wn?KQBo8`5sN_e>Fd>XAhED&)MWL&H>mN=M$Q+zK+~CPEGC`_YLfgcR2N0=L^ik zIdveIp9i<$=X>`c`t#5Dm0|t%r(WN~rz4$XyVTD^Nb5KOJNNl~>bAZmNb6|EP4&-l zQ++4y^HwXuh|1zZUKSbL1pGf1C zCBFUqg>=4UQv7KYXZ+X6<2i1Qk@enB5dH2VDIp5Ak;bn980UC?C?6(?b*)VMei?e} zn?w@(dzL)r`wi(FF9wvaVXxooNc*UWpZ2>Vt)~l3+5cA5WgU-^$GC?9+JBPl-lGWP zze61B*@64|t%JRPLW*0CzV)k$H1CN>`}q>-zHCE2>$)<{dn&=4<3NHqkDbZuzTb>= zu3w-upa0%j?fxd8b#6~S^*bZY^D9a0>n4o7|3R`l0=@m*fYkqP>agBA)S=(=B-O79 z{`NBo$p{N?;cwlC;Ah<@BdudS{>FbEf9t&prTTr6zBx|nPbZ1@TcrDsaNoQyB>gCq z=C6s~Jnxf_kcB;9{qLp->)jta`(4Nn<6Xy1<9wImuE&p(3YB4gEiC7UcB_%r_XBbC ze}W{|Una$Gi_$nVNanmRB(8Pbo9f;sYAptXIDH0HkC_skqkq4E^in){_$>*W3ENNcXZ4|BeV z-kg)TZ@!nQ#oEqBZ@eF=(LB}Z!I^aDKED=L@xwhnD%H~mKkaTpYS%yIJtFPFG2FD* zuPDkhQVYFpUWk+TuOW{2|Ds6iz8WQ=3Jb_1Z%G{M9)vW{4%DT-53GLc)Ys*y&nd+B z{wm^H&m9227Df=?Jv=t`b6TqN5`wD#nk3e>C3@=_h2FUwguiiqz}dN+0$a~1$$l^F zobPYkH~z`V{&j+Re<$iR?i&P=FCe~skHg|-hTkbw6GYk-dZTV-<~4$KM;v&Vf$o%3(|g{M`?X? z$!omjNb49uUFLsi{1X84_r%yd zdtgtf!byN}Cn5D4pX?f@c{f1n{{%|?-o?-T+MT%WPfLP&jxVM@?e>Jt`*4c$6%tk9 zDU|NVt0Z+ki-~95bFnw>-N~+Zs`s2!|3sv7Y=fV6S0b&mEPnh|7{w3YCEH=A+z;vg z9fY*6xk%^N1V86`CeH5n!T5O&o}oDVSVM68^502nz85Ld_^04+Ki44b?`3{i|KYIp zoQO2fJ4pNa9I)SJIIDjhso(cV{k9^w@ylUnzAX}WWH`pzh?DxZuyQBZI28$Q{Dv55 z_Y3{F-&H8iIPW9X_oNQ*Z%p!j`nA8V>AY^m-nq|5x*s-S{+$To{68kY`>_wrc>i+h zHQ#8Y`?3x3^!t~f*84kg&9fSR>!?Ov=hF$j^-nv}ci83I`M zDkLU_h2*o|-vRCF0?v0SVE=bfym|jeQ1hNjeCN;?>Hf7LuJb7iYhQ^t#dAZ^#(RPI z&U+>7{h_dSBaz1YhPx=1iru7_565}>a`TX}M zn(rj^-v5ms%6HLwKIc-L=eQMm&*w~}^F51Tp7Syo%gw0AdF+66zO9kYwJ!F?IiEU= zyCuas_dfU=Zy@!U{~zp}!`|f8ZVL9^pO*SK9KH8Pq<)sNpT<8l<(tZV_va#-wvMmR zYySn(IQx*t_|>s@&N~yYXotP~`E%kn)TR9uNc;GXxaK(sXMQbwo96!&ah&gM#8=MY zhxzvpZm_M55etcJkq~s{v*=;*+gFFeKmc0e`?D6HusIQ zJ9(_DT#A1gdgpsMMcDUPinYG?(mdXUt#1zg*1sNUUH>8NYiHuQk25hcZW-7-pCXO- zS<16(n)@3_^OYyB`hAevFHChDO%mgOL@@JSN*wd-miA*5QvInY&ATGy8IPa)_b}4< ztMS*aCe0|nCa5JZepN5S) z6KNk+=-2q)6G!_Kv9r&g$ZvgLa-Y8nmB_2#Uumv?BQYs#jZ*&&_-S9BB>G=MeCwTx z^#1!u&-D#yo2!Nwa#k?wCD?A_n1aI&rg ziKE?Uqx?RzLn<$WYKZ)cL}cLrcx=U~T33PY3qlGN8dDPCvt`Me&G z;yy`p?&EscejZG7`VMK_$B64(4kNg8=tZ&Cw*+ave@SNjOH&`^@w2W9Nb~%Jk@dfa zk#Qa%k9}7mi0}DX_^ICsC-YZHdFi6;NBoX?VN9z1b`0bp_!#4FV(@EWN9>F}8flFu zrWu}rw6^Q`Va>m$I7bk~`~7IpSy31;Z$;{N5lPM42tQ}IEX6qw zebF!VKN_juk>t0I7C71G+N3`-&Hgl`@tPCQ{7op{ck)rNdoY4#t@GKG?@09K`IEfH zKbYXwwGlgcIrp8<5Tx_C9zWyPpg!mNTblPV=$+G8?rXP<;{2|#EB4yWOa6Uvro_Tw z%nj4R&4~{t3AYM2;Ag(Z{BT|eV5I%|Nc)~ha6%Q1Np+OP$$UeR=Gh9R_Ixa;^*e?i`W;J9^ZgGa z^Ecy%_aDbu|D(ub{*M6T%%NWOuV9C&(3U*Yq!tg8;etp70VjXMQ9`|6G#w+agZ>-i_e{e}D5J)iCmz)1g{Q-5Djg!3=0f$mdX}=Xes*Y~emTzOc?5QD+Zfr$ z44m})3S;kIz`UH#LEJR&4M^<<;-_7G?A(VDsjh>$Dc_2d{?*ZIw;m_!n1oVZK`=rW zuHpx!6rSM+trrfZ5B@4#$$jna;J!Q(Y2JMSku$~yu-=XnnI zo!2<>dw$0LALs%q#)69h%nxMWdd zl(-X(8TYtE#~rsAP{+6-!DWoNB|)Q^V4}|Z-g_?9-6AvjYn~^QqR#!!xBb55oO|nb zRd)fS|4^uPtsM5re;Fs~DNym(!PwV&;ws-Cxp^KR;!Fm|cw0hU|HndJ%R}Fu z#mPDjKyLmEaMo@idC5Nvp7rfPGU84IOnobi>%Kd z4uA8$CFJ>Z!2c!w=J8tSdnI{U&&a^P0iODELY{AcXWSz~oiTRCIUKq9t_pdaiJx{o ziQ_(7gTMRhJmmJR8hf76X!JlN|5uCo^+#y@TJV*BJJ@{$RsS|Yqz`~2?uGdCjADfL zQ47~cGsp*PMm zG}XTTo_ejbhJ5YA02t*1IcV1dfAP)(T>cf361N|Dh`R@RaVyY!UValC{kKLhtwC=8 z&m~E5{vCWwqG9-95`7P<-F4U*e;#(`GY=!<sXA9vxdBlyE$^N6UWjF z*JTb=yTSMwr#E{0xHkv;bw1$oKSGX4vm0*e%99)Kkb__a-Ww`Jff%#tqu)NEj>Xu^KM$z+jO3u-PT+|%9=m;@v*3F|Z-fFF-AEnU|2+5~ zN|EwgptPQ!LCxz(a9!8__!z3}(- zs2@~)FXZ~Y1r@&v9POS6aX&!_7IS#q>%0PDtcz2Vp zxYv-6`Uk;F^2guz-nN4`FBjRLf3|~~&*0#{Ie0vym%t%Z)Q^6-4|>8djaEVJ(|!oe zs}725)B?pN+8bv=MK7YXzprr+=W2x7Z3&2WYhk2gq3TbAA(d!L?2S_vY1BmhuG?==D(?~K`NUU0nuGK*cE4iH39Cl2CNBec#|jO@bz{LJr~fO{pN z_G3rvw4Vjl?r|7#_9U+O_rZv>o;ndl*W+ir{Wz$<1YGMVGf936#vDHbL*3W$QTHy6 z2_`~g^+G7df8rzN*)Y=20_Ld{sNXwK{T2WURJ1?-hIs?3e;C{E_F z5UPDw?DgLk#&fs^Kle;mK-6y^?Ei+{UhuaPw;OaAAifX%A-cmX?m zxHo?G?nvy+YXt}Q*4f}DdhCt!Wr~!)3OnT!pp18?iMaOnI`Wo(87lr3;M#|`@iXpp{KQ|0oM&`I=tn2~?b9r%_u^N;XxAMh zXND@aQD`yuYN@XBiudaZvQJJ<6JoLuka(C*OA7^$B|vf@n$bsZc0 z*TVCRI-{5Fi@p1@5BbS22j6}S#MyY&P;quZZ=K7a>fa4@?1YncH-LvK8o>$753`OaRMURAEEXA1v~LZ5X^Pxik<6lIJo*f zj?#Xu1K)Vx33NV6{SFItT?nK9Ega1IsX*@q2bbt~@aBJNSf96`zCStvxj5HC#jiu| zdY%SF6x|QL`i79-50Gp3YvNm9Ww2Ws;y(&+zOQr8&fxB|rBHEhg6g*tYM#3yl(vLA z&P2{Lss!KoAE6iL=#Xa>&R%D3MsJ@!#Ls?TOkAGPSoHS!9_m)UAO6N23#fQ|5={OQ zj4_F>g^J%F#=KfkinEG?{F31JV|e3zlX&KPH@tb?i@pA9gZ;%QjWdLU@@B8pG-eQ#Qmv@khy9l}ctjFIv`=i(HP4W=uc7nLC z&JXLpN046#zVUY?hNsvt0zdt_}3yQ zM6?_BOr!6CXFlBk73a4oy%+j6daq|K=*8)Rzpn?M0B*etq1v5+o#%N0F!Ni6op=|) zi@#^c>wIwadq32-f?)Djke~RsVQ0U3lLyo2&&aK_ANKOYI7lZ1`Ltk{BZzq)iZiNc zebE0f#CZoj(`X(2(*M5DpR-`h_j2T(KQoZ)KLxq`OnCKc;PtN#crQY=>kMwvf2elv zBeb50=w0s?@-f~>jI85nc0m8E+n-;$4PZ`}=Vg=XvDj_aF!J zt|6ZE3iRf&3V;1>02fvCBjnb*9x7je@{G1YuiecEjaR@~|KDS5oSraV=T67ieY6B# zzg@A%HTpYL|If(7{0=4w{bq)~AA?@|oxwBTU!YXK4+ryk06a{h9)K9X7NK!Eg*fHl zX!i?v>Au(*cdJ0l!4ZFXzigiV-*AGdzYIIi+a1B>8SRC!@;i`w z&%QX+aZ1Rm34i!f}eIjhl>AS*m<34g1TvS$26Kx5{RO&5(H6HPjKTc54bnNnCE+dnb+Gmi$4@z zzk{$-KN-2}dNGV~9|z3+d>u~eF9t{Zp77=~5yp7m3VBon{o^6tYskep8fX1G!)t#4 zLiwiy?r`FY`xw-EcI9B5s}UlK`VvgPhoS0^;h?+=LhWt|`u9U#cOhpQ-48YY1JJuZ zgAr;!D#TfXT>fbA)W1qnq#nHsRsJ~fl{aH=yp`CCcQl#$S$|{E6_GL}!tobw3Xy&fhr@Iy#ad<~N9B zl%E#t?}2K+I|uE$hI-~B=NY|55ba+A&pfV#G0(qZZ$8s;5_bW-cH4wHd*P@4y9lj6 z$H6%NM!wSH(To2d@b2qo@I7zdM{Ygmq15ks^!BH3@P7?w>pX#j^1HCZBsvZ`uF-BV zo`>t8)-#HO@lFnYBSOA+fTv#-`RP}~!F(@;n%4;It>pKNT{hx>{e>8HQ(V+o% z3Y2HGC7|}_yCIJpLi6a2zqqfEwEN{`gyw%Mdh_@o*nJnO-CqH>{*U0j9&Q68?!!3g z_YQLR*AC#C&wk|P>-Vp5mOdHiZvtHr=*mE!3iRnfpMe_h3Gl4zL-I54t6`G;O+4cd zLTLY0n#Z;wFGc4vSN9|LX-*z=68f>(bOe%AFSLgO|e zH=iN+$?wR4)bN)L@gwxs{Q}PF55w3!UJq~lBSYM7AD?cc;t z|I5G^uNThd@f`U2zYG;`F-rUMMCex!82ff6emtW;VeEeS89|KmXZ+kJpTHRB2Y?vo z=TQ6p272+nfwT8Sn`5W_!RV8IpiI^eIi}G-sPWdKH@|xVZezfE4r+ftB2V>al8^Yy zu=D)<1igHJ4zA}fiHj=Q32L1WaPYmsi}Cko%m<*>^GK-sX#9ujif*aN-s&kz19@W(XTf_UPOhl+DourGvoXG1ZK9z|)q_t5)#G8Liw zU~S0bx7b-{e{hV`9ee9}3+g)m2EB9yNdghAf*0ph{EdG%cK)onH4Lh#5O9`bEY22C z`?5QFah754I-QQO_3ebc^=}*O@=*DAuwxq4aqzvMPqDKv&qI~}8a(s93On<@6`^@O zLSFiJgJ&9j14j9?F#4Yq{2#;5b#8@<^EKqI=M(su*XBX~4XAa#hhCgNf@8b`$lttf z4|IE|`+pk7*82_YjsG9W?f+g-<9~)+yIS%x&JgUyyAr*5R3evdiyTpO5%H~eJPfYU z$ME8852OAysQS4u%159#-d5n)=XvP$8;f517de>M7=*6R&BW2~DdgsHCcJnT;;-FI z-)NOrwJVGp|(`>G$cL=KfF{u0UCs1+cV()(V0A8F=18zTf`*0+Bp2`2It^GPc+{b4??dO-Um;M{} z?uSPL|0;S!(NE#6XF$OFZOHFIsP+B;YTP5RvtJkC=l;48C;8t(J+GId=NUcCLBGk! z&2JvO`P>iH?kiCJKSmE!^g8&6q60#lt_Yb%7eK9hIE-}-g(|PYPyE}_+qZ+s+d9tS zAkM^)PXR{#YN&Y(2=NBvC*B^|yAPj)M-}}ZJJ#PU3uwUb`dV^{+_3oV<(*%=s{5Jo(TLj z>@kgw2>d7TJfodB80V#+zYaYiq6HW;jlK_czx78izc1A5U4P{E^G68vKMc8kpK{Rd zLi9YNYv8@UPe5;ee-8G$A~(NT7+L>c;jQ~Dc=yGP*x?dAi`@P3Ot9Yvp>|tfr+xtk z`+X|B>vA2ubX$1$`? zTgU!T>pTRx`5gprUbWa;&tj4s z?|`6C-q_qw91_pSHP;o7uPd}v#`#(h3vqs2TxhJD8|N!#HZ|NlnavoSNff;^MH{xUPD1eoVfxDb5#L6LCdhXiHUGSJ~Xu)R-^E)d|F$ zTy^{4|LdS%5T!#dp}_LSy5{T6bl`JcYaXquRx}+PNE5wM5 zS+ePnY00{sRj9MlfE~+Bgd3@{Z7m(5WGY+GMpafU=4+=nQ*yE?D&ZPt4v%xy@rI># zRTGa<&Gs-g3`?I{l4@;3Ts^d>M*lrX)q_rVeUt5)~ll=;UEbnB)6)GBv zaehXwDlSZlr6YTKTvf3#-x^}EmH$I$S%=i+w1Kx?%F!~~QzL@dXFxSR!YxFMT zCyeWndxxX^hsd2P|4OiT{xfbpyo>9`@UQxv_h$Ip<<4svyK$T1{0zos_;N#*;QR?{ zti2iE1>ZcyT+eW>d;zs+Z!P|&{w~nI41d$ad?qknVj{ja{*N;DL|?y&*msJY`wjZu zH9Fs%xp$n-cVzCndCn&>>`5cTZwB`+cOJvvKJw1a+y-;2=v}AsR(vy?H{s1$`A>sQ z59W)QyDrLiXKwz^pJFbiHos<=PcOz&hBs*1JWCF~bLQN?FxTGs{lpcs8^dp8ac*z@ zl+|9jUfEwPi{FL*hY5nlDT*E&ijCGp1m1IF*kqb)9|%d`ZkiY_WqXhh1fWs#F!Xr+>80)q32c1{id&- zpw`QL+vl-JF&W-C|#%vFr!tj4E@m#Q1{m?V?hlUr5nq`-Je}dUF``O( zdlb}tsP7%%_*1NFD(IanS03|9vtQuLGQrc z>wtahNkY!;zu!LUyq2*)IXFLqaZj7|eFAXz+XRMx1#Hf)`|lXqo7-&+>visLuR34C zxSo;Otfz2uQ|^P%$zx~o_k8g>;QzGd{;?;IU~kWr7a6WyBjbDEyDrw~r>M?<%*X*K z{t1kc2%T#qw)44+?_=-$EXGfWYi{=KKZ9=#^OKNkvzT#9m}~PVFwM={{VNvpKaf$4 z-1$L_J`Csf-cR_P_hT#o$9-Zg{)LgR1}fU2228Kl84^-8B4wQg@g2pYT!O z9FF-{*h}QQK#qS*xuEJBLLpS;oZ;Jcp6t$)C(HzWBb} zo*sDp2QbcM=r2Ez;j8{G3}4X?Vcg0vA8yK`Z!vzwFuso?8BZ{**@wLUSD|;_KIA`U zcxU26z6*i8L+~Nr1KvLPkUtvUdW|PP0)9uR`Ij-K!FPfBuvc^7y?atGzc|=4jfOJ( zf6A>NlJHlzu^)!)PI%XgJCA5M!~av&`hARIyaI1L@#X#h6SDlrz;{Bi9TagS@AnmZ z=O{mxk$pcl(`X!H5PIXOm#=`&`drwtq*y>Gb-!1yx*CZonI%yzYd@EN8X?OvwEk(cjm;%)=xfr*TwkL82;4Z`uNB( z`odceZAtG)b_@H~^p437Q;nDs;6zm3cKC;uwE*8?B&{$0KM#fQA#Y3WaRKIC^N zxh!A#ULAP$XQ`>sj0U)B5n;$->BkAcswU-DJ( z+4WoAVgJlGI}hA{of!I=oBPQ<;B~>+*5ftYx?Oww-J2oqp^RM^V;T09aEZ^>Q1Kn^ z|LzQN4`5iIIlB+kiDypY7)u;uYi~^R)5cu(Vu-yjL)&jMjM0Z7#t4RW=(BB@>$eX> zzrz{E_uMzWu^clP>eb2XE1oqf^O_{4*CKVj7~=M4*sDPdYdL~p54;wOKZ#*JIflKB z8S2%E(<97}54<&tvp2)IWeoGFWLR%khBQuJb7=K2tL+Vfcd5&}7t2g|#UHU1${mn`{GdZ7pEPe$>*^VgAA4!Hle=y9%+gy& zE#JBGsxE@1SlQ?3$uESo!!4!Q_T%fsZj8U|F{e2$gipq@&yP##*==_x0k$(K=EcuYX{V%p8F6~8$6{pUZe${W`ye$?@TG#dS+oVbCnz(9qoZt9n z`9E3q&H8O@)mL$$@NBQ<*pM8nc)zTccW`~*%=gz~-lHqRP3Icndv;C9duiJG?w-D0 zHS)Z-Hm{xb^ODk)B*(jVzOy)kNOeh^JiaAak!zdzr0)_|W0AgtmrB#?RNJdodwtvY z6f?h=ICbqZt|D(`z8l#J^&QVtV(oQgqr`VVeTP$hDgX5S&bi3)c+W_xuTQ#{zLQy- zyfBg)v`&i6t|F6-<;&TsTifMY|5%_Ptz{9&Bga-U4Qq&R9??wR>V9@QakRN)F*Yj z7V_x|w6|=(JLZFuzIR>1DrM|?d@)k?PI7z1l(UCvSF_%>m6URI-Lm(^-QT|7Uh*v2 z*$v;H-n2IDLb_M8{ZR5~Nc!Xc$R}8Nx|N>AS;SK1o64(X_4%wmulu5$nuzUg^ZkA^ zYJ0x6&oAp>X^*shr@rmVx0R=#BADUKcGafu?AvS4+Cm3iX79?!k-MYqRct1_=UvA& zOXY1d5hp#9rn6VuYO-@K^J#nDr)QSd>3NmfRD+Ou`ALfBe|>V6doQ*zi>Bnv_Y)1T zKCR&@;q@xB_bQWqKH_yXy>h3YveYLY`liUG-P5*)Y~4HBe17#)3$Npz)vk7)>!o#W zEWgw`J-^en%(6-~ZEJ6zLt9PO;jCI;qgs-6a|gNVUcb|-(~hU;uK5f`dKGrpmFh_? zI_}i0cbkg-MLr$7(7v8hWcN>2QQN)PabC-c)lg+ydFi!FO_83vioU|69r2py>$$7a zns|TSCR>4YRnpJ$zUWG84h;!f$4}F&E`3!>&%ZRX9Zr9)$gV(bvrn(vdZwS$*~!eV z!2b14!^}l2-2;dxif3xa>$keLYt=SiKMO1*9$&Nv)SIub_+DePy9(uV*-!4R>@{K2 zpFx)FI_?g4U)pJFO3%6W*K_0Om0Gp0$8Oj)uk6L7Z|-}qv{l&Wl5;ve@9fMRdguyx zzfpRn>DV)S+=QiPjh!x?%h`_2?r-d@SI6vizT*zhc5z2}*2j*KJ6;Vt_R4(Hd!CLO ztFjC2UsGH?Gi-l%)&7h~E!y8Plq@`R+U`&hv%Qv8SCTZcCuR}RGpr;n-OaW2&U&Do gSAVaS?eBQApSv^qzuRdYtvBA6_CL|{ - + diff --git a/WebApiContrib.Formatting.Xlsx.sln b/WebApiContrib.Formatting.Xlsx.sln index be926e2..54bb1f4 100644 --- a/WebApiContrib.Formatting.Xlsx.sln +++ b/WebApiContrib.Formatting.Xlsx.sln @@ -1,18 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30110.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2015 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiContrib.Formatting.Xlsx", "src\WebApiContrib.Formatting.Xlsx\WebApiContrib.Formatting.Xlsx.csproj", "{B6A319B2-82A4-41BA-A895-4FC02A0D53EF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiContrib.Formatting.Xlsx.Tests", "test\WebApiContrib.Formatting.Xlsx.Tests\WebApiContrib.Formatting.Xlsx.Tests.csproj", "{91831A5B-8286-466A-8CC5-07A630493D9B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{11B0118B-54A0-4542-BF89-E1B1A4A5B209}" - ProjectSection(SolutionItems) = preProject - ..\README.md = ..\README.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiContrib.Formatting.Xlsx.Sample", "samples\WebApiContrib.Formatting.Xlsx.Sample\WebApiContrib.Formatting.Xlsx.Sample.csproj", "{03A10509-AF42-4AEA-A3AA-D0DD4368B905}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQAD.MTNext.WebApiContrib.Formatting.Xlsx", "src\WebApiContrib.Formatting.Xlsx\SQAD.MTNext.WebApiContrib.Formatting.Xlsx.csproj", "{B6A319B2-82A4-41BA-A895-4FC02A0D53EF}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{74359D7E-0112-4C04-A1FA-34504B3B7E48}" ProjectSection(SolutionItems) = preProject @@ -31,16 +22,11 @@ Global {B6A319B2-82A4-41BA-A895-4FC02A0D53EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6A319B2-82A4-41BA-A895-4FC02A0D53EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6A319B2-82A4-41BA-A895-4FC02A0D53EF}.Release|Any CPU.Build.0 = Release|Any CPU - {91831A5B-8286-466A-8CC5-07A630493D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91831A5B-8286-466A-8CC5-07A630493D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91831A5B-8286-466A-8CC5-07A630493D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91831A5B-8286-466A-8CC5-07A630493D9B}.Release|Any CPU.Build.0 = Release|Any CPU - {03A10509-AF42-4AEA-A3AA-D0DD4368B905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03A10509-AF42-4AEA-A3AA-D0DD4368B905}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03A10509-AF42-4AEA-A3AA-D0DD4368B905}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03A10509-AF42-4AEA-A3AA-D0DD4368B905}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {633B4F9C-A394-46E7-965C-DF230C291343} + EndGlobalSection EndGlobal diff --git a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs index 9cc4b3c..1a6bfe0 100644 --- a/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs +++ b/src/WebApiContrib.Formatting.Xlsx/FormatterUtils.cs @@ -5,7 +5,7 @@ using System.Runtime.Serialization; using WebApiContrib.Formatting.Xlsx.Attributes; -namespace WebApiContrib.Formatting.Xlsx +namespace SQAD.MTNext.WebApiContrib.Formatting.Xlsx { public static class FormatterUtils { diff --git a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs index c3959bc..d60d371 100644 --- a/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs +++ b/src/WebApiContrib.Formatting.Xlsx/Interfaces/IColumnResolver.cs @@ -1,9 +1,9 @@ -using System; +using SQAD.MTNext.Serialisation.WebApiContrib.Formatting.Xlsx.Serialisation; +using System; using System.Collections.Generic; using System.Reflection; -using WebApiContrib.Formatting.Xlsx.Serialisation; -namespace WebApiContrib.Formatting.Xlsx.Interfaces +namespace SQAD.MTNext.Interfaces.WebApiContrib.Formatting.Xlsx.Interfaces { ///