diff --git a/docs/_config.yml b/docs/_config.yml index 6609d8b3dea..c9d219950a3 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -2,4 +2,4 @@ name: Your New Jekyll Site pygments: true markdown: redcarpet redcarpet: - extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data"] + extensions: ["no_intra_emphasis", "fenced_code_blocks", "disable_indented_code_blocks", "tables", "with_toc_data"] diff --git a/docs/_includes/page_footer.html b/docs/_includes/page_footer.html new file mode 100644 index 00000000000..e8fe3e85aa6 --- /dev/null +++ b/docs/_includes/page_footer.html @@ -0,0 +1,51 @@ + + +
+ +
+ + + diff --git a/docs/_includes/page_header.html b/docs/_includes/page_header.html new file mode 100644 index 00000000000..df3d7e1e5a4 --- /dev/null +++ b/docs/_includes/page_header.html @@ -0,0 +1,27 @@ + + + + diff --git a/docs/_includes/site_head.html b/docs/_includes/site_head.html new file mode 100644 index 00000000000..8528dddef65 --- /dev/null +++ b/docs/_includes/site_head.html @@ -0,0 +1,19 @@ + + + + + +Druid | {{page.title}} + + + + + + + + + + + + + diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html deleted file mode 100644 index 12106274e0f..00000000000 --- a/docs/_layouts/default.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Druid | {{page.title}} - - - - - - - - - - - -
- -
-
-
- -
-
- {% if page.id == 'home' %} -

Druid is open-source infrastructure for real²time exploratory analytics on large datasets.

- - {% endif %} -
- -
- - {{ content }} - -
-
- - - - - - diff --git a/docs/_layouts/doc_page.html b/docs/_layouts/doc_page.html new file mode 100644 index 00000000000..325a25ca8a3 --- /dev/null +++ b/docs/_layouts/doc_page.html @@ -0,0 +1,36 @@ + + + + {% include site_head.html %} + + + + + {% include page_header.html %} + +
+ + +
+
+
+ +
+ {{ content }} +
+
+
+ + {% include page_footer.html %} + + + + + + diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html deleted file mode 100644 index cb38f8c336e..00000000000 --- a/docs/_layouts/docs.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: default ---- -
- - {{ content }} - -
diff --git a/docs/_layouts/docs_default.html b/docs/_layouts/docs_default.html deleted file mode 100644 index ec0b870838a..00000000000 --- a/docs/_layouts/docs_default.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Druid | {{page.title}} - - - - - - - - - - - -
- -
-
-
- -
-
- {% if page.id == 'home' %} -

Druid is open-source infrastructure for real²time exploratory analytics on large datasets.

- - {% endif %} -
- -
- - {{ content }} - -
-
- - - - - - diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html deleted file mode 100644 index b5ebfb17ace..00000000000 --- a/docs/_layouts/page.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: default ---- - -
-
- - {{ content }} - -
-
diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html deleted file mode 100644 index affb233fd23..00000000000 --- a/docs/_layouts/post.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: default -sectionid: blog ---- - -
-
-

Recent posts

- -
- -
-
-

- {{ page.title }} - {{ page.date | date: "%B %e, %Y" }} · {{ page.author | upcase }} -

- - {% if page.image %}{{ page.title }}{% endif %} - - {{ content }} - -
- - - comments powered by Disqus - -
-
-
diff --git a/docs/content/Aggregations.md b/docs/content/Aggregations.md index b530b691b41..3beec02a73f 100644 --- a/docs/content/Aggregations.md +++ b/docs/content/Aggregations.md @@ -1,20 +1,26 @@ --- -layout: docs_default +layout: doc_page --- Aggregations are specifications of processing over metrics available in Druid. Available aggregations are: +### Count aggregator + +`count` computes the row count that match the filters + +```json +{ "type" : "count", "name" : } +``` + ### Sum aggregators #### `longSum` aggregator computes the sum of values as a 64-bit, signed integer - { - "type" : "longSum", - "name" : , - "fieldName" : - } +```json +{ "type" : "longSum", "name" : , "fieldName" : } +``` `name` – output name for the summed value `fieldName` – name of the metric column to sum over @@ -23,20 +29,9 @@ computes the sum of values as a 64-bit, signed integer Computes the sum of values as 64-bit floating point value. Similar to `longSum` - { - "type" : "doubleSum", - "name" : , - "fieldName" : - } - -### Count aggregator - -`count` computes the row count that match the filters - - { - "type" : "count", - "name" : , - } +```json +{ "type" : "doubleSum", "name" : , "fieldName" : } +``` ### Min / Max aggregators @@ -44,21 +39,17 @@ Computes the sum of values as 64-bit floating point value. Similar to `longSum` `min` computes the minimum metric value - { - "type" : "min", - "name" : , - "fieldName" : - } +```json +{ "type" : "min", "name" : , "fieldName" : } +``` #### `max` aggregator `max` computes the maximum metric value - { - "type" : "max", - "name" : , - "fieldName" : - } +```json +{ "type" : "max", "name" : , "fieldName" : } +``` ### JavaScript aggregator @@ -66,25 +57,27 @@ Computes an arbitrary JavaScript function over a set of columns (both metrics an All JavaScript functions must return numerical values. - { - "type": "javascript", - "name": "", - "fieldNames" : [ , , ... ], - "fnAggregate" : "function(current, column1, column2, ...) { - - return - }" - "fnCombine" : "function(partialA, partialB) { return ; }" - "fnReset" : "function() { return ; }" - } +```json +{ "type": "javascript", "name": "", + "fieldNames" : [ , , ... ], + "fnAggregate" : "function(current, column1, column2, ...) { + + return + }", + "fnCombine" : "function(partialA, partialB) { return ; }", + "fnReset" : "function() { return ; }" +} +``` **Example** - { - "type": "javascript", - "name": "sum(log(x)/y) + 10", - "fieldNames": ["x", "y"], - "fnAggregate" : "function(current, a, b) { return current + (Math.log(a) * b); }" - "fnCombine" : "function(partialA, partialB) { return partialA + partialB; }" - "fnReset" : "function() { return 10; }" - } \ No newline at end of file +```json +{ + "type": "javascript", + "name": "sum(log(x)/y) + 10", + "fieldNames": ["x", "y"], + "fnAggregate" : "function(current, a, b) { return current + (Math.log(a) * b); }", + "fnCombine" : "function(partialA, partialB) { return partialA + partialB; }", + "fnReset" : "function() { return 10; }" +} +``` diff --git a/docs/content/Batch-ingestion.md b/docs/content/Batch-ingestion.md index 42a42ac7b29..48dccd11a84 100644 --- a/docs/content/Batch-ingestion.md +++ b/docs/content/Batch-ingestion.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Batch Data Ingestion ==================== @@ -18,52 +18,52 @@ HadoopDruidIndexer Located at `com.metamx.druid.indexer.HadoopDruidIndexerMain` can be run like - - java -cp hadoop_config_path:druid_indexer_selfcontained_jar_path com.metamx.druid.indexer.HadoopDruidIndexerMain - +``` +java -cp hadoop_config_path:druid_indexer_selfcontained_jar_path com.metamx.druid.indexer.HadoopDruidIndexerMain +``` -The interval is the [ISO8601 interval](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals) of the data you are processing. The config\_file is a path to a file (the “specFile”) that contains JSON and an example looks like: +The interval is the [ISO8601 interval](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals) of the data you are processing. The config\_file is a path to a file (the "specFile") that contains JSON and an example looks like: - - { - "dataSource": "the_data_source", - "timestampColumn": "ts", - "timestampFormat": "", - "dataSpec": { - "format": "", - "columns": ["ts", "column_1", "column_2", "column_3", "column_4", "column_5"], - "dimensions": ["column_1", "column_2", "column_3"] - }, - "granularitySpec": { - "type":"uniform", - "intervals":[""], - "gran":"day" - }, - "pathSpec": { "type": "granularity", - "dataGranularity": "hour", - "inputPath": "s3n://billy-bucket/the/data/is/here", - "filePattern": ".*" }, - "rollupSpec": { "aggs": [ - { "type": "count", "name":"event_count" }, - { "type": "doubleSum", "fieldName": "column_4", "name": "revenue" }, - { "type": "longSum", "fieldName" : "column_5", "name": "clicks" } - ], - "rollupGranularity": "minute"}, - "workingPath": "/tmp/path/on/hdfs", - "segmentOutputPath": "s3n://billy-bucket/the/segments/go/here", - "leaveIntermediate": "false", - "partitionsSpec": { - "targetPartitionSize": 5000000 - }, - "updaterJobSpec": { - "type":"db", - "connectURI":"jdbc:mysql://localhost:7980/test_db", - "user":"username", - "password":"passmeup", - "segmentTable":"segments" - } - } - +``` +{ + "dataSource": "the_data_source", + "timestampColumn": "ts", + "timestampFormat": "", + "dataSpec": { + "format": "", + "columns": ["ts", "column_1", "column_2", "column_3", "column_4", "column_5"], + "dimensions": ["column_1", "column_2", "column_3"] + }, + "granularitySpec": { + "type":"uniform", + "intervals":[""], + "gran":"day" + }, + "pathSpec": { "type": "granularity", + "dataGranularity": "hour", + "inputPath": "s3n://billy-bucket/the/data/is/here", + "filePattern": ".*" }, + "rollupSpec": { "aggs": [ + { "type": "count", "name":"event_count" }, + { "type": "doubleSum", "fieldName": "column_4", "name": "revenue" }, + { "type": "longSum", "fieldName" : "column_5", "name": "clicks" } + ], + "rollupGranularity": "minute"}, + "workingPath": "/tmp/path/on/hdfs", + "segmentOutputPath": "s3n://billy-bucket/the/segments/go/here", + "leaveIntermediate": "false", + "partitionsSpec": { + "targetPartitionSize": 5000000 + }, + "updaterJobSpec": { + "type":"db", + "connectURI":"jdbc:mysql://localhost:7980/test_db", + "user":"username", + "password":"passmeup", + "segmentTable":"segments" + } +} +``` ### Hadoop indexer config @@ -100,10 +100,12 @@ Is a type of data loader that expects data to be laid out in a specific path for For example, if the sample config were run with the interval 2012-06-01/2012-06-02, it would expect data at the paths - s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=00 - s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=01 - ... - s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=23 +``` +s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=00 +s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=01 +... +s3n://billy-bucket/the/data/is/here/y=2012/m=06/d=01/H=23 +``` ### Rollup specification @@ -116,7 +118,7 @@ The indexing process has the ability to roll data up as it processes the incomin ### Partitioning specification -Segments are always partitioned based on timestamp (according to the granularitySpec) and may be further partitioned in some other way. For example, data for a day may be split by the dimension “last\_name” into two segments: one with all values from A-M and one with all values from N-Z. +Segments are always partitioned based on timestamp (according to the granularitySpec) and may be further partitioned in some other way. For example, data for a day may be split by the dimension "last\_name" into two segments: one with all values from A-M and one with all values from N-Z. To use this option, the indexer must be given a target partition size. It can then find a good set of partition ranges on its own. @@ -132,7 +134,7 @@ This is a specification of the properties that tell the job how to update metada |property|description|required?| |--------|-----------|---------| -|type|“db” is the only value available|yes| +|type|"db" is the only value available|yes| |connectURI|a valid JDBC url to MySQL|yes| |user|username for db|yes| |password|password for db|yes| diff --git a/docs/content/Booting-a-production-cluster.md b/docs/content/Booting-a-production-cluster.md index f7e5444ab8e..fc17f70b3e2 100644 --- a/docs/content/Booting-a-production-cluster.md +++ b/docs/content/Booting-a-production-cluster.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- # Booting a Single Node Cluster # @@ -27,4 +27,4 @@ cd whirr git checkout trunk mvn clean install -Dmaven.test.failure.ignore=true -Dcheckstyle.skip sp;bin/whirr launch-cluster --config recipes/druid.properties -``` \ No newline at end of file +``` diff --git a/docs/content/Broker.md b/docs/content/Broker.md index fee33bedc83..be5e2142dbf 100644 --- a/docs/content/Broker.md +++ b/docs/content/Broker.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Broker ====== diff --git a/docs/content/Build-from-source.md b/docs/content/Build-from-source.md index 3f323259b80..6b8f1cc8605 100644 --- a/docs/content/Build-from-source.md +++ b/docs/content/Build-from-source.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- ### Clone and Build from Source @@ -20,5 +20,6 @@ LICENSE client eclipse_formatting.xml index-common merger realtime ``` You can find the example executables in the examples/bin directory: + * run_example_server.sh * run_example_client.sh diff --git a/docs/content/Cluster-setup.md b/docs/content/Cluster-setup.md deleted file mode 100644 index b8281e99468..00000000000 --- a/docs/content/Cluster-setup.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -layout: default ---- -A Druid cluster consists of various node types that need to be set up depending on your use case. See our [Design](Design.html) docs for a description of the different node types. - -Setup Scripts -------------- - -One of our community members, [housejester](https://github.com/housejester/), contributed some scripts to help with setting up a cluster. Checkout the [github](https://github.com/housejester/druid-test-harness) and [wiki](https://github.com/housejester/druid-test-harness/wiki/Druid-Test-Harness). - -Minimum Physical Layout: Absolute Minimum ------------------------------------------ - -As a special case, the absolute minimum setup is one of the standalone examples for realtime ingestion and querying; see [Examples](Examples.html) that can easily run on one machine with one core and 1GB RAM. This layout can be set up to try some basic queries with Druid. - -Minimum Physical Layout: Experimental Testing with 4GB of RAM -------------------------------------------------------------- - -This layout can be used to load some data from deep storage onto a Druid compute node for the first time. A minimal physical layout for a 1 or 2 core machine with 4GB of RAM is: - -1. node1: [Master](Master.html) + metadata service + zookeeper + [Compute](Compute.html) -2. transient nodes: indexer - -This setup is only reasonable to prove that a configuration works. It would not be worthwhile to use this layout for performance measurement. - -Comfortable Physical Layout: Pilot Project with Multiple Machines ------------------------------------------------------------------ - -*The machine size “flavors” are using AWS/EC2 terminology for descriptive purposes only and is not meant to imply that AWS/EC2 is required or recommended. Another cloud provider or your own hardware can also work.* - -A minimal physical layout not constrained by cores that demonstrates parallel querying and realtime, using AWS-EC2 “small”/m1.small (one core, with 1.7GB of RAM) or larger, no realtime, is: - -1. node1: [Master](Master.html) (m1.small) -2. node2: metadata service (m1.small) -3. node3: zookeeper (m1.small) -4. node4: [Broker](Broker.html) (m1.small or m1.medium or m1.large) -5. node5: [Compute](Compute.html) (m1.small or m1.medium or m1.large) -6. node6: [Compute](Compute.html) (m1.small or m1.medium or m1.large) -7. node7: [Realtime](Realtime.html) (m1.small or m1.medium or m1.large) -8. transient nodes: indexer - -This layout naturally lends itself to adding more RAM and core to Compute nodes, and to adding many more Compute nodes. Depending on the actual load, the Master, metadata server, and Zookeeper might need to use larger machines. - -High Availability Physical Layout ---------------------------------- - -*The machine size “flavors” are using AWS/EC2 terminology for descriptive purposes only and is not meant to imply that AWS/EC2 is required or recommended. Another cloud provider or your own hardware can also work.* - -An HA layout allows full rolling restarts and heavy volume: - -1. node1: [Master](Master.html) (m1.small or m1.medium or m1.large) -2. node2: [Master](Master.html) (m1.small or m1.medium or m1.large) (backup) -3. node3: metadata service (c1.medium or m1.large) -4. node4: metadata service (c1.medium or m1.large) (backup) -5. node5: zookeeper (c1.medium) -6. node6: zookeeper (c1.medium) -7. node7: zookeeper (c1.medium) -8. node8: [Broker](Broker.html) (m1.small or m1.medium or m1.large or m2.xlarge or m2.2xlarge or m2.4xlarge) -9. node9: [Broker](Broker.html) (m1.small or m1.medium or m1.large or m2.xlarge or m2.2xlarge or m2.4xlarge) (backup) -10. node10: [Compute](Compute.html) (m1.small or m1.medium or m1.large or m2.xlarge or m2.2xlarge or m2.4xlarge) -11. node11: [Compute](Compute.html) (m1.small or m1.medium or m1.large or m2.xlarge or m2.2xlarge or m2.4xlarge) -12. node12: [Realtime](Realtime.html) (m1.small or m1.medium or m1.large or m2.xlarge or m2.2xlarge or m2.4xlarge) -13. transient nodes: indexer - -Sizing for Cores and RAM ------------------------- - -The Compute and Broker nodes will use as many cores as are available, depending on usage, so it is best to keep these on dedicated machines. The upper limit of effectively utilized cores is not well characterized yet and would depend on types of queries, query load, and the schema. Compute daemons should have a heap a size of at least 1GB per core for normal usage, but could be squeezed into a smaller heap for testing. Since in-memory caching is essential for good performance, even more RAM is better. Broker nodes will use RAM for caching, so they do more than just route queries. - -The effective utilization of cores by Zookeeper, MySQL, and Master nodes is likely to be between 1 and 2 for each process/daemon, so these could potentially share a machine with lots of cores. These daemons work with heap a size between 500MB and 1GB. - -Storage -------- - -Indexed segments should be kept in a permanent store accessible by all nodes like AWS S3 or HDFS or equivalent. Currently Druid supports S3, but this will be extended soon. - -Local disk (“ephemeral” on AWS EC2) for caching is recommended over network mounted storage (example of mounted: AWS EBS, Elastic Block Store) in order to avoid network delays during times of heavy usage. If your data center is suitably provisioned for networked storage, perhaps with separate LAN/NICs just for storage, then mounted might work fine. - -Setup ------ - -Setting up a cluster is essentially just firing up all of the nodes you want with the proper [configuration](configuration.html). One thing to be aware of is that there are a few properties in the configuration that potentially need to be set individually for each process: - - - druid.server.type=historical|realtime - druid.host=someHostOrIPaddrWithPort - druid.port=8080 - - -`druid.server.type` should be set to “historical” for your compute nodes and realtime for the realtime nodes. The master will only assign segments to a “historical” node and the broker has some intelligence around its ability to cache results when talking to a realtime node. This does not need to be set for the master or the broker. - -`druid.host` should be set to the hostname and port that can be used to talk to the given server process. Basically, someone should be able to send a request to http://\${druid.host}/ and actually talk to the process. - -`druid.port` should be set to the port that the server should listen on. In the vast majority of cases, this port should be the same as what is on `druid.host`. - -Build/Run ---------- - -The simplest way to build and run from the repository is to run `mvn package` from the base directory and then take `druid-services/target/druid-services-*-selfcontained.jar` and push that around to your machines; the jar does not need to be expanded, and since it contains the main() methods for each kind of service, it is **not** invoked with java ~~jar. It can be run from a normal java command-line by just including it on the classpath and then giving it the main class that you want to run. For example one instance of the Compute node/service can be started like this: -\ - -java~~Duser.timezone=UTC ~~Dfile.encoding=UTF-8~~cp compute/:druid-services/target/druid-services~~\*~~selfcontained.jar com.metamx.druid.http.ComputeMain - - - -The following table shows the possible services and fully qualified class for main(). - -|service|main class| -|-------|----------| -|[ Realtime ]( Realtime .html)|com.metamx.druid.realtime.RealtimeMain| -|[ Master ]( Master .html)|com.metamx.druid.http.MasterMain| -|[ Broker ]( Broker .html)|com.metamx.druid.http.BrokerMain| -|[ Compute ]( Compute .html)|com.metamx.druid.http.ComputeMain| - diff --git a/docs/content/Compute.md b/docs/content/Compute.md index e7df17ebbd5..2994fed97c2 100644 --- a/docs/content/Compute.md +++ b/docs/content/Compute.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Compute ======= diff --git a/docs/content/Concepts-and-Terminology.md b/docs/content/Concepts-and-Terminology.md index 925941dd8c5..3b5bc3ca730 100644 --- a/docs/content/Concepts-and-Terminology.md +++ b/docs/content/Concepts-and-Terminology.md @@ -1,15 +1,14 @@ --- -layout: default +layout: doc_page --- Concepts and Terminology ======================== -- **Aggregators:** A mechanism for combining records during realtime incremental indexing, Hadoop batch indexing, and in queries. -- **DataSource:** A table-like view of data; specified in a “specFile” and in a query. -- **Granularity:** The time interval corresponding to aggregation by time. - - The *indexGranularity* setting in a schema is used to aggregate input (ingest) records within an interval into a single output (internal) record. - - The *segmentGranularity* is the interval specifying how internal records are stored together in a single file. - -- **Segment:** A collection of (internal) records that are stored and processed together. -- **Shard:** A unit of partitioning data across machine. TODO: clarify; by time or other dimensions? -- **specFile** is specification for services in JSON format; see [Realtime](Realtime.html) and [Batch-ingestion](Batch-ingestion.html) +* **Aggregators**: A mechanism for combining records during realtime incremental indexing, Hadoop batch indexing, and in queries. +* **DataSource**: A table-like view of data; specified in a "specFile" and in a query. +* **Granularity**: The time interval corresponding to aggregation by time. + * **indexGranularity**: specifies the granularity used to bucket timestamps within a segment. + * **segmentGranularity**: specifies the granularity of the segment, i.e. the amount of time a segment will represent +* **Segment**: A collection of (internal) records that are stored and processed together. +* **Shard**: A sub-partition of the data in a segment. It is possible to have multiple segments represent all data for a given segmentGranularity. +* **specFile**: is specification for services in JSON format; see [Realtime](Realtime.html) and [Batch-ingestion](Batch-ingestion.html) diff --git a/docs/content/Configuration.md b/docs/content/Configuration.md index 4042d02d825..2b0f6f05bc1 100644 --- a/docs/content/Configuration.md +++ b/docs/content/Configuration.md @@ -1,7 +1,7 @@ --- -layout: default +layout: doc_page --- -This describes the basic server configuration that is loaded by all the server processes; the same file is loaded by all. See also the json “specFile” descriptions in [Realtime](Realtime.html) and [Batch-ingestion](Batch-ingestion.html). +This describes the basic server configuration that is loaded by all the server processes; the same file is loaded by all. See also the json "specFile" descriptions in [Realtime](Realtime.html) and [Batch-ingestion](Batch-ingestion.html). JVM Configuration Best Practices ================================ @@ -17,63 +17,63 @@ Basic Service Configuration Configuration of the various nodes is done via Java properties. These can either be provided as `-D` system properties on the java command line or they can be passed in via a file called `runtime.properties` that exists on the classpath. Note: as a future item, I’d like to consolidate all of the various configuration into a yaml/JSON based configuration files. -The periodic time intervals (like “PT1M”) are [ISO8601 intervals](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals) +The periodic time intervals (like "PT1M") are [ISO8601 intervals](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals) An example runtime.properties is as follows: - - # S3 access - com.metamx.aws.accessKey= - com.metamx.aws.secretKey= +``` +# S3 access +com.metamx.aws.accessKey= +com.metamx.aws.secretKey= - # thread pool size for servicing queries - druid.client.http.connections=30 +# thread pool size for servicing queries +druid.client.http.connections=30 - # JDBC connection string for metadata database - druid.database.connectURI= - druid.database.user=user - druid.database.password=password - # time between polling for metadata database - druid.database.poll.duration=PT1M - druid.database.segmentTable=prod_segments +# JDBC connection string for metadata database +druid.database.connectURI= +druid.database.user=user +druid.database.password=password +# time between polling for metadata database +druid.database.poll.duration=PT1M +druid.database.segmentTable=prod_segments - # Path on local FS for storage of segments; dir will be created if needed - druid.paths.indexCache=/tmp/druid/indexCache - # Path on local FS for storage of segment metadata; dir will be created if needed - druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache +# Path on local FS for storage of segments; dir will be created if needed +druid.paths.indexCache=/tmp/druid/indexCache +# Path on local FS for storage of segment metadata; dir will be created if needed +druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache - druid.request.logging.dir=/tmp/druid/log +druid.request.logging.dir=/tmp/druid/log - druid.server.maxSize=300000000000 +druid.server.maxSize=300000000000 - # ZK quorum IPs - druid.zk.service.host= - # ZK path prefix for Druid-usage of zookeeper, Druid will create multiple paths underneath this znode - druid.zk.paths.base=/druid - # ZK path for discovery, the only path not to default to anything - druid.zk.paths.discoveryPath=/druid/discoveryPath +# ZK quorum IPs +druid.zk.service.host= +# ZK path prefix for Druid-usage of zookeeper, Druid will create multiple paths underneath this znode +druid.zk.paths.base=/druid +# ZK path for discovery, the only path not to default to anything +druid.zk.paths.discoveryPath=/druid/discoveryPath - # the host:port as advertised to clients - druid.host=someHostOrIPaddrWithPort - # the port on which to listen, this port should line up with the druid.host value - druid.port=8080 +# the host:port as advertised to clients +druid.host=someHostOrIPaddrWithPort +# the port on which to listen, this port should line up with the druid.host value +druid.port=8080 - com.metamx.emitter.logging=true - com.metamx.emitter.logging.level=debug +com.metamx.emitter.logging=true +com.metamx.emitter.logging.level=debug - druid.processing.formatString=processing_%s - druid.processing.numThreads=3 +druid.processing.formatString=processing_%s +druid.processing.numThreads=3 - druid.computation.buffer.size=100000000 +druid.computation.buffer.size=100000000 - # S3 dest for realtime indexer - druid.pusher.s3.bucket= - druid.pusher.s3.baseKey= +# S3 dest for realtime indexer +druid.pusher.s3.bucket= +druid.pusher.s3.baseKey= - druid.bard.cache.sizeInBytes=40000000 - druid.master.merger.service=blah_blah - +druid.bard.cache.sizeInBytes=40000000 +druid.master.merger.service=blah_blah +``` Configuration groupings ----------------------- @@ -91,7 +91,7 @@ These properties are for connecting with S3 and using it to pull down segments. ### JDBC connection -These properties specify the jdbc connection and other configuration around the “segments table” database. The only processes that connect to the DB with these properties are the [Master](Master.html) and [Indexing service](Indexing-service.html). This is tested on MySQL. +These properties specify the jdbc connection and other configuration around the "segments table" database. The only processes that connect to the DB with these properties are the [Master](Master.html) and [Indexing service](Indexing-service.html). This is tested on MySQL. |Property|Description|Default| |--------|-----------|-------| @@ -142,7 +142,7 @@ These are properties that the compute nodes use |Property|Description|Default| |--------|-----------|-------| |`druid.server.maxSize`|The maximum number of bytes worth of segment that the node wants assigned to it. This is not a limit that the compute nodes actually enforce, they just publish it to the master and trust the master to do the right thing|none| -|`druid.server.type`|Specifies the type of the node. This is published via ZK and depending on the value the node will be treated specially by the Master/Broker. Allowed values are “realtime” or “historical”. This is a configuration parameter because the plan is to allow for a more configurable cluster composition. At the current time, all realtime nodes should just be “realtime” and all compute nodes should just be “compute”|none| +|`druid.server.type`|Specifies the type of the node. This is published via ZK and depending on the value the node will be treated specially by the Master/Broker. Allowed values are "realtime" or "historical". This is a configuration parameter because the plan is to allow for a more configurable cluster composition. At the current time, all realtime nodes should just be "realtime" and all compute nodes should just be "compute"|none| ### Emitter Properties @@ -150,7 +150,7 @@ The Druid servers emit various metrics and alerts via something we call an [Emit |Property|Description|Default| |--------|-----------|-------| -|`com.metamx.emitter.logging`|Set to “true” to use the logging emitter|none| +|`com.metamx.emitter.logging`|Set to "true" to use the logging emitter|none| |`com.metamx.emitter.logging.level`|Sets the level to log at|debug| |`com.metamx.emitter.logging.class`|Sets the class to log at|com.metamx.emiter.core.LoggingEmitter| diff --git a/docs/content/Contribute.md b/docs/content/Contribute.md index a853eb430d2..197e52e320d 100644 --- a/docs/content/Contribute.md +++ b/docs/content/Contribute.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- If you are interested in contributing to the code, we accept [pull requests](https://help.github.com/articles/using-pull-requests). Note: we have only just completed decoupling our Metamarkets-specific code from the code base and we took some short-cuts in interface design to make it happen. So, there are a number of interfaces that exist right now which are likely to be in flux. If you are embedding Druid in your system, it will be safest for the time being to only extend/implement interfaces that this wiki describes, as those are intended as stable (unless otherwise mentioned). diff --git a/docs/content/Deep-Storage.md b/docs/content/Deep-Storage.md index bd9a0ec8a66..6ca4a797710 100644 --- a/docs/content/Deep-Storage.md +++ b/docs/content/Deep-Storage.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Deep storage is where segments are stored. It is a storage mechanism that Druid does not provide. This deep storage infrastructure defines the level of durability of your data, as long as Druid nodes can see this storage infrastructure and get at the segments stored on it, you will not lose data no matter how many Druid nodes you lose. If segments disappear from this storage layer, then you will lose whatever data those segments represented. @@ -11,10 +11,12 @@ S3-compatible deep storage is basically either S3 or something like riak-cs whic S3 configuration parameters are - com.metamx.aws.accessKey= - com.metamx.aws.secretKey= - druid.pusher.s3.bucket= - druid.pusher.s3.baseKey= +``` +com.metamx.aws.accessKey= +com.metamx.aws.secretKey= +druid.pusher.s3.bucket= +druid.pusher.s3.baseKey= +``` ## HDFS @@ -22,8 +24,10 @@ As of 0.4.0, HDFS can be used for storage of segments as well. In order to use hdfs for deep storage, you need to set the following configuration on your realtime nodes. - druid.pusher.hdfs=true - druid.pusher.hdfs.storageDirectory= +``` +druid.pusher.hdfs=true +druid.pusher.hdfs.storageDirectory= +``` If you are using the Hadoop indexer, set your output directory to be a location on Hadoop and it will work @@ -34,9 +38,11 @@ A local mount can be used for storage of segments as well. This allows you to u In order to use a local mount for deep storage, you need to set the following configuration on your realtime nodes. - druid.pusher.local=true - druid.pusher.local.storageDirectory= +``` +druid.pusher.local=true +druid.pusher.local.storageDirectory= +``` Note that you should generally set `druid.pusher.local.storageDirectory` to something different from `druid.paths.indexCache`. -If you are using the Hadoop indexer in local mode, then just give it a local file as your output directory and it will work. \ No newline at end of file +If you are using the Hadoop indexer in local mode, then just give it a local file as your output directory and it will work. diff --git a/docs/content/Design.md b/docs/content/Design.md index 25d69d95fe8..cdd3d5e6322 100644 --- a/docs/content/Design.md +++ b/docs/content/Design.md @@ -1,12 +1,13 @@ --- -layout: default +layout: doc_page --- + For a comprehensive look at the architecture of Druid, read the [White Paper](http://static.druid.io/docs/druid.pdf). What is Druid? ============== -Druid is a system built to allow fast (“real-time”) access to large sets of seldom-changing data. It was designed with the intent of being a service and maintaining 100% uptime in the face of code deployments, machine failures and other eventualities of a production system. It can be useful for back-office use cases as well, but design decisions were made explicitly targetting an always-up service. +Druid is a system built to allow fast ("real-time") access to large sets of seldom-changing data. It was designed with the intent of being a service and maintaining 100% uptime in the face of code deployments, machine failures and other eventualities of a production system. It can be useful for back-office use cases as well, but design decisions were made explicitly targetting an always-up service. Druid currently allows for single-table queries in a similar manner to [Dremel](http://research.google.com/pubs/pub36632.html) and [PowerDrill](http://www.vldb.org/pvldb/vol5/p1436_alexanderhall_vldb2012.pdf). It adds to the mix @@ -18,20 +19,21 @@ Druid currently allows for single-table queries in a similar manner to [Dremel]( As far as a comparison of systems is concerned, Druid sits in between PowerDrill and Dremel on the spectrum of functionality. It implements almost everything Dremel offers (Dremel handles arbitrary nested data structures while Druid only allows for a single level of array-based nesting) and gets into some of the interesting data layout and compression methods from PowerDrill. -Druid is a good fit for products that require real-time data ingestion of a single, large data stream. Especially if you are targetting no-downtime operation and are building your product on top of a time-oriented summarization of the incoming data stream. Druid is probably not the right solution if you care more about query flexibility and raw data access than query speed and no-downtime operation. When talking about query speed it is important to clarify what “fast” means, with Druid it is entirely within the realm of possibility (we have done it) to achieve queries that run in single-digit seconds across a 6TB data set. +Druid is a good fit for products that require real-time data ingestion of a single, large data stream. Especially if you are targetting no-downtime operation and are building your product on top of a time-oriented summarization of the incoming data stream. Druid is probably not the right solution if you care more about query flexibility and raw data access than query speed and no-downtime operation. When talking about query speed it is important to clarify what "fast" means, with Druid it is entirely within the realm of possibility (we have done it) to achieve queries that run in single-digit seconds across a 6TB data set. ### Architecture Druid is architected as a grouping of systems each with a distinct role and together they form a working system. The name comes from the Druid class in many role-playing games: it is a shape-shifter, capable of taking many different forms to fulfill various different roles in a group. The node types that currently exist are: -\* **Compute** nodes are the workhorses that handle storage and querying on “historical” data (non-realtime) -\* **Realtime** nodes ingest data in real-time, they are in charge of listening to a stream of incoming data and making it available immediately inside the Druid system. As data they have ingested ages, they hand it off to the compute nodes. -\* **Master** nodes act as coordinators. They look over the grouping of computes and make sure that data is available, replicated and in a generally “optimal” configuration. -\* **Broker** nodes understand the topology of data across all of the other nodes in the cluster and re-write and route queries accordingly -\* **Indexer** nodes form a cluster of workers to load batch and real-time data into the system as well as allow for alterations to the data stored in the system (also known as the Indexing Service) -This separation allows each node to only care about what it is best at. By separating Compute and Realtime, we separate the memory concerns of listening on a real-time stream of data and processing it for entry into the system. By separating the Master and Broker, we separate the needs for querying from the needs for maintaining “good” data distribution across the cluster. +* **Compute** nodes are the workhorses that handle storage and querying on "historical" data (non-realtime) +* **Realtime** nodes ingest data in real-time, they are in charge of listening to a stream of incoming data and making it available immediately inside the Druid system. As data they have ingested ages, they hand it off to the compute nodes. +* **Master** nodes act as coordinators. They look over the grouping of computes and make sure that data is available, replicated and in a generally "optimal" configuration. +* **Broker** nodes understand the topology of data across all of the other nodes in the cluster and re-write and route queries accordingly +* **Indexer** nodes form a cluster of workers to load batch and real-time data into the system as well as allow for alterations to the data stored in the system (also known as the Indexing Service) + +This separation allows each node to only care about what it is best at. By separating Compute and Realtime, we separate the memory concerns of listening on a real-time stream of data and processing it for entry into the system. By separating the Master and Broker, we separate the needs for querying from the needs for maintaining "good" data distribution across the cluster. All nodes can be run in some highly available fashion. Either as symmetric peers in a share-nothing cluster or as hot-swap failover nodes. @@ -39,7 +41,7 @@ Aside from these nodes, there are 3 external dependencies to the system: 1. A running [ZooKeeper](http://zookeeper.apache.org/) cluster for cluster service discovery and maintenance of current data topology 2. A MySQL instance for maintenance of metadata about the data segments that should be served by the system -3. A “deep storage” LOB store/file system to hold the stored segments +3. A "deep storage" LOB store/file system to hold the stored segments ### Data Storage @@ -53,9 +55,9 @@ Getting data into the Druid system requires an indexing process. This gives the - Bitmap compression - RLE (on the roadmap, but not yet implemented) -The output of the indexing process is stored in a “deep storage” LOB store/file system ([Deep Storage](Deep Storage.html) for information about potential options). Data is then loaded by compute nodes by first downloading the data to their local disk and then memory mapping it before serving queries. +The output of the indexing process is stored in a "deep storage" LOB store/file system ([Deep Storage](Deep Storage.html) for information about potential options). Data is then loaded by compute nodes by first downloading the data to their local disk and then memory mapping it before serving queries. -If a compute node dies, it will no longer serve its segments, but given that the segments are still available on the “deep storage” any other node can simply download the segment and start serving it. This means that it is possible to actually remove all compute nodes from the cluster and then re-provision them without any data loss. It also means that if the “deep storage” is not available, the nodes can continue to serve the segments they have already pulled down (i.e. the cluster goes stale, not down). +If a compute node dies, it will no longer serve its segments, but given that the segments are still available on the "deep storage" any other node can simply download the segment and start serving it. This means that it is possible to actually remove all compute nodes from the cluster and then re-provision them without any data loss. It also means that if the "deep storage" is not available, the nodes can continue to serve the segments they have already pulled down (i.e. the cluster goes stale, not down). In order for a segment to exist inside of the cluster, an entry has to be added to a table in a MySQL instance. This entry is a self-describing bit of metadata about the segment, it includes things like the schema of the segment, the size, and the location on deep storage. These entries are what the Master uses to know what data **should** be available on the cluster. @@ -65,7 +67,7 @@ In order for a segment to exist inside of the cluster, an entry has to be added - **Master** Can be run in a hot fail-over configuration. If no masters are running, then changes to the data topology will stop happening (no new data and no data balancing decisions), but the system will continue to run. - **Broker** Can be run in parallel or in hot fail-over. - **Realtime** Depending on the semantics of the delivery stream, multiple of these can be run in parallel processing the exact same stream. They periodically checkpoint to disk and eventually push out to the Computes. Steps are taken to be able to recover from process death, but loss of access to the local disk can result in data loss if this is the only method of adding data to the system. -- **“deep storage” file system** If this is not available, new data will not be able to enter the cluster, but the cluster will continue operating as is. +- **"deep storage" file system** If this is not available, new data will not be able to enter the cluster, but the cluster will continue operating as is. - **MySQL** If this is not available, the master will be unable to find out about new segments in the system, but it will continue with its current view of the segments that should exist in the cluster. - **ZooKeeper** If this is not available, data topology changes will not be able to be made, but the Brokers will maintain their most recent view of the data topology and continue serving requests accordingly. @@ -77,12 +79,8 @@ For filters at a more granular level than what the Broker can prune based on, th Once it knows the rows that match the current query, it can access the columns it cares about for those rows directly without having to load data that it is just going to throw away. -The following diagram shows the data flow for queries without showing batch indexing: - -![Simple Data Flow](https://raw.github.com/metamx/druid/master/doc/data_flow_simple.png "Simple Data Flow") - ### In-memory? Druid is not always and only in-memory. When we first built it, it is true that it was all in-memory all the time, but as time went on the price-performance tradeoff ended up swinging towards keeping all of our customers data in memory all the time a non-starter. We then added the ability to memory map data and allow the OS to handle paging data in and out of memory on demand. Our production cluster is primarily configured to operate with this memory mapping behavior and we are definitely over-subscribed in terms of memory available vs. data a node is serving. -As you read some of the old blog posts or other literature about the project, you will see “in-memory” often touted as that is the history of where Druid came from, but the technical reality is that there is a spectrum of price vs. performance and being able to slide along it from all in-memory (high cost, great performance) to mostly on disk (low cost, low performance) is the important knob to be able to adjust. +As you read some of the old blog posts or other literature about the project, you will see "in-memory" often touted as that is the history of where Druid came from, but the technical reality is that there is a spectrum of price vs. performance and being able to slide along it from all in-memory (high cost, great performance) to mostly on disk (low cost, low performance) is the important knob to be able to adjust. diff --git a/docs/content/Download.md b/docs/content/Download.md index 1bf1352de58..36328d4fe72 100644 --- a/docs/content/Download.md +++ b/docs/content/Download.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- A version may be declared as a release candidate if it has been deployed to a sizable production cluster. Release candidates are declared as stable after we feel fairly confident there are no major bugs in the version. Check out the [Versioning](Versioning.html) section for how we describe software versions. diff --git a/docs/content/Druid-Personal-Demo-Cluster.md b/docs/content/Druid-Personal-Demo-Cluster.md index 0ef9834f198..01112a4725c 100644 --- a/docs/content/Druid-Personal-Demo-Cluster.md +++ b/docs/content/Druid-Personal-Demo-Cluster.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- # Druid Personal Demo Cluster (DPDC) diff --git a/docs/content/Druid-vs-Cassandra.md b/docs/content/Druid-vs-Cassandra.md index e191dde2af7..4ef29a1ab36 100644 --- a/docs/content/Druid-vs-Cassandra.md +++ b/docs/content/Druid-vs-Cassandra.md @@ -1,8 +1,8 @@ --- -layout: default +layout: doc_page --- We are not experts on Cassandra, if anything is incorrect about our portrayal, please let us know on the mailing list or via some other means. We will fix this page. Druid is highly optimized for scans and aggregations, it supports arbitrarily deep drill downs into data sets without the need to pre-compute, and it can ingest event streams in real-time and allow users to query events as they come in. Cassandra is a great key-value store and it has some features that allow you to use it to do more interesting things than what you can do with a pure key-value store. But, it is not built for the same use cases that Druid handles, namely regularly scanning over billions of entries per query. -Furthermore, Druid is fully read-consistent. Druid breaks down a data set into immutable chunks known as segments. All replicants always present the exact same view for the piece of data they are holding and we don’t have to worry about data synchronization. The tradeoff is that Druid has limited semantics for write and update operations. Cassandra, similar to Amazon’s Dynamo, has an eventually consistent data model. Writes are always supported but updates to data may take some time before all replicas sync up (data reconciliation is done at read time). This model favors availability and scalability over consistency. \ No newline at end of file +Furthermore, Druid is fully read-consistent. Druid breaks down a data set into immutable chunks known as segments. All replicants always present the exact same view for the piece of data they are holding and we don’t have to worry about data synchronization. The tradeoff is that Druid has limited semantics for write and update operations. Cassandra, similar to Amazon’s Dynamo, has an eventually consistent data model. Writes are always supported but updates to data may take some time before all replicas sync up (data reconciliation is done at read time). This model favors availability and scalability over consistency. diff --git a/docs/content/Druid-vs-Hadoop.md b/docs/content/Druid-vs-Hadoop.md index 37559b1da8f..7ca9deaabba 100644 --- a/docs/content/Druid-vs-Hadoop.md +++ b/docs/content/Druid-vs-Hadoop.md @@ -1,6 +1,6 @@ --- -layout: default +layout: doc_page --- Druid is a complementary addition to Hadoop. Hadoop is great at storing and making accessible large amounts of individually low-value data. Unfortunately, Hadoop is not great at providing query speed guarantees on top of that data, nor does it have very good operational characteristics for a customer-facing production system. Druid, on the other hand, excels at taking high-value summaries of the low-value data on Hadoop, making it available in a fast and always-on fashion, such that it could be exposed directly to a customer. -Druid also requires some infrastructure to exist for “deep storage”. HDFS is one of the implemented options for this “deep storage”. +Druid also requires some infrastructure to exist for [deep storage](Deep-Storage.html). HDFS is one of the implemented options for this [deep storage](Deep-Storage.html). diff --git a/docs/content/Druid-vs-Impala-or-Shark.md b/docs/content/Druid-vs-Impala-or-Shark.md index ee59b3def0c..cb658c8e087 100644 --- a/docs/content/Druid-vs-Impala-or-Shark.md +++ b/docs/content/Druid-vs-Impala-or-Shark.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- The question of Druid versus Impala or Shark basically comes down to your product requirements and what the systems were designed to do. @@ -42,4 +42,4 @@ Impala/Shark, being based on data in HDFS or some other backing store, are limit Druid supports timeseries and groupBy style queries. It doesn't have support for joins, which makes it a lot less flexible for generic processing. -Impala/Shark support SQL style queries with full joins. \ No newline at end of file +Impala/Shark support SQL style queries with full joins. diff --git a/docs/content/Druid-vs-redshift.md b/docs/content/Druid-vs-redshift.md index 8469209b10b..52ec6250a66 100644 --- a/docs/content/Druid-vs-redshift.md +++ b/docs/content/Druid-vs-redshift.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- ###How does Druid compare to Redshift? @@ -19,7 +19,7 @@ It’s write semantics aren’t as fluid and does not support joins. ParAccel is ###Data distribution model -Druid’s data distribution, is segment based which exists on highly available “deep” storage, like S3 or HDFS. Scaling up (or down) does not require massive copy actions or downtime; in fact, losing any number of compute nodes does not result in data loss because new compute nodes can always be brought up by reading data from “deep” storage. +Druid’s data distribution, is segment based which exists on highly available "deep" storage, like S3 or HDFS. Scaling up (or down) does not require massive copy actions or downtime; in fact, losing any number of compute nodes does not result in data loss because new compute nodes can always be brought up by reading data from "deep" storage. To contrast, ParAccel’s data distribution model is hash-based. Expanding the cluster requires re-hashing the data across the nodes, making it difficult to perform without taking downtime. Amazon’s Redshift works around this issue with a multi-step process: @@ -37,4 +37,4 @@ ParAccel’s hash-based distribution generally means that replication is conduct Along with column oriented structures, Druid uses indexing structures to speed up query execution when a filter is provided. Indexing structures do increase storage overhead (and make it more difficult to allow for mutation), but they can also significantly speed up queries. -ParAccel does not appear to employ indexing strategies. \ No newline at end of file +ParAccel does not appear to employ indexing strategies. diff --git a/docs/content/Druid-vs-vertica.md b/docs/content/Druid-vs-vertica.md index 535e5e06300..e6971ae03d9 100644 --- a/docs/content/Druid-vs-vertica.md +++ b/docs/content/Druid-vs-vertica.md @@ -1,10 +1,10 @@ --- -layout: default +layout: doc_page --- How does Druid compare to Vertica? Vertica is similar to ParAccel/Redshift ([Druid-vs-Redshift](Druid-vs-Redshift.html)) described above in that it wasn’t built for real-time streaming data ingestion and it supports full SQL. -The other big difference is that instead of employing indexing, Vertica tries to optimize processing by leveraging run-length encoding (RLE) and other compression techniques along with a “projection” system that creates materialized copies of the data in a different sort order (to maximize the effectiveness of RLE). +The other big difference is that instead of employing indexing, Vertica tries to optimize processing by leveraging run-length encoding (RLE) and other compression techniques along with a "projection" system that creates materialized copies of the data in a different sort order (to maximize the effectiveness of RLE). We are unclear about how Vertica handles data distribution and replication, so we cannot speak to if/how Druid is different. diff --git a/docs/content/Examples.md b/docs/content/Examples.md index 4207911464b..28795d0f3fc 100644 --- a/docs/content/Examples.md +++ b/docs/content/Examples.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Examples ======== @@ -15,21 +15,22 @@ There are two options for installing standalone Druid. Building from source, and Clone Druid and build it: - git clone https://github.com/metamx/druid.git druid - cd druid - git fetch --tags - git checkout druid-0.4.30 - ./build.sh - +``` bash +git clone https://github.com/metamx/druid.git druid +cd druid +git fetch --tags +git checkout druid-0.4.30 +./build.sh +``` ### Downloading the DSK (Druid Standalone Kit) [Download](http://static.druid.io/data/examples/druid-services-0.4.6.tar.gz) a stand-alone tarball and run it: - - tar -xzf druid-services-0.X.X-SNAPSHOT-bin.tar.gz - cd druid-services-0.X.X-SNAPSHOT - +``` bash +tar -xzf druid-services-0.X.X-SNAPSHOT-bin.tar.gz +cd druid-services-0.X.X-SNAPSHOT +``` Twitter Example --------------- @@ -39,12 +40,12 @@ For a full tutorial based on the twitter example, check out this [Twitter Tutori This Example uses a feature of Twitter that allows for sampling of it’s stream. We sample the Twitter stream via our [TwitterSpritzerFirehoseFactory](https://github.com/metamx/druid/blob/master/examples/src/main/java/druid/examples/twitter/TwitterSpritzerFirehoseFactory.java) class and use it to simulate the kinds of data you might ingest into Druid. Then, with the client part, the sample shows what kinds of analytics explorations you can do during and after the data is loaded. ### What you’ll learn -\* See how large amounts of data gets ingested into Druid in real-time -\* Learn how to do fast, interactive, analytics queries on that real-time data +* See how large amounts of data gets ingested into Druid in real-time +* Learn how to do fast, interactive, analytics queries on that real-time data ### What you need -\* A build of standalone Druid with the Twitter example (see above) -\* A Twitter username and password. +* A build of standalone Druid with the Twitter example (see above) +* A Twitter username and password. ### What you’ll do @@ -57,12 +58,15 @@ This uses `RandomFirehoseFactory` which emits a stream of random numbers (outCol In a terminal window, (NOTE: If you are using the cloned Github repository these scripts are in ./examples/bin) start the server with: -`./run_example_server.sh` -`# type rand when prompted` +``` bash +./run_example_server.sh # type rand when prompted +``` In another terminal window: -`./run_example_client.sh` -`# type rand when prompted` +``` bash +./run_example_client.sh # type rand when prompted +``` + The result of the client query is in JSON format. The client makes a REST request using the program `curl` which is usually installed on Linux, Unix, and OSX by default. diff --git a/docs/content/Filters.md b/docs/content/Filters.md index 41ae91f93e2..8564b84e6c5 100644 --- a/docs/content/Filters.md +++ b/docs/content/Filters.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- A filter is a JSON object indicating which rows of data should be included in the computation for a query. It’s essentially the equivalent of the WHERE clause in SQL. Druid supports the following types of filters. @@ -9,12 +9,9 @@ The simplest filter is a selector filter. The selector filter will match a speci The grammar for a SELECTOR filter is as follows: - "filter": { - "type": "selector", - "dimension": , - "value": - } - +``` json +"filter": { "type": "selector", "dimension": , "value": } +``` This is the equivalent of `WHERE = ''`. @@ -22,12 +19,9 @@ This is the equivalent of `WHERE = '' The regular expression filter is similar to the selector filter, but using regular expressions. It matches the specified dimension with the given pattern. The pattern can be any standard [Java regular expression](http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html). - "filter": { - "type": "regex", - "dimension": , - "pattern": - } - +``` json +"filter": { "type": "regex", "dimension": , "pattern": } +``` ### Logical expression filters @@ -35,11 +29,9 @@ The regular expression filter is similar to the selector filter, but using regul The grammar for an AND filter is as follows: - "filter": { - "type": "and", - "fields": [, , ...] - } - +``` json +"filter": { "type": "and", "fields": [, , ...] } +``` The filters in fields can be any other filter defined on this page. @@ -47,11 +39,9 @@ The filters in fields can be any other filter defined on this page. The grammar for an OR filter is as follows: - "filter": { - "type": "or", - "fields": [, , ...] - } - +``` json +"filter": { "type": "or", "fields": [, , ...] } +``` The filters in fields can be any other filter defined on this page. @@ -59,11 +49,9 @@ The filters in fields can be any other filter defined on this page. The grammar for a NOT filter is as follows: - "filter": { - "type": "not", - "field": - } - +```json +"filter": { "type": "not", "field": } +``` The filter specified at field can be any other filter defined on this page. @@ -73,19 +61,21 @@ The JavaScript filter matches a dimension against the specified JavaScript funct The function takes a single argument, the dimension value, and returns either true or false. - { - "type" : "javascript", - "dimension" : , - "function" : "function(value) { <...> }" - } - +```json +{ + "type" : "javascript", + "dimension" : , + "function" : "function(value) { <...> }" +} +``` **Example** The following matches any dimension values for the dimension `name` between `'bar'` and `'foo'` - { - "type" : "javascript", - "dimension" : "name", - "function" : "function(x) { return(x >= 'bar' && x <= 'foo') }" - } - +```json +{ + "type" : "javascript", + "dimension" : "name", + "function" : "function(x) { return(x >= 'bar' && x <= 'foo') }" +} +``` \ No newline at end of file diff --git a/docs/content/Firehose.md b/docs/content/Firehose.md index 92c5caa2386..62b19ac078d 100644 --- a/docs/content/Firehose.md +++ b/docs/content/Firehose.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Firehoses describe the data stream source. They are pluggable and thus the configuration schema can and will vary based on the `type` of the firehose. @@ -11,7 +11,7 @@ We describe the configuration of the Kafka firehose from the example below, but - `consumerProps` is a map of properties for the Kafka consumer. The JSON object is converted into a Properties object and passed along to the Kafka consumer. - `feed` is the feed that the Kafka consumer should read from. -- `parser` represents a parser that knows how to convert from String representations into the required `InputRow` representation that Druid uses. This is a potentially reusable piece that can be found in many of the firehoses that are based on text streams. The spec in the example describes a JSON feed (new-line delimited objects), with a timestamp column called “timestamp” in ISO8601 format and that it should not include the dimension “value” when processing. More information about the options available for the parser are available [here](https://github.com/metamx/druid/wiki/Firehose#parsing-data). +- `parser` represents a parser that knows how to convert from String representations into the required `InputRow` representation that Druid uses. This is a potentially reusable piece that can be found in many of the firehoses that are based on text streams. The spec in the example describes a JSON feed (new-line delimited objects), with a timestamp column called "timestamp" in ISO8601 format and that it should not include the dimension "value" when processing. More information about the options available for the parser are available [here](https://github.com/metamx/druid/wiki/Firehose#parsing-data). Available Firehoses ------------------- diff --git a/docs/content/Granularities.md b/docs/content/Granularities.md index 0cb25a7a5df..b71a5b1a8d8 100644 --- a/docs/content/Granularities.md +++ b/docs/content/Granularities.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- The granularity field determines how data gets bucketed across the time dimension, i.e how it gets aggregated by hour, day, minute, etc. @@ -10,8 +10,9 @@ It can be specified either as a string for simple granularities or as an object Simple granularities are specified as a string and bucket timestamps by their UTC time (i.e. days start at 00:00 UTC). Supported granularity strings are: `all`, `none`, `minute`, `fifteen_minute`, `thirty_minute`, `hour` and `day` -\* **`all`** buckets everything into a single bucket -\* **`none`** does not bucket data (it actually uses the granularity of the index - minimum here is `none` which means millisecond granularity). Using `none` in a [timeseries query|TimeSeriesQuery](timeseries query|TimeSeriesQuery.html) is currently not recommended (the system will try to generate 0 values for all milliseconds that didn’t exist, which is often a lot). + +* `all` buckets everything into a single bucket +* `none` does not bucket data (it actually uses the granularity of the index - minimum here is `none` which means millisecond granularity). Using `none` in a [TimeSeriesQuery](TimeSeriesQuery.html) is currently not recommended (the system will try to generate 0 values for all milliseconds that didn’t exist, which is often a lot). ### Duration Granularities @@ -19,11 +20,15 @@ Duration granularities are specified as an exact duration in milliseconds and ti They also support specifying an optional origin, which defines where to start counting time buckets from (defaults to 1970-01-01T00:00:00Z). - {"type": "duration", "duration": "7200000"} +``` +{"type": "duration", "duration": "7200000"} +``` This chunks up every 2 hours. - {"type": "duration", "duration": "3600000", "origin": "2012-01-01T00:30:00Z"} +``` +{"type": "duration", "duration": "3600000", "origin": "2012-01-01T00:30:00Z"} +``` This chunks up every hour on the half-hour. @@ -38,11 +43,15 @@ By default years start on the first of January, months start on the first of the Time zone is optional (defaults to UTC) Origin is optional (defaults to 1970-01-01T00:00:00 in the given time zone) - {"type": "period", "period": "P2D", "timeZone": "America/Los_Angeles"} +``` +{"type": "period", "period": "P2D", "timeZone": "America/Los_Angeles"} +``` This will bucket by two day chunks in the Pacific timezone. - {"type": "period", "period": "P3M", "timeZone": "America/Los_Angeles", "origin": "2012-02-01T00:00:00-08:00"} +``` +{"type": "period", "period": "P3M", "timeZone": "America/Los_Angeles", "origin": "2012-02-01T00:00:00-08:00"} +``` This will bucket by 3 month chunks in the Pacific timezone where the three-month quarters are defined as starting from February. diff --git a/docs/content/GroupByQuery.md b/docs/content/GroupByQuery.md index 01edc6bdc7e..e208e588ac1 100644 --- a/docs/content/GroupByQuery.md +++ b/docs/content/GroupByQuery.md @@ -1,96 +1,53 @@ --- -layout: default +layout: doc_page --- These types of queries take a groupBy query object and return an array of JSON objects where each object represents a grouping asked for by the query. An example groupBy query object is shown below: -
-
+``` json
 {
- [queryType]() “groupBy”,
- [dataSource]() “sample\_datasource”,
- [granularity]() “day”,
- [dimensions]() [“dim1”, “dim2”],
- [limitSpec]() {
- [type]() “default”,
- [limit]() 5000,
- [columns]() [“dim1”, “metric1”]
- },
- [filter]() {
- [type]() “and”,
- [fields]() [
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension1”,
- [value]() “sample\_value1”
- },
- {
- [type]() “or”,
- [fields]() [
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension2”,
- [value]() “sample\_value2”
- },
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension3”,
- [value]() “sample\_value3”
- }
- ]
- }
- ]
- },
- [aggregations]() [
- {
- [type]() “longSum”,
- [name]() “sample\_name1”,
- [fieldName]() “sample\_fieldName1”
- },
- {
- [type]() “doubleSum”,
- [name]() “sample\_name2”,
- [fieldName]() “sample\_fieldName2”
- }
- ],
- [postAggregations]() [
- {
- [type]() “arithmetic”,
- [name]() “sample\_divide”,
- [fn]() “/”,
- [fields]() [
- {
- [type]() “fieldAccess”,
- [name]() “sample\_name1”,
- [fieldName]() “sample\_fieldName1”
- },
- {
- [type]() “fieldAccess”,
- [name]() “sample\_name2”,
- [fieldName]() “sample\_fieldName2”
- }
- ]
- }
- ],
- [intervals]() [
- “2012-01-01T00:00:00.000/2012-01-03T00:00:00.000”
- ],
- [having]() {
- [type]() “greaterThan”,
- [aggregation]() “sample\_name1”,
- [value]() 0
- }
+  "queryType": "groupBy",
+  "dataSource": "sample_datasource",
+  "granularity": "day",
+  "dimensions": ["dim1", "dim2"],
+  "limitSpec": { "type": "default", "limit": 5000, "columns": ["dim1", "metric1"] },
+  "filter": {
+    "type": "and",
+    "fields": [
+      { "type": "selector", "dimension": "sample_dimension1", "value": "sample_value1" },
+      { "type": "or", 
+        "fields": [
+          { "type": "selector", "dimension": "sample_dimension2", "value": "sample_value2" },
+          { "type": "selector", "dimension": "sample_dimension3", "value": "sample_value3" }
+        ]
+      }
+    ]
+  },
+  "aggregations": [
+    { "type": "longSum", "name": "sample_name1", "fieldName": "sample_fieldName1" },
+    { "type": "doubleSum", "name": "sample_name2", "fieldName": "sample_fieldName2" }
+  ],
+  "postAggregations": [
+    { "type": "arithmetic",
+      "name": "sample_divide",
+      "fn": "/",
+      "fields": [
+        { "type": "fieldAccess", "name": "sample_name1", "fieldName": "sample_fieldName1" },
+        { "type": "fieldAccess", "name": "sample_name2", "fieldName": "sample_fieldName2" }
+      ]
+    }
+  ],
+  "intervals": [ "2012-01-01T00:00:00.000/2012-01-03T00:00:00.000" ],
+  "having": { "type": "greaterThan", "aggregation": "sample_name1", "value": 0 }
 }
-
-
- +``` There are 9 main parts to a groupBy query: |property|description|required?| |--------|-----------|---------| -|queryType|This String should always be “groupBy”; this is the first thing Druid looks at to figure out how to interpret the query|yes| +|queryType|This String should always be "groupBy"; this is the first thing Druid looks at to figure out how to interpret the query|yes| |dataSource|A String defining the data source to query, very similar to a table in a relational database|yes| |dimensions|A JSON list of dimensions to do the groupBy over|yes| |orderBy|See [OrderBy](OrderBy.html).|no| @@ -102,33 +59,32 @@ There are 9 main parts to a groupBy query: |intervals|A JSON Object representing ISO-8601 Intervals. This defines the time ranges to run the query over.|yes| |context|An additional JSON Object which can be used to specify certain flags.|no| -To pull it all together, the above query would return *n\*m* data points, up to a maximum of 5000 points, where n is the cardinality of the “dim1” dimension, m is the cardinality of the “dim2” dimension, each day between 2012-01-01 and 2012-01-03, from the “sample\_datasource” table. Each data point contains the (long) sum of sample\_fieldName1 if the value of the data point is greater than 0, the (double) sum of sample\_fieldName2 and the (double) the result of sample\_fieldName1 divided by sample\_fieldName2 for the filter set for a particular grouping of “dim1” and “dim2”. The output looks like this: +To pull it all together, the above query would return *n\*m* data points, up to a maximum of 5000 points, where n is the cardinality of the "dim1" dimension, m is the cardinality of the "dim2" dimension, each day between 2012-01-01 and 2012-01-03, from the "sample_datasource" table. Each data point contains the (long) sum of sample_fieldName1 if the value of the data point is greater than 0, the (double) sum of sample_fieldName2 and the (double) the result of sample_fieldName1 divided by sample_fieldName2 for the filter set for a particular grouping of "dim1" and "dim2". The output looks like this: -
-
-[ {
- “version” : “v1”,
- “timestamp” : “2012-01-01T00:00:00.000Z”,
- “event” : {
- “dim1” : ,
- “dim2” : ,
- “sample\_name1” : ,
- “sample\_name2” :,
- “sample\_divide” : 
- }
-}, {
- “version” : “v1”,
- “timestamp” : “2012-01-01T00:00:00.000Z”,
- “event” : {
- “dim1” : ,
- “dim2” : ,
- “sample\_name1” : ,
- “sample\_name2” :,
- “sample\_divide” : 
- }
-},
-…
+```json
+[ 
+  {
+    "version" : "v1",
+    "timestamp" : "2012-01-01T00:00:00.000Z",
+    "event" : {
+      "dim1" : ,
+      "dim2" : ,
+      "sample_name1" : ,
+      "sample_name2" :,
+      "sample_divide" : 
+    }
+  }, 
+  {
+    "version" : "v1",
+    "timestamp" : "2012-01-01T00:00:00.000Z",
+    "event" : {
+      "dim1" : ,
+      "dim2" : ,
+      "sample_name1" : ,
+      "sample_name2" :,
+      "sample_divide" : 
+    }
+  },
+...
 ]
-
-
- +``` \ No newline at end of file diff --git a/docs/content/Having.md b/docs/content/Having.md index 62ab4644451..9b37fdb4ba1 100644 --- a/docs/content/Having.md +++ b/docs/content/Having.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- A having clause is a JSON object identifying which rows from a groupBy query should be returned, by specifying conditions on aggregated values. @@ -17,12 +17,13 @@ Numeric filters can be used as the base filters for more complex boolean express The equalTo filter will match rows with a specific aggregate value. The grammar for an `equalTo` filter is as follows: - "having": { - "type": "equalTo", - "aggregation": , - "value": - } - +```json +{ + "type": "equalTo", + "aggregation": , + "value": +} +``` This is the equivalent of `HAVING = `. @@ -31,12 +32,13 @@ This is the equivalent of `HAVING = `. The greaterThan filter will match rows with aggregate values greater than the given value. The grammar for a `greaterThan` filter is as follows: - "having": { - "type": "greaterThan", - "aggregation": , - "value": - } - +```json +{ + "type": "greaterThan", + "aggregation": , + "value": +} +``` This is the equivalent of `HAVING > `. @@ -45,12 +47,13 @@ This is the equivalent of `HAVING > `. The lessThan filter will match rows with aggregate values less than the specified value. The grammar for a `greaterThan` filter is as follows: - "having": { - "type": "lessThan", - "aggregation": , - "value": - } - +```json +{ + "type": "lessThan", + "aggregation": , + "value": +} +``` This is the equivalent of `HAVING < `. @@ -60,11 +63,12 @@ This is the equivalent of `HAVING < `. The grammar for an AND filter is as follows: - "having": { - "type": "and", - "havingSpecs": [, , ...] - } - +```json +{ + "type": "and", + "havingSpecs": [, , ...] +} +``` The having clauses in `havingSpecs` can be any other having clause defined on this page. @@ -72,11 +76,12 @@ The having clauses in `havingSpecs` can be any other having clause defined on th The grammar for an OR filter is as follows: - "having": { - "type": "or", - "havingSpecs": [, , ...] - } - +```json +{ + "type": "or", + "havingSpecs": [, , ...] +} +``` The having clauses in `havingSpecs` can be any other having clause defined on this page. @@ -84,10 +89,11 @@ The having clauses in `havingSpecs` can be any other having clause defined on th The grammar for a NOT filter is as follows: - "having": { - "type": "not", - "havingSpec": - } - +```json +{ + "type": "not", + "havingSpec": +} +``` The having clause specified at `havingSpec` can be any other having clause defined on this page. diff --git a/docs/content/Home.md b/docs/content/Home.md index 8587aae4749..d7542e9fa70 100644 --- a/docs/content/Home.md +++ b/docs/content/Home.md @@ -1,10 +1,11 @@ --- -layout: default +layout: doc_page --- + Druid is an open-source analytics datastore designed for realtime, exploratory, queries on large-scale data sets (100’s of Billions entries, 100’s TB data). Druid provides for cost effective, always-on, realtime data ingestion and arbitrary data exploration. - Check out some [Examples](Examples.html) -- Try out Druid with our Getting Started [Tutorial](https://github.com/metamx/druid/wiki/Tutorial%3A-A-First-Look-at-Druid) +- Try out Druid with our Getting Started [Tutorial](./Tutorial%3A-A-First-Look-at-Druid.html) - Learn more by reading the [White Paper](http://static.druid.io/docs/druid.pdf) Why Druid? @@ -24,25 +25,25 @@ We have more details about the general design of the system and why you might wa The data store world is vast, confusing and constantly in flux. This page is meant to help potential evaluators decide whether Druid is a good fit for the problem one needs to solve. If anything about it is incorrect please provide that feedback on the mailing list or via some other means, we will fix this page. #### When Druid? -\* You need to do interactive, fast, exploration of large amounts of data -\* You need analytics (not key value store) -\* You have a lot of data (10s of Billions of events added per day, 10s of TB of data added per day) -\* You want to do your analysis on data as it’s happening (realtime) -\* Your store needs to be always-on, 24x7x365 and years into the future. +* You need to do interactive, fast, exploration of large amounts of data +* You need analytics (not key value store) +* You have a lot of data (10s of Billions of events added per day, 10s of TB of data added per day) +* You want to do your analysis on data as it’s happening (realtime) +* Your store needs to be always-on, 24x7x365 and years into the future. #### Not Druid? -\* The amount of data you have can easily be handled by MySql -\* Your querying for individual entries or doing lookups (Not Analytics) -\* Batch is good enough -\* Canned queries is good enough -\* Downtime is no big deal +* The amount of data you have can easily be handled by MySql +* Your querying for individual entries or doing lookups (Not Analytics) +* Batch is good enough +* Canned queries is good enough +* Downtime is no big deal #### Druid vs… -\* [Druid-vs-Impala-or-Shark](Druid-vs-Impala-or-Shark.html) -\* [Druid-vs-Redshift](Druid-vs-Redshift.html) -\* [Druid-vs-Vertica](Druid-vs-Vertica.html) -\* [Druid-vs-Cassandra](Druid-vs-Cassandra.html) -\* [Druid-vs-Hadoop](Druid-vs-Hadoop.html) +* [Druid-vs-Impala-or-Shark](Druid-vs-Impala-or-Shark.html) +* [Druid-vs-Redshift](Druid-vs-Redshift.html) +* [Druid-vs-Vertica](Druid-vs-Vertica.html) +* [Druid-vs-Cassandra](Druid-vs-Cassandra.html) +* [Druid-vs-Hadoop](Druid-vs-Hadoop.html) Key Features ------------ diff --git a/docs/content/Indexing-Service.md b/docs/content/Indexing-Service.md index d878e1b4176..e4bb5252310 100644 --- a/docs/content/Indexing-Service.md +++ b/docs/content/Indexing-Service.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Disclaimer: We are still in the process of finalizing the indexing service and these configs are prone to change at any time. We will announce when we feel the indexing service and the configurations described are stable. @@ -21,27 +21,37 @@ The indexer coordinator node exposes HTTP endpoints where tasks can be submitted Tasks can be submitted via POST requests to: - http://:/druid/indexer/v1/task +``` +http://:/druid/indexer/v1/task +``` Tasks can cancelled via POST requests to: - http://:/druid/indexer/v1/task/{taskId}/shutdown +``` +http://:/druid/indexer/v1/task/{taskId}/shutdown +``` Issuing the cancel request once sends a graceful shutdown request. Graceful shutdowns may not stop a task right away, but instead issue a safe stop command at a point deemed least impactful to the system. Issuing the cancel request twice in succession will kill –9 the task. Task statuses can be retrieved via GET requests to: - http://:/druid/indexer/v1/task/{taskId}/status +``` +http://:/druid/indexer/v1/task/{taskId}/status +``` Task segments can be retrieved via GET requests to: - http://:/druid/indexer/v1/task/{taskId}/segments +``` +http://:/druid/indexer/v1/task/{taskId}/segments +``` When a task is submitted, the coordinator creates a lock over the data source and interval of the task. The coordinator also stores the task in a MySQL database table. The database table is read at startup time to bootstrap any tasks that may have been submitted to the coordinator but may not yet have been executed. The coordinator also exposes a simple UI to show what tasks are currently running on what nodes at - http://:/static/console.html +``` +http://:/static/console.html +``` #### Task Execution @@ -55,31 +65,34 @@ The Autoscaling mechanisms currently in place are tightly coupled with our deplo The Coordinator node controls the number of workers in the cluster according to a worker setup spec that is submitted via a POST request to the indexer at: - http://:/druid/indexer/v1/worker/setup +``` +http://:/druid/indexer/v1/worker/setup +``` A sample worker setup spec is shown below: - { - "minVersion":"some_version", - "minNumWorkers":"0", - "maxNumWorkers":"10", - "nodeData": { - "type":"ec2", - "amiId":"ami-someId", - "instanceType":"m1.xlarge", - "minInstances":"1", - "maxInstances":"1", - "securityGroupIds":["securityGroupIds"], - "keyName":"keyName" - }, - "userData":{ - "classType":"galaxy", - "env":"druid", - "version":"druid_version", - "type":"sample_cluster/worker" - } - } - +``` +{ + "minVersion":"some_version", + "minNumWorkers":"0", + "maxNumWorkers":"10", + "nodeData": { + "type":"ec2", + "amiId":"ami-someId", + "instanceType":"m1.xlarge", + "minInstances":"1", + "maxInstances":"1", + "securityGroupIds":["securityGroupIds"], + "keyName":"keyName" + }, + "userData":{ + "classType":"galaxy", + "env":"druid", + "version":"druid_version", + "type":"sample_cluster/worker" + } +} +``` Issuing a GET request at the same URL will return the current worker setup spec that is currently in place. The worker setup spec list above is just a sample and it is possible to write worker setup specs for other deployment environments. A description of the worker setup spec is shown below. @@ -101,19 +114,21 @@ Indexer Coordinator nodes can be run using the `com.metamx.druid.indexing.coordi Indexer Coordinator nodes require [basic service configuration](https://github.com/metamx/druid/wiki/Configuration#basic-service-configuration). In addition, there are several extra configurations that are required. - -Ddruid.zk.paths.indexer.announcementsPath=/druid/indexer/announcements - -Ddruid.zk.paths.indexer.leaderLatchPath=/druid/indexer/leaderLatchPath - -Ddruid.zk.paths.indexer.statusPath=/druid/indexer/status - -Ddruid.zk.paths.indexer.tasksPath=/druid/demo/indexer/tasks +``` +-Ddruid.zk.paths.indexer.announcementsPath=/druid/indexer/announcements +-Ddruid.zk.paths.indexer.leaderLatchPath=/druid/indexer/leaderLatchPath +-Ddruid.zk.paths.indexer.statusPath=/druid/indexer/status +-Ddruid.zk.paths.indexer.tasksPath=/druid/demo/indexer/tasks - -Ddruid.indexer.runner=remote - -Ddruid.indexer.taskDir=/mnt/persistent/task/ - -Ddruid.indexer.configTable=sample_config - -Ddruid.indexer.workerSetupConfigName=worker_setup - -Ddruid.indexer.strategy=ec2 - -Ddruid.indexer.hadoopWorkingPath=/tmp/druid-indexing - -Ddruid.indexer.logs.s3bucket=some_bucket - -Ddruid.indexer.logs.s3prefix=some_prefix +-Ddruid.indexer.runner=remote +-Ddruid.indexer.taskDir=/mnt/persistent/task/ +-Ddruid.indexer.configTable=sample_config +-Ddruid.indexer.workerSetupConfigName=worker_setup +-Ddruid.indexer.strategy=ec2 +-Ddruid.indexer.hadoopWorkingPath=/tmp/druid-indexing +-Ddruid.indexer.logs.s3bucket=some_bucket +-Ddruid.indexer.logs.s3prefix=some_prefix +``` The indexing service requires some additional Zookeeper configs. @@ -128,7 +143,7 @@ There’s several additional configs that are required to run tasks. |Property|Description|Default| |--------|-----------|-------| -|`druid.indexer.runner`|Indicates whether tasks should be run locally or in a distributed environment. “local” or “remote”.|local| +|`druid.indexer.runner`|Indicates whether tasks should be run locally or in a distributed environment. "local" or "remote".|local| |`druid.indexer.taskDir`|Intermediate temporary directory that tasks may use.|none| |`druid.indexer.configTable`|The MySQL config table where misc configs live.|none| |`druid.indexer.strategy`|The autoscaling strategy to use.|noop| @@ -140,7 +155,9 @@ There’s several additional configs that are required to run tasks. The indexer console can be used to view pending tasks, running tasks, available workers, and recent worker creation and termination. The console can be accessed at: - http://:8080/static/console.html +``` +http://:8080/static/console.html +``` Worker Node ----------- @@ -155,29 +172,31 @@ Worker nodes can be run using the `com.metamx.druid.indexing.worker.http.WorkerM Worker nodes require [basic service configuration](https://github.com/metamx/druid/wiki/Configuration#basic-service-configuration). In addition, there are several extra configurations that are required. - -Ddruid.worker.version=0 - -Ddruid.worker.capacity=3 +``` +-Ddruid.worker.version=0 +-Ddruid.worker.capacity=3 - -Ddruid.indexer.threads=3 - -Ddruid.indexer.taskDir=/mnt/persistent/task/ - -Ddruid.indexer.hadoopWorkingPath=/tmp/druid-indexing +-Ddruid.indexer.threads=3 +-Ddruid.indexer.taskDir=/mnt/persistent/task/ +-Ddruid.indexer.hadoopWorkingPath=/tmp/druid-indexing - -Ddruid.worker.masterService=druid:sample_cluster:indexer +-Ddruid.worker.masterService=druid:sample_cluster:indexer - -Ddruid.indexer.fork.hostpattern=:%d - -Ddruid.indexer.fork.startport=8080 - -Ddruid.indexer.fork.main=com.metamx.druid.indexing.worker.executor.ExecutorMain - -Ddruid.indexer.fork.opts="-server -Xmx1g -Xms1g -XX:NewSize=256m -XX:MaxNewSize=256m" - -Ddruid.indexer.fork.property.druid.service=druid/sample_cluster/executor +-Ddruid.indexer.fork.hostpattern=:%d +-Ddruid.indexer.fork.startport=8080 +-Ddruid.indexer.fork.main=com.metamx.druid.indexing.worker.executor.ExecutorMain +-Ddruid.indexer.fork.opts="-server -Xmx1g -Xms1g -XX:NewSize=256m -XX:MaxNewSize=256m" +-Ddruid.indexer.fork.property.druid.service=druid/sample_cluster/executor - # These configs are the same configs you would set for basic service configuration, just with a different prefix - -Ddruid.indexer.fork.property.druid.monitoring.monitorSystem=false - -Ddruid.indexer.fork.property.druid.computation.buffer.size=268435456 - -Ddruid.indexer.fork.property.druid.indexer.taskDir=/mnt/persistent/task/ - -Ddruid.indexer.fork.property.druid.processing.formatString=processing-%s - -Ddruid.indexer.fork.property.druid.processing.numThreads=1 - -Ddruid.indexer.fork.property.druid.server.maxSize=0 - -Ddruid.indexer.fork.property.druid.request.logging.dir=request_logs/ +# These configs are the same configs you would set for basic service configuration, just with a different prefix +-Ddruid.indexer.fork.property.druid.monitoring.monitorSystem=false +-Ddruid.indexer.fork.property.druid.computation.buffer.size=268435456 +-Ddruid.indexer.fork.property.druid.indexer.taskDir=/mnt/persistent/task/ +-Ddruid.indexer.fork.property.druid.processing.formatString=processing-%s +-Ddruid.indexer.fork.property.druid.processing.numThreads=1 +-Ddruid.indexer.fork.property.druid.server.maxSize=0 +-Ddruid.indexer.fork.property.druid.request.logging.dir=request_logs/ +``` Many of the configurations for workers are similar to those for basic service configuration":https://github.com/metamx/druid/wiki/Configuration\#basic-service-configuration, but with a different config prefix. Below we describe the unique worker configs. diff --git a/docs/content/Libraries.md b/docs/content/Libraries.md index 0c57ffab3e8..ac393c5a4bf 100644 --- a/docs/content/Libraries.md +++ b/docs/content/Libraries.md @@ -1,9 +1,6 @@ --- -layout: default +layout: doc_page --- -### R - -- [RDruid](https://github.com/metamx/RDruid) - Druid connector for R Community Libraries ------------------- @@ -11,13 +8,18 @@ Community Libraries Some great folks have written their own libraries to interact with Druid #### Ruby -\* [madvertise/ruby-druid](https://github.com/madvertise/ruby-druid) - A ruby client for Druid + +* [madvertise/ruby-druid](https://github.com/madvertise/ruby-druid) - A ruby client for Druid #### Python -\* [metamx/pydruid](https://github.com/metamx/pydruid) - A python client for Druid + +* [metamx/pydruid](https://github.com/metamx/pydruid) - A python client for Druid + +#### R + +- [RDruid](https://github.com/metamx/RDruid) - Druid connector for R #### Helper Libraries -- [madvertise/druid-dumbo](https://github.com/madvertise/druid-dumbo) - Scripts to help generate batch configs for the ingestion of data into Druid - -- [housejester/druid-test-harness](https://github.com/housejester/druid-test-harness) - A set of scripts to simplify standing up some servers and seeing how things work +* [madvertise/druid-dumbo](https://github.com/madvertise/druid-dumbo) - Scripts to help generate batch configs for the ingestion of data into Druid +* [housejester/druid-test-harness](https://github.com/housejester/druid-test-harness) - A set of scripts to simplify standing up some servers and seeing how things work diff --git a/docs/content/Loading-Your-Data.md b/docs/content/Loading-Your-Data.md index 126a871ccca..1dd870e37d8 100644 --- a/docs/content/Loading-Your-Data.md +++ b/docs/content/Loading-Your-Data.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Once you have a realtime node working, it is time to load your own data to see how Druid performs. @@ -18,7 +18,7 @@ mkdir config/broker ## Loading Data with Kafka ## -[KafkaFirehoseFactory](https://github.com/metamx/druid/blob/master/realtime/src/main/java/com/metamx/druid/realtime/firehose/KafkaFirehoseFactory.java) is how druid communicates with Kafka. Using this [Firehose](Firehose.html) with the right configuration, we can import data into Druid in realtime without writing any code. To load data to a realtime node via Kafka, we'll first need to initialize Zookeeper and Kafka, and then configure and initialize a [Realtime](Realtime.html) node. +[KafkaFirehoseFactory](https://github.com/metamx/druid/blob/druid-0.5.x/realtime/src/main/java/com/metamx/druid/realtime/firehose/KafkaFirehoseFactory.java) is how druid communicates with Kafka. Using this [Firehose](Firehose.html) with the right configuration, we can import data into Druid in realtime without writing any code. To load data to a realtime node via Kafka, we'll first need to initialize Zookeeper and Kafka, and then configure and initialize a [Realtime](Realtime.html) node. ### Booting Kafka ### @@ -58,7 +58,7 @@ Instructions for booting a Zookeeper and then Kafka cluster are available [here] 1. Create a valid configuration file similar to this called config/realtime/runtime.properties: - ``` + ```properties druid.host=0.0.0.0:8080 druid.port=8080 @@ -91,7 +91,6 @@ Instructions for booting a Zookeeper and then Kafka cluster are available [here] druid.database.password=diurd druid.database.connectURI= druid.host=127.0.0.1:8080 - ``` 2. Create a valid realtime configuration file similar to this called realtime.spec: @@ -239,7 +238,7 @@ If you've already setup a realtime node, be aware that although you can run mult 1. Setup a configuration file called config/master/runtime.properties similar to: - ```bash + ```properties druid.host=0.0.0.0:8081 druid.port=8081 @@ -294,7 +293,7 @@ If you've already setup a realtime node, be aware that although you can run mult 1. Create a configuration file in config/compute/runtime.properties similar to: - ```bash + ```properties druid.host=0.0.0.0:8082 druid.port=8082 @@ -404,7 +403,9 @@ Now its time to run the Hadoop [Batch-ingestion](Batch-ingestion.html) job, Hado 2. Now run the job, with the config pointing at batchConfig.json: ```bash - java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.realtime.specFile=realtime.spec -classpath lib/* com.metamx.druid.indexer.HadoopDruidIndexerMain batchConfig.json + java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ + -Ddruid.realtime.specFile=realtime.spec -classpath lib/* \ + com.metamx.druid.indexer.HadoopDruidIndexerMain batchConfig.json ``` You can now move on to [Querying Your Data](Querying-Your-Data.html)! diff --git a/docs/content/Master.md b/docs/content/Master.md index eb86a3e81fd..d6ba2e78998 100644 --- a/docs/content/Master.md +++ b/docs/content/Master.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Master ====== @@ -39,37 +39,67 @@ The master node exposes several HTTP endpoints for interactions. ### GET -/info/master - returns the current true master of the cluster as a JSON object. E.g. A GET request to :8080/info/master will yield JSON of the form {[host]("IP"}) +* `/info/master` -/info/cluster - returns JSON data about every node and segment in the cluster. E.g. A GET request to :8080/info/cluster will yield JSON data organized by nodes. Information about each node and each segment on each node will be returned. + Returns the current true master of the cluster as a JSON object. -/info/servers (optional param ?full) - returns all segments in the cluster if the full flag is not set, otherwise returns full metadata about all servers in the cluster +* `/info/cluster` -/info/servers/{serverName} - returns full metadata about a specific server + Returns JSON data about every node and segment in the cluster. Information about each node and each segment on each node will be returned. -/info/servers/{serverName}/segments (optional param ?full) - returns a list of all segments for a server if the full flag is not set, otherwise returns all segment metadata +* `/info/servers` -/info/servers/{serverName}/segments/{segmentId} - returns full metadata for a specific segment + Returns information about servers in the cluster. Set the `?full` query parameter to get full metadata about all servers and their segments in the cluster. -/info/segments (optional param ?full)- returns all segments in the cluster as a list if the full flag is not set, otherwise returns all metadata about segments in the cluster +* `/info/servers/{serverName}` -/info/segments/{segmentId} - returns full metadata for a specific segment + Returns full metadata about a specific server. -/info/datasources (optional param ?full) - returns a list of datasources in the cluster if the full flag is not set, otherwise returns all the metadata for every datasource in the cluster +* `/info/servers/{serverName}/segments` -/info/datasources/{dataSourceName} - returns full metadata for a datasource + Returns a list of all segments for a server. Set the `?full` query parameter to get all segment metadata included -/info/datasources/{dataSourceName}/segments (optional param ?full) - returns a list of all segments for a datasource if the full flag is not set, otherwise returns full segment metadata for a datasource +* `/info/servers/{serverName}/segments/{segmentId}` -/info/datasources/{dataSourceName}/segments/{segmentId} - returns full segment metadata for a specific segment + Returns full metadata for a specific segment. -/info/rules - returns all rules for all data sources in the cluster including the default datasource. +* `/info/segments` -/info/rules/{dataSourceName} - returns all rules for a specified datasource + Returns all segments in the cluster as a list. Set the `?full` flag to get all metadata about segments in the cluster + +* `/info/segments/{segmentId}` + + Returns full metadata for a specific segment + +* `/info/datasources` + + Returns a list of datasources in the cluster. Set the `?full` flag to get all metadata for every datasource in the cluster + +* `/info/datasources/{dataSourceName}` + + Returns full metadata for a datasource + +* `/info/datasources/{dataSourceName}/segments` + + Returns a list of all segments for a datasource. Set the `?full` flag to get full segment metadata for a datasource + +* `/info/datasources/{dataSourceName}/segments/{segmentId}` + + Returns full segment metadata for a specific segment + +* `/info/rules` + + Returns all rules for all data sources in the cluster including the default datasource. + +* `/info/rules/{dataSourceName}` + + Returns all rules for a specified datasource ### POST -/info/rules/{dataSourceName} - POST with a list of rules in JSON form to update rules. +* `/info/rules/{dataSourceName}` + + POST with a list of rules in JSON form to update rules. The Master Console ------------------ @@ -83,17 +113,17 @@ FAQ 1. **Do clients ever contact the master node?** -The master is not involved in the lifecycle of a query. + The master is not involved in a query. -Compute nodes never directly contact the master node. The Druid master tells the compute nodes to load/drop data via Zookeeper, but the compute nodes are completely unaware of the master. + Compute nodes never directly contact the master node. The Druid master tells the compute nodes to load/drop data via Zookeeper, but the compute nodes are completely unaware of the master. -Brokers also never contact the master. Brokers base their understanding of the data topology on metadata exposed by the compute nodes via ZK and are completely unaware of the master. + Brokers also never contact the master. Brokers base their understanding of the data topology on metadata exposed by the compute nodes via ZK and are completely unaware of the master. 2. **Does it matter if the master node starts up before or after other processes?** -No. If the Druid master is not started up, no new segments will be loaded in the cluster and outdated segments will not be dropped. However, the master node can be started up at any time, and after a configurable delay, will start running master tasks. + No. If the Druid master is not started up, no new segments will be loaded in the cluster and outdated segments will not be dropped. However, the master node can be started up at any time, and after a configurable delay, will start running master tasks. -This also means that if you have a working cluster and all of your masters die, the cluster will continue to function, it just won’t experience any changes to its data topology. + This also means that if you have a working cluster and all of your masters die, the cluster will continue to function, it just won’t experience any changes to its data topology. Running ------- diff --git a/docs/content/MySQL.md b/docs/content/MySQL.md index 713ad0ab18d..b28bd6951ff 100644 --- a/docs/content/MySQL.md +++ b/docs/content/MySQL.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- MySQL is an external dependency of Druid. We use it to store various metadata about the system, but not to store the actual data. There are a number of tables used for various purposes described below. @@ -10,24 +10,26 @@ This is dictated by the `druid.database.segmentTable` property (Note that these This table stores metadata about the segments that are available in the system. The table is polled by the [Master](Master.html) to determine the set of segments that should be available for querying in the system. The table has two main functional columns, the other columns are for indexing purposes. -The `used` column is a boolean “tombstone”. A 1 means that the segment should be “used” by the cluster (i.e. it should be loaded and available for requests). A 0 means that the segment should not be actively loaded into the cluster. We do this as a means of removing segments from the cluster without actually removing their metadata (which allows for simpler rolling back if that is ever an issue). +The `used` column is a boolean "tombstone". A 1 means that the segment should be "used" by the cluster (i.e. it should be loaded and available for requests). A 0 means that the segment should not be actively loaded into the cluster. We do this as a means of removing segments from the cluster without actually removing their metadata (which allows for simpler rolling back if that is ever an issue). The `payload` column stores a JSON blob that has all of the metadata for the segment (some of the data stored in this payload is redundant with some of the columns in the table, that is intentional). This looks something like - { - "dataSource":"wikipedia", - "interval":"2012-05-23T00:00:00.000Z/2012-05-24T00:00:00.000Z", - "version":"2012-05-24T00:10:00.046Z", - "loadSpec":{"type":"s3_zip", - "bucket":"bucket_for_segment", - "key":"path/to/segment/on/s3"}, - "dimensions":"comma-delimited-list-of-dimension-names", - "metrics":"comma-delimited-list-of-metric-names", - "shardSpec":{"type":"none"}, - "binaryVersion":9, - "size":size_of_segment, - "identifier":"wikipedia_2012-05-23T00:00:00.000Z_2012-05-24T00:00:00.000Z_2012-05-23T00:10:00.046Z" - } +``` +{ + "dataSource":"wikipedia", + "interval":"2012-05-23T00:00:00.000Z/2012-05-24T00:00:00.000Z", + "version":"2012-05-24T00:10:00.046Z", + "loadSpec":{"type":"s3_zip", + "bucket":"bucket_for_segment", + "key":"path/to/segment/on/s3"}, + "dimensions":"comma-delimited-list-of-dimension-names", + "metrics":"comma-delimited-list-of-metric-names", + "shardSpec":{"type":"none"}, + "binaryVersion":9, + "size":size_of_segment, + "identifier":"wikipedia_2012-05-23T00:00:00.000Z_2012-05-24T00:00:00.000Z_2012-05-23T00:10:00.046Z" +} +``` Note that the format of this blob can and will change from time-to-time. diff --git a/docs/content/OrderBy.md b/docs/content/OrderBy.md index 9dcffff7886..1cbb88909b3 100644 --- a/docs/content/OrderBy.md +++ b/docs/content/OrderBy.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- The orderBy field provides the functionality to sort and limit the set of results from a groupBy query. Available options are: @@ -7,21 +7,21 @@ The orderBy field provides the functionality to sort and limit the set of result The default limit spec takes a limit and the list of columns to do an orderBy operation over. The grammar is: - - { - "type" : "default", - "limit" : , - "columns" : [list of OrderByColumnSpec], - } - +```json +{ + "type" : "default", + "limit" : , + "columns" : [list of OrderByColumnSpec], +} +``` #### OrderByColumnSpec -OrderByColumnSpecs indicate how to do order by operations. Each order by condition can be a String or a map of the following form: +OrderByColumnSpecs indicate how to do order by operations. Each order by condition can be a `jsonString` or a map of the following form: - - { - "dimension" : "", - "direction" : "ASCENDING OR DESCENDING" - } - +```json +{ + "dimension" : , + "direction" : "ASCENDING OR DESCENDING" +} +``` diff --git a/docs/content/Plumber.md b/docs/content/Plumber.md index b2123e94393..115fd66e7f5 100644 --- a/docs/content/Plumber.md +++ b/docs/content/Plumber.md @@ -1,7 +1,7 @@ --- -layout: default +layout: doc_page --- -The Plumber is the thing that handles generated segments both while they are being generated and when they are “done”. This is also technically a pluggable interface and there are multiple implementations, but there are a lot of details handled by the plumber such that it is expected that there will only be a few implementations and only more advanced third-parties will implement their own. See [here](https://github.com/metamx/druid/wiki/Plumber#available-plumbers) for a description of the plumbers included with Druid. +The Plumber is the thing that handles generated segments both while they are being generated and when they are "done". This is also technically a pluggable interface and there are multiple implementations, but there are a lot of details handled by the plumber such that it is expected that there will only be a few implementations and only more advanced third-parties will implement their own. |Field|Type|Description|Required| |-----|----|-----------|--------| @@ -9,8 +9,8 @@ The Plumber is the thing that handles generated segments both while they are bei We provide a brief description of the example to exemplify the types of things that are configured on the plumber. -- `windowPeriod` is the amount of lag time to allow events. This is configured with a 10 minute window, meaning that any event more than 10 minutes ago will be thrown away and not included in the segment generated by the realtime server. -- `basePersistDirectory` is the directory to put things that need persistence. The plumber is responsible for the actual intermediate persists and this tells it where to store those persists. +* `windowPeriod` is the amount of lag time to allow events. This is configured with a 10 minute window, meaning that any event more than 10 minutes ago will be thrown away and not included in the segment generated by the realtime server. +* `basePersistDirectory` is the directory to put things that need persistence. The plumber is responsible for the actual intermediate persists and this tells it where to store those persists. Available Plumbers ------------------ diff --git a/docs/content/Post-aggregations.md b/docs/content/Post-aggregations.md index 2e11f98d0e0..0bd7b990a30 100644 --- a/docs/content/Post-aggregations.md +++ b/docs/content/Post-aggregations.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Post-aggregations are specifications of processing that should happen on aggregated values as they come out of Druid. If you include a post aggregation as part of a query, make sure to include all aggregators the post-aggregator requires. @@ -13,83 +13,63 @@ Supported functions are `+`, `-`, `*`, and `/` The grammar for an arithmetic post aggregation is: - postAggregation : { - "type" : "arithmetic", - "name" : , - "fn" : , - "fields": [, , ...] - } +```json +postAggregation : { + "type" : "arithmetic", + "name" : , + "fn" : , + "fields": [, , ...] +} +``` ### Field accessor post-aggregator -This returns the value produced by the specified [aggregator|Aggregations](aggregator|Aggregations.html). +This returns the value produced by the specified [aggregator](Aggregations.html). -`fieldName` refers to the output name of the aggregator given in the [aggregations|Aggregations](aggregations|Aggregations.html) portion of the query. +`fieldName` refers to the output name of the aggregator given in the [aggregations](Aggregations.html) portion of the query. - field_accessor : { - "type" : "fieldAccess", - "fieldName" : - } +```json +{ "type" : "fieldAccess", "fieldName" : } +``` ### Constant post-aggregator The constant post-aggregator always returns the specified value. - constant : { - "type" : "constant", - "name" : , - "value" : , - } +```json +{ "type" : "constant", "name" : , "value" : } +``` ### Example Usage -In this example, let’s calculate a simple percentage using post aggregators. Let’s imagine our data set has a metric called “total”. +In this example, let’s calculate a simple percentage using post aggregators. Let’s imagine our data set has a metric called "total". The format of the query JSON is as follows: - - { - ... - "aggregations" : [ - { - "type" : "count", - "name" : "rows" - }, - { - "type" : "doubleSum", - "name" : "tot", - "fieldName" : "total" - } - ], - "postAggregations" : { - "type" : "arithmetic", - "name" : "average", - "fn" : "*", - "fields" : [ - { - "type" : "arithmetic", - "name" : "div", - "fn" : "/", - "fields" : [ - { - "type" : "fieldAccess", - "name" : "tot", - "fieldName" : "tot" - }, - { - "type" : "fieldAccess", - "name" : "rows", - "fieldName" : "rows" - } - ] - }, - { - "type" : "constant", - "name": "const", - "value" : 100 - } - ] - } - ... - } - +```json +{ + ... + "aggregations" : [ + { "type" : "count", "name" : "rows" }, + { "type" : "doubleSum", "name" : "tot", "fieldName" : "total" } + ], + "postAggregations" : { + "type" : "arithmetic", + "name" : "average", + "fn" : "*", + "fields" : [ + { "type" : "arithmetic", + "name" : "div", + "fn" : "/", + "fields" : [ + { "type" : "fieldAccess", "name" : "tot", "fieldName" : "tot" }, + { "type" : "fieldAccess", "name" : "rows", "fieldName" : "rows" } + ] + }, + { "type" : "constant", "name": "const", "value" : 100 } + ] + } + ... +} + +``` diff --git a/docs/content/Querying-your-data.md b/docs/content/Querying-your-data.md index dc3e04d645c..ba5045131f6 100644 --- a/docs/content/Querying-your-data.md +++ b/docs/content/Querying-your-data.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- # Setup # @@ -8,93 +8,100 @@ Before we start querying druid, we're going to finish setting up a complete clus ## Booting a Broker Node ## 1. Setup a config file at config/broker/runtime.properties that looks like this: -``` -druid.host=0.0.0.0:8083 -druid.port=8083 + + ``` + druid.host=0.0.0.0:8083 + druid.port=8083 -com.metamx.emitter.logging=true + com.metamx.emitter.logging=true -druid.processing.formatString=processing_%s -druid.processing.numThreads=1 -druid.processing.buffer.sizeBytes=10000000 + druid.processing.formatString=processing_%s + druid.processing.numThreads=1 + druid.processing.buffer.sizeBytes=10000000 -#emitting, opaque marker -druid.service=example + #emitting, opaque marker + druid.service=example -druid.request.logging.dir=/tmp/example/log -druid.realtime.specFile=realtime.spec -com.metamx.emitter.logging=true -com.metamx.emitter.logging.level=debug + druid.request.logging.dir=/tmp/example/log + druid.realtime.specFile=realtime.spec + com.metamx.emitter.logging=true + com.metamx.emitter.logging.level=debug -# below are dummy values when operating a realtime only node -druid.processing.numThreads=3 + # below are dummy values when operating a realtime only node + druid.processing.numThreads=3 -com.metamx.aws.accessKey=dummy_access_key -com.metamx.aws.secretKey=dummy_secret_key -druid.pusher.s3.bucket=dummy_s3_bucket + com.metamx.aws.accessKey=dummy_access_key + com.metamx.aws.secretKey=dummy_secret_key + druid.pusher.s3.bucket=dummy_s3_bucket -druid.zk.service.host=localhost -druid.server.maxSize=300000000000 -druid.zk.paths.base=/druid -druid.database.segmentTable=prod_segments -druid.database.user=druid -druid.database.password=diurd -druid.database.connectURI=jdbc:mysql://localhost:3306/druid -druid.zk.paths.discoveryPath=/druid/discoveryPath -druid.database.ruleTable=rules -druid.database.configTable=config + druid.zk.service.host=localhost + druid.server.maxSize=300000000000 + druid.zk.paths.base=/druid + druid.database.segmentTable=prod_segments + druid.database.user=druid + druid.database.password=diurd + druid.database.connectURI=jdbc:mysql://localhost:3306/druid + druid.zk.paths.discoveryPath=/druid/discoveryPath + druid.database.ruleTable=rules + druid.database.configTable=config -# Path on local FS for storage of segments; dir will be created if needed -druid.paths.indexCache=/tmp/druid/indexCache -# Path on local FS for storage of segment metadata; dir will be created if needed -druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache -druid.pusher.local.storageDirectory=/tmp/druid/localStorage -druid.pusher.local=true + # Path on local FS for storage of segments; dir will be created if needed + druid.paths.indexCache=/tmp/druid/indexCache + # Path on local FS for storage of segment metadata; dir will be created if needed + druid.paths.segmentInfoCache=/tmp/druid/segmentInfoCache + druid.pusher.local.storageDirectory=/tmp/druid/localStorage + druid.pusher.local=true -# thread pool size for servicing queries -druid.client.http.connections=30 -``` + # thread pool size for servicing queries + druid.client.http.connections=30 + ``` 2. Run the broker node: -```bash -java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ --Ddruid.realtime.specFile=realtime.spec \ --classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/broker \ -com.metamx.druid.http.BrokerMain -``` + + ```bash + java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ + -Ddruid.realtime.specFile=realtime.spec \ + -classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/broker \ + com.metamx.druid.http.BrokerMain + ``` ## Booting a Master Node ## 1. Setup a config file at config/master/runtime.properties that looks like this: [https://gist.github.com/rjurney/5818870](https://gist.github.com/rjurney/5818870) + 2. Run the master node: -```bash -java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ --classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/master \ -com.metamx.druid.http.MasterMain -``` + + ```bash + java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ + -classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/master \ + com.metamx.druid.http.MasterMain + ``` ## Booting a Realtime Node ## 1. Setup a config file at config/realtime/runtime.properties that looks like this: [https://gist.github.com/rjurney/5818774](https://gist.github.com/rjurney/5818774) 2. Setup a realtime.spec file like this: [https://gist.github.com/rjurney/5818779](https://gist.github.com/rjurney/5818779) + 3. Run the realtime node: -```bash -java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ --Ddruid.realtime.specFile=realtime.spec \ --classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/realtime \ -com.metamx.druid.realtime.RealtimeMain -``` + + ```bash + java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ + -Ddruid.realtime.specFile=realtime.spec \ + -classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/realtime \ + com.metamx.druid.realtime.RealtimeMain + ``` ## Booting a Compute Node ## 1. Setup a config file at config/compute/runtime.properties that looks like this: [https://gist.github.com/rjurney/5818885](https://gist.github.com/rjurney/5818885) 2. Run the compute node: -```bash -java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ --classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/compute \ -com.metamx.druid.http.ComputeMain -``` + + ```bash + java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 \ + -classpath services/target/druid-services-0.5.50-SNAPSHOT-selfcontained.jar:config/compute \ + com.metamx.druid.http.ComputeMain + ``` # Querying Your Data # @@ -107,6 +114,7 @@ As a shared-nothing system, there are three ways to query druid, against the [Re ### Construct a Query ### For constructing this query, see: Querying against the realtime.spec + ```json { "queryType": "groupBy", @@ -125,57 +133,52 @@ For constructing this query, see: Querying against the realtime.spec ### Querying the Realtime Node ### Run our query against port 8080: + ```bash -curl -X POST "http://localhost:8080/druid/v2/?pretty" \ --H 'content-type: application/json' -d @query.body +curl -X POST "http://localhost:8080/druid/v2/?pretty" -H 'content-type: application/json' -d @query.body ``` + See our result: + ```json [ { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 5, - "wp" : 15000.0, - "rows" : 5 - } + "event" : { "imps" : 5, "wp" : 15000.0, "rows" : 5 } } ] ``` ### Querying the Compute Node ### Run the query against port 8082: + ```bash -curl -X POST "http://localhost:8082/druid/v2/?pretty" \ --H 'content-type: application/json' -d @query.body +curl -X POST "http://localhost:8082/druid/v2/?pretty" -H 'content-type: application/json' -d @query.body ``` + And get (similar to): + ```json [ { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 27, - "wp" : 77000.0, - "rows" : 9 - } + "event" : { "imps" : 27, "wp" : 77000.0, "rows" : 9 } } ] ``` + ### Querying both Nodes via the Broker ### Run the query against port 8083: + ```bash -curl -X POST "http://localhost:8083/druid/v2/?pretty" \ --H 'content-type: application/json' -d @query.body +curl -X POST "http://localhost:8083/druid/v2/?pretty" -H 'content-type: application/json' -d @query.body ``` + And get: + ```json [ { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 5, - "wp" : 15000.0, - "rows" : 5 - } + "event" : { "imps" : 5, "wp" : 15000.0, "rows" : 5 } } ] ``` @@ -189,9 +192,9 @@ How are we to know what queries we can run? Although [Querying](Querying.html) i [{ "schema" : { "dataSource":"druidtest", "aggregators":[ {"type":"count", "name":"impressions"}, - {"type":"doubleSum","name":"wp","fieldName":"wp"}], + {"type":"doubleSum","name":"wp","fieldName":"wp"}], "indexGranularity":"minute", - "shardSpec" : { "type": "none" } }, + "shardSpec" : { "type": "none" } }, "config" : { "maxRowsInMemory" : 500000, "intermediatePersistPeriod" : "PT10m" }, "firehose" : { "type" : "kafka-0.7.2", @@ -221,6 +224,7 @@ How are we to know what queries we can run? Although [Querying](Querying.html) i ```json "dataSource":"druidtest" ``` + Our dataSource tells us the name of the relation/table, or 'source of data', to query in both our realtime.spec and query.body! ### aggregations ### @@ -239,7 +243,7 @@ this matches up to the aggregators in the schema of our realtime.spec! ```json "aggregators":[ {"type":"count", "name":"impressions"}, - {"type":"doubleSum","name":"wp","fieldName":"wp"}], + {"type":"doubleSum","name":"wp","fieldName":"wp"}], ``` ### dimensions ### @@ -277,48 +281,23 @@ Which gets us grouped data in return! [ { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 1, - "age" : "100", - "wp" : 1000.0, - "rows" : 1 - } + "event" : { "imps" : 1, "age" : "100", "wp" : 1000.0, "rows" : 1 } }, { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 1, - "age" : "20", - "wp" : 3000.0, - "rows" : 1 - } + "event" : { "imps" : 1, "age" : "20", "wp" : 3000.0, "rows" : 1 } }, { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 1, - "age" : "30", - "wp" : 4000.0, - "rows" : 1 - } + "event" : { "imps" : 1, "age" : "30", "wp" : 4000.0, "rows" : 1 } }, { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 1, - "age" : "40", - "wp" : 5000.0, - "rows" : 1 - } + "event" : { "imps" : 1, "age" : "40", "wp" : 5000.0, "rows" : 1 } }, { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 1, - "age" : "50", - "wp" : 2000.0, - "rows" : 1 - } + "event" : { "imps" : 1, "age" : "50", "wp" : 2000.0, "rows" : 1 } } ] ``` @@ -331,11 +310,7 @@ Now that we've observed our dimensions, we can also filter: "queryType": "groupBy", "dataSource": "druidtest", "granularity": "all", - "filter": { - "type": "selector", - "dimension": "gender", - "value": "male" - }, + "filter": { "type": "selector", "dimension": "gender", "value": "male" }, "aggregations": [ {"type": "count", "name": "rows"}, {"type": "longSum", "name": "imps", "fieldName": "impressions"}, @@ -351,11 +326,7 @@ Which gets us just people aged 40: [ { "version" : "v1", "timestamp" : "2010-01-01T00:00:00.000Z", - "event" : { - "imps" : 3, - "wp" : 9000.0, - "rows" : 3 - } + "event" : { "imps" : 3, "wp" : 9000.0, "rows" : 3 } } ] ``` @@ -363,4 +334,4 @@ Check out [Filters](Filters.html) for more. ## Learn More ## -You can learn more about querying at [Querying](Querying.html)! Now check out [Booting a production cluster](Booting-a-production-cluster.html)! \ No newline at end of file +You can learn more about querying at [Querying](Querying.html)! Now check out [Booting a production cluster](Booting-a-production-cluster.html)! diff --git a/docs/content/Querying.md b/docs/content/Querying.md index 7e613a074ec..a09d969f76d 100644 --- a/docs/content/Querying.md +++ b/docs/content/Querying.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Querying ======== @@ -8,86 +8,100 @@ Queries are made using an HTTP REST style request to a [Broker](Broker.html), [C We start by describing an example query with additional comments that mention possible variations. Query operators are also summarized in a table below. -Example Query “rand” +Example Query "rand" -------------------- Here is the query in the examples/rand subproject (file is query.body), followed by a commented version of the same. -\`\`\`javascript +```javascript { - [queryType]() “groupBy”, - [dataSource]() “randSeq”, - [granularity]() “all”, - [dimensions]() [], - [aggregations]() [ - { [type]() “count”, [name]() “rows” }, - { [type]() “doubleSum”, [fieldName]() “events”, [name]() “e” }, - { [type]() “doubleSum”, [fieldName]() “outColumn”, [name]() “randomNumberSum” } - ], - [postAggregations]() [{ - [type]() “arithmetic”, - [name]() “avg\_random”, - [fn]() “/”, - [fields]() [ - { [type]() “fieldAccess”, [fieldName]() “randomNumberSum” }, - { [type]() “fieldAccess”, [fieldName]() “rows” } - ] - }], - [intervals]() [“2012-10-01T00:00/2020-01-01T00”] + "queryType": "groupBy", + "dataSource": "randSeq", + "granularity": "all", + "dimensions": [], + "aggregations": [ + { "type": "count", "name": "rows" }, + { "type": "doubleSum", "fieldName": "events", "name": "e" }, + { "type": "doubleSum", "fieldName": "outColumn", "name": "randomNumberSum" } + ], + "postAggregations": [{ + "type": "arithmetic", + "name": "avg_random", + "fn": "/", + "fields": [ + { "type": "fieldAccess", "fieldName": "randomNumberSum" }, + { "type": "fieldAccess", "fieldName": "rows" } + ] + }], + "intervals": ["2012-10-01T00:00/2020-01-01T00"] } -\`\`\` +``` -This query could be submitted via curl like so (assuming the query object is in a file “query.json”). +This query could be submitted via curl like so (assuming the query object is in a file "query.json"). - curl -X POST "http://host:port/druid/v2/?pretty" -H 'content-type: application/json' -d @query.json +``` +curl -X POST "http://host:port/druid/v2/?pretty" -H 'content-type: application/json' -d @query.json +``` -The “pretty” query parameter gets the results formatted a bit nicer. +The "pretty" query parameter gets the results formatted a bit nicer. -Details of Example Query “rand” +Details of Example Query "rand" ------------------------------- -The queryType JSON field identifies which kind of query operator is to be used, in this case it is groupBy, the most frequently used kind (which corresponds to an internal implementation class GroupByQuery registered as “groupBy”), and it has a set of required fields that are also part of this query. The queryType can also be “search” or “timeBoundary” which have similar or different required fields summarized below: -\`\`\`javascript +The queryType JSON field identifies which kind of query operator is to be used, in this case it is groupBy, the most frequently used kind (which corresponds to an internal implementation class GroupByQuery registered as "groupBy"), and it has a set of required fields that are also part of this query. The queryType can also be "search" or "timeBoundary" which have similar or different required fields summarized below: + +```javascript { - [queryType]() “groupBy”, -\`\`\` -The dataSource JSON field shown next identifies where to apply the query. In this case, randSeq corresponds to the examples/rand/rand\_realtime.spec file schema: -\`\`\`javascript - [dataSource]() “randSeq”, -\`\`\` -The granularity JSON field specifies the bucket size for values. It could be a built-in time interval like “second”, “minute”, “fifteen\_minute”, “thirty\_minute”, “hour” or “day”. It can also be an expression like `{"type": "period", "period":"PT6m"}` meaning “6 minute buckets”. See [Granularities](Granularities.html) for more information on the different options for this field. In this example, it is set to the special value “all” which means [bucket all data points together into the same time bucket]() -\`\`\`javascript - [granularity]() “all”, -\`\`\` + "queryType": "groupBy", +``` + +The dataSource JSON field shown next identifies where to apply the query. In this case, randSeq corresponds to the examples/rand/rand_realtime.spec file schema: + +```javascript + "dataSource": "randSeq", +``` + +The granularity JSON field specifies the bucket size for values. It could be a built-in time interval like "second", "minute", "fifteen_minute", "thirty_minute", "hour" or "day". It can also be an expression like `{"type": "period", "period":"PT6m"}` meaning "6 minute buckets". See [Granularities](Granularities.html) for more information on the different options for this field. In this example, it is set to the special value "all" which means [bucket all data points together into the same time bucket]() + +```javascript + "granularity": "all", +``` + The dimensions JSON field value is an array of zero or more fields as defined in the dataSource spec file or defined in the input records and carried forward. These are used to constrain the grouping. If empty, then one value per time granularity bucket is requested in the groupBy: -\`\`\`javascript - [dimensions]() [], -\`\`\` -A groupBy also requires the JSON field “aggregations” (See [Aggregations](Aggregations.html)), which are applied to the column specified by fieldName and the output of the aggregation will be named according to the value in the “name” field: -\`\`\`javascript - [aggregations]() [ - { [type]() “count”, [name]() “rows” }, - { [type]() “doubleSum”, [fieldName]() “events”, [name]() “e” }, - { [type]() “doubleSum”, [fieldName]() “outColumn”, [name]() “randomNumberSum” } - ], -\`\`\` -You can also specify postAggregations, which are applied after data has been aggregated for the current granularity and dimensions bucket. See [Post Aggregations](Post Aggregations.html) for a detailed description. In the rand example, an arithmetic type operation (division, as specified by “fn”) is performed with the result “name” of “avg\_random”. The “fields” field specifies the inputs from the aggregation stage to this expression. Note that identifiers corresponding to “name” JSON field inside the type “fieldAccess” are required but not used outside this expression, so they are prefixed with “dummy” for clarity: -\`\`\`javascript - [postAggregations]() [{ - [type]() “arithmetic”, - [name]() “avg\_random”, - [fn]() “/”, - [fields]() [ - { [type]() “fieldAccess”, [fieldName]() “randomNumberSum” }, - { [type]() “fieldAccess”, [fieldName]() “rows” } - ] - }], -\`\`\` + +```javascript + "dimensions": [], +``` + +A groupBy also requires the JSON field "aggregations" (See [Aggregations](Aggregations.html)), which are applied to the column specified by fieldName and the output of the aggregation will be named according to the value in the "name" field: + +```javascript + "aggregations": [ + { "type": "count", "name": "rows" }, + { "type": "doubleSum", "fieldName": "events", "name": "e" }, + { "type": "doubleSum", "fieldName": "outColumn", "name": "randomNumberSum" } + ], +``` + +You can also specify postAggregations, which are applied after data has been aggregated for the current granularity and dimensions bucket. See [Post Aggregations](Post Aggregations.html) for a detailed description. In the rand example, an arithmetic type operation (division, as specified by "fn") is performed with the result "name" of "avg_random". The "fields" field specifies the inputs from the aggregation stage to this expression. Note that identifiers corresponding to "name" JSON field inside the type "fieldAccess" are required but not used outside this expression, so they are prefixed with "dummy" for clarity: + +```javascript + "postAggregations": [{ + "type": "arithmetic", + "name": "avg_random", + "fn": "/", + "fields": [ + { "type": "fieldAccess", "fieldName": "randomNumberSum" }, + { "type": "fieldAccess", "fieldName": "rows" } + ] + }], +``` The time range(s) of the query; data outside the specified intervals will not be used; this example specifies from October 1, 2012 until January 1, 2020: -\`\`\`javascript - [intervals]() [“2012-10-01T00:00/2020-01-01T00”] + +```javascript + "intervals": ["2012-10-01T00:00/2020-01-01T00"] } -\`\`\` +``` Query Operators --------------- @@ -99,8 +113,8 @@ The following table summarizes query properties. |timeseries, groupBy, search, timeBoundary|dataSource|query is applied to this data source|yes| |timeseries, groupBy, search|intervals|range of time series to include in query|yes| |timeseries, groupBy, search, timeBoundary|context|This is a key-value map that can allow the query to alter some of the behavior of a query. It is primarily used for debugging, for example if you include `"bySegment":true` in the map, you will get results associated with the data segment they came from.|no| -|timeseries, groupBy, search|filter|Specifies the filter (the “WHERE” clause in SQL) for the query. See [Filters](Filters.html)|no| -|timeseries, groupBy, search|granularity|the timestamp granularity to bucket results into (i.e. “hour”). See [Granularities](Granularities.html) for more information.|no| +|timeseries, groupBy, search|filter|Specifies the filter (the "WHERE" clause in SQL) for the query. See [Filters](Filters.html)|no| +|timeseries, groupBy, search|granularity|the timestamp granularity to bucket results into (i.e. "hour"). See [Granularities](Granularities.html) for more information.|no| |groupBy|dimensions|constrains the groupings; if empty, then one value per time granularity bucket|yes| |timeseries, groupBy|aggregations|aggregations that combine values in a bucket. See [Aggregations](Aggregations.html).|yes| |timeseries, groupBy|postAggregations|aggregations of aggregations. See [Post Aggregations](Post Aggregations.html).|yes| diff --git a/docs/content/Realtime.md b/docs/content/Realtime.md index 855607d7eb5..459f7d20175 100644 --- a/docs/content/Realtime.md +++ b/docs/content/Realtime.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Realtime ======== @@ -23,38 +23,38 @@ Configuration Realtime nodes take a mix of base server configuration and spec files that describe how to connect, process and expose the realtime feed. See [Configuration](Configuration.html) for information about general server configuration. -### Realtime “specFile” +### Realtime "specFile" -The property `druid.realtime.specFile` has the path of a file (absolute or relative path and file name) with realtime specifications in it. This “specFile” should be a JSON Array of JSON objects like the following: +The property `druid.realtime.specFile` has the path of a file (absolute or relative path and file name) with realtime specifications in it. This "specFile" should be a JSON Array of JSON objects like the following: - - [{ - "schema" : { "dataSource":"dataSourceName", - "aggregators":[ {"type":"count", "name":"events"}, - {"type":"doubleSum","name":"outColumn","fieldName":"inColumn"} ], - "indexGranularity":"minute", +```json +[{ + "schema" : { "dataSource":"dataSourceName", + "aggregators":[ {"type":"count", "name":"events"}, + {"type":"doubleSum","name":"outColumn","fieldName":"inColumn"} ], + "indexGranularity":"minute", "shardSpec" : { "type": "none" } }, - "config" : { "maxRowsInMemory" : 500000, - "intermediatePersistPeriod" : "PT10m" }, - "firehose" : { "type" : "kafka-0.7.2", - "consumerProps" : { "zk.connect" : "zk_connect_string", - "zk.connectiontimeout.ms" : "15000", - "zk.sessiontimeout.ms" : "15000", - "zk.synctime.ms" : "5000", - "groupid" : "consumer-group", - "fetch.size" : "1048586", - "autooffset.reset" : "largest", - "autocommit.enable" : "false" }, - "feed" : "your_kafka_topic", - "parser" : { "timestampSpec" : { "column" : "timestamp", "format" : "iso" }, - "data" : { "format" : "json" }, - "dimensionExclusions" : ["value"] } }, - "plumber" : { "type" : "realtime", - "windowPeriod" : "PT10m", - "segmentGranularity":"hour", - "basePersistDirectory" : "/tmp/realtime/basePersist" } - }] - + "config" : { "maxRowsInMemory" : 500000, + "intermediatePersistPeriod" : "PT10m" }, + "firehose" : { "type" : "kafka-0.7.2", + "consumerProps" : { "zk.connect" : "zk_connect_string", + "zk.connectiontimeout.ms" : "15000", + "zk.sessiontimeout.ms" : "15000", + "zk.synctime.ms" : "5000", + "groupid" : "consumer-group", + "fetch.size" : "1048586", + "autooffset.reset" : "largest", + "autocommit.enable" : "false" }, + "feed" : "your_kafka_topic", + "parser" : { "timestampSpec" : { "column" : "timestamp", "format" : "iso" }, + "data" : { "format" : "json" }, + "dimensionExclusions" : ["value"] } }, + "plumber" : { "type" : "realtime", + "windowPeriod" : "PT10m", + "segmentGranularity":"hour", + "basePersistDirectory" : "/tmp/realtime/basePersist" } +}] +``` This is a JSON Array so you can give more than one realtime stream to a given node. The number you can put in the same process depends on the exact configuration. In general, it is best to think of each realtime stream handler as requiring 2-threads: 1 thread for data consumption and aggregation, 1 thread for incremental persists and other background tasks. @@ -68,7 +68,7 @@ This describes the data schema for the output Druid segment. More information ab |-----|----|-----------|--------| |aggregators|Array of Objects|The list of aggregators to use to aggregate colliding rows together.|yes| |dataSource|String|The name of the dataSource that the segment belongs to.|yes| -|indexGranularity|String|The granularity of the data inside the segment. E.g. a value of “minute” will mean that data is aggregated at minutely granularity. That is, if there are collisions in the tuple (minute(timestamp), dimensions), then it will aggregate values together using the aggregators instead of storing individual rows.|yes| +|indexGranularity|String|The granularity of the data inside the segment. E.g. a value of "minute" will mean that data is aggregated at minutely granularity. That is, if there are collisions in the tuple (minute(timestamp), dimensions), then it will aggregate values together using the aggregators instead of storing individual rows.|yes| |segmentGranularity|String|The granularity of the segment as a whole. This is generally larger than the index granularity and describes the rate at which the realtime server will push segments out for historical servers to take over.|yes| |shardSpec|Object|This describes the shard that is represented by this server. This must be specified properly in order to have multiple realtime nodes indexing the same data stream in a sharded fashion.|no| @@ -94,7 +94,8 @@ Constraints The following tables summarizes constraints between settings in the spec file for the Realtime subsystem. -|*. Name |*. Effect |*. Minimum |*. Recommended | +|Name|Effect|Minimum|Recommended| +|----|------|-------|-----------| | windowPeriod| when reading an InputRow, events with timestamp older than now minus this window are discarded | time jitter tolerance | use this to reject outliers | | segmentGranularity| time granularity (minute, hour, day, week, month) for loading data at query time | equal to indexGranularity| more than indexGranularity| | indexGranularity| time granularity (minute, hour, day, week, month) of indexes | less than segmentGranularity| minute, hour, day, week, month | @@ -115,8 +116,8 @@ Extending the code Realtime integration is intended to be extended in two ways: -1. Connect to data streams from varied systems ([Firehose](https://github.com/metamx/druid/blob/master/realtime/src/main/java/com/metamx/druid/realtime/FirehoseFactory.java)) -2. Adjust the publishing strategy to match your needs ([Plumber](https://github.com/metamx/druid/blob/master/realtime/src/main/java/com/metamx/druid/realtime/PlumberSchool.java)) +1. Connect to data streams from varied systems ([Firehose](https://github.com/metamx/druid/blob/druid-0.5.x/realtime/src/main/java/com/metamx/druid/realtime/firehose/FirehoseFactory.java)) +2. Adjust the publishing strategy to match your needs ([Plumber](https://github.com/metamx/druid/blob/druid-0.5.x/realtime/src/main/java/com/metamx/druid/realtime/plumber/PlumberSchool.java)) The expectations are that the former will be very common and something that users of Druid will do on a fairly regular basis. Most users will probably never have to deal with the latter form of customization. Indeed, we hope that all potential use cases can be packaged up as part of Druid proper without requiring proprietary customization. @@ -124,34 +125,34 @@ Given those expectations, adding a firehose is straightforward and completely en We will do our best to accept contributions from the community of new Firehoses and Plumbers, but we also understand the requirement for being able to plug in your own proprietary implementations. The model for doing this is by embedding the druid code in another project and writing your own `main()` method that initializes a RealtimeNode object and registers your proprietary objects with it. - - public class MyRealtimeMain - { - private static final Logger log = new Logger(MyRealtimeMain.class); +```java +public class MyRealtimeMain +{ + private static final Logger log = new Logger(MyRealtimeMain.class); - public static void main(String[] args) throws Exception - { - LogLevelAdjuster.register(); + public static void main(String[] args) throws Exception + { + LogLevelAdjuster.register(); - Lifecycle lifecycle = new Lifecycle(); + Lifecycle lifecycle = new Lifecycle(); - lifecycle.addManagedInstance( - RealtimeNode.builder() - .build() - .registerJacksonSubtype(foo.bar.MyFirehose.class) - ); + lifecycle.addManagedInstance( + RealtimeNode.builder() + .build() + .registerJacksonSubtype(foo.bar.MyFirehose.class) + ); - try { - lifecycle.start(); - } - catch (Throwable t) { - log.info(t, "Throwable caught at startup, committing seppuku"); - System.exit(2); - } - - lifecycle.join(); - } + try { + lifecycle.start(); } - + catch (Throwable t) { + log.info(t, "Throwable caught at startup, committing seppuku"); + System.exit(2); + } + + lifecycle.join(); + } +} +``` Pluggable pieces of the system are either handled by a setter on the RealtimeNode object, or they are configuration driven and need to be setup to allow for [Jackson polymorphic deserialization](http://wiki.fasterxml.com/JacksonPolymorphicDeserialization) and registered via the relevant methods on the RealtimeNode object. diff --git a/docs/content/Rule-Configuration.md b/docs/content/Rule-Configuration.md index 2695da646ab..80e4b649422 100644 --- a/docs/content/Rule-Configuration.md +++ b/docs/content/Rule-Configuration.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Note: It is recommended that the master console is used to configure rules. However, the master node does have HTTP endpoints to programmatically configure rules. @@ -12,33 +12,33 @@ Load rules indicate how many replicants of a segment should exist in a server ti Interval load rules are of the form: - - { - "type" : "loadByInterval", - "interval" : "2012-01-01/2013-01-01", - "tier" : "hot" - } - +```json +{ + "type" : "loadByInterval", + "interval" : "2012-01-01/2013-01-01", + "tier" : "hot" +} +``` -type - this should always be “loadByInterval” -interval - A JSON Object representing ISO-8601 Intervals -tier - the configured compute node tier +* `type` - this should always be "loadByInterval" +* `interval` - A JSON Object representing ISO-8601 Intervals +* `tier` - the configured compute node tier ### Period Load Rule Period load rules are of the form: - - { - "type" : "loadByInterval", - "period" : "P1M", - "tier" : "hot" - } - +```json +{ + "type" : "loadByPeriod", + "period" : "P1M", + "tier" : "hot" +} +``` -type - this should always be “loadByPeriod” -period - A JSON Object representing ISO-8601 Periods -tier - the configured compute node tier +* `type` - this should always be "loadByPeriod" +* `period` - A JSON Object representing ISO-8601 Periods +* `tier` - the configured compute node tier The interval of a segment will be compared against the specified period. The rule matches if the period overlaps the interval. @@ -51,15 +51,15 @@ Drop rules indicate when segments should be dropped from the cluster. Interval drop rules are of the form: - - { - "type" : "dropByInterval", - "interval" : "2012-01-01/2013-01-01" - } - +```json +{ + "type" : "dropByInterval", + "interval" : "2012-01-01/2013-01-01" +} +``` -type - this should always be “dropByInterval” -interval - A JSON Object representing ISO-8601 Periods +* `type` - this should always be "dropByInterval" +* `interval` - A JSON Object representing ISO-8601 Periods A segment is dropped if the interval contains the interval of the segment. @@ -67,14 +67,14 @@ A segment is dropped if the interval contains the interval of the segment. Period drop rules are of the form: - - { - "type" : "dropByPeriod", - "period" : "P1M" - } - +```json +{ + "type" : "dropByPeriod", + "period" : "P1M" +} +``` -type - this should always be “dropByPeriod” -period - A JSON Object representing ISO-8601 Periods +* `type` - this should always be "dropByPeriod" +* `period` - A JSON Object representing ISO-8601 Periods The interval of a segment will be compared against the specified period. The period is from some time in the past to the current time. The rule matches if the period contains the interval. diff --git a/docs/content/SearchQuery.md b/docs/content/SearchQuery.md index b206f652c6e..6cee0918e91 100644 --- a/docs/content/SearchQuery.md +++ b/docs/content/SearchQuery.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- A search query returns dimension values that match the search specification. @@ -28,14 +28,14 @@ There are several main parts to a search query: |property|description|required?| |--------|-----------|---------| -|queryType|This String should always be “search”; this is the first thing Druid looks at to figure out how to interpret the query|yes| +|queryType|This String should always be "search"; this is the first thing Druid looks at to figure out how to interpret the query|yes| |dataSource|A String defining the data source to query, very similar to a table in a relational database|yes| |granularity|Defines the granularity of the query. See [Granularities](Granularities.html)|yes| |filter|See [Filters](Filters.html)|no| |intervals|A JSON Object representing ISO-8601 Intervals. This defines the time ranges to run the query over.|yes| |searchDimensions|The dimensions to run the search over. Excluding this means the search is run over all dimensions.|no| |query|See [SearchQuerySpec](SearchQuerySpec.html).|yes| -|sort|How the results of the search should sorted. Two possible types here are “lexicographic” and “strlen”.|yes| +|sort|How the results of the search should sorted. Two possible types here are "lexicographic" and "strlen".|yes| |context|An additional JSON Object which can be used to specify certain flags.|no| The format of the result is: diff --git a/docs/content/SearchQuerySpec.md b/docs/content/SearchQuerySpec.md index 9b9db04b8e6..46589554075 100644 --- a/docs/content/SearchQuerySpec.md +++ b/docs/content/SearchQuerySpec.md @@ -1,26 +1,28 @@ --- -layout: default +layout: doc_page --- -Search query specs define how a “match” is defined between a search value and a dimension value. The available search query specs are: +Search query specs define how a "match" is defined between a search value and a dimension value. The available search query specs are: InsensitiveContainsSearchQuerySpec ---------------------------------- -If any part of a dimension value contains the value specified in this search query spec, regardless of case, a “match” occurs. The grammar is: +If any part of a dimension value contains the value specified in this search query spec, regardless of case, a "match" occurs. The grammar is: - { - "type" : "insensitive_contains", - "value" : "some_value" - } - +```json +{ + "type" : "insensitive_contains", + "value" : "some_value" +} +``` FragmentSearchQuerySpec ----------------------- -If any part of a dimension value contains any of the values specified in this search query spec, regardless of case, a “match” occurs. The grammar is: +If any part of a dimension value contains any of the values specified in this search query spec, regardless of case, a "match" occurs. The grammar is: - { - "type" : "fragment", - "values" : ["fragment1", "fragment2"] - } - +```json +{ + "type" : "fragment", + "values" : ["fragment1", "fragment2"] +} +``` diff --git a/docs/content/SegmentMetadataQuery.md b/docs/content/SegmentMetadataQuery.md index 0e6eefb78e1..c65e6957d43 100644 --- a/docs/content/SegmentMetadataQuery.md +++ b/docs/content/SegmentMetadataQuery.md @@ -1,26 +1,28 @@ --- -layout: default +layout: doc_page --- Segment metadata queries return per segment information about: -\* Cardinality of all columns in the segment -\* Estimated byte size for the segment columns in TSV format -\* Interval the segment covers -\* Column type of all the columns in the segment -\* Estimated total segment byte size in TSV format -\* Segment id - { - "queryType":"segmentMetadata", - "dataSource":"sample_datasource", - "intervals":["2013-01-01/2014-01-01"], - } - +* Cardinality of all columns in the segment +* Estimated byte size for the segment columns in TSV format +* Interval the segment covers +* Column type of all the columns in the segment +* Estimated total segment byte size in TSV format +* Segment id + +```json +{ + "queryType":"segmentMetadata", + "dataSource":"sample_datasource", + "intervals":["2013-01-01/2014-01-01"], +} +``` There are several main parts to a segment metadata query: |property|description|required?| |--------|-----------|---------| -|queryType|This String should always be “segmentMetadata”; this is the first thing Druid looks at to figure out how to interpret the query|yes| +|queryType|This String should always be "segmentMetadata"; this is the first thing Druid looks at to figure out how to interpret the query|yes| |dataSource|A String defining the data source to query, very similar to a table in a relational database|yes| |intervals|A JSON Object representing ISO-8601 Intervals. This defines the time ranges to run the query over.|yes| |merge|Merge all individual segment metadata results into a single result|no| @@ -28,31 +30,16 @@ There are several main parts to a segment metadata query: The format of the result is: - [ { - "id" : "some_id", - "intervals" : [ "2013-05-13T00:00:00.000Z/2013-05-14T00:00:00.000Z" ], - "columns" : { - "__time" : { - "type" : "LONG", - "size" : 407240380, - "cardinality" : null - }, - "dim1" : { - "type" : "STRING", - "size" : 100000, - "cardinality" : 1944 - }, - "dim2" : { - "type" : "STRING", - "size" : 100000, - "cardinality" : 1504 - }, - "metric1" : { - "type" : "FLOAT", - "size" : 100000, - "cardinality" : null - } - }, - "size" : 300000 - } ] - +```json +[ { + "id" : "some_id", + "intervals" : [ "2013-05-13T00:00:00.000Z/2013-05-14T00:00:00.000Z" ], + "columns" : { + "__time" : { "type" : "LONG", "size" : 407240380, "cardinality" : null }, + "dim1" : { "type" : "STRING", "size" : 100000, "cardinality" : 1944 }, + "dim2" : { "type" : "STRING", "size" : 100000, "cardinality" : 1504 }, + "metric1" : { "type" : "FLOAT", "size" : 100000, "cardinality" : null } + }, + "size" : 300000 +} ] +``` diff --git a/docs/content/Segments.md b/docs/content/Segments.md index 5af50cd8e48..8f1af704df6 100644 --- a/docs/content/Segments.md +++ b/docs/content/Segments.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Segments ======== @@ -14,36 +14,28 @@ Naming Convention Identifiers for segments are typically constructed using the segment datasource, interval start time (in ISO 8601 format), interval end time (in ISO 8601 format), and a version. If data is additionally sharded beyond a time range, the segment identifier will also contain a partition number. An example segment identifier may be: -datasource\_intervalStart\_intervalEnd\_version\_partitionNum +datasource_intervalStart_intervalEnd_version_partitionNum Segment Components ------------------ A segment is compromised of several files, listed below. -### `version.bin` +* `version.bin` -4 bytes representing the current segment version as an integer. E.g., for v9 segments, the version is 0x0, 0x0, 0x0, 0x9 + 4 bytes representing the current segment version as an integer. E.g., for v9 segments, the version is 0x0, 0x0, 0x0, 0x9 -### `meta.smoosh` +* `meta.smoosh` -A file with metadata (filenames and offsets) about the contents of the other `smoosh` files + A file with metadata (filenames and offsets) about the contents of the other `smoosh` files -### `XXXXX.smoosh` +* `XXXXX.smoosh` -There are some number of these files, which are concatenated binary data + There are some number of these files, which are concatenated binary data -The `smoosh` files represent multiple files “smooshed” together in order to minimize the number of file descriptors that must be open to house the data. They are files of up to 2GB in size (to match the limit of a memory mapped ByteBuffer in Java). The `smoosh` files house individual files for each of the columns in the data as well as an `index.drd` file with extra metadata about the segment. + The `smoosh` files represent multiple files "smooshed" together in order to minimize the number of file descriptors that must be open to house the data. They are files of up to 2GB in size (to match the limit of a memory mapped ByteBuffer in Java). The `smoosh` files house individual files for each of the columns in the data as well as an `index.drd` file with extra metadata about the segment. -There is also a special column called `__time` that refers to the time column of the segment. This will hopefully become less and less special as the code evolves, but for now it’s as special as my Mommy always told me I am. - -### `index.drd` - -The `index.drd` file houses 3 pieces of data in order - -1. The names of all of the columns of the data -2. The names of the “dimensions” of the data (these are the dictionary-encoded, string columns. This is here to support some legacy APIs and will be superfluous in the future) -3. The data interval represented by this segment stored as the start and end timestamps as longs + There is also a special column called `__time` that refers to the time column of the segment. This will hopefully become less and less special as the code evolves, but for now it’s as special as my Mommy always told me I am. Format of a column ------------------ diff --git a/docs/content/Spatial-Filters.md b/docs/content/Spatial-Filters.md index 2ca83b9a3f9..eacf2379d9c 100644 --- a/docs/content/Spatial-Filters.md +++ b/docs/content/Spatial-Filters.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Note: This feature is highly experimental and only works with spatially indexed dimensions. diff --git a/docs/content/Spatial-Indexing.md b/docs/content/Spatial-Indexing.md index 1df36593433..0c866bc6a50 100644 --- a/docs/content/Spatial-Indexing.md +++ b/docs/content/Spatial-Indexing.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Note: This feature is highly experimental. diff --git a/docs/content/Stand-Alone-With-Riak-CS.md b/docs/content/Stand-Alone-With-Riak-CS.md index d1dc8f780d8..1efb0ea3398 100644 --- a/docs/content/Stand-Alone-With-Riak-CS.md +++ b/docs/content/Stand-Alone-With-Riak-CS.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- This page describes how to use Riak-CS for deep storage instead of S3. We are still setting up some of the peripheral stuff (file downloads, etc.). @@ -223,4 +223,4 @@ This just walks through getting the relevant software installed and running. Yo /etc/init.d/druid_master start /etc/init.d/druid_realtime start /etc/init.d/druid_broker start - /etc/init.d/druid_compute start \ No newline at end of file + /etc/init.d/druid_compute start diff --git a/docs/content/Support.md b/docs/content/Support.md index 3dd512e050f..421cdec7ee4 100644 --- a/docs/content/Support.md +++ b/docs/content/Support.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Numerous backend engineers at [Metamarkets](http://www.metamarkets.com) work on Druid full-time. If you any questions about usage or code, feel free to contact any of us. diff --git a/docs/content/Tasks.md b/docs/content/Tasks.md index 95341f581ec..9f70e6995d7 100644 --- a/docs/content/Tasks.md +++ b/docs/content/Tasks.md @@ -1,7 +1,7 @@ --- -layout: default +layout: doc_page --- -Tasks are run on workers and always operate on a single datasource. Once an indexer coordinator node accepts a task, a lock is created for the datasource and interval specified in the task. Tasks do not need to explicitly release locks, they are released upon task completion. Tasks may potentially release locks early if they desire. Tasks ids are unique by naming them using UUIDs or the timestamp in which the task was created. Tasks are also part of a “task group”, which is a set of tasks that can share interval locks. +Tasks are run on workers and always operate on a single datasource. Once an indexer coordinator node accepts a task, a lock is created for the datasource and interval specified in the task. Tasks do not need to explicitly release locks, they are released upon task completion. Tasks may potentially release locks early if they desire. Tasks ids are unique by naming them using UUIDs or the timestamp in which the task was created. Tasks are also part of a "task group", which is a set of tasks that can share interval locks. There are several different types of tasks. diff --git a/docs/content/Thanks.md b/docs/content/Thanks.md index cb1c873cca0..97ec7e0904a 100644 --- a/docs/content/Thanks.md +++ b/docs/content/Thanks.md @@ -1,6 +1,7 @@ --- -layout: default +layout: doc_page --- + YourKit supports the Druid open source projects with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling @@ -8,4 +9,4 @@ Java and .NET applications. Take a look at YourKit's software products: YourKit Java Profiler and YourKit .NET -Profiler. \ No newline at end of file +Profiler. diff --git a/docs/content/TimeBoundaryQuery.md b/docs/content/TimeBoundaryQuery.md index bde4ca1c812..dd07169b103 100644 --- a/docs/content/TimeBoundaryQuery.md +++ b/docs/content/TimeBoundaryQuery.md @@ -1,29 +1,31 @@ --- -layout: default +layout: doc_page --- Time boundary queries return the earliest and latest data points of a data set. The grammar is: - { - "queryType" : "timeBoundary", - "dataSource": "sample_datasource" - } - +```json +{ + "queryType" : "timeBoundary", + "dataSource": "sample_datasource" +} +``` There are 3 main parts to a time boundary query: |property|description|required?| |--------|-----------|---------| -|queryType|This String should always be “timeBoundary”; this is the first thing Druid looks at to figure out how to interpret the query|yes| +|queryType|This String should always be "timeBoundary"; this is the first thing Druid looks at to figure out how to interpret the query|yes| |dataSource|A String defining the data source to query, very similar to a table in a relational database|yes| |context|An additional JSON Object which can be used to specify certain flags.|no| The format of the result is: - [ { - "timestamp" : "2013-05-09T18:24:00.000Z", - "result" : { - "minTime" : "2013-05-09T18:24:00.000Z", - "maxTime" : "2013-05-09T18:37:00.000Z" - } - } ] - +```json +[ { + "timestamp" : "2013-05-09T18:24:00.000Z", + "result" : { + "minTime" : "2013-05-09T18:24:00.000Z", + "maxTime" : "2013-05-09T18:37:00.000Z" + } +} ] +``` diff --git a/docs/content/TimeseriesQuery.md b/docs/content/TimeseriesQuery.md index 62ebcee59f1..e73e51df51e 100644 --- a/docs/content/TimeseriesQuery.md +++ b/docs/content/TimeseriesQuery.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- Timeseries queries ================== @@ -8,81 +8,46 @@ These types of queries take a timeseries query object and return an array of JSO An example timeseries query object is shown below: -
-
+```json
 {
- [queryType]() “timeseries”,
- [dataSource]() “sample\_datasource”,
- [granularity]() “day”,
- [filter]() {
- [type]() “and”,
- [fields]() [
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension1”,
- [value]() “sample\_value1”
- },
- {
- [type]() “or”,
- [fields]() [
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension2”,
- [value]() “sample\_value2”
- },
- {
- [type]() “selector”,
- [dimension]() “sample\_dimension3”,
- [value]() “sample\_value3”
- }
- ]
- }
- ]
- },
- [aggregations]() [
- {
- [type]() “longSum”,
- [name]() “sample\_name1”,
- [fieldName]() “sample\_fieldName1”
- },
- {
- [type]() “doubleSum”,
- [name]() “sample\_name2”,
- [fieldName]() “sample\_fieldName2”
- }
- ],
- [postAggregations]() [
- {
- [type]() “arithmetic”,
- [name]() “sample\_divide”,
- [fn]() “/”,
- [fields]() [
- {
- [type]() “fieldAccess”,
- [name]() “sample\_name1”,
- [fieldName]() “sample\_fieldName1”
- },
- {
- [type]() “fieldAccess”,
- [name]() “sample\_name2”,
- [fieldName]() “sample\_fieldName2”
- }
- ]
- }
- ],
- [intervals]() [
- “2012-01-01T00:00:00.000/2012-01-03T00:00:00.000”
- ]
+  "queryType": "timeseries",
+  "dataSource": "sample_datasource",
+  "granularity": "day",
+  "filter": {
+    "type": "and",
+    "fields": [
+      { "type": "selector", "dimension": "sample_dimension1", "value": "sample_value1" },
+      { "type": "or",
+        "fields": [
+          { "type": "selector", "dimension": "sample_dimension2", "value": "sample_value2" },
+          { "type": "selector", "dimension": "sample_dimension3", "value": "sample_value3" }
+        ]
+      }
+    ]
+  },
+  "aggregations": [
+    { "type": "longSum", "name": "sample_name1", "fieldName": "sample_fieldName1" },
+    { "type": "doubleSum", "name": "sample_name2", "fieldName": "sample_fieldName2" }
+  ],
+  "postAggregations": [
+    { "type": "arithmetic",
+      "name": "sample_divide",
+      "fn": "/",
+      "fields": [
+        { "type": "fieldAccess", "name": "sample_name1", "fieldName": "sample_fieldName1" },
+        { "type": "fieldAccess", "name": "sample_name2", "fieldName": "sample_fieldName2" }
+      ]
+    }
+  ],
+  "intervals": [ "2012-01-01T00:00:00.000/2012-01-03T00:00:00.000" ]
 }
-
-
- +``` There are 7 main parts to a timeseries query: |property|description|required?| |--------|-----------|---------| -|queryType|This String should always be “timeseries”; this is the first thing Druid looks at to figure out how to interpret the query|yes| +|queryType|This String should always be "timeseries"; this is the first thing Druid looks at to figure out how to interpret the query|yes| |dataSource|A String defining the data source to query, very similar to a table in a relational database|yes| |granularity|Defines the granularity of the query. See [Granularities](Granularities.html)|yes| |filter|See [Filters](Filters.html)|no| @@ -91,28 +56,17 @@ There are 7 main parts to a timeseries query: |intervals|A JSON Object representing ISO-8601 Intervals. This defines the time ranges to run the query over.|yes| |context|An additional JSON Object which can be used to specify certain flags.|no| -To pull it all together, the above query would return 2 data points, one for each day between 2012-01-01 and 2012-01-03, from the “sample\_datasource” table. Each data point would be the (long) sum of sample\_fieldName1, the (double) sum of sample\_fieldName2 and the (double) the result of sample\_fieldName1 divided by sample\_fieldName2 for the filter set. The output looks like this: +To pull it all together, the above query would return 2 data points, one for each day between 2012-01-01 and 2012-01-03, from the "sample\_datasource" table. Each data point would be the (long) sum of sample\_fieldName1, the (double) sum of sample\_fieldName2 and the (double) the result of sample\_fieldName1 divided by sample\_fieldName2 for the filter set. The output looks like this: -
-
+```json
 [
- {
- [timestamp]() “2012-01-01T00:00:00.000Z”,
- [result]() {
- [sample\_name1]() ,
- [sample\_name2]() ,
- [sample\_divide]() 
- }
- },
- {
- [timestamp]() “2012-01-02T00:00:00.000Z”,
- [result]() {
- [sample\_name1]() ,
- [sample\_name2]() ,
- [sample\_divide]() 
- }
- }
+  {
+    "timestamp": "2012-01-01T00:00:00.000Z",
+    "result": { "sample_name1": , "sample_name2": , "sample_divide":  } 
+  },
+  {
+    "timestamp": "2012-01-02T00:00:00.000Z",
+    "result": { "sample_name1": , "sample_name2": , "sample_divide":  }
+  }
 ]
-
-
- +``` \ No newline at end of file diff --git a/docs/content/Tutorial:-A-First-Look-at-Druid.md b/docs/content/Tutorial:-A-First-Look-at-Druid.md index 987cf89fa28..1fb4df334a1 100644 --- a/docs/content/Tutorial:-A-First-Look-at-Druid.md +++ b/docs/content/Tutorial:-A-First-Look-at-Druid.md @@ -1,40 +1,42 @@ --- -layout: default +layout: doc_page --- Greetings! This tutorial will help clarify some core Druid concepts. We will use a realtime dataset and issue some basic Druid queries. If you are ready to explore Druid, and learn a thing or two, read on! About the data -------------- -The data source we’ll be working with is Wikipedia edits. Each time an edit is made in Wikipedia, an event gets pushed to an IRC channel associated with the language of the Wikipedia page. We scrape IRC channels for several different languages and load this data into Druid. +The data source we'll be working with is Wikipedia edits. Each time an edit is made in Wikipedia, an event gets pushed to an IRC channel associated with the language of the Wikipedia page. We scrape IRC channels for several different languages and load this data into Druid. Each event has a timestamp indicating the time of the edit (in UTC time), a list of dimensions indicating various metadata about the event (such as information about the user editing the page and where the user resides), and a list of metrics associated with the event (such as the number of characters added and deleted). Specifically. the data schema looks like so: Dimensions (things to filter on): -\`\`\`json -“page” -“language” -“user” -“unpatrolled” -“newPage” -“robot” -“anonymous” -“namespace” -“continent” -“country” -“region” -“city” -\`\`\` + +```json +"page" +"language" +"user" +"unpatrolled" +"newPage" +"robot" +"anonymous" +"namespace" +"continent" +"country" +"region" +"city" +``` Metrics (things to aggregate over): -\`\`\`json -“count” -“added” -“delta” -“deleted” -\`\`\` + +```json +"count" +"added" +"delta" +"deleted" +``` These metrics track the number of characters added, deleted, and changed. @@ -45,120 +47,120 @@ There are two ways to setup Druid: download a tarball, or [Build From Source](Bu ### Download a Tarball -We’ve built a tarball that contains everything you’ll need. You’ll find it [here](http://static.druid.io/artifacts/releases/druid-services-0.5.54-bin.tar.gz) +We've built a tarball that contains everything you'll need. You'll find it [here](http://static.druid.io/artifacts/releases/druid-services-0.5.54-bin.tar.gz) Download this file to a directory of your choosing. You can extract the awesomeness within by issuing: - tar -zxvf druid-services-*-bin.tar.gz +``` +tar -zxvf druid-services-*-bin.tar.gz +``` -Not too lost so far right? That’s great! If you cd into the directory: +Not too lost so far right? That's great! If you cd into the directory: - cd druid-services-0.5.54 +``` +cd druid-services-0.5.54 +``` You should see a bunch of files: -\* run\_example\_server.sh -\* run\_example\_client.sh -\* LICENSE, config, examples, lib directories + +* run_example_server.sh +* run_example_client.sh +* LICENSE, config, examples, lib directories Running Example Scripts ----------------------- -Let’s start doing stuff. You can start a Druid [Realtime](Realtime.html) node by issuing: +Let's start doing stuff. You can start a Druid [Realtime](Realtime.html) node by issuing: - ./run_example_server.sh +``` +./run_example_server.sh +``` -Select “wikipedia”. +Select "wikipedia". Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below. - - 2013-07-19 21:54:05,154 INFO [main] com.metamx.druid.realtime.RealtimeNode - Starting Jetty - 2013-07-19 21:54:05,154 INFO [main] org.mortbay.log - jetty-6.1.x - 2013-07-19 21:54:05,171 INFO [chief-wikipedia] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Expect to run at [2013-07-19T22:03:00.000Z] - 2013-07-19 21:54:05,246 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8083 - +``` +2013-07-19 21:54:05,154 INFO [main] com.metamx.druid.realtime.RealtimeNode - Starting Jetty +2013-07-19 21:54:05,154 INFO [main] org.mortbay.log - jetty-6.1.x +2013-07-19 21:54:05,171 INFO [chief-wikipedia] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Expect to run at [2013-07-19T22:03:00.000Z] +2013-07-19 21:54:05,246 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8083 +``` The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. If you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our [White Paper](http://static.druid.io/docs/druid.pdf). -Okay, things are about to get real(~~time). To query the real-time node you’ve spun up, you can issue: -\./run\_example\_client.sh\ -Select “wikipedia” once again. This script issues ]s to the data we’ve been ingesting. The query looks like this: -\`\`\`json +Okay, things are about to get real-time. To query the real-time node you've spun up, you can issue: + +``` +./run_example_client.sh +``` + +Select "wikipedia" once again. This script issues [GroupByQuery](GroupByQuery.html)s to the data we've been ingesting. The query looks like this: + +```json { - [queryType]("groupBy"), - [dataSource]("wikipedia"), - [granularity]("minute"), - [dimensions]([) - “page” - ], - [aggregations]([) - { - [type]("count"), - [name]("rows") - }, - { - [type]("longSum"), - [fieldName]("edit_count"), - [name]("count") - } - ], - [filter]({) - [type]("selector"), - [dimension]("namespace"), - [value]("article") - }, - [intervals]([) - “2013-06-01T00:00/2020-01-01T00” - ] + "queryType":"groupBy", + "dataSource":"wikipedia", + "granularity":"minute", + "dimensions":[ "page" ], + "aggregations":[ + {"type":"count", "name":"rows"}, + {"type":"longSum", "fieldName":"edit_count", "name":"count"} + ], + "filter":{ "type":"selector", "dimension":"namespace", "value":"article" }, + "intervals":[ "2013-06-01T00:00/2020-01-01T00" ] } -\`\`\` -This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: . We are **filtering** via the **“namespace”** dimension, to only look at edits on **“articles”**. Our **aggregations** are what we are calculating: a count of the number of data rows, and a count of the number of edits that have occurred. +``` + +This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the `dimensions` field: `["page"]`. We are **filtering** via the `namespace` dimension, to only look at edits on `articles`. Our **aggregations** are what we are calculating: a count of the number of data rows, and a count of the number of edits that have occurred. + The result looks something like this: -\`\`\`json + +```json [ - { - [version]() “v1”, - [timestamp]() “2013-09-04T21:44:00.000Z”, - [event]() { - [count]() 0, - [page]() “2013\\u201314\_Brentford\_F.C.*season", - [rows]() 1 - } - }, - { - [version]() "v1", - [timestamp]() "2013-09-04T21:44:00.000Z", - [event]() { - [count]() 0, - [page]() "8e*00e9tape\_du\_Tour\_de\_France\_2013”, - [rows]() 1 - } - }, - { - [version]() “v1”, - [timestamp]() “2013-09-04T21:44:00.000Z”, - [event]() { - [count]() 0, - [page]() “Agenda\_of\_the\_Tea\_Party\_movement”, - [rows]() 1 - } - }, -… -\`\`\` -This groupBy query is a bit complicated and we’ll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script. + { + "version": "v1", + "timestamp": "2013-09-04T21:44:00.000Z", + "event": { "count": 0, "page": "2013\u201314_Brentford_F.C._season", "rows": 1 } + }, + { + "version": "v1", + "timestamp": "2013-09-04T21:44:00.000Z", + "event": { "count": 0, "page": "8e_\u00e9tape_du_Tour_de_France_2013", "rows": 1 } + }, + { + "version": "v1", + "timestamp": "2013-09-04T21:44:00.000Z", + "event": { "count": 0, "page": "Agenda_of_the_Tea_Party_movement", "rows": 1 } + }, +... +``` + +This groupBy query is a bit complicated and we'll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script. + h2. Querying Druid + In your favorite editor, create the file: -\time\_boundary\_query.body\ + +``` +time_boundary_query.body +``` + Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created: -\ + +``` { - [queryType]() “timeBoundary”, - [dataSource]() “wikipedia” + "queryType": "timeBoundary", + "dataSource": "wikipedia" } -\ -The ] is one of the simplest Druid queries. To run the query, you can issue: -\ curl~~X POST ‘http://localhost:8083/druid/v2/?pretty’ ~~H ‘content-type: application/json’~~d ```` time_boundary_query.body +``` + +The [TimeBoundaryQuery](TimeBoundaryQuery.html) is one of the simplest Druid queries. To run the query, you can issue: + +``` +curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json' -d @time_boundary_query.body +``` We get something like this JSON back: @@ -171,186 +173,146 @@ We get something like this JSON back: } } ] ``` + As you can probably tell, the result is indicating the maximum and minimum timestamps we've seen thus far (summarized to a minutely granularity). Let's explore a bit further. Return to your favorite editor and create the file: -
timeseries_query.body
+ +``` +timeseries_query.body +``` We are going to make a slightly more complicated query, the [TimeseriesQuery](TimeseriesQuery.html). Copy and paste the following into the file: -

+
+```
 {
     "queryType": "timeseries", 
     "dataSource": "wikipedia", 
-    "intervals": [
-        "2010-01-01/2020-01-01"
-    ], 
+    "intervals": [ "2010-01-01/2020-01-01" ], 
     "granularity": "all", 
     "aggregations": [
-        {
-            "type": "longSum", 
-            "fieldName": "count",
-            "name": "edit_count"
-        }, 
-        {
-            "type": "doubleSum", 
-            "fieldName": "added", 
-            "name": "chars_added"
-        }
+        {"type": "longSum", "fieldName": "count", "name": "edit_count"}, 
+        {"type": "doubleSum", "fieldName": "added", "name": "chars_added"}
     ]
 }
-
+``` You are probably wondering, what are these [Granularities](Granularities.html) and [Aggregations](Aggregations.html) things? What the query is doing is aggregating some metrics over some span of time. To issue the query and get some results, run the following in your command line: -
curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d  ````timeseries\_query.body
 
-
+``` +curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json' -d ````timeseries_query.body +``` + Once again, you should get a JSON blob of text back with your results, that looks something like this: -\`\`\`json +```json [ { - “timestamp” : “2013-09-04T21:44:00.000Z”, - “result” : { - “chars\_added” : 312670.0, - “edit\_count” : 733 - } + "timestamp" : "2013-09-04T21:44:00.000Z", + "result" : { "chars_added" : 312670.0, "edit_count" : 733 } } ] -\`\`\` +``` If you issue the query again, you should notice your results updating. Right now all the results you are getting back are being aggregated into a single timestamp bucket. What if we wanted to see our aggregations on a per minute basis? What field can we change in the query to accomplish this? -If you loudly exclaimed “we can change granularity to minute”, you are absolutely correct! We can specify different granularities to bucket our results, like so: +If you loudly exclaimed "we can change granularity to minute", you are absolutely correct! We can specify different granularities to bucket our results, like so: - - { - "queryType": "timeseries", - "dataSource": "wikipedia", - "intervals": [ - "2010-01-01/2020-01-01" - ], - "granularity": "minute", - "aggregations": [ - { - "type": "longSum", - "fieldName": "count", - "name": "edit_count" - }, - { - "type": "doubleSum", - "fieldName": "added", - "name": "chars_added" - } - ] - } - +``` +{ + "queryType": "timeseries", + "dataSource": "wikipedia", + "intervals": [ "2010-01-01/2020-01-01" ], + "granularity": "minute", + "aggregations": [ + {"type": "longSum", "fieldName": "count", "name": "edit_count"}, + {"type": "doubleSum", "fieldName": "added", "name": "chars_added"} + ] +} +``` This gives us something like the following: -\`\`\`json +```json [ { - “timestamp” : “2013-09-04T21:44:00.000Z”, - “result” : { - “chars\_added” : 30665.0, - “edit\_count” : 128 - } - }, { - “timestamp” : “2013-09-04T21:45:00.000Z”, - “result” : { - “chars\_added” : 122637.0, - “edit\_count” : 167 - } - }, { - “timestamp” : “2013-09-04T21:46:00.000Z”, - “result” : { - “chars\_added” : 78938.0, - “edit\_count” : 159 - } + "timestamp" : "2013-09-04T21:44:00.000Z", + "result" : { "chars_added" : 30665.0, "edit_count" : 128 } + }, + { + "timestamp" : "2013-09-04T21:45:00.000Z", + "result" : { "chars_added" : 122637.0, "edit_count" : 167 } + }, + { + "timestamp" : "2013-09-04T21:46:00.000Z", + "result" : { "chars_added" : 78938.0, "edit_count" : 159 } }, -… -\`\`\` +... +] +``` Solving a Problem ----------------- -One of Druid’s main powers is to provide answers to problems, so let’s pose a problem. What if we wanted to know what the top pages in the US are, ordered by the number of edits over the last few minutes you’ve been going through this tutorial? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the [GroupByQuery](GroupByQuery.html). It would be nice if we could group by results by dimension value and somehow sort those results… and it turns out we can! +One of Druid's main powers is to provide answers to problems, so let's pose a problem. What if we wanted to know what the top pages in the US are, ordered by the number of edits over the last few minutes you've been going through this tutorial? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the [GroupByQuery](GroupByQuery.html). It would be nice if we could group by results by dimension value and somehow sort those results... and it turns out we can! -Let’s create the file: +Let's create the file: - group_by_query.body - and put the following in there: -

-    {
-        "queryType": "groupBy", 
-        "dataSource": "wikipedia", 
-        "granularity": "all", 
-        "dimensions": [
-            "page"
-        ], 
-        "orderBy": {
-            "type": "default", 
-            "columns": [
-                {
-                    "dimension": "edit_count", 
-                    "direction": "DESCENDING"
-                }
-            ], 
-            "limit": 10
-        }, 
-        "aggregations": [
-            {
-                "type": "longSum", 
-                "fieldName": "count", 
-                "name": "edit_count"
-            }
-        ], 
-        "filter": {
-            "type": "selector", 
-            "dimension": "country", 
-            "value": "United States"
-        }, 
-        "intervals": [
-            "2012-10-01T00:00/2020-01-01T00"
-        ]
-    }
-    
+```
+group_by_query.body
+```
 
-Woah! Our query just got a way more complicated. Now we have these [Filters](Filters.html) things and this [OrderBy](OrderBy.html) thing. Fear not, it turns out the new objects we’ve introduced to our query can help define the format of our results and provide an answer to our question.
+and put the following in there:
+
+```
+{
+  "queryType": "groupBy", 
+  "dataSource": "wikipedia", 
+  "granularity": "all", 
+  "dimensions": [ "page" ], 
+  "orderBy": {
+     "type": "default", 
+     "columns": [ { "dimension": "edit_count", "direction": "DESCENDING" } ], 
+     "limit": 10
+  }, 
+  "aggregations": [
+    {"type": "longSum", "fieldName": "count", "name": "edit_count"}
+  ], 
+  "filter": { "type": "selector", "dimension": "country", "value": "United States" }, 
+  "intervals": ["2012-10-01T00:00/2020-01-01T00"]
+}
+```
+
+Woah! Our query just got a way more complicated. Now we have these [Filters](Filters.html) things and this [OrderBy](OrderBy.html) thing. Fear not, it turns out the new objects we've introduced to our query can help define the format of our results and provide an answer to our question.
 
 If you issue the query:
 
-    curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
+```
+curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
+```
 
 You should see an answer to our question. As an example, some results are shown below:
 
-\`\`\`json
+```json
 [
  {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “page” : “RTC\_Transit”,
- “edit\_count” : 6
- }
- }, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “page” : “List\_of\_Deadly\_Women\_episodes”,
- “edit\_count” : 4
- }
- }, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “page” : “User\_talk:David\_Biddulph”,
- “edit\_count” : 4
- }
+   "version" : "v1",
+   "timestamp" : "2012-10-01T00:00:00.000Z",
+   "event" : { "page" : "RTC_Transit", "edit_count" : 6 }
+ }, 
+ {
+   "version" : "v1",
+   "timestamp" : "2012-10-01T00:00:00.000Z",
+   "event" : { "page" : "List_of_Deadly_Women_episodes", "edit_count" : 4 }
+ }, 
+ {
+   "version" : "v1",
+   "timestamp" : "2012-10-01T00:00:00.000Z",
+   "event" : { "page" : "User_talk:David_Biddulph", "edit_count" : 4 }
  },
-…
-\`\`\`
+...
+```
 
 Feel free to tweak other query parameters to answer other questions you may have about the data.
 
diff --git a/docs/content/Tutorial:-The-Druid-Cluster.md b/docs/content/Tutorial:-The-Druid-Cluster.md
index 282ec9fa7f8..cb5c463ba76 100644
--- a/docs/content/Tutorial:-The-Druid-Cluster.md
+++ b/docs/content/Tutorial:-The-Druid-Cluster.md
@@ -1,5 +1,5 @@
 ---
-layout: default
+layout: doc_page
 ---
 Welcome back! In our first [tutorial](https://github.com/metamx/druid/wiki/Tutorial%3A-A-First-Look-at-Druid), we introduced you to the most basic Druid setup: a single realtime node. We streamed in some data and queried it. Realtime nodes collect very recent data and periodically hand that data off to the rest of the Druid cluster. Some questions about the architecture must naturally come to mind. What does the rest of Druid cluster look like? How does Druid load available static data?
 
@@ -14,6 +14,7 @@ If you followed the first tutorial, you should already have Druid downloaded. If
 You can download the latest version of druid [here](http://static.druid.io/artifacts/releases/druid-services-0.5.54-bin.tar.gz)
 
 and untar the contents within by issuing:
+
 ```bash
 tar -zxvf druid-services-*-bin.tar.gz
 cd druid-services-*
@@ -32,15 +33,18 @@ For deep storage, we have made a public S3 bucket (static.druid.io) available wh
 1. If you don't already have it, download MySQL Community Server here: [http://dev.mysql.com/downloads/mysql/](http://dev.mysql.com/downloads/mysql/)
 2. Install MySQL
 3. Create a druid user and database
+
 ```bash
 mysql -u root
 ```
+
 ```sql
 GRANT ALL ON druid.* TO 'druid'@'localhost' IDENTIFIED BY 'diurd';
 CREATE database druid;
 ```
 
 ### Setting up Zookeeper ###
+
 ```bash
 curl http://www.motorlogy.com/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz -o zookeeper-3.4.5.tar.gz
 tar xzf zookeeper-3.4.5.tar.gz
@@ -55,6 +59,7 @@ cd ..
 Similar to the first tutorial, the data we will be loading is based on edits that have occurred on Wikipedia. Every time someone edits a page in Wikipedia, metadata is generated about the editor and edited page. Druid collects each individual event and packages them together in a container known as a [segment](https://github.com/metamx/druid/wiki/Segments). Segments contain data over some span of time. We've prebuilt a segment for this tutorial and will cover making your own segments in other [pages](https://github.com/metamx/druid/wiki/Loading-Your-Data).The segment we are going to work with has the following format:
 
 Dimensions (things to filter on):
+
 ```json
 "page"
 "language"
@@ -71,6 +76,7 @@ Dimensions (things to filter on):
 ```
 
 Metrics (things to aggregate over):
+
 ```json
 "count"
 "added"
@@ -98,7 +104,7 @@ To create the master config file:
 mkdir config/master
 ```
 
-Under the directory we just created, create the file ```runtime.properties``` with the following contents:
+Under the directory we just created, create the file `runtime.properties` with the following contents:
 
 ```
 druid.host=127.0.0.1:8082
@@ -146,7 +152,8 @@ To create the compute config file:
 mkdir config/compute
 ```
 
-Under the directory we just created, create the file ```runtime.properties``` with the following contents:
+Under the directory we just created, create the file `runtime.properties` with the following contents:
+
 ```
 druid.host=127.0.0.1:8081
 druid.port=8081
@@ -219,67 +226,17 @@ To start the broker node:
 ```bash
 java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -classpath lib/*:config/broker com.metamx.druid.http.BrokerMain
 ```
-
 ## Loading the Data ##
 
 The MySQL dependency we introduced earlier on contains a 'segments' table that contains entries for segments that should be loaded into our cluster. The Druid master compares this table with segments that already exist in the cluster to determine what should be loaded and dropped. To load our wikipedia segment, we need to create an entry in our MySQL segment table.
 
 Usually, when new segments are created, these MySQL entries are created directly so you never have to do this by hand. For this tutorial, we can do this manually by going back into MySQL and issuing:
 
-```
+``` sql
 use druid;
-```
-
-``
 INSERT INTO segments (id, dataSource, created_date, start, end, partitioned, version, used, payload) VALUES ('wikipedia_2013-08-01T00:00:00.000Z_2013-08-02T00:00:00.000Z_2013-08-08T21:22:48.989Z', 'wikipedia', '2013-08-08T21:26:23.799Z', '2013-08-01T00:00:00.000Z', '2013-08-02T00:00:00.000Z', '0', '2013-08-08T21:22:48.989Z', '1', '{\"dataSource\":\"wikipedia\",\"interval\":\"2013-08-01T00:00:00.000Z/2013-08-02T00:00:00.000Z\",\"version\":\"2013-08-08T21:22:48.989Z\",\"loadSpec\":{\"type\":\"s3_zip\",\"bucket\":\"static.druid.io\",\"key\":\"data/segments/wikipedia/20130801T000000.000Z_20130802T000000.000Z/2013-08-08T21_22_48.989Z/0/index.zip\"},\"dimensions\":\"dma_code,continent_code,geo,area_code,robot,country_name,network,city,namespace,anonymous,unpatrolled,page,postal_code,language,newpage,user,region_lookup\",\"metrics\":\"count,delta,variation,added,deleted\",\"shardSpec\":{\"type\":\"none\"},\"binaryVersion\":9,\"size\":24664730,\"identifier\":\"wikipedia_2013-08-01T00:00:00.000Z_2013-08-02T00:00:00.000Z_2013-08-08T21:22:48.989Z\"}');
-``
+```
 
 If you look in your master node logs, you should, after a maximum of a minute or so, see logs of the following form:
 
@@ -294,9 +251,9 @@ When the segment completes downloading and ready for queries, you should see the
 2013-08-08 22:48:41,959 INFO [ZkCoordinator-0] com.metamx.druid.coordination.BatchDataSegmentAnnouncer - Announcing segment[wikipedia_2013-08-01T00:00:00.000Z_2013-08-02T00:00:00.000Z_2013-08-08T21:22:48.989Z] at path[/druid/segments/127.0.0.1:8081/2013-08-08T22:48:41.959Z]
 ```
 
-At this point, we can query the segment. For more information on querying, see this[link](https://github.com/metamx/druid/wiki/Querying).
+At this point, we can query the segment. For more information on querying, see this [link](https://github.com/metamx/druid/wiki/Querying).
 
 ## Next Steps ##
 
 Now that you have an understanding of what the Druid clsuter looks like, why not load some of your own data?
-Check out the [Loading Your Own Data](https://github.com/metamx/druid/wiki/Loading-Your-Data) section for more info!
\ No newline at end of file
+Check out the [Loading Your Own Data](https://github.com/metamx/druid/wiki/Loading-Your-Data) section for more info!
diff --git a/docs/content/Tutorial:-Webstream.md b/docs/content/Tutorial:-Webstream.md
index bfb7ed73bed..32bde468833 100644
--- a/docs/content/Tutorial:-Webstream.md
+++ b/docs/content/Tutorial:-Webstream.md
@@ -1,345 +1,307 @@
 ---
-layout: default
+layout: doc_page
 ---
 Greetings! This tutorial will help clarify some core Druid concepts. We will use a realtime dataset and issue some basic Druid queries. If you are ready to explore Druid, and learn a thing or two, read on!
 
 About the data
 --------------
 
-The data source we’ll be working with is the Bit.ly USA Government website statistics stream. You can see the stream [here](http://developer.usa.gov/1usagov), and read about the stream [here](http://www.usa.gov/About/developer-resources/1usagov.shtml) . This is a feed of json data that gets updated whenever anyone clicks a bit.ly shortened USA.gov website. A typical event might look something like this:
-\`\`\`json
+The data source we'll be working with is the Bit.ly USA Government website statistics stream. You can see the stream [here](http://developer.usa.gov/1usagov), and read about the stream [here](http://www.usa.gov/About/developer-resources/1usagov.shtml) . This is a feed of json data that gets updated whenever anyone clicks a bit.ly shortened USA.gov website. A typical event might look something like this:
+
+```json
 {
- [user\_agent]() “Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)”,
- [country]() “US”,
- [known\_user]() 1,
- [timezone]() “America/New\_York”,
- [geo\_region]() “DC”,
- [global\_bitly\_hash]() “17ctAFs”,
- [encoding\_user\_bitly\_hash]() “17ctAFr”,
- [encoding\_user\_login]() “senrubiopress”,
- [aaccept\_language]() “en-US”,
- [short\_url\_cname]() “1.usa.gov”,
- [referring\_url]() “http://t.co/4Av4NUFAYq”,
- [long\_url]() “http://www.rubio.senate.gov/public/index.cfm/fighting-for-florida?ID=c8357d12-9da8-4e9d-b00d-7168e1bf3599”,
- [timestamp]() 1372190407,
- [timestamp of time hash was created]() 1372190097,
- [city]() “Washington”,
- [latitude\_longitude]() [
- 38.893299,
- ~~77.014603
- ]
+  "user_agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)", 
+  "country": "US", 
+  "known_user": 1, 
+  "timezone": "America/New_York", 
+  "geo_region": "DC", 
+  "global_bitly_hash": "17ctAFs", 
+  "encoding_user_bitly_hash": "17ctAFr", 
+  "encoding_user_login": "senrubiopress", 
+  "aaccept_language": "en-US", 
+  "short_url_cname": "1.usa.gov", 
+  "referring_url": "http://t.co/4Av4NUFAYq", 
+  "long_url": "http://www.rubio.senate.gov/public/index.cfm/fighting-for-florida?ID=c8357d12-9da8-4e9d-b00d-7168e1bf3599", 
+  "timestamp": 1372190407, 
+  "timestamp of time hash was created": 1372190097, 
+  "city": "Washington", 
+  "latitude_longitude": [ 38.893299,  -77.014603 ]
 }
-\`\`\`
-The “known\_user” field is always 1 or 0. It is 1 if the user is known to the server, and 0 otherwise. We will use this field extensively in this demo.
+```
+
+The "known_user" field is always 1 or 0. It is 1 if the user is known to the server, and 0 otherwise. We will use this field extensively in this demo.
+
 h2. Setting Up
-There are two ways to setup Druid: download a tarball, or ]. You only need to do one of these.
+
+There are two ways to setup Druid: download a tarball, or [Build From Source](Build-From-Source.html). You only need to do one of these.
+
 h3. Download a Tarball
-We’ve built a tarball that contains everything you’ll need. You’ll find it [here](http://static.druid.io/artifacts/releases/druid-services-0.5.50-bin.tar.gz)
+
+We've built a tarball that contains everything you'll need. You'll find it [here](http://static.druid.io/artifacts/releases/druid-services-0.5.50-bin.tar.gz)
 Download this file to a directory of your choosing.
 You can extract the awesomeness within by issuing:
-\tar~~zxvf druid-services~~**~~bin.tar.gz\
-Not too lost so far right? That’s great! If you cd into the directory:
-\cd druid-services-0.5.50\
+
+```
+tar zxvf druid-services-*-bin.tar.gz
+```
+
+Not too lost so far right? That's great! If you cd into the directory:
+
+```
+cd druid-services-0.5.50
+```
+
 You should see a bunch of files:
-\* run\_example\_server.sh
-\* run\_example\_client.sh
-\* LICENSE, config, examples, lib directories
+
+* run_example_server.sh
+* run_example_client.sh
+* LICENSE, config, examples, lib directories
 
 h2. Running Example Scripts
-Let’s start doing stuff. You can start a Druid ] node by issuing:
-\./run\_example\_server.sh\
-Select “webstream”.
+Let's start doing stuff. You can start a Druid [Realtime](Realtime.html) node by issuing:
+
+```
+./run_example_server.sh
+```
+
+Select "webstream".
 Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below.
-\
+
+```
 2013-07-19 21:54:05,154 INFO com.metamx.druid.realtime.RealtimeNode~~ Starting Jetty
 2013-07-19 21:54:05,154 INFO org.mortbay.log - jetty-6.1.x
 2013-07-19 21:54:05,171 INFO com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Expect to run at
 2013-07-19 21:54:05,246 INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8083
-\
+```
+
 The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. If you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our [White Paper](http://static.druid.io/docs/druid.pdf).
-Okay, things are about to get real. To query the real-time node you’ve spun up, you can issue:
-\./run\_example\_client.sh\
-Select “webstream” once again. This script issues ]s to the data we’ve been ingesting. The query looks like this:
-\`\`\`json
+Okay, things are about to get real. To query the real-time node you've spun up, you can issue:
+
+```
+./run_example_client.sh
+```
+
+Select "webstream" once again. This script issues [GroupByQuery](GroupByQuery.html)s to the data we've been ingesting. The query looks like this:
+
+```json
 {
- [queryType]() “groupBy”,
- [dataSource]() “webstream”,
- [granularity]() “minute”,
- [dimensions]() [
- “timezone”
- ],
- [aggregations]() [
- {
- [type]() “count”,
- [name]() “rows”
- },
- {
- [type]() “doubleSum”,
- [fieldName]() “known\_users”,
- [name]() “known\_users”
- }
- ],
- [filter]() {
- [type]() “selector”,
- [dimension]() “country”,
- [value]() “US”
- },
- [intervals]() [
- “2013-06-01T00:00/2020-01-01T00”
- ]
+  "queryType": "groupBy", 
+  "dataSource": "webstream", 
+  "granularity": "minute", 
+  "dimensions": [ "timezone" ], 
+  "aggregations": [
+      { "type": "count",  "name": "rows" }, 
+      { "type": "doubleSum",  "fieldName": "known_users",  "name": "known_users" }
+  ], 
+  "filter": { "type": "selector",  "dimension": "country",  "value": "US" }, 
+  "intervals": [ "2013-06-01T00:00/2020-01-01T00" ]
 }
-\`\`\`
-This is a****groupBy**\* query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: . We are **filtering** via the **“country”** dimension, to only look at website hits in the US. Our **aggregations** are what we are calculating: a row count, and the sum of the number of known users in our data.
+```
+This is a `groupBy` query, which you may be familiar with from SQL. We are grouping, or aggregating, via the `dimensions` field: . We are **filtering** via the `"country"` dimension, to only look at website hits in the US. Our **aggregations** are what we are calculating: a row count, and the sum of the number of known users in our data.
+
 The result looks something like this:
-\`\`\`json
+
+```json
 [
- {
- [version]() “v1”,
- [timestamp]() “2013-07-18T19:39:00.000Z”,
- [event]() {
- [timezone]() “America/Chicago”,
- [known\_users]() 10,
- [rows]() 15
- }
- },
- {
- [version]() “v1”,
- [timestamp]() “2013-07-18T19:39:00.000Z”,
- [event]() {
- [timezone]() “America/Los\_Angeles”,
- [known\_users]() 0,
- [rows]() 3
- }
- },
-…
-\`\`\`
-This groupBy query is a bit complicated and we’ll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script.
+  {
+      "version": "v1", 
+      "timestamp": "2013-07-18T19:39:00.000Z", 
+      "event": { "timezone": "America/Chicago",  "known_users": 10,  "rows": 15 }
+  }, 
+  {
+      "version": "v1", 
+      "timestamp": "2013-07-18T19:39:00.000Z", 
+      "event": { "timezone": "America/Los_Angeles",  "known_users": 0,  "rows": 3 }
+  },
+...
+```
+
+This groupBy query is a bit complicated and we'll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script.
+
 h2. Querying Druid
+
 In your favorite editor, create the file:
-\time\_boundary\_query.body\
+
+```
+time_boundary_query.body
+```
+
 Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created:
-\
+
+```
 {
- [queryType]() “timeBoundary”,
- [dataSource]() “webstream”
+  "queryType": "timeBoundary", 
+  "dataSource": "webstream"
 }
-\
-The ] is one of the simplest Druid queries. To run the query, you can issue:
-\ curl~~X POST ‘http://localhost:8083/druid/v2/?pretty’ ~~H ‘content-type: application/json’~~d ```` time_boundary_query.body
+``` + +The [TimeBoundaryQuery](TimeBoundaryQuery.html) is one of the simplest Druid queries. To run the query, you can issue: + +``` +curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json' -d time_boundary_query.body +``` We get something like this JSON back: ```json [ - { - "timestamp": "2013-07-18T19:39:00.000Z", - "result": { - "minTime": "2013-07-18T19:39:00.000Z", - "maxTime": "2013-07-18T19:46:00.000Z" - } - } + { + "timestamp": "2013-07-18T19:39:00.000Z", + "result": { + "minTime": "2013-07-18T19:39:00.000Z", + "maxTime": "2013-07-18T19:46:00.000Z" + } + } ] ``` As you can probably tell, the result is indicating the maximum and minimum timestamps we've seen thus far (summarized to a minutely granularity). Let's explore a bit further. Return to your favorite editor and create the file: -
timeseries_query.body
+ +``` +timeseries_query.body +``` We are going to make a slightly more complicated query, the [TimeseriesQuery](TimeseriesQuery.html). Copy and paste the following into the file: -

+
+```json
 {
-    "queryType": "timeseries", 
-    "dataSource": "webstream", 
-    "intervals": [
-        "2010-01-01/2020-01-01"
-    ], 
-    "granularity": "all", 
-    "aggregations": [
-        {
-            "type": "count", 
-            "name": "rows"
-        }, 
-        {
-            "type": "doubleSum", 
-            "fieldName": "known_users", 
-            "name": "known_users"
-        }
-    ]
+  "queryType": "timeseries", 
+  "dataSource": "webstream", 
+  "intervals": [ "2010-01-01/2020-01-01" ], 
+  "granularity": "all", 
+  "aggregations": [
+      { "type": "count",  "name": "rows" }, 
+      { "type": "doubleSum",  "fieldName": "known_users",  "name": "known_users" }
+  ]
 }
-
+``` You are probably wondering, what are these [Granularities](Granularities.html) and [Aggregations](Aggregations.html) things? What the query is doing is aggregating some metrics over some span of time. To issue the query and get some results, run the following in your command line: -
curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d  ````timeseries\_query.body
 
-
+``` +curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json' -d timeseries_query.body +``` + Once again, you should get a JSON blob of text back with your results, that looks something like this: -\`\`\`json +```json [ -{ - “timestamp” : “2013-07-18T19:39:00.000Z”, - “result” : { - “known\_users” : 787.0, - “rows” : 2004 - } -} + { + "timestamp" : "2013-07-18T19:39:00.000Z", + "result" : { "known_users" : 787.0, "rows" : 2004 } + } ] -\`\`\` +``` If you issue the query again, you should notice your results updating. Right now all the results you are getting back are being aggregated into a single timestamp bucket. What if we wanted to see our aggregations on a per minute basis? What field can we change in the query to accomplish this? -If you loudly exclaimed “we can change granularity to minute”, you are absolutely correct! We can specify different granularities to bucket our results, like so: +If you loudly exclaimed "we can change granularity to minute", you are absolutely correct! We can specify different granularities to bucket our results, like so: - - { - "queryType": "timeseries", - "dataSource": "webstream", - "intervals": [ - "2010-01-01/2020-01-01" - ], - "granularity": "minute", - "aggregations": [ - { - "type": "count", - "name": "rows" - }, - { - "type": "doubleSum", - "fieldName": "known_users", - "name": "known_users" - } - ] - } - +```json + { + "queryType": "timeseries", + "dataSource": "webstream", + "intervals": [ "2010-01-01/2020-01-01" ], + "granularity": "minute", + "aggregations": [ + { "type": "count", "name": "rows" }, + { "type": "doubleSum", "fieldName": "known_users", "name": "known_users" } + ] + } +``` This gives us something like the following: -\`\`\`json +```json [ - { - [timestamp]() “2013-07-18T19:39:00.000Z”, - [result]() { - [known\_users]() 33, - [rows]() 76 - } - }, - { - [timestamp]() “2013-07-18T19:40:00.000Z”, - [result]() { - [known\_users]() 105, - [rows]() 221 - } - }, - { - [timestamp]() “2013-07-18T19:41:00.000Z”, - [result]() { - [known\_users]() 53, - [rows]() 167 - } - }, -… -\`\`\` + { + "timestamp": "2013-07-18T19:39:00.000Z", + "result": { "known_users": 33, "rows": 76 } + }, + { + "timestamp": "2013-07-18T19:40:00.000Z", + "result": { "known_users": 105, "rows": 221 } + }, + { + "timestamp": "2013-07-18T19:41:00.000Z", + "result": { "known_users": 53, "rows": 167 } + }, +... +``` Solving a Problem ----------------- -One of Druid’s main powers is to provide answers to problems, so let’s pose a problem. What if we wanted to know what the top states in the US are, ordered by the number of visits by known users over the last few minutes? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the [GroupByQuery](GroupByQuery.html). It would be nice if we could group by results by dimension value and somehow sort those results… and it turns out we can! +One of Druid's main powers is to provide answers to problems, so let's pose a problem. What if we wanted to know what the top states in the US are, ordered by the number of visits by known users over the last few minutes? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the [GroupByQuery](GroupByQuery.html). It would be nice if we could group by results by dimension value and somehow sort those results… and it turns out we can! -Let’s create the file: +Let's create the file: - group_by_query.body - and put the following in there: -

-    {
-        "queryType": "groupBy", 
-        "dataSource": "webstream", 
-        "granularity": "all", 
-        "dimensions": [
-            "geo_region"
+```
+group_by_query.body
+```
+
+and put the following in there:
+
+```
+{
+    "queryType": "groupBy", 
+    "dataSource": "webstream", 
+    "granularity": "all", 
+    "dimensions": [ "geo_region" ], 
+    "orderBy": {
+        "type": "default", 
+        "columns": [
+            { "dimension": "known_users",  "direction": "DESCENDING" }
         ], 
-        "orderBy": {
-            "type": "default", 
-            "columns": [
-                {
-                    "dimension": "known_users", 
-                    "direction": "DESCENDING"
-                }
-            ], 
-            "limit": 10
-        }, 
-        "aggregations": [
-            {
-                "type": "count", 
-                "name": "rows"
-            }, 
-            {
-                "type": "doubleSum", 
-                "fieldName": "known_users", 
-                "name": "known_users"
-            }
-        ], 
-        "filter": {
-            "type": "selector", 
-            "dimension": "country", 
-            "value": "US"
-        }, 
-        "intervals": [
-            "2012-10-01T00:00/2020-01-01T00"
-        ]
-    }
-    
+        "limit": 10
+    }, 
+    "aggregations": [
+        { "type": "count",  "name": "rows" }, 
+        { "type": "doubleSum",  "fieldName": "known_users",  "name": "known_users" }
+    ], 
+    "filter": { "type": "selector",  "dimension": "country",  "value": "US" }, 
+    "intervals": [ "2012-10-01T00:00/2020-01-01T00" ]
+}
+```
 
-Woah! Our query just got a way more complicated. Now we have these [Filters](Filters.html) things and this [OrderBy](OrderBy.html) thing. Fear not, it turns out the new objects we’ve introduced to our query can help define the format of our results and provide an answer to our question.
+Woah! Our query just got a way more complicated. Now we have these [Filters](Filters.html) things and this [OrderBy](OrderBy.html) thing. Fear not, it turns out the new objects we've introduced to our query can help define the format of our results and provide an answer to our question.
 
 If you issue the query:
 
-    curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
+```
+curl -X POST 'http://localhost:8083/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
+```
 
 You should see an answer to our question. For my stream, it looks like this:
 
-\`\`\`json
+```json
 [
- {
- [version]() “v1”,
- [timestamp]() “2012-10-01T00:00:00.000Z”,
- [event]() {
- [geo\_region]() “RI”,
- [known\_users]() 359,
- [rows]() 143
- }
- },
- {
- [version]() “v1”,
- [timestamp]() “2012-10-01T00:00:00.000Z”,
- [event]() {
- [geo\_region]() “NY”,
- [known\_users]() 187,
- [rows]() 322
- }
- },
- {
- [version]() “v1”,
- [timestamp]() “2012-10-01T00:00:00.000Z”,
- [event]() {
- [geo\_region]() “CA”,
- [known\_users]() 145,
- [rows]() 466
- }
- },
- {
- [version]() “v1”,
- [timestamp]() “2012-10-01T00:00:00.000Z”,
- [event]() {
- [geo\_region]() “IL”,
- [known\_users]() 121,
- [rows]() 185
- }
- },
-…
-\`\`\`
+  {
+      "version": "v1", 
+      "timestamp": "2012-10-01T00:00:00.000Z", 
+      "event": { "geo_region": "RI",  "known_users": 359,  "rows": 143 }
+  }, 
+  {
+      "version": "v1", 
+      "timestamp": "2012-10-01T00:00:00.000Z", 
+      "event": { "geo_region": "NY",  "known_users": 187,  "rows": 322 }
+  }, 
+  {
+      "version": "v1", 
+      "timestamp": "2012-10-01T00:00:00.000Z", 
+      "event": { "geo_region": "CA",  "known_users": 145,  "rows": 466 }
+  }, 
+  {
+      "version": "v1", 
+      "timestamp": "2012-10-01T00:00:00.000Z", 
+      "event": { "geo_region": "IL",  "known_users": 121,  "rows": 185 }
+  },
+...
+```
 
 Feel free to tweak other query parameters to answer other questions you may have about the data.
 
diff --git a/docs/content/Twitter-Tutorial.md b/docs/content/Twitter-Tutorial.md
deleted file mode 100644
index dc2151ec3e4..00000000000
--- a/docs/content/Twitter-Tutorial.md
+++ /dev/null
@@ -1,329 +0,0 @@
----
-layout: default
----
-Greetings! We see you’ve taken an interest in Druid. That’s awesome! Hopefully this tutorial will help clarify some core Druid concepts. We will go through one of the Real-time [Examples](Examples.html), and issue some basic Druid queries. The data source we’ll be working with is the [Twitter spritzer stream](https://dev.twitter.com/docs/streaming-apis/streams/public). If you are ready to explore Druid, brave its challenges, and maybe learn a thing or two, read on!
-
-Setting Up
-----------
-
-There are two ways to setup Druid: download a tarball, or build it from source.
-
-### Download a Tarball
-
-We’ve built a tarball that contains everything you’ll need. You’ll find it [here](http://static.druid.io/data/examples/druid-services-0.4.6.tar.gz).
-Download this bad boy to a directory of your choosing.
-
-You can extract the awesomeness within by issuing:
-
-    tar -zxvf druid-services-0.4.6.tar.gz
-
-Not too lost so far right? That’s great! If you cd into the directory:
-
-    cd druid-services-0.4.6-SNAPSHOT
-
-You should see a bunch of files:
-\* run\_example\_server.sh
-\* run\_example\_client.sh
-\* LICENSE, config, examples, lib directories
-
-### Clone and Build from Source
-
-The other way to setup Druid is from source via git. To do so, run these commands:
-
-\`\`\`
-git clone git@github.com:metamx/druid.git
-cd druid
-git checkout druid-0.4.32-branch
-./build.sh
-\`\`\`
-
-You should see a bunch of files:
-
-\`\`\`
-DruidCorporateCLA.pdf README common examples indexer pom.xml server
-DruidIndividualCLA.pdf build.sh doc group\_by.body install publications services
-LICENSE client eclipse\_formatting.xml index-common merger realtime
-\`\`\`
-
-You can find the example executables in the examples/bin directory:
-\* run\_example\_server.sh
-\* run\_example\_client.sh
-
-Running Example Scripts
------------------------
-
-Let’s start doing stuff. You can start a Druid [Realtime](Realtime.html) node by issuing:
-
-    ./run_example_server.sh
-
-Select “twitter”.
-
-You’ll need to register a new application with the twitter API, which only takes a minute. Go to [https://twitter.com/oauth\_clients/new](https://twitter.com/oauth_clients/new) and fill out the form and submit. Don’t worry, the home page and callback url can be anything. This will generate keys for the Twitter example application. Take note of the values for consumer key/secret and access token/secret.
-
-Enter your credentials when prompted.
-
-Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below. If you see crazy exceptions, you probably typed in your login information incorrectly.
-
-    
-    2013-05-17 23:04:40,934 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
-    2013-05-17 23:04:40,935 INFO [main] com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler - Invoking start method[public void com.metamx.druid.http.FileRequestLogger.start()] on object[com.metamx.druid.http.FileRequestLogger@42bb0406].
-    2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Connection established.
-    2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] druid.examples.twitter.TwitterSpritzerFirehoseFactory - Connected_to_Twitter
-    2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Receiving status stream.
-    
-
-Periodically, you’ll also see messages of the form:
-
-    
-    2013-05-17 23:04:59,793 INFO [chief-twitterstream] druid.examples.twitter.TwitterSpritzerFirehoseFactory - nextRow() has returned 1,000 InputRows
-    
-
-These messages indicate you are ingesting events. The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. Persisting to disk generates a whole bunch of logs:
-
-    
-    2013-05-17 23:06:40,918 INFO [chief-twitterstream] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Submitting persist runnable for dataSource[twitterstream]
-    2013-05-17 23:06:40,920 INFO [twitterstream-incremental-persist] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - DataSource[twitterstream], Interval[2013-05-17T23:00:00.000Z/2013-05-18T00:00:00.000Z], persisting Hydrant[FireHydrant{index=com.metamx.druid.index.v1.IncrementalIndex@126212dd, queryable=com.metamx.druid.index.IncrementalIndexSegment@64c47498, count=0}]
-    2013-05-17 23:06:40,937 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting persist for interval[2013-05-17T23:00:00.000Z/2013-05-17T23:07:00.000Z], rows[4,666]
-    2013-05-17 23:06:41,039 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed index.drd in 11 millis.
-    2013-05-17 23:06:41,070 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed dim conversions in 31 millis.
-    2013-05-17 23:06:41,275 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.CompressedPools - Allocating new chunkEncoder[1]
-    2013-05-17 23:06:41,332 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed walk through of 4,666 rows in 262 millis.
-    2013-05-17 23:06:41,334 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[htags] with cardinality[634]
-    2013-05-17 23:06:41,381 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[htags] in 49 millis.
-    2013-05-17 23:06:41,382 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[lang] with cardinality[19]
-    2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[lang] in 17 millis.
-    2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[utc_offset] with cardinality[32]
-    2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[utc_offset] in 15 millis.
-    2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed inverted.drd in 81 millis.
-    2013-05-17 23:06:41,425 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexIO$DefaultIndexIOHandler - Converting v8[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] to v9[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0]
-    2013-05-17 23:06:41,426 INFO [twitterstream-incremental-persist] 
-    ... ETC
-    
-
-The logs are about building different columns, probably not the most exciting stuff (they might as well be in Vulcan) if are you learning about Druid for the first time. Nevertheless, if you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our [White Paper](http://static.druid.io/docs/druid.pdf).
-
-Okay, things are about to get real (~~time). To query the real-time node you’ve spun up, you can issue:
-\./run\_example\_client.sh\
-Select “twitter” once again. This script issues ]s to the twitter data we’ve been ingesting. The query looks like this:
-\`\`\`json
-{
- [queryType]() “groupBy”,
- [dataSource]() “twitterstream”,
- [granularity]() “all”,
- [dimensions]() ,
- [aggregations]([)
- { [type]() “count”, [name]() “rows”},
- { [type]() “doubleSum”, [fieldName]() “tweets”, [name]() “tweets”}
- ],
- [filter]() { [type]() “selector”, [dimension]() “lang”, [value]() “en” },
- [intervals](["2012-10-01T00:00/2020-01-01T00"])
-}
-\`\`\`
-This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: . We are **filtering** via the **“lang”** dimension, to only look at english tweets. Our **aggregations** are what we are calculating: a row count, and the sum of the tweets in our data.
-The result looks something like this:
-\`\`\`json
-[
- {
- [version]() “v1”,
- [timestamp]() “2012-10-01T00:00:00.000Z”,
- [event]() {
- [utc\_offset]() “~~10800",
- [tweets]() 90,
- [lang]() "en",
- [rows]() 81
- }
- },
- {
- [version]() "v1",
- [timestamp]() "2012-10-01T00:00:00.000Z",
- [event]() {
- [utc\_offset]() "~~14400”,
- [tweets]() 177,
- [lang]() “en”,
- [rows]() 154
- }
- },
-…
-\`\`\`
-This data, plotted in a time series/distribution, looks something like this:
-![Timezone / Tweets Scatter Plot](http://metamarkets.com/wp-content/uploads/2013/06/tweets_timezone_offset.png "Timezone / Tweets Scatter Plot")
-This groupBy query is a bit complicated and we’ll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have [curl](http://curl.haxx.se/) installed. Control+C to break out of the client script.
-h2. Querying Druid
-In your favorite editor, create the file:
-\time\_boundary\_query.body\
-Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created:
-\
-\
-The ] is one of the simplest Druid queries. To run the query, you can issue:
-\ curl~~X POST ‘http://localhost:8080/druid/v2/?pretty’ ~~H ‘content-type: application/json’~~d ```` time_boundary_query.body
- -We get something like this JSON back: - -```json -[ { - "timestamp" : "2013-06-10T19:09:00.000Z", - "result" : { - "minTime" : "2013-06-10T19:09:00.000Z", - "maxTime" : "2013-06-10T20:50:00.000Z" - } -} ] -``` -That's the result. What information do you think the result is conveying? -... -If you said the result is indicating the maximum and minimum timestamps we've seen thus far (summarized to a minutely granularity), you are absolutely correct. I can see you are a person legitimately interested in learning about Druid. Let's explore a bit further. - -Return to your favorite editor and create the file: -
timeseries_query.body
- -We are going to make a slightly more complicated query, the [TimeseriesQuery](TimeseriesQuery.html). Copy and paste the following into the file: -
{
-  "queryType":"timeseries",
-  "dataSource":"twitterstream",
-  "intervals":["2010-01-01/2020-01-01"],
-  "granularity":"all",
-  "aggregations":[
-      { "type": "count", "name": "rows"},
-      { "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
-  ]
-}
-
- -You are probably wondering, what are these [Granularities](Granularities.html) and [Aggregations](Aggregations.html) things? What the query is doing is aggregating some metrics over some span of time. -To issue the query and get some results, run the following in your command line: -
curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json'  -d  ````timeseries\_query.body
-
-
-Once again, you should get a JSON blob of text back with your results, that looks something like this: - -\`\`\`json -[ { - “timestamp” : “2013-06-10T19:09:00.000Z”, - “result” : { - “tweets” : 358562.0, - “rows” : 272271 - } -} ] -\`\`\` - -If you issue the query again, you should notice your results updating. - -Right now all the results you are getting back are being aggregated into a single timestamp bucket. What if we wanted to see our aggregations on a per minute basis? What field can we change in the query to accomplish this? - -If you loudly exclaimed “we can change granularity to minute”, you are absolutely correct again! We can specify different granularities to bucket our results, like so: - -\`\`\`json -{ - [queryType]("timeseries"), - [dataSource]("twitterstream"), - [intervals](["2010-01-01/2020-01-01"]), - [granularity]("minute"), - [aggregations]([) - { [type]() “count”, [name]() “rows”}, - { [type]() “doubleSum”, [fieldName]() “tweets”, [name]() “tweets”} - ] -} -\`\`\` - -This gives us something like the following: - -\`\`\`json -[ { - “timestamp” : “2013-06-10T19:09:00.000Z”, - “result” : { - “tweets” : 2650.0, - “rows” : 2120 - } -}, { - “timestamp” : “2013-06-10T19:10:00.000Z”, - “result” : { - “tweets” : 3401.0, - “rows” : 2609 - } -}, { - “timestamp” : “2013-06-10T19:11:00.000Z”, - “result” : { - “tweets” : 3472.0, - “rows” : 2610 - } -}, -… -\`\`\` - -Solving a Problem ------------------ - -One of Druid’s main powers (see what we did there?) is to provide answers to problems, so let’s pose a problem. What if we wanted to know what the top hash tags are, ordered by the number tweets, where the language is english, over the last few minutes you’ve been reading this tutorial? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the [GroupByQuery](GroupByQuery.html). It would be nice if we could group by results by dimension value and somehow sort those results… and it turns out we can! - -Let’s create the file: - - group_by_query.body - and put the following in there: -
{
-        "queryType": "groupBy",
-        "dataSource": "twitterstream",
-        "granularity": "all",
-        "dimensions": ["htags"],
-        "orderBy": {"type":"default", "columns":[{"dimension": "tweets", "direction":"DESCENDING"}], "limit":5},
-        "aggregations":[
-          { "type": "longSum", "fieldName": "tweets", "name": "tweets"}
-        ],
-        "filter": {"type": "selector", "dimension": "lang", "value": "en" },
-        "intervals":["2012-10-01T00:00/2020-01-01T00"]
-    }
-    
-
-Woah! Our query just got a way more complicated. Now we have these [Filters](Filters.html) things and this [OrderBy](OrderBy.html) thing. Fear not, it turns out the new objects we’ve introduced to our query can help define the format of our results and provide an answer to our question.
-
-If you issue the query:
-
-    curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
-
-You should hopefully see an answer to our question. For my twitter stream, it looks like this:
-
-\`\`\`json
-[ {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “tweets” : 2660,
- “htags” : “android”
- }
-}, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “tweets” : 1944,
- “htags” : “E3”
- }
-}, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “tweets” : 1927,
- “htags” : “15SueñosPendientes”
- }
-}, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “tweets” : 1717,
- “htags” : “ipad”
- }
-}, {
- “version” : “v1”,
- “timestamp” : “2012-10-01T00:00:00.000Z”,
- “event” : {
- “tweets” : 1515,
- “htags” : “IDidntTextYouBackBecause”
- }
-} ]
-\`\`\`
-
-Feel free to tweak other query parameters to answer other questions you may have about the data.
-
-Additional Information
-----------------------
-
-This tutorial is merely showcasing a small fraction of what Druid can do. Next, continue on to [Loading Your Data](Loading Your Data.html).
-
-And thus concludes our journey! Hopefully you learned a thing or two about Druid real-time ingestion, querying Druid, and how Druid can be used to solve problems. If you have additional questions, feel free to post in our [google groups page](http://www.groups.google.com/forum/#!forum/druid-development).
diff --git a/docs/content/Twitter-Tutorial.textile b/docs/content/Twitter-Tutorial.textile
new file mode 100644
index 00000000000..b5bdbb3b20a
--- /dev/null
+++ b/docs/content/Twitter-Tutorial.textile
@@ -0,0 +1,327 @@
+---
+layout: doc_page
+---
+Greetings! We see you've taken an interest in Druid. That's awesome! Hopefully this tutorial will help clarify some core Druid concepts. We will go through one of the Real-time "Examples":Examples.html, and issue some basic Druid queries. The data source we'll be working with is the "Twitter spritzer stream":https://dev.twitter.com/docs/streaming-apis/streams/public. If you are ready to explore Druid, brave its challenges, and maybe learn a thing or two, read on!
+
+h2. Setting Up
+
+There are two ways to setup Druid: download a tarball, or build it from source.
+
+h3. Download a Tarball
+
+We've built a tarball that contains everything you'll need. You'll find it "here":http://static.druid.io/data/examples/druid-services-0.4.6.tar.gz.
+Download this bad boy to a directory of your choosing.
+
+You can extract the awesomeness within by issuing:
+
+pre. tar -zxvf druid-services-0.4.6.tar.gz
+
+Not too lost so far right? That's great! If you cd into the directory:
+
+pre. cd druid-services-0.4.6-SNAPSHOT
+
+You should see a bunch of files:
+* run_example_server.sh
+* run_example_client.sh
+* LICENSE, config, examples, lib directories
+
+h3. Clone and Build from Source
+
+The other way to setup Druid is from source via git. To do so, run these commands:
+
+
git clone git@github.com:metamx/druid.git
+cd druid
+git checkout druid-0.4.32-branch
+./build.sh
+
+ +You should see a bunch of files: + +
DruidCorporateCLA.pdf	README			common			examples		indexer			pom.xml			server
+DruidIndividualCLA.pdf	build.sh		doc			group_by.body		install			publications		services
+LICENSE			client			eclipse_formatting.xml	index-common		merger			realtime
+
+ +You can find the example executables in the examples/bin directory: +* run_example_server.sh +* run_example_client.sh + +h2. Running Example Scripts + +Let's start doing stuff. You can start a Druid "Realtime":Realtime.html node by issuing: +./run_example_server.sh + +Select "twitter". + +You'll need to register a new application with the twitter API, which only takes a minute. Go to "https://twitter.com/oauth_clients/new":https://twitter.com/oauth_clients/new and fill out the form and submit. Don't worry, the home page and callback url can be anything. This will generate keys for the Twitter example application. Take note of the values for consumer key/secret and access token/secret. + +Enter your credentials when prompted. + +Once the node starts up you will see a bunch of logs about setting up properties and connecting to the data source. If everything was successful, you should see messages of the form shown below. If you see crazy exceptions, you probably typed in your login information incorrectly. +
2013-05-17 23:04:40,934 INFO [main] org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
+2013-05-17 23:04:40,935 INFO [main] com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler - Invoking start method[public void com.metamx.druid.http.FileRequestLogger.start()] on object[com.metamx.druid.http.FileRequestLogger@42bb0406].
+2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Connection established.
+2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] druid.examples.twitter.TwitterSpritzerFirehoseFactory - Connected_to_Twitter
+2013-05-17 23:04:41,578 INFO [Twitter Stream consumer-1[Establishing connection]] twitter4j.TwitterStreamImpl - Receiving status stream.
+
+ +Periodically, you'll also see messages of the form: +
2013-05-17 23:04:59,793 INFO [chief-twitterstream] druid.examples.twitter.TwitterSpritzerFirehoseFactory - nextRow() has returned 1,000 InputRows
+
+ +These messages indicate you are ingesting events. The Druid real time-node ingests events in an in-memory buffer. Periodically, these events will be persisted to disk. Persisting to disk generates a whole bunch of logs: + +
2013-05-17 23:06:40,918 INFO [chief-twitterstream] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - Submitting persist runnable for dataSource[twitterstream]
+2013-05-17 23:06:40,920 INFO [twitterstream-incremental-persist] com.metamx.druid.realtime.plumber.RealtimePlumberSchool - DataSource[twitterstream], Interval[2013-05-17T23:00:00.000Z/2013-05-18T00:00:00.000Z], persisting Hydrant[FireHydrant{index=com.metamx.druid.index.v1.IncrementalIndex@126212dd, queryable=com.metamx.druid.index.IncrementalIndexSegment@64c47498, count=0}]
+2013-05-17 23:06:40,937 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting persist for interval[2013-05-17T23:00:00.000Z/2013-05-17T23:07:00.000Z], rows[4,666]
+2013-05-17 23:06:41,039 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed index.drd in 11 millis.
+2013-05-17 23:06:41,070 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed dim conversions in 31 millis.
+2013-05-17 23:06:41,275 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.CompressedPools - Allocating new chunkEncoder[1]
+2013-05-17 23:06:41,332 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed walk through of 4,666 rows in 262 millis.
+2013-05-17 23:06:41,334 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[htags] with cardinality[634]
+2013-05-17 23:06:41,381 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[htags] in 49 millis.
+2013-05-17 23:06:41,382 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[lang] with cardinality[19]
+2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[lang] in 17 millis.
+2013-05-17 23:06:41,398 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Starting dimension[utc_offset] with cardinality[32]
+2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - Completed dimension[utc_offset] in 15 millis.
+2013-05-17 23:06:41,413 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexMerger - outDir[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] completed inverted.drd in 81 millis.
+2013-05-17 23:06:41,425 INFO [twitterstream-incremental-persist] com.metamx.druid.index.v1.IndexIO$DefaultIndexIOHandler - Converting v8[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0/v8-tmp] to v9[/tmp/example/twitter_realtime/basePersist/twitterstream/2013-05-17T23:00:00.000Z_2013-05-18T00:00:00.000Z/0]
+2013-05-17 23:06:41,426 INFO [twitterstream-incremental-persist] 
+... ETC
+
+ +The logs are about building different columns, probably not the most exciting stuff (they might as well be in Vulcan) if are you learning about Druid for the first time. Nevertheless, if you are interested in the details of our real-time architecture and why we persist indexes to disk, I suggest you read our "White Paper":http://static.druid.io/docs/druid.pdf. + +Okay, things are about to get real (-time). To query the real-time node you've spun up, you can issue: +
./run_example_client.sh
+ +Select "twitter" once again. This script issues ["GroupByQuery":GroupByQuery.html]s to the twitter data we've been ingesting. The query looks like this: + +
{
+    "queryType": "groupBy",
+    "dataSource": "twitterstream",
+    "granularity": "all",
+    "dimensions": ["lang", "utc_offset"],
+    "aggregations":[
+      { "type": "count", "name": "rows"},
+      { "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
+    ],
+    "filter": { "type": "selector", "dimension": "lang", "value": "en" },
+    "intervals":["2012-10-01T00:00/2020-01-01T00"]
+}
+
+ +This is a **groupBy** query, which you may be familiar with from SQL. We are grouping, or aggregating, via the **dimensions** field: ["lang", "utc_offset"]. We are **filtering** via the **"lang"** dimension, to only look at english tweets. Our **aggregations** are what we are calculating: a row count, and the sum of the tweets in our data. + +The result looks something like this: + +
[
+    {
+        "version": "v1",
+        "timestamp": "2012-10-01T00:00:00.000Z",
+        "event": {
+            "utc_offset": "-10800",
+            "tweets": 90,
+            "lang": "en",
+            "rows": 81
+        }
+    },
+    {
+        "version": "v1",
+        "timestamp": "2012-10-01T00:00:00.000Z",
+        "event": {
+            "utc_offset": "-14400",
+            "tweets": 177,
+            "lang": "en",
+            "rows": 154
+        }
+    },
+...
+
+ +This data, plotted in a time series/distribution, looks something like this: + +!http://metamarkets.com/wp-content/uploads/2013/06/tweets_timezone_offset.png(Timezone / Tweets Scatter Plot)! + +This groupBy query is a bit complicated and we'll return to it later. For the time being, just make sure you are getting some blocks of data back. If you are having problems, make sure you have "curl":http://curl.haxx.se/ installed. Control+C to break out of the client script. + +h2. Querying Druid + +In your favorite editor, create the file: +
time_boundary_query.body
+ +Druid queries are JSON blobs which are relatively painless to create programmatically, but an absolute pain to write by hand. So anyway, we are going to create a Druid query by hand. Add the following to the file you just created: +
{

+  "queryType"  : "timeBoundary",
+  "dataSource" : "twitterstream"
+}
+
+ +The "TimeBoundaryQuery":TimeBoundaryQuery.html is one of the simplest Druid queries. To run the query, you can issue: +
 
+curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json'  -d @time_boundary_query.body
+
+ +We get something like this JSON back: + +
[ {
+  "timestamp" : "2013-06-10T19:09:00.000Z",
+  "result" : {
+    "minTime" : "2013-06-10T19:09:00.000Z",
+    "maxTime" : "2013-06-10T20:50:00.000Z"
+  }
+} ]
+
+ +That's the result. What information do you think the result is conveying? +... +If you said the result is indicating the maximum and minimum timestamps we've seen thus far (summarized to a minutely granularity), you are absolutely correct. I can see you are a person legitimately interested in learning about Druid. Let's explore a bit further. + +Return to your favorite editor and create the file: + +
timeseries_query.body
+ +We are going to make a slightly more complicated query, the "TimeseriesQuery":TimeseriesQuery.html. Copy and paste the following into the file: + +
{
+  "queryType":"timeseries",
+  "dataSource":"twitterstream",
+  "intervals":["2010-01-01/2020-01-01"],
+  "granularity":"all",
+  "aggregations":[
+      { "type": "count", "name": "rows"},
+      { "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
+  ]
+}
+
+ +You are probably wondering, what are these "Granularities":Granularities.html and "Aggregations":Aggregations.html things? What the query is doing is aggregating some metrics over some span of time. +To issue the query and get some results, run the following in your command line: +
curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json'  -d @timeseries_query.body
+ +Once again, you should get a JSON blob of text back with your results, that looks something like this: + +
[ {
+  "timestamp" : "2013-06-10T19:09:00.000Z",
+  "result" : {
+    "tweets" : 358562.0,
+    "rows" : 272271
+  }
+} ]
+
+ +If you issue the query again, you should notice your results updating. + +Right now all the results you are getting back are being aggregated into a single timestamp bucket. What if we wanted to see our aggregations on a per minute basis? What field can we change in the query to accomplish this? + +If you loudly exclaimed "we can change granularity to minute", you are absolutely correct again! We can specify different granularities to bucket our results, like so: + +
{
+  "queryType":"timeseries",
+  "dataSource":"twitterstream",
+  "intervals":["2010-01-01/2020-01-01"],
+  "granularity":"minute",
+  "aggregations":[
+      { "type": "count", "name": "rows"},
+      { "type": "doubleSum", "fieldName": "tweets", "name": "tweets"}
+  ]
+}
+
+ +This gives us something like the following: + +
[ {
+  "timestamp" : "2013-06-10T19:09:00.000Z",
+  "result" : {
+    "tweets" : 2650.0,
+    "rows" : 2120
+  }
+}, {
+  "timestamp" : "2013-06-10T19:10:00.000Z",
+  "result" : {
+    "tweets" : 3401.0,
+    "rows" : 2609
+  }
+}, {
+  "timestamp" : "2013-06-10T19:11:00.000Z",
+  "result" : {
+    "tweets" : 3472.0,
+    "rows" : 2610
+  }
+},
+...
+
+ +h2. Solving a Problem + +One of Druid's main powers (see what we did there?) is to provide answers to problems, so let's pose a problem. What if we wanted to know what the top hash tags are, ordered by the number tweets, where the language is english, over the last few minutes you've been reading this tutorial? To solve this problem, we have to return to the query we introduced at the very beginning of this tutorial, the "GroupByQuery":GroupByQuery.html. It would be nice if we could group by results by dimension value and somehow sort those results... and it turns out we can! + +Let's create the file: +
group_by_query.body
+and put the following in there: +
{
+    "queryType": "groupBy",
+    "dataSource": "twitterstream",
+    "granularity": "all",
+    "dimensions": ["htags"],
+    "orderBy": {"type":"default", "columns":[{"dimension": "tweets", "direction":"DESCENDING"}], "limit":5},
+    "aggregations":[
+      { "type": "longSum", "fieldName": "tweets", "name": "tweets"}
+    ],
+    "filter": {"type": "selector", "dimension": "lang", "value": "en" },
+    "intervals":["2012-10-01T00:00/2020-01-01T00"]
+}
+
+ +Woah! Our query just got a way more complicated. Now we have these "Filters":Filters.html things and this "OrderBy":OrderBy.html thing. Fear not, it turns out the new objects we've introduced to our query can help define the format of our results and provide an answer to our question. + +If you issue the query: +
curl -X POST 'http://localhost:8080/druid/v2/?pretty' -H 'content-type: application/json'  -d @group_by_query.body
+ +You should hopefully see an answer to our question. For my twitter stream, it looks like this: + +
[ {
+  "version" : "v1",
+  "timestamp" : "2012-10-01T00:00:00.000Z",
+  "event" : {
+    "tweets" : 2660,
+    "htags" : "android"
+  }
+}, {
+  "version" : "v1",
+  "timestamp" : "2012-10-01T00:00:00.000Z",
+  "event" : {
+    "tweets" : 1944,
+    "htags" : "E3"
+  }
+}, {
+  "version" : "v1",
+  "timestamp" : "2012-10-01T00:00:00.000Z",
+  "event" : {
+    "tweets" : 1927,
+    "htags" : "15SueñosPendientes"
+  }
+}, {
+  "version" : "v1",
+  "timestamp" : "2012-10-01T00:00:00.000Z",
+  "event" : {
+    "tweets" : 1717,
+    "htags" : "ipad"
+  }
+}, {
+  "version" : "v1",
+  "timestamp" : "2012-10-01T00:00:00.000Z",
+  "event" : {
+    "tweets" : 1515,
+    "htags" : "IDidntTextYouBackBecause"
+  }
+} ]
+
+ +Feel free to tweak other query parameters to answer other questions you may have about the data. + +h2. Additional Information + +This tutorial is merely showcasing a small fraction of what Druid can do. Next, continue on to "Loading Your Data":./Loading-Your-Data.html. + +And thus concludes our journey! Hopefully you learned a thing or two about Druid real-time ingestion, querying Druid, and how Druid can be used to solve problems. If you have additional questions, feel free to post in our "google groups page":http://www.groups.google.com/forum/#!forum/druid-development. diff --git a/docs/content/Versioning.md b/docs/content/Versioning.md index 6b9e79fe9d3..74b3acf8aa3 100644 --- a/docs/content/Versioning.md +++ b/docs/content/Versioning.md @@ -1,5 +1,5 @@ --- -layout: default +layout: doc_page --- This page discusses how we do versioning and provides information on our stable releases. @@ -8,13 +8,13 @@ Versioning Strategy We generally follow [semantic versioning](http://semver.org/). The general idea is -- “Major” version (leftmost): backwards incompatible, no guarantees exist about APIs between the versions -- “Minor” version (middle number): you can move forward from a smaller number to a larger number, but moving backwards *might* be incompatible. -- “bug-fix” version (“patch” or the rightmost): Interchangeable. The higher the number, the more things are fixed (hopefully), but the programming interfaces are completely compatible and you should be able to just drop in a new jar and have it work. +* "Major" version (leftmost): backwards incompatible, no guarantees exist about APIs between the versions +* "Minor" version (middle number): you can move forward from a smaller number to a larger number, but moving backwards *might* be incompatible. +* "bug-fix" version ("patch" or the rightmost): Interchangeable. The higher the number, the more things are fixed (hopefully), but the programming interfaces are completely compatible and you should be able to just drop in a new jar and have it work. -Note that this is defined in terms of programming API, **not** in terms of functionality. It is possible that a brand new awesome way of doing something is introduced in a “bug-fix” release version if it doesn’t add to the public API or change it. +Note that this is defined in terms of programming API, **not** in terms of functionality. It is possible that a brand new awesome way of doing something is introduced in a "bug-fix" release version if it doesn’t add to the public API or change it. -One exception for right now, while we are still in major version 0, we are considering the APIs to be in beta and are conflating “major” and “minor” so a minor version increase could be backwards incompatible for as long as we are at major version 0. These will be communicated via email on the group. +One exception for right now, while we are still in major version 0, we are considering the APIs to be in beta and are conflating "major" and "minor" so a minor version increase could be backwards incompatible for as long as we are at major version 0. These will be communicated via email on the group. For external deployments, we recommend running the stable release tag. Releases are considered stable after we have deployed them into our production environment and they have operated bug-free for some time. diff --git a/docs/content/ZooKeeper.md b/docs/content/ZooKeeper.md index d3e24e29ceb..771a60f41e0 100644 --- a/docs/content/ZooKeeper.md +++ b/docs/content/ZooKeeper.md @@ -1,10 +1,10 @@ --- -layout: default +layout: doc_page --- Druid uses ZooKeeper (ZK) for management of current cluster state. The operations that happen over ZK are 1. [Master](Master.html) leader election -2. Segment “publishing” protocol from [Compute](Compute.html) and [Realtime](Realtime.html) +2. Segment "publishing" protocol from [Compute](Compute.html) and [Realtime](Realtime.html) 3. Segment load/drop protocol between [Master](Master.html) and [Compute](Compute.html) ### Property Configuration @@ -13,45 +13,59 @@ ZooKeeper paths are set via the `runtime.properties` configuration file. Druid w There is a prefix path that is required and can be used as the only (well, kinda, see the note below) path-related zookeeper configuration parameter (everything else will be a default based on the prefix): - druid.zk.paths.base +``` +druid.zk.paths.base +``` You can also override each individual path (defaults are shown below): - druid.zk.paths.propertiesPath=${druid.zk.paths.base}/properties - druid.zk.paths.announcementsPath=${druid.zk.paths.base}/announcements - druid.zk.paths.servedSegmentsPath=${druid.zk.paths.base}/servedSegments - druid.zk.paths.loadQueuePath=${druid.zk.paths.base}/loadQueue - druid.zk.paths.masterPath=${druid.zk.paths.base}/master - druid.zk.paths.indexer.announcementsPath=${druid.zk.paths.base}/indexer/announcements - druid.zk.paths.indexer.tasksPath=${druid.zk.paths.base}/indexer/tasks - druid.zk.paths.indexer.statusPath=${druid.zk.paths.base}/indexer/status - druid.zk.paths.indexer.leaderLatchPath=${druid.zk.paths.base}/indexer/leaderLatchPath +``` +druid.zk.paths.propertiesPath=${druid.zk.paths.base}/properties +druid.zk.paths.announcementsPath=${druid.zk.paths.base}/announcements +druid.zk.paths.servedSegmentsPath=${druid.zk.paths.base}/servedSegments +druid.zk.paths.loadQueuePath=${druid.zk.paths.base}/loadQueue +druid.zk.paths.masterPath=${druid.zk.paths.base}/master +druid.zk.paths.indexer.announcementsPath=${druid.zk.paths.base}/indexer/announcements +druid.zk.paths.indexer.tasksPath=${druid.zk.paths.base}/indexer/tasks +druid.zk.paths.indexer.statusPath=${druid.zk.paths.base}/indexer/status +druid.zk.paths.indexer.leaderLatchPath=${druid.zk.paths.base}/indexer/leaderLatchPath +``` NOTE: We also use Curator’s service discovery module to expose some services via zookeeper. This also uses a zookeeper path, but this path is **not** affected by `druid.zk.paths.base` and **must** be specified separately. This property is - druid.zk.paths.discoveryPath +``` +druid.zk.paths.discoveryPath +``` ### Master Leader Election We use the Curator LeadershipLatch recipe to do leader election at path - ${druid.zk.paths.masterPath}/_MASTER +``` +${druid.zk.paths.masterPath}/_MASTER +``` -### Segment “publishing” protocol from Compute and Realtime +### Segment "publishing" protocol from Compute and Realtime The `announcementsPath` and `servedSegmentsPath` are used for this. All [Compute](Compute.html) and [Realtime](Realtime.html) nodes publish themselves on the `announcementsPath`, specifically, they will create an ephemeral znode at - ${druid.zk.paths.announcementsPath}/${druid.host} +``` +${druid.zk.paths.announcementsPath}/${druid.host} +``` Which signifies that they exist. They will also subsequently create a permanent znode at - ${druid.zk.paths.servedSegmentsPath}/${druid.host} +``` +${druid.zk.paths.servedSegmentsPath}/${druid.host} +``` And as they load up segments, they will attach ephemeral znodes that look like - ${druid.zk.paths.servedSegmentsPath}/${druid.host}/_segment_identifier_ +``` +${druid.zk.paths.servedSegmentsPath}/${druid.host}/_segment_identifier_ +``` Nodes like the [Master](Master.html) and [Broker](Broker.html) can then watch these paths to see which nodes are currently serving which segments. @@ -61,6 +75,8 @@ The `loadQueuePath` is used for this. When the [Master](Master.html) decides that a [Compute](Compute.html) node should load or drop a segment, it writes an ephemeral znode to - ${druid.zk.paths.loadQueuePath}/_host_of_compute_node/_segment_identifier +``` +${druid.zk.paths.loadQueuePath}/_host_of_compute_node/_segment_identifier +``` This node will contain a payload that indicates to the Compute node what it should do with the given segment. When the Compute node is done with the work, it will delete the znode in order to signify to the Master that it is complete. diff --git a/docs/content/contents.md b/docs/content/contents.md deleted file mode 100644 index 963f88926e1..00000000000 --- a/docs/content/contents.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -layout: default ---- -Contents -\* [Introduction|Home](Introduction|Home.html) -\* [Download](Download.html) -\* [Support](Support.html) -\* [Contribute](Contribute.html) -======================== - -Getting Started -\* [Tutorial: A First Look at Druid](Tutorial:-A-First-Look-at-Druid.html) -\* [Tutorial: The Druid Cluster](Tutorial:-The-Druid-Cluster.html) -\* [Loading Your Data](Loading-Your-Data.html) -\* [Querying Your Data](Querying-Your-Data.html) -\* [Booting a Production Cluster](Booting-a-Production-Cluster.html) -\* [Examples](Examples.html) -\* [Cluster Setup](Cluster-Setup.html) -\* [Configuration](Configuration.html) --------------------------------------- - -Data Ingestion -\* [Realtime](Realtime.html) -\* [Batch|Batch Ingestion](Batch|Batch-Ingestion.html) -\* [Indexing Service](Indexing-Service.html) ----------------------------- - -Querying -\* [Querying](Querying.html) -**\* ] -**\* [Aggregations](Aggregations.html) -**\* ] -**\* [Granularities](Granularities.html) -\* Query Types -**\* ] -****\* ] -****\* ] -**\* [SearchQuery](SearchQuery.html) -**\* ] -** [SegmentMetadataQuery](SegmentMetadataQuery.html) -**\* ] -**\* [TimeseriesQuery](TimeseriesQuery.html) ---------------------------- - -Architecture -\* [Design](Design.html) -\* [Segments](Segments.html) -\* Node Types -**\* ] -**\* [Broker](Broker.html) -**\* ] -****\* ] -**\* [Realtime](Realtime.html) -**\* ] -**\* [Plumber](Plumber.html) -\* External Dependencies -**\* ] -**\* [MySQL](MySQL.html) -**\* ] -** [Concepts and Terminology](Concepts-and-Terminology.html) -------------------------------- - -Development -\* [Versioning](Versioning.html) -\* [Build From Source](Build-From-Source.html) -\* [Libraries](Libraries.html) ------------------------- - -Misc -\* [Thanks](Thanks.html) -------------- diff --git a/docs/content/contents.textile b/docs/content/contents.textile new file mode 100644 index 00000000000..75e678e8e5b --- /dev/null +++ b/docs/content/contents.textile @@ -0,0 +1,70 @@ +--- +--- + +* [Introduction|Home](Introduction|Home.html) +* [Download](Download.html) +* [Support](Support.html) +* [Contribute](Contribute.html) +======================== + +Getting Started +* [Tutorial: A First Look at Druid](Tutorial:-A-First-Look-at-Druid.html) +* [Tutorial: The Druid Cluster](Tutorial:-The-Druid-Cluster.html) +* [Loading Your Data](Loading-Your-Data.html) +* [Querying Your Data](Querying-Your-Data.html) +* [Booting a Production Cluster](Booting-a-Production-Cluster.html) +* [Examples](Examples.html) +* [Cluster Setup](Cluster-Setup.html) +* [Configuration](Configuration.html) +-------------------------------------- + +Data Ingestion +* [Realtime](Realtime.html) +* [Batch|Batch Ingestion](Batch|Batch-Ingestion.html) +* [Indexing Service](Indexing-Service.html) +---------------------------- + +Querying +* [Querying](Querying.html) +*** ] +*** [Aggregations](Aggregations.html) +*** ] +*** [Granularities](Granularities.html) +* Query Types +*** ] +***** ] +***** ] +*** [SearchQuery](SearchQuery.html) +*** ] +** [SegmentMetadataQuery](SegmentMetadataQuery.html) +*** ] +*** [TimeseriesQuery](TimeseriesQuery.html) +--------------------------- + +Architecture +* [Design](Design.html) +* [Segments](Segments.html) +* Node Types +*** ] +*** [Broker](Broker.html) +*** ] +***** ] +*** [Realtime](Realtime.html) +*** ] +*** [Plumber](Plumber.html) +* External Dependencies +*** ] +*** [MySQL](MySQL.html) +*** ] +** [Concepts and Terminology](Concepts-and-Terminology.html) +------------------------------- + +Development +* [Versioning](Versioning.html) +* [Build From Source](Build-From-Source.html) +* [Libraries](Libraries.html) +------------------------ + +Misc +* [Thanks](Thanks.html) +------------- diff --git a/docs/content/css/bootstrap-responsive.css b/docs/content/css/bootstrap-responsive.css deleted file mode 100644 index 9570d1c2e40..00000000000 --- a/docs/content/css/bootstrap-responsive.css +++ /dev/null @@ -1,1058 +0,0 @@ -/*! - * Bootstrap Responsive v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: auto; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:hover { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: block; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/docs/content/css/bootstrap-responsive.min.css b/docs/content/css/bootstrap-responsive.min.css deleted file mode 100644 index 8eb78d8e67c..00000000000 --- a/docs/content/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/docs/content/css/bootstrap.css b/docs/content/css/bootstrap.css deleted file mode 100644 index 8dca0b71366..00000000000 --- a/docs/content/css/bootstrap.css +++ /dev/null @@ -1,5774 +0,0 @@ -/*! - * Bootstrap v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -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-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -.text-warning { - color: #c09853; -} - -.text-error { - color: #b94a48; -} - -.text-info { - color: #3a87ad; -} - -.text-success { - color: #468847; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 1; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1 { - font-size: 36px; - line-height: 40px; -} - -h2 { - font-size: 30px; - line-height: 40px; -} - -h3 { - font-size: 24px; - line-height: 40px; -} - -h4 { - font-size: 18px; - line-height: 20px; -} - -h5 { - font-size: 14px; - line-height: 20px; -} - -h6 { - font-size: 12px; - line-height: 20px; -} - -h1 small { - font-size: 24px; -} - -h2 small { - font-size: 18px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.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; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 25px; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 9px; - font-size: 14px; - line-height: 20px; - color: #555555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; - cursor: pointer; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"] { - float: left; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info > label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - margin-bottom: 5px; - font-size: 0; - white-space: nowrap; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - font-size: 14px; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append .add-on, -.input-append .btn { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child, -.table-bordered tfoot:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child, -.table-bordered tfoot:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover td, -.table-hover tbody tr:hover th { - background-color: #f5f5f5; -} - -table [class*=span], -.row-fluid table [class*=span] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table .span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table .span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table .span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table .span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table .span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table .span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table .span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table .span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table .span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table .span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table .span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table .span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} - -.table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} - -.table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} - -.table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} - -.table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} - -.table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} - -.table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} - -.table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} - -.table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} - -.table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} - -.table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} - -.table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} - -.table tbody tr.success td { - background-color: #dff0d8; -} - -.table tbody tr.error td { - background-color: #f2dede; -} - -.table tbody tr.warning td { - background-color: #fcf8e3; -} - -.table tbody tr.info td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/active states of certain elements */ - -.icon-white, -.nav-tabs > .active > a > [class^="icon-"], -.nav-tabs > .active > a > [class*=" icon-"], -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu li > a:focus, -.dropdown-submenu:hover > a { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; - background-color: #0081c2; - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .disabled > a, -.dropdown-menu .disabled > a:hover { - color: #999999; -} - -.dropdown-menu .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 14px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #bbbbbb; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-bottom-color: #a2a2a2; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 9px 14px; - font-size: 16px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn-large [class^="icon-"] { - margin-top: 2px; -} - -.btn-small { - padding: 3px 9px; - font-size: 12px; - line-height: 18px; -} - -.btn-small [class^="icon-"] { - margin-top: 0; -} - -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 17px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #c5c5c5; - border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-image: -moz-linear-gradient(top, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-toolbar .btn + .btn, -.btn-toolbar .btn-group + .btn, -.btn-toolbar .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 11px; -} - -.btn-group > .btn-small { - font-size: 12px; -} - -.btn-group > .btn-large { - font-size: 16px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-mini .caret, -.btn-small .caret, -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-top: 0; - border-bottom: 5px solid #000000; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical .btn { - display: block; - float: none; - width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - color: #c09853; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; - color: #777777; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - width: 100%; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse { - color: #999999; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-image: -moz-linear-gradient(top, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb .active { - color: #999999; -} - -.pagination { - height: 40px; - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 0 14px; - line-height: 38px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager a, -.pager span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next a, -.pager .next span { - float: right; -} - -.pager .previous a { - float: left; -} - -.pager .disabled a, -.pager .disabled a:hover, -.pager .disabled span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-open .modal .dropdown-menu { - z-index: 2050; -} - -.modal-open .modal .dropdown.open { - *z-index: 2050; -} - -.modal-open .modal .popover { - z-index: 2060; -} - -.modal-open .modal .tooltip { - z-index: 2080; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - width: 560px; - margin: -250px 0 0 -280px; - overflow: auto; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 50%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -3px; -} - -.tooltip.right { - margin-left: 3px; -} - -.tooltip.bottom { - margin-top: 3px; -} - -.tooltip.left { - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - 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-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - width: 236px; - padding: 1px; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-bottom: 10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-right: 10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: inline-block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow:after { - z-index: -1; - content: ""; -} - -.popover.top .arrow { - bottom: -10px; - left: 50%; - margin-left: -10px; - border-top-color: #ffffff; - border-width: 10px 10px 0; -} - -.popover.top .arrow:after { - bottom: -1px; - left: -11px; - border-top-color: rgba(0, 0, 0, 0.25); - border-width: 11px 11px 0; -} - -.popover.right .arrow { - top: 50%; - left: -10px; - margin-top: -10px; - border-right-color: #ffffff; - border-width: 10px 10px 10px 0; -} - -.popover.right .arrow:after { - bottom: -11px; - left: -1px; - border-right-color: rgba(0, 0, 0, 0.25); - border-width: 11px 11px 11px 0; -} - -.popover.bottom .arrow { - top: -10px; - left: 50%; - margin-left: -10px; - border-bottom-color: #ffffff; - border-width: 0 10px 10px; -} - -.popover.bottom .arrow:after { - top: -1px; - left: -11px; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-width: 0 11px 11px; -} - -.popover.left .arrow { - top: 50%; - right: -10px; - margin-top: -10px; - border-left-color: #ffffff; - border-width: 10px 0 10px 10px; -} - -.popover.left .arrow:after { - right: -1px; - bottom: -11px; - border-left-color: rgba(0, 0, 0, 0.25); - border-width: 11px 0 11px 11px; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.label, -.badge { - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 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: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel .item > img { - display: block; - line-height: 1; -} - -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} - -.carousel .active { - left: 0; -} - -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel .next { - left: 100%; -} - -.carousel .prev { - left: -100%; -} - -.carousel .next.left, -.carousel .prev.right { - left: 0; -} - -.carousel .active.left { - left: -100%; -} - -.carousel .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/docs/content/css/bootstrap.min.css b/docs/content/css/bootstrap.min.css deleted file mode 100644 index ef013cba233..00000000000 --- a/docs/content/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}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-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}.text-error{color:#b94a48}.text-info{color:#3a87ad}.text-success{color:#468847}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.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}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on,.input-append .btn{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}.table .span1{float:none;width:44px;margin-left:0}.table .span2{float:none;width:124px;margin-left:0}.table .span3{float:none;width:204px;margin-left:0}.table .span4{float:none;width:284px;margin-left:0}.table .span5{float:none;width:364px;margin-left:0}.table .span6{float:none;width:444px;margin-left:0}.table .span7{float:none;width:524px;margin-left:0}.table .span8{float:none;width:604px;margin-left:0}.table .span9{float:none;width:684px;margin-left:0}.table .span10{float:none;width:764px;margin-left:0}.table .span11{float:none;width:844px;margin-left:0}.table .span12{float:none;width:924px;margin-left:0}.table .span13{float:none;width:1004px;margin-left:0}.table .span14{float:none;width:1084px;margin-left:0}.table .span15{float:none;width:1164px;margin-left:0}.table .span16{float:none;width:1244px;margin-left:0}.table .span17{float:none;width:1324px;margin-left:0}.table .span18{float:none;width:1404px;margin-left:0}.table .span19{float:none;width:1484px;margin-left:0}.table .span20{float:none;width:1564px;margin-left:0}.table .span21{float:none;width:1644px;margin-left:0}.table .span22{float:none;width:1724px;margin-left:0}.table .span23{float:none;width:1804px;margin-left:0}.table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-tabs>.active>a>[class^="icon-"],.nav-tabs>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:17px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a,.pager span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a,.pager .next span{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999;cursor:default;background-color:#fff}.modal-open .modal .dropdown-menu{z-index:2050}.modal-open .modal .dropdown.open{*z-index:2050}.modal-open .modal .popover{z-index:2060}.modal-open .modal .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 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:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/docs/content/css/custom.css b/docs/content/css/custom.css deleted file mode 100644 index ce15235e889..00000000000 --- a/docs/content/css/custom.css +++ /dev/null @@ -1,592 +0,0 @@ -@font-face { - font-family: 'Conv_framd'; - src: url('../fonts/framd.eot'); - src: url('../fonts/framd.eot?#iefix') format('embedded-opentype'), - url('../fonts/framd.woff') format('woff'), - url('../fonts/framd.ttf') format('truetype'), - url('../fonts/framd.svg#heroregular') format('svg'); - font-weight: normal; - font-style: normal; -} - - -html, body { - position:relative; - height:100%; - min-height:100%; - height:100%; - color:#252525; - font:400 18px/26px 'Open Sans', Arial, Helvetica, sans-serif; - padding:0; - margin:0; - word-wrap:break-word; -} -a { - color:#6ab6dd; - position:relative; -} -a:hover { - text-decoration:underline; - color:#2c79a1; -} -.wrapper { - min-height:100%; -} -header { - margin:0 0 100px; -} -header .span12 { - padding:0 0 7px 0; -} -.logo.custom { - display:inline-block; - margin:0; - vertical-align:25px; -} -.logo.custom a { - background:url(../img/logo.png) no-repeat; - width: 110px; - height: 49px; - display:block; - text-indent:-9999px; -} -.custom.navbar { - margin:10px 0; -} -.custom.navbar .nav li { - padding:0 !important; -} -.custom.navbar .nav li a, .navbar .brand, .custom.navbar .nav li.pull-right span { - font:300 14px/20px 'Open Sans', Arial, Helvetica, sans-serif; - padding:10px 10px; -} -.navbar .brand.active { - color:#fff; -} -.custom.navbar .nav li.pull-right span { - padding-right:0; - color:#e76d4c !important; - display:block; -} -.custom.navbar .nav li a.doc-link { - padding:5px 10px 0; -} -.custom.navbar .nav li a.doc-link span { - display:inline-block; - background:url(../img/icon-git.png) no-repeat; - width: 28px; - height: 28px; - vertical-align:-7px; - margin-left:5px; -} -.custom.navbar .nav li a.doc-link:hover span, .custom.navbar .nav li.active a.doc-link span { - background-position:0 -28px; -} -.custom.navbar .nav { - float:none; -} -.navbar .nav > li.pull-right { - float:right; - padding:10px 0; -} -h1 { - font:300 48px/48px 'Open Sans', Arial, Helvetica, sans-serif; - margin:0 0 45px; -} -h1.index { - text-align:center; -} -h1 span { - display:block; - font:400 14px/28px 'Open Sans', Arial, Helvetica, sans-serif; -} -h2 { - font:30px/30px 'Conv_framd', Arial, Helvetica, sans-serif; - margin:0 0 20px; - color:#0f1e35; -} -h3 { - font:300 30px/36px 'Open Sans', Arial, Helvetica, sans-serif; - margin:0 0 33px; - text-align:center; -} -.btn { - display:block; - margin:0 auto 65px; - background:#6ab6dd; - border:none; - box-shadow:inset -3px -3px 3px #5592b1; - height:53px; - width:205px; - font:30px/53px 'Conv_framd', Arial, Helvetica, sans-serif; - color:#252424; - text-shadow:none; - padding:0; - z-index:100; - position:relative; -} -.btn a { - color:#252424; -} -.btn:hover { - background:#83c6e9; -} -.index-content { - margin:0 auto 60px; - text-align:center; -} -.third { - margin:0 auto 35px; -} -.third-item { - text-align:left; -} -.third-item:first-child { - margin:0; -} -.third-item a { - display:block; - font-family:'Open Sans', Arial, Helvetica, sans-serif; - font-weight:700; - font-size:30px; - margin:0 auto 20px; - color:#252424; - text-align:center; -} -.container.custom { - padding:0; - margin:0 auto; -} -.container.custom.main-cont { - padding-bottom:230px; -} -.text-part { - padding-top:70px; -} -.row-fluid.index-page { - padding-top:100px; -} -.index-page .content { - padding:15px 0 0; -} -.index-page h3 { - text-align:left; -} -.index-page .sidebar { - padding:65px 0 30px; -} -.container.custom p { - margin:0 0 17px; -} -.homepage .index-page .content h2 { - margin:0 0 20px; -} -.container.custom .unstyled { - margin:0; - color:#353535; -} -.container.custom .unstyled li { - margin:0 0 17px; -} -.container.custom .unstyled li span { - font-family:'Open Sans', Arial, Helvetica, sans-serif; - font-weight:700; - display:block; -} -.container.custom .unstyled li a { - display:inline; -} -.homepage h4 { - font:24px/24px 'Conv_framd', Arial, Helvetica, sans-serif; - margin:0 0 15px; -} -.container.custom .sidebar .unstyled { - margin:0 0 100px; -} -.container.custom .sidebar .unstyled li { - margin:0 0 12px; - border-bottom:1px solid #adadad; - padding: 5px 7px; -} -.grey-box { - background:#e5e4e3; - border-radius:3px; - -moz-border-radius:3px; - -webkit-border-radius:3px; - position:relative; - padding:20px 10px 130px; - color:#000; -} -footer { - text-align:center; - font-size:14px; - color:#000; - margin:-135px 0 0; -} -footer .container.custom { - border-top:1px solid #e1e1e1; - padding:20px 0 25px; -} -footer .span9 { - text-align:left; -} -footer .container.custom ul.unstyled { - display:inline-block; - margin:0 120px 30px 30px; - text-align:left; - vertical-align:top; -} -footer .container.custom ul.unstyled li { - font:300 14px/26px 'Open Sans', Arial, Helvetica, sans-serif; - margin:0; -} -footer .container.custom .unstyled li a { - color:#000; - font-weight:300; -} -footer .container.custom .unstyled li:first-child a { - font-weight:400; -} -footer ul li a:hover { - text-decoration:underline; - color:#fff; -} -footer .logo-block { - text-align:right; -} -footer .container.custom p { - display:inline-block; - margin:28px 0 0 10px; - text-align:left; -} -.contact-item { - margin:0 0 30px 30px; - text-align:left; - font-weight:300; -} -.contact-item a { - color:#000; -} -footer .contact-item span { - font-weight:400; - display:block; -} -footer .contact-item:first-child span { - text-transform:uppercase; -} -footer .span4 { - text-align:left; -} -footer .span5 { - padding-top: 75px; -} -.soc { - text-align:left; - margin:5px 0 0 0; -} -.soc a { - display:inline-block; - width:35px; - height:34px; - background:url(../img/icons-soc.png) no-repeat; -} -.soc a.github { - background-position:0 -34px; -} -.soc a.meet { - background-position:0 -68px; -} -.soc a.rss { - background-position:0 -102px; -} - -.text-item { - margin:0 0 75px; -} -.container.custom p.note { - text-align:center; - padding:30px 0 0; -} -.text-item strong { - font-weight:normal; - font-family:'Open Sans', Arial, Helvetica, sans-serif; - font-weight:700; -} -h2.date { - font-family:'Open Sans', Arial, Helvetica, sans-serif; - font-weight:400; -} -.blog h2.date { - margin:0 0 25px; -} -h2.date span { - display:block; - margin:0 0 5px; - padding:0 0 15px; - font-size:20px; - border-bottom:1px solid #ccc; -} -.blog h2.date a { - font-weight:700; -} -.blog.inner h2.date span:first-child { - display:block; - font-size:30px; - font-weight:700; - padding:0; - border:none; -} -.blog.inner h3 { - text-align:left; - font-size:25px; - font-weight:700; - margin:0 0 15px; -} -.blog.inner ul li { - margin-left: 50px; - line-height:26px; -} -.recent h3 { - font-size: 25px; - font-weight: 700; - margin: 0 0 15px; - text-align: left; -} -.recent ul li.active a { - color:#252525; -} -.border { - width:130px; - margin: 45px auto; - border-top:1px solid #dfdfdf; - border-top:1px solid #81807f; -} -.text-img { - display:block; - margin:0 auto 17px; -} -.indent p, .indent ul { - padding:0 0 0 50px; -} -.span3 { - margin-left:0; -} -.nav.nav-list.bs-docs-sidenav { - border:1px solid #e5e5e5; - border-radius:5px; - box-shadow:0 0 3px #f9f9f9; - padding:0; - width:auto; -} -.nav.nav-list.bs-docs-sidenav li { - border-top:1px solid #e5e5e5; -} -.nav.nav-list.bs-docs-sidenav li:first-child { - border:none; -} -.nav.nav-list.bs-docs-sidenav li:first-child a { - border-radius:5px 5px 0 0; - -moz-border-radius:5px 5px 0 0; - -webkit-border-radius:5px 5px 0 0; -} -.nav.nav-list.bs-docs-sidenav li:last-child, .nav.nav-list.bs-docs-sidenav li:last-child a { - border-radius:0 0 5px 5px; - -moz-border-radius:0 0 5px 5px; - -webkit-border-radius:0 0 5px 5px; -} -.nav.nav-list.bs-docs-sidenav li a { - padding:10px; - margin:0; - font-weight:400; - font-size:14px; - line-height:18px; -} -.icon-chevron-right { - float: right; - margin-right: -6px; - margin-top: 2px; - opacity: 0.25; -} -.indent ul li { - line-height:26px; -} -.span8 h3 { - text-align:left; - margin:0 0 50px; -} -.span8 h3 a { - font-weight:800; -} -.span8 h4 { - font:700 18px/26px 'Open Sans', Arial, Helvetica, sans-serif; - margin:0 0 20px; -} -.span8 p span { - font-weight:700; -} -header.index-head { - background:#f9f9f9; - margin:0 0 30px; -} -header.index-head .span12 { - margin-bottom:80px; -} -.index-content h2 { - text-align:center; -} -.third-item img { - display:block; - margin:0 auto 70px; -} -.container.custom .third-item p { - margin:0 0 0 20px; -} -.row-fluid { - margin:0; - padding:0; -} -.nav-list [class^="icon-"] { - margin-right:-2px; -} -@media (min-width: 1200px) { - .custom.navbar .nav li a, .navbar .brand, .custom.navbar .nav li.pull-right span { - padding: 10px 20px; - font-size:16px; - } - .nav.nav-list.bs-docs-sidenav { - width:258px; - } - .container.custom .recent ul.unstyled { - margin-right:100px; - } -} -@media (max-width: 980px) { - .container.custom { - width:95%; - } - .bs-docs-sidenav.affix { - position: static; - top: 0; - width: 100%; - } - .nav.nav-list.bs-docs-sidenav { - width:100%; - margin-bottom:20px; - } -} -@media only screen -and (min-device-width : 710px) -and (max-device-width : 770px) { - .container.custom { - width:700px; - position:relative; - } - .custom.navbar .nav li { - font-size:22px; - padding:0 10px; - } - .nav.nav-list.bs-docs-sidenav.affix { - position:fixed; - top:175px; - width:218px; - } -} -@media only screen and (min-device-width : 770px) -and (max-device-width : 810px) { - .container.custom { - width:700px; - } - .custom.navbar .nav li { - font-size:15px; - padding:0 15px; - } - .custom.navbar .nav { - margin-left:30px; - } -} -@media only screen -and (min-device-width : 320px) -and (max-device-width : 480px) { - .container.custom { - width:100%; - margin:0; - } - footer .logo-block { - text-align: left; - padding-left:30px; - } - .offset1, .row-fluid .offset1:first-child { - margin:0; - } - .indent p, .indent ul { - padding:0; - } - .indent, .blog, .recent h3, .recent ul, .text-part { - padding:0 20px; - } - .index-head h3 { - font-size:20px; - } - .index-content { - padding:0 20px; - } - .content h2, .content h3, .content ul.unstyled, .sidebar h3 { - padding:0 20px; - } - h1 { - padding:0 20px; - } -} -@media (max-width: 320px) { - .container.custom { - width:100%; - } - footer .logo-block { - text-align: left; - padding-left:30px; - } - footer .container.custom p { - margin-top:10px; - } - .offset1, .row-fluid .offset1:first-child { - margin:0; - } - .indent p, .indent ul { - padding:0; - } - .indent, .blog, .recent h3, .recent ul, .text-part { - padding:0 20px; - } - .index-head h3 { - font-size:25px; - line-height:30px; - padding:0 20px; - } - .index-content { - padding:0 20px; - } - .content h2, .content h3, .content ul.unstyled, .sidebar h3 { - padding:0 20px; - } - h1 { - padding:0 20px; - } -} -.container.custom .faq-page p { - margin-bottom:10px; -} -.index-head h3 { - margin-bottom:50px; -} -h1.center { - text-align:center; -} -.btn.btn-navbar { - height:auto; - width:auto; - margin:10px 0 0; -} -.navbar-inner { - z-index:100000; - position:relative; -} diff --git a/docs/content/css/default.html b/docs/content/css/default.html deleted file mode 100644 index 12106274e0f..00000000000 --- a/docs/content/css/default.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Druid | {{page.title}} - - - - - - - - - - - -
- -
-
-
- -
-
- {% if page.id == 'home' %} -

Druid is open-source infrastructure for real²time exploratory analytics on large datasets.

- - {% endif %} -
- -
- - {{ content }} - -
-
- - - - - - diff --git a/docs/content/css/docs.css b/docs/content/css/docs.css new file mode 100644 index 00000000000..da63bc09095 --- /dev/null +++ b/docs/content/css/docs.css @@ -0,0 +1,56 @@ +.doc-content pre, .doc-content pre code { + overflow: auto; + white-space: pre; + word-wrap: normal; +} + +.doc-content p { + margin: 18px 0 18px 0; +} + +/*** HACK: This is a horrible hack, but I have no clue why images don't want to stay in the container **/ +.doc-content img { + max-width: 847.5px; +} + +.doc-content code { + background-color: #e0e0e0; +} + +.doc-content pre code { + background-color: transparent; +} + +.doc-content table, +.doc-content pre { + margin: 35px 0 35px 0; +} + +.doc-content table, +.doc-content table > thead > tr > th, +.doc-content table > tbody > tr > th, +.doc-content table > tfoot > tr > th, +.doc-content table > thead > tr > td, +.doc-content table > tbody > tr > td, +.doc-content table > tfoot > tr > td { + border: 1px solid #dddddd; +} + +.doc-content table > thead > tr > th, +.doc-content table > thead > tr > td { + border-bottom-width: 2px; +} + +.doc-content table > tbody > tr:nth-child(odd) > td, +.doc-content table > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.doc-content table > tbody > tr:hover > td, +.doc-content table > tbody > tr:hover > th { + background-color: #d5d5d5; +} + +.doc-content table code { + background-color: transparent; +} \ No newline at end of file diff --git a/docs/content/css/docs.html b/docs/content/css/docs.html deleted file mode 100644 index cb38f8c336e..00000000000 --- a/docs/content/css/docs.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: default ---- -
- - {{ content }} - -
diff --git a/docs/content/css/main.css b/docs/content/css/main.css deleted file mode 100755 index 50a818048ad..00000000000 --- a/docs/content/css/main.css +++ /dev/null @@ -1,160 +0,0 @@ -/*****************************************************************************/ -/* -/* Common -/* -/*****************************************************************************/ - -/* Global Reset */ -* { - margin: 0; - padding: 0; -} - -html, body { height: 100%; } - -body { - background-color: #FFF; - font: 13.34px Helvetica, Arial, sans-serif; - font-size: small; - text-align: center; -} - -h1, h2, h3, h4, h5, h6 { - font-size: 100%; } - -h1 { margin-bottom: 1em; } -p { margin: 1em 0; } - -a { color: #00a; } -a:hover { color: #000; } -a:visited { color: #a0a; } - -/*****************************************************************************/ -/* -/* Home -/* -/*****************************************************************************/ -ul.posts { - list-style-type: none; - margin-bottom: 2em; -} - -ul.posts li { - line-height: 1.75em; -} - -ul.posts span { - color: #aaa; - font-family: Monaco, "Courier New", monospace; - font-size: 80%; -} - -/*****************************************************************************/ -/* -/* Site -/* -/*****************************************************************************/ - -.site { - font-size: 115%; - text-align: justify; - width: 42em; - margin: 3em auto 2em; - line-height: 1.5em; -} - -.site .header a { - font-weight: bold; - text-decoration: none; -} - -.site .header h1.title { - display: inline-block; - margin-bottom: 2em; -} - -.site .header h1.title a { - color: #a00; -} - -.site .header h1.title a:hover { - color: #000; -} - -.site .header a.extra { - color: #aaa; - margin-left: 1em; -} - -.site .header a.extra:hover { - color: #000; -} - -.site .meta { - color: #aaa; -} - -.site .footer { - font-size: 80%; - color: #666; - border-top: 4px solid #eee; - margin-top: 2em; - overflow: hidden; -} - -.site .footer .contact { - float: left; - margin-right: 3em; -} - -.site .footer .contact a { - color: #8085C1; -} - -.site .footer .rss { - margin-top: 1.1em; - margin-right: -.2em; - float: right; -} - -.site .footer .rss img { - border: 0; -} - -/*****************************************************************************/ -/* -/* Posts -/* -/*****************************************************************************/ - -/* standard */ -.post pre { - border: 1px solid #ddd; - background-color: #eef; - padding: 0 .4em; -} - -.post ul, .post ol { - margin-left: 1.35em; -} - -.post code { - border: 1px solid #ddd; - background-color: #eef; - padding: 0 .2em; -} - -.post pre code { - border: none; -} - -/* terminal */ -.post pre.terminal { - border: 1px solid #000; - background-color: #333; - color: #FFF; -} - -.post pre.terminal code { - background-color: #333; -} diff --git a/docs/content/css/page.html b/docs/content/css/page.html deleted file mode 100644 index b5ebfb17ace..00000000000 --- a/docs/content/css/page.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: default ---- - -
-
- - {{ content }} - -
-
diff --git a/docs/content/css/pie.htc b/docs/content/css/pie.htc deleted file mode 100644 index ca3b54700cc..00000000000 --- a/docs/content/css/pie.htc +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - diff --git a/docs/content/css/post.html b/docs/content/css/post.html deleted file mode 100644 index affb233fd23..00000000000 --- a/docs/content/css/post.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: default -sectionid: blog ---- - -
-
-

Recent posts

- -
- -
-
-

- {{ page.title }} - {{ page.date | date: "%B %e, %Y" }} · {{ page.author | upcase }} -

- - {% if page.image %}{{ page.title }}{% endif %} - - {{ content }} - -
- - - comments powered by Disqus - -
-
-
diff --git a/docs/content/css/syntax.css b/docs/content/css/syntax.css deleted file mode 100644 index 1e651cf79db..00000000000 --- a/docs/content/css/syntax.css +++ /dev/null @@ -1,60 +0,0 @@ -.highlight { background: #ffffff; } -.highlight .c { color: #999988; font-style: italic } /* Comment */ -.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -.highlight .k { font-weight: bold } /* Keyword */ -.highlight .o { font-weight: bold } /* Operator */ -.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ -.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ -.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #aa0000 } /* Generic.Error */ -.highlight .gh { color: #999999 } /* Generic.Heading */ -.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ -.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ -.highlight .go { color: #888888 } /* Generic.Output */ -.highlight .gp { color: #555555 } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ -.highlight .gt { color: #aa0000 } /* Generic.Traceback */ -.highlight .kc { font-weight: bold } /* Keyword.Constant */ -.highlight .kd { font-weight: bold } /* Keyword.Declaration */ -.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ -.highlight .m { color: #009999 } /* Literal.Number */ -.highlight .s { color: #d14 } /* Literal.String */ -.highlight .na { color: #008080 } /* Name.Attribute */ -.highlight .nb { color: #0086B3 } /* Name.Builtin */ -.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ -.highlight .no { color: #008080 } /* Name.Constant */ -.highlight .ni { color: #800080 } /* Name.Entity */ -.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ -.highlight .nn { color: #555555 } /* Name.Namespace */ -.highlight .nt { color: #000080 } /* Name.Tag */ -.highlight .nv { color: #008080 } /* Name.Variable */ -.highlight .ow { font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #009999 } /* Literal.Number.Float */ -.highlight .mh { color: #009999 } /* Literal.Number.Hex */ -.highlight .mi { color: #009999 } /* Literal.Number.Integer */ -.highlight .mo { color: #009999 } /* Literal.Number.Oct */ -.highlight .sb { color: #d14 } /* Literal.String.Backtick */ -.highlight .sc { color: #d14 } /* Literal.String.Char */ -.highlight .sd { color: #d14 } /* Literal.String.Doc */ -.highlight .s2 { color: #d14 } /* Literal.String.Double */ -.highlight .se { color: #d14 } /* Literal.String.Escape */ -.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ -.highlight .si { color: #d14 } /* Literal.String.Interpol */ -.highlight .sx { color: #d14 } /* Literal.String.Other */ -.highlight .sr { color: #009926 } /* Literal.String.Regex */ -.highlight .s1 { color: #d14 } /* Literal.String.Single */ -.highlight .ss { color: #990073 } /* Literal.String.Symbol */ -.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #008080 } /* Name.Variable.Class */ -.highlight .vg { color: #008080 } /* Name.Variable.Global */ -.highlight .vi { color: #008080 } /* Name.Variable.Instance */ -.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/content/css/toc.css b/docs/content/css/toc.css new file mode 100644 index 00000000000..c074ef7d79a --- /dev/null +++ b/docs/content/css/toc.css @@ -0,0 +1,6 @@ +.toc ul { + list-style: none; + list-style-position: inside; + padding-left: 15px; +} + diff --git a/docs/content/toc.textile b/docs/content/toc.textile new file mode 100644 index 00000000000..e4ed908a559 --- /dev/null +++ b/docs/content/toc.textile @@ -0,0 +1,65 @@ +--- +--- + + + +h1. Contents +* "Introduction":./Home.html +* "Download":./Download.html +* "Support":./Support.html +* "Contribute":./Contribute.html + +h2. Getting Started +* "Tutorial: A First Look at Druid":./Tutorial:-A-First-Look-at-Druid.html +* "Tutorial: The Druid Cluster":./Tutorial:-The-Druid-Cluster.html +* "Loading Your Data":./Loading-Your-Data.html +* "Querying Your Data":./Querying-your-data.html +* "Booting a Production Cluster":./Booting-a-production-cluster.html +* "Examples":./Examples.html +* "Configuration":Configuration.html + +h2. Data Ingestion +* "Realtime":./Realtime.html +* "Batch":./Batch-ingestion.html +* "Indexing Service":./Indexing-Service.html + +h2. Querying +* "Querying":./Querying.html +** "Filters":./Filters.html +** "Aggregations":./Aggregations.html +** "Post Aggregations":./Post-aggregations.html +** "Granularities":./Granularities.html +* Query Types +** "GroupByQuery":./GroupByQuery.html +*** "OrderBy":./OrderBy.html +*** "Having":./Having.html +** "SearchQuery":./Having.html +*** "SearchQuerySpec":./SearchQuerySpec.html +** "SegmentMetadataQuery":./SegmentMetadataQuery.html +** "TimeBoundaryQuery":./TimeBoundaryQuery.html +** "TimeseriesQuery":./TimeseriesQuery.html + +h2. Architecture +* "Design":./Design.html +* "Segments":./Segments.html +* Node Types +** "Compute":./Compute.html +** "Broker":./Broker.html +** "Master":./Master.html +*** "Rule Configuration":./Rule-Configuration.html +** "Realtime":./Realtime.html +*** "Firehose":./Firehose.html +*** "Plumber":./Plumber.html +* External Dependencies +** "Deep Storage":./Deep-Storage.html +** "MySQL":./MySQL.html +** "ZooKeeper":./ZooKeeper.html +* "Concepts and Terminology":./Concepts-and-Terminology.html + +h2. Development +* "Versioning":./Versioning.html +* "Build From Source":./Build-from-source.html +* "Libraries":./Libraries.html + +h2. Misc +* "Thanks":./Thanks.html \ No newline at end of file diff --git a/docs/css/blogs.css b/docs/css/blogs.css new file mode 100644 index 00000000000..5da711170cd --- /dev/null +++ b/docs/css/blogs.css @@ -0,0 +1,14 @@ +.blog-listing { + margin-bottom: 70px; +} + +.blog-entry { + margin-bottom: 70px; +} + +.recents ul li { + font-weight: 400; + margin-bottom: 15px; +} + + diff --git a/docs/css/index.css b/docs/css/index.css new file mode 100644 index 00000000000..d41ee794334 --- /dev/null +++ b/docs/css/index.css @@ -0,0 +1,21 @@ +.sub-text { + margin-top: 20px; + margin-bottom: 50px; +} + +.main-marketing { + margin-bottom: 50px; +} + +.main-marketing a { + color: #000000; +} + +h2 { + font-weight: 400; + font-size: 30px; +} + +.main-marketing img { + margin-bottom: 40px; +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index c7268192374..844b49e4ee2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,13 +1,7 @@ ---- -layout: default -title: Your New Jekyll Site ---- - -
-

Blog Posts

-
    - {% for post in site.posts %} -
  • {{ post.date | date_to_string }} » {{ post.title }}
  • - {% endfor %} -
-
\ No newline at end of file + + + + + + + diff --git a/indexing-service/src/main/java/io/druid/indexing/coordinator/ForkingTaskRunner.java b/indexing-service/src/main/java/io/druid/indexing/coordinator/ForkingTaskRunner.java index 382aaed6ece..e18a806f338 100644 --- a/indexing-service/src/main/java/io/druid/indexing/coordinator/ForkingTaskRunner.java +++ b/indexing-service/src/main/java/io/druid/indexing/coordinator/ForkingTaskRunner.java @@ -200,12 +200,12 @@ public class ForkingTaskRunner implements TaskRunner, TaskLogStreamer command.add("io.druid.cli.Main"); command.add("internal"); command.add("peon"); + command.add(taskFile.toString()); + command.add(statusFile.toString()); String nodeType = task.getNodeType(); if (nodeType != null) { command.add(String.format("--nodeType %s", nodeType)); } - command.add(taskFile.toString()); - command.add(statusFile.toString()); jsonMapper.writeValue(taskFile, task); diff --git a/server/src/main/java/io/druid/client/selector/Server.java b/server/src/main/java/io/druid/client/selector/Server.java index 664d621136e..79fc216a12b 100644 --- a/server/src/main/java/io/druid/client/selector/Server.java +++ b/server/src/main/java/io/druid/client/selector/Server.java @@ -25,5 +25,6 @@ public interface Server { public String getScheme(); public String getHost(); + public String getAddress(); public int getPort(); } diff --git a/server/src/main/java/io/druid/curator/discovery/CuratorServiceAnnouncer.java b/server/src/main/java/io/druid/curator/discovery/CuratorServiceAnnouncer.java index 633b987a88a..2a0eb3b770c 100644 --- a/server/src/main/java/io/druid/curator/discovery/CuratorServiceAnnouncer.java +++ b/server/src/main/java/io/druid/curator/discovery/CuratorServiceAnnouncer.java @@ -62,7 +62,7 @@ public class CuratorServiceAnnouncer implements ServiceAnnouncer try { instance = ServiceInstance.builder() .name(serviceName) - .address(service.getHost()) + .address(service.getHostNoPort()) .port(service.getPort()) .build(); } diff --git a/server/src/main/java/io/druid/curator/discovery/DiscoveryModule.java b/server/src/main/java/io/druid/curator/discovery/DiscoveryModule.java index 36e13f2e144..f3fc56d59a7 100644 --- a/server/src/main/java/io/druid/curator/discovery/DiscoveryModule.java +++ b/server/src/main/java/io/druid/curator/discovery/DiscoveryModule.java @@ -147,9 +147,9 @@ public class DiscoveryModule implements Module final Injector injector, final Set> nodesToAnnounce, final Lifecycle lifecycle - ) + ) throws Exception { - lifecycle.addHandler( + lifecycle.addMaybeStartHandler( new Lifecycle.Handler() { private volatile List nodes = null; @@ -203,7 +203,7 @@ public class DiscoveryModule implements Module .client(curator) .build(); - lifecycle.addHandler( + lifecycle.addMaybeStartHandler( new Lifecycle.Handler() { @Override diff --git a/server/src/main/java/io/druid/curator/discovery/ServerDiscoverySelector.java b/server/src/main/java/io/druid/curator/discovery/ServerDiscoverySelector.java index b7cd72abf17..fe716715ad3 100644 --- a/server/src/main/java/io/druid/curator/discovery/ServerDiscoverySelector.java +++ b/server/src/main/java/io/druid/curator/discovery/ServerDiscoverySelector.java @@ -63,6 +63,12 @@ public class ServerDiscoverySelector implements DiscoverySelector { @Override public String getHost() + { + return String.format("%s:%d", getAddress(), getPort()); + } + + @Override + public String getAddress() { return instance.getAddress(); } diff --git a/services/src/main/java/io/druid/cli/CliOverlord.java b/services/src/main/java/io/druid/cli/CliOverlord.java index 446283e0dee..c8fe70ab2b8 100644 --- a/services/src/main/java/io/druid/cli/CliOverlord.java +++ b/services/src/main/java/io/druid/cli/CliOverlord.java @@ -19,6 +19,8 @@ package io.druid.cli; +import com.fasterxml.jackson.databind.jsontype.NamedType; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.common.collect.ImmutableList; import com.google.inject.Binder; import com.google.inject.Injector; @@ -28,6 +30,10 @@ import com.google.inject.TypeLiteral; import com.google.inject.multibindings.MapBinder; import com.google.inject.servlet.GuiceFilter; import com.metamx.common.logger.Logger; +import druid.examples.flights.FlightsFirehoseFactory; +import druid.examples.rand.RandomFirehoseFactory; +import druid.examples.twitter.TwitterSpritzerFirehoseFactory; +import druid.examples.web.WebFirehoseFactory; import io.airlift.command.Command; import io.druid.guice.IndexingServiceModuleHelper; import io.druid.guice.JacksonConfigProvider; @@ -41,6 +47,8 @@ import io.druid.guice.PolyBind; import io.druid.indexing.common.actions.LocalTaskActionClientFactory; import io.druid.indexing.common.actions.TaskActionClientFactory; import io.druid.indexing.common.actions.TaskActionToolbox; +import io.druid.indexing.common.index.EventReceiverFirehoseFactory; +import io.druid.indexing.common.index.StaticS3FirehoseFactory; import io.druid.indexing.common.tasklogs.SwitchingTaskLogStreamer; import io.druid.indexing.common.tasklogs.TaskLogStreamer; import io.druid.indexing.common.tasklogs.TaskLogs; @@ -69,6 +77,12 @@ import io.druid.indexing.coordinator.scaling.ResourceManagementStrategy; import io.druid.indexing.coordinator.scaling.SimpleResourceManagementConfig; import io.druid.indexing.coordinator.scaling.SimpleResourceManagementStrategy; import io.druid.indexing.coordinator.setup.WorkerSetupData; +import io.druid.initialization.DruidModule; +import io.druid.segment.realtime.firehose.ClippedFirehoseFactory; +import io.druid.segment.realtime.firehose.IrcFirehoseFactory; +import io.druid.segment.realtime.firehose.KafkaFirehoseFactory; +import io.druid.segment.realtime.firehose.RabbitMQFirehoseFactory; +import io.druid.segment.realtime.firehose.TimedShutoffFirehoseFactory; import io.druid.server.http.RedirectFilter; import io.druid.server.http.RedirectInfo; import io.druid.server.initialization.JettyServerInitializer; @@ -84,6 +98,7 @@ import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlets.GzipFilter; import org.eclipse.jetty.util.resource.ResourceCollection; +import java.util.Arrays; import java.util.List; /** @@ -105,7 +120,7 @@ public class CliOverlord extends ServerRunnable protected List getModules() { return ImmutableList.of( - new Module() + new DruidModule() { @Override public void configure(Binder binder) @@ -199,6 +214,27 @@ public class CliOverlord extends ServerRunnable JsonConfigProvider.bind(binder, "druid.indexer.autoscale", SimpleResourceManagementConfig.class); } + + @Override + public List getJacksonModules() + { + return Arrays.asList( + new SimpleModule("RealtimeModule") + .registerSubtypes( + new NamedType(TwitterSpritzerFirehoseFactory.class, "twitzer"), + new NamedType(FlightsFirehoseFactory.class, "flights"), + new NamedType(RandomFirehoseFactory.class, "rand"), + new NamedType(WebFirehoseFactory.class, "webstream"), + new NamedType(KafkaFirehoseFactory.class, "kafka-0.7.2"), + new NamedType(RabbitMQFirehoseFactory.class, "rabbitmq"), + new NamedType(ClippedFirehoseFactory.class, "clipped"), + new NamedType(TimedShutoffFirehoseFactory.class, "timed"), + new NamedType(IrcFirehoseFactory.class, "irc"), + new NamedType(StaticS3FirehoseFactory.class, "s3"), + new NamedType(EventReceiverFirehoseFactory.class, "receiver") + ) + ); + } } ); } diff --git a/services/src/main/java/io/druid/cli/CliPeon.java b/services/src/main/java/io/druid/cli/CliPeon.java index b4b9ce4e661..46edf595802 100644 --- a/services/src/main/java/io/druid/cli/CliPeon.java +++ b/services/src/main/java/io/druid/cli/CliPeon.java @@ -19,6 +19,8 @@ package io.druid.cli; +import com.fasterxml.jackson.databind.jsontype.NamedType; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.inject.Binder; @@ -28,6 +30,10 @@ import com.google.inject.Module; import com.google.inject.multibindings.MapBinder; import com.metamx.common.lifecycle.Lifecycle; import com.metamx.common.logger.Logger; +import druid.examples.flights.FlightsFirehoseFactory; +import druid.examples.rand.RandomFirehoseFactory; +import druid.examples.twitter.TwitterSpritzerFirehoseFactory; +import druid.examples.web.WebFirehoseFactory; import io.airlift.command.Arguments; import io.airlift.command.Command; import io.airlift.command.Option; @@ -45,18 +51,26 @@ import io.druid.indexing.common.actions.RemoteTaskActionClientFactory; import io.druid.indexing.common.actions.TaskActionClientFactory; import io.druid.indexing.common.config.TaskConfig; import io.druid.indexing.common.index.ChatHandlerProvider; +import io.druid.indexing.common.index.EventReceiverFirehoseFactory; import io.druid.indexing.common.index.EventReceivingChatHandlerProvider; import io.druid.indexing.common.index.NoopChatHandlerProvider; +import io.druid.indexing.common.index.StaticS3FirehoseFactory; import io.druid.indexing.coordinator.TaskRunner; import io.druid.indexing.coordinator.ThreadPoolTaskRunner; import io.druid.indexing.worker.executor.ChatHandlerResource; import io.druid.indexing.worker.executor.ExecutorLifecycle; import io.druid.indexing.worker.executor.ExecutorLifecycleConfig; +import io.druid.initialization.DruidModule; import io.druid.query.QuerySegmentWalker; import io.druid.segment.loading.DataSegmentKiller; import io.druid.segment.loading.S3DataSegmentKiller; import io.druid.segment.loading.SegmentLoaderConfig; import io.druid.segment.loading.StorageLocationConfig; +import io.druid.segment.realtime.firehose.ClippedFirehoseFactory; +import io.druid.segment.realtime.firehose.IrcFirehoseFactory; +import io.druid.segment.realtime.firehose.KafkaFirehoseFactory; +import io.druid.segment.realtime.firehose.RabbitMQFirehoseFactory; +import io.druid.segment.realtime.firehose.TimedShutoffFirehoseFactory; import io.druid.server.initialization.JettyServerInitializer; import org.eclipse.jetty.server.Server; @@ -90,7 +104,7 @@ public class CliPeon extends GuiceRunnable protected List getModules() { return ImmutableList.of( - new Module() + new DruidModule() { @Override public void configure(Binder binder) @@ -143,6 +157,27 @@ public class CliPeon extends GuiceRunnable LifecycleModule.register(binder, Server.class); } + + @Override + public List getJacksonModules() + { + return Arrays.asList( + new SimpleModule("RealtimeModule") + .registerSubtypes( + new NamedType(TwitterSpritzerFirehoseFactory.class, "twitzer"), + new NamedType(FlightsFirehoseFactory.class, "flights"), + new NamedType(RandomFirehoseFactory.class, "rand"), + new NamedType(WebFirehoseFactory.class, "webstream"), + new NamedType(KafkaFirehoseFactory.class, "kafka-0.7.2"), + new NamedType(RabbitMQFirehoseFactory.class, "rabbitmq"), + new NamedType(ClippedFirehoseFactory.class, "clipped"), + new NamedType(TimedShutoffFirehoseFactory.class, "timed"), + new NamedType(IrcFirehoseFactory.class, "irc"), + new NamedType(StaticS3FirehoseFactory.class, "s3"), + new NamedType(EventReceiverFirehoseFactory.class, "receiver") + ) + ); + } } ); } diff --git a/services/src/main/java/io/druid/cli/CliRealtimeExample.java b/services/src/main/java/io/druid/cli/CliRealtimeExample.java index 0dcbfe6d99b..e0ad5b471cd 100644 --- a/services/src/main/java/io/druid/cli/CliRealtimeExample.java +++ b/services/src/main/java/io/druid/cli/CliRealtimeExample.java @@ -35,9 +35,16 @@ import io.druid.client.InventoryView; import io.druid.client.ServerView; import io.druid.guice.NoopSegmentPublisherProvider; import io.druid.guice.RealtimeModule; +import io.druid.indexing.common.index.EventReceiverFirehoseFactory; +import io.druid.indexing.common.index.StaticS3FirehoseFactory; import io.druid.initialization.DruidModule; import io.druid.segment.loading.DataSegmentPusher; import io.druid.segment.realtime.SegmentPublisher; +import io.druid.segment.realtime.firehose.ClippedFirehoseFactory; +import io.druid.segment.realtime.firehose.IrcFirehoseFactory; +import io.druid.segment.realtime.firehose.KafkaFirehoseFactory; +import io.druid.segment.realtime.firehose.RabbitMQFirehoseFactory; +import io.druid.segment.realtime.firehose.TimedShutoffFirehoseFactory; import io.druid.server.coordination.DataSegmentAnnouncer; import io.druid.timeline.DataSegment; @@ -88,7 +95,14 @@ public class CliRealtimeExample extends ServerRunnable new NamedType(TwitterSpritzerFirehoseFactory.class, "twitzer"), new NamedType(FlightsFirehoseFactory.class, "flights"), new NamedType(RandomFirehoseFactory.class, "rand"), - new NamedType(WebFirehoseFactory.class, "webstream") + new NamedType(WebFirehoseFactory.class, "webstream"), + new NamedType(KafkaFirehoseFactory.class, "kafka"), + new NamedType(RabbitMQFirehoseFactory.class, "rabbitmq"), + new NamedType(ClippedFirehoseFactory.class, "clipped"), + new NamedType(TimedShutoffFirehoseFactory.class, "timed"), + new NamedType(IrcFirehoseFactory.class, "irc"), + new NamedType(StaticS3FirehoseFactory.class, "s3"), + new NamedType(EventReceiverFirehoseFactory.class, "receiver") ) ); } diff --git a/services/src/main/java/io/druid/cli/convert/ConvertProperties.java b/services/src/main/java/io/druid/cli/convert/ConvertProperties.java index 7c97b4a8012..314ec107194 100644 --- a/services/src/main/java/io/druid/cli/convert/ConvertProperties.java +++ b/services/src/main/java/io/druid/cli/convert/ConvertProperties.java @@ -85,6 +85,8 @@ public class ConvertProperties implements Runnable new Rename("druid.indexer.terminateResources.duration", "druid.indexer.autoscale.terminatePeriod"), new Rename("druid.indexer.terminateResources.originDateTime", "druid.indexer.autoscale.originTime"), new Rename("druid.indexer.autoscaling.strategy", "druid.indexer.autoscale.strategy"), + new Rename("druid.indexer.logs.s3bucket", "druid.indexer.logs.s3Bucket"), + new Rename("druid.indexer.logs.s3prefix", "druid.indexer.logs.s3Prefix"), new Rename("druid.indexer.maxWorkerIdleTimeMillisBeforeDeletion", "druid.indexer.autoscale.workerIdleTimeout"), new Rename("druid.indexer.maxScalingDuration", "druid.indexer.autoscale.scalingTimeout"), new Rename("druid.indexer.numEventsToTrack", "druid.indexer.autoscale.numEventsToTrack"), @@ -122,7 +124,7 @@ public class ConvertProperties implements Runnable } File outFile = new File(outFilename); - if (!outFile.getParentFile().exists()) { + if (outFile.getParentFile() != null && !outFile.getParentFile().exists()) { outFile.getParentFile().mkdirs(); } @@ -144,8 +146,10 @@ public class ConvertProperties implements Runnable for (PropertyConverter converter : converters) { if (converter.canHandle(property)) { for (Map.Entry entry : converter.convert(fromFile).entrySet()) { - ++count; - updatedProps.setProperty(entry.getKey(), entry.getValue()); + if (entry.getValue() != null) { + ++count; + updatedProps.setProperty(entry.getKey(), entry.getValue()); + } } handled = true; } diff --git a/services/src/main/java/io/druid/cli/convert/Rename.java b/services/src/main/java/io/druid/cli/convert/Rename.java index 19139d8e363..f2297782a48 100644 --- a/services/src/main/java/io/druid/cli/convert/Rename.java +++ b/services/src/main/java/io/druid/cli/convert/Rename.java @@ -49,6 +49,11 @@ public class Rename implements PropertyConverter @Override public Map convert(Properties properties) { - return ImmutableMap.of(newProperty, properties.getProperty(property)); + final String value = properties.getProperty(property); + if (value != null) { + return ImmutableMap.of(newProperty, value); + } else { + return ImmutableMap.of(); + } } } diff --git a/services/src/main/java/io/druid/guice/RealtimeModule.java b/services/src/main/java/io/druid/guice/RealtimeModule.java index 13c182d352e..f3bfb156547 100644 --- a/services/src/main/java/io/druid/guice/RealtimeModule.java +++ b/services/src/main/java/io/druid/guice/RealtimeModule.java @@ -26,7 +26,13 @@ import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.MapBinder; +import druid.examples.flights.FlightsFirehoseFactory; +import druid.examples.rand.RandomFirehoseFactory; +import druid.examples.twitter.TwitterSpritzerFirehoseFactory; +import druid.examples.web.WebFirehoseFactory; import io.druid.cli.QueryJettyServerInitializer; +import io.druid.indexing.common.index.EventReceiverFirehoseFactory; +import io.druid.indexing.common.index.StaticS3FirehoseFactory; import io.druid.initialization.DruidModule; import io.druid.query.QuerySegmentWalker; import io.druid.segment.realtime.DbSegmentPublisher; @@ -34,7 +40,11 @@ import io.druid.segment.realtime.FireDepartment; import io.druid.segment.realtime.NoopSegmentPublisher; import io.druid.segment.realtime.RealtimeManager; import io.druid.segment.realtime.SegmentPublisher; +import io.druid.segment.realtime.firehose.ClippedFirehoseFactory; +import io.druid.segment.realtime.firehose.IrcFirehoseFactory; import io.druid.segment.realtime.firehose.KafkaFirehoseFactory; +import io.druid.segment.realtime.firehose.RabbitMQFirehoseFactory; +import io.druid.segment.realtime.firehose.TimedShutoffFirehoseFactory; import io.druid.server.initialization.JettyServerInitializer; import org.eclipse.jetty.server.Server; @@ -80,7 +90,17 @@ public class RealtimeModule implements DruidModule return Arrays.asList( new SimpleModule("RealtimeModule") .registerSubtypes( - new NamedType(KafkaFirehoseFactory.class, "kafka-0.7.2") + new NamedType(TwitterSpritzerFirehoseFactory.class, "twitzer"), + new NamedType(FlightsFirehoseFactory.class, "flights"), + new NamedType(RandomFirehoseFactory.class, "rand"), + new NamedType(WebFirehoseFactory.class, "webstream"), + new NamedType(KafkaFirehoseFactory.class, "kafka-0.7.2"), + new NamedType(RabbitMQFirehoseFactory.class, "rabbitmq"), + new NamedType(ClippedFirehoseFactory.class, "clipped"), + new NamedType(TimedShutoffFirehoseFactory.class, "timed"), + new NamedType(IrcFirehoseFactory.class, "irc"), + new NamedType(StaticS3FirehoseFactory.class, "s3"), + new NamedType(EventReceiverFirehoseFactory.class, "receiver") ) ); }