diff --git a/README.md b/README.md index 7fb8a3dd..874068fc 100644 --- a/README.md +++ b/README.md @@ -46,4 +46,4 @@ Press Ctrl+C to stop [website]: http://opencensus.io [install-hugo]: https://gohugo.io/getting-started/installing/ -[version-control]: https://github.com/gohugoio/hugo/releases/tag/v0.31.1 +[version-control]: https://github.com/gohugoio/hugo/releases/tag/v0.31.1 \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 00000000..00e77bd7 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/themes/census/README.md b/codelabs/README.md similarity index 100% rename from themes/census/README.md rename to codelabs/README.md diff --git a/codelabs/googlecloudstorage.md b/codelabs/googlecloudstorage.md new file mode 100644 index 00000000..6aebd492 --- /dev/null +++ b/codelabs/googlecloudstorage.md @@ -0,0 +1,34 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Google Stackdriver +environments: Web +id: googlecloudstorage + +# Setup and Configure Google Cloud Storage + +## Overview of the tutorial +Duration: 0:01 + +This tutorial shows you how to setup and configure Google Cloud Storage + +Requirements: + +* A Google Cloud Platform project + +## Create a Project on Google Cloud +Duration: 0:02 + +If you haven't already created a project on Google Cloud, [you can do so here](https://console.cloud.google.com/projectcreate). + +## Enable the Spanner APIs +Duration: 0:03 + +You will be enabling this API: + +* [Cloud Storage API](https://console.cloud.google.com/apis/library?q=storage-component) + +![img](https://cdn-images-1.medium.com/max/1500/1*r7KreflK6XIdX8fjAHqoVA.png) + +## Enable Application Default Credentials +Duration: 0:01 + +Please make sure to enable Application Default Credentials for authentication. [Click here](https://developers.google.com/identity/protocols/application-default-credentials) to do so. diff --git a/codelabs/googlecloudstorage/codelab.json b/codelabs/googlecloudstorage/codelab.json new file mode 100644 index 00000000..05e60aa7 --- /dev/null +++ b/codelabs/googlecloudstorage/codelab.json @@ -0,0 +1,20 @@ +{ + "environment": "web", + "source": "google_cloud_storage.md", + "format": "html", + "prefix": "../../", + "mainga": "UA-49880327-14", + "updated": "2018-07-24T23:08:01-07:00", + "id": "googlecloudstorage", + "duration": 4, + "title": "Setup and Configure Google Cloud Storage", + "author": "Emmanuel Odeke and Henry Ventura", + "summary": "Setup and configure Google Stackdriver", + "theme": "", + "status": null, + "category": null, + "tags": [ + "web" + ], + "url": "googlecloudstorage" +} diff --git a/codelabs/googlecloudstorage/img/a4ab2ad9eb740b8e.png b/codelabs/googlecloudstorage/img/a4ab2ad9eb740b8e.png new file mode 100644 index 00000000..9f26b099 Binary files /dev/null and b/codelabs/googlecloudstorage/img/a4ab2ad9eb740b8e.png differ diff --git a/codelabs/googlecloudstorage/index.html b/codelabs/googlecloudstorage/index.html new file mode 100644 index 00000000..7e549a0d --- /dev/null +++ b/codelabs/googlecloudstorage/index.html @@ -0,0 +1,90 @@ + + + + + + + + + Setup and Configure Google Cloud Storage + + + + + + + + + + + +

This tutorial shows you how to setup and configure Google Cloud Storage

+

Requirements:

+ + + +
+ + +

If you haven't already created a project on Google Cloud, you can do so here.

+ + +
+ + +

You will be enabling this API:

+ +

img

+ + +
+ + +

Please make sure to enable Application Default Credentials for authentication. Click here to do so.

+ + +
+ +
+ + + + + diff --git a/codelabs/jaeger.md b/codelabs/jaeger.md new file mode 100644 index 00000000..3312327d --- /dev/null +++ b/codelabs/jaeger.md @@ -0,0 +1,54 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Jaeger +environments: Web +id: jaeger + +# Setup and Configure Jaeger + +## Overview of the tutorial +Duration: 0:05 + +This tutorial shows you how to setup and configure Jaeger + +![](https://www.jaegertracing.io/img/jaeger-logo.png) + +Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. It is used for monitoring and troubleshooting microservices-based distributed systems, including: + +Distributed context propagation +Distributed transaction monitoring +Root cause analysis +Service dependency analysis +Performance / latency optimization + +Requirements: + +* Docker, if you don't already have it, you can learn [How to install Docker](https://docs.docker.com/install/) + +## Downloading the Jaeger Docker image +Duration: 0:01 + +We'll get the Jaeger Docker image from https://hub.docker.com/u/jaegertracing/ + +by + +``` +docker pull jaegertracing/all-in-one:latest +``` + +## Starting Jaeger +Duration: 0.01 + +``` +docker run -d --name jaeger \ + -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ + -p 5775:5775/udp \ + -p 6831:6831/udp \ + -p 6832:6832/udp \ + -p 5778:5778 \ + -p 16686:16686 \ + -p 14268:14268 \ + -p 9411:9411 \ + jaegertracing/all-in-one:latest +``` + +and now the Jaeger user interface can be opened in your web browser by visiting [http://localhost:16686](http://localhost:16686/) diff --git a/codelabs/jaeger/codelab.json b/codelabs/jaeger/codelab.json new file mode 100644 index 00000000..3d7780cc --- /dev/null +++ b/codelabs/jaeger/codelab.json @@ -0,0 +1,20 @@ +{ + "environment": "web", + "source": "jaeger.md", + "format": "html", + "prefix": "../../", + "mainga": "UA-49880327-14", + "updated": "2018-07-21T18:00:01-07:00", + "id": "jaeger", + "duration": 2, + "title": "Setup and Configure Jaeger", + "author": "Emmanuel Odeke and Henry Ventura", + "summary": "Setup and configure Jaeger", + "theme": "", + "status": null, + "category": null, + "tags": [ + "web" + ], + "url": "jaeger" +} diff --git a/codelabs/jaeger/img/a74b22a1a2749ae7.png b/codelabs/jaeger/img/a74b22a1a2749ae7.png new file mode 100644 index 00000000..1e4753d0 Binary files /dev/null and b/codelabs/jaeger/img/a74b22a1a2749ae7.png differ diff --git a/codelabs/jaeger/index.html b/codelabs/jaeger/index.html new file mode 100644 index 00000000..78af84b3 --- /dev/null +++ b/codelabs/jaeger/index.html @@ -0,0 +1,97 @@ + + + + + + + + + Setup and Configure Jaeger + + + + + + + + + + + +

This tutorial shows you how to setup and configure Jaeger

+

+

Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. It is used for monitoring and troubleshooting microservices-based distributed systems, including:

+

Distributed context propagation
Distributed transaction monitoring
Root cause analysis
Service dependency analysis
Performance / latency optimization

+

Requirements:

+ + + +
+ + +

We'll get the Jaeger Docker image from https://hub.docker.com/u/jaegertracing/

+

by

+
docker pull jaegertracing/all-in-one:latest
+
+ + +
+ + +
docker run -d --name jaeger \
+  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
+  -p 5775:5775/udp \
+  -p 6831:6831/udp \
+  -p 6832:6832/udp \
+  -p 5778:5778 \
+  -p 16686:16686 \
+  -p 14268:14268 \
+  -p 9411:9411 \
+  jaegertracing/all-in-one:latest
+
+

and now the Jaeger user interface can be opened in your web browser by visiting http://localhost:16686

+ + +
+ +
+ + + + + diff --git a/codelabs/prometheus.md b/codelabs/prometheus.md new file mode 100644 index 00000000..c6a28e96 --- /dev/null +++ b/codelabs/prometheus.md @@ -0,0 +1,56 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Prometheus +environments: Web +id: prometheus + +# Setup and Configure Prometheus + +## Overview of the tutorial +Duration: 0:01 + +This tutorial shows you how to setup and configure Prometheus + +![](https://upload.wikimedia.org/wikipedia/en/thumb/3/38/Prometheus_software_logo.svg/115px-Prometheus_software_logo.svg.png) + +Prometheus is a monitoring system that collects metrics from systems, by scraping exposed endpoints at +a regular interval. It evaluates rule expressions and displays results. It can also trigger alerts if +alert conditions are met. + +Requirements: + +* An installation of Prometheus which you can get from here [Install Prometheus](https://prometheus.io/docs/introduction/first_steps/) + +## Configure Prometheus +Duration: 0:02 + +Prometheus Monitoring requires a system configuration usually in the form a ".yaml" file. For example, here is +a sample "prometheus.yaml" file to scrape from our servers running at `localhost:9888`, `localhost:9988` and `localhost:9989` + +``` +global: + scrape_interval: 10s + + external_labels: + monitor: 'media_search' + +scrape_configs: + - job_name: 'media_search' + + scrape_interval: 10s + + static_configs: + - targets: ['localhost:9888', 'localhost:9988', 'localhost:9989'] +``` + +## Starting Prometheus +Duration: 0.05 + +Having successfully downloaded Prometheus and setup your config.yaml file, you should now be able to run +```shell +prometheus --config.file=prometheus.yaml +``` + +## Viewing Prometheus output +Duration: 0.01 + +You should now be able to navigate to [http://localhost:9090/](http://localhost:9090/) diff --git a/codelabs/prometheus/codelab.json b/codelabs/prometheus/codelab.json new file mode 100644 index 00000000..4d21c388 --- /dev/null +++ b/codelabs/prometheus/codelab.json @@ -0,0 +1,20 @@ +{ + "environment": "web", + "source": "prometheus.md", + "format": "html", + "prefix": "../../", + "mainga": "UA-49880327-14", + "updated": "2018-07-21T15:57:19-07:00", + "id": "prometheus", + "duration": 2, + "title": "Setup and Configure Prometheus", + "author": "Emmanuel Odeke and Henry Ventura", + "summary": "Setup and configure Prometheus", + "theme": "", + "status": null, + "category": null, + "tags": [ + "web" + ], + "url": "prometheus" +} diff --git a/codelabs/prometheus/img/452ecf341cd4cb4d.png b/codelabs/prometheus/img/452ecf341cd4cb4d.png new file mode 100644 index 00000000..8027e538 Binary files /dev/null and b/codelabs/prometheus/img/452ecf341cd4cb4d.png differ diff --git a/codelabs/prometheus/index.html b/codelabs/prometheus/index.html new file mode 100644 index 00000000..642aa5ef --- /dev/null +++ b/codelabs/prometheus/index.html @@ -0,0 +1,104 @@ + + + + + + + + + Setup and Configure Prometheus + + + + + + + + + + + +

This tutorial shows you how to setup and configure Prometheus

+

+

Prometheus is a monitoring system that collects metrics from systems, by scraping exposed endpoints at
a regular interval. It evaluates rule expressions and displays results. It can also trigger alerts if
alert conditions are met.

+

Requirements:

+ + + +
+ + +

Prometheus Monitoring requires a system configuration usually in the form a ".yaml" file. For example, here is
a sample "prometheus.yaml" file to scrape from our servers running at localhost:9888, localhost:9988 and localhost:9989

+
global:
+  scrape_interval: 10s
+
+  external_labels:
+    monitor: 'media_search' 
+
+scrape_configs:
+  - job_name: 'media_search'
+
+    scrape_interval: 10s
+
+    static_configs:
+      - targets: ['localhost:9888', 'localhost:9988', 'localhost:9989']
+
+ + +
+ + +

Having successfully downloaded Prometheus and setup your config.yaml file, you should now be able to run

+
prometheus --config.file=config.yaml
+
+ + +
+ + +

You should now be able to navigate to http://localhost:9090/

+ + +
+ +
+ + + + + diff --git a/codelabs/spanner.md b/codelabs/spanner.md new file mode 100644 index 00000000..2dbfcd76 --- /dev/null +++ b/codelabs/spanner.md @@ -0,0 +1,35 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Google Stackdriver +environments: Web +id: spanner + +# Setup and Configure Google Cloud Spanner + +## Overview of the tutorial +Duration: 0:01 + +This tutorial shows you how to setup and configure Google Cloud Spanner. + +Requirements: + +* A Google Cloud Platform project + +## Create a Project on Google Cloud +Duration: 0:02 + +If you haven't already created a project on Google Cloud, [you can do so here](https://console.cloud.google.com/projectcreate). + +## Enable the Spanner APIs +Duration: 0:03 + +You will be enabling this API: + +* [Cloud Spanner API](https://console.cloud.google.com/apis/library?q=spanner) + +![img](https://cdn-images-1.medium.com/max/1000/1*dgrSjYWtslJ0Fr1-2HsdUA.png) +![img](https://cdn-images-1.medium.com/max/1000/1*Cx9kAZevjEppEM8HwNCr5Q.png) + +## Enable Application Default Credentials +Duration: 0:01 + +Please make sure to enable Application Default Credentials for authentication. [Click here](https://developers.google.com/identity/protocols/application-default-credentials) to do so. diff --git a/codelabs/spanner/codelab.json b/codelabs/spanner/codelab.json new file mode 100644 index 00000000..fcbe4cee --- /dev/null +++ b/codelabs/spanner/codelab.json @@ -0,0 +1,20 @@ +{ + "environment": "web", + "source": "spanner.md", + "format": "html", + "prefix": "../../", + "mainga": "UA-49880327-14", + "updated": "2018-07-24T22:33:17-07:00", + "id": "spanner", + "duration": 4, + "title": "Setup and Configure Google Cloud Spanner", + "author": "Emmanuel Odeke and Henry Ventura", + "summary": "Setup and configure Google Stackdriver", + "theme": "", + "status": null, + "category": null, + "tags": [ + "web" + ], + "url": "spanner" +} diff --git a/codelabs/spanner/img/80d221bc68854c6a.png b/codelabs/spanner/img/80d221bc68854c6a.png new file mode 100644 index 00000000..fb60683f Binary files /dev/null and b/codelabs/spanner/img/80d221bc68854c6a.png differ diff --git a/codelabs/spanner/img/dc78db6b7248e787.png b/codelabs/spanner/img/dc78db6b7248e787.png new file mode 100644 index 00000000..0dbd0ed9 Binary files /dev/null and b/codelabs/spanner/img/dc78db6b7248e787.png differ diff --git a/codelabs/spanner/index.html b/codelabs/spanner/index.html new file mode 100644 index 00000000..defef7d0 --- /dev/null +++ b/codelabs/spanner/index.html @@ -0,0 +1,90 @@ + + + + + + + + + Setup and Configure Google Cloud Spanner + + + + + + + + + + + +

This tutorial shows you how to setup and configure Google Stackdriver Tracing and Metrics.

+

Requirements:

+ + + +
+ + +

If you haven't already created a project on Google Cloud, you can do so here.

+ + +
+ + +

You will be enabling this API:

+ +

imgimg

+ + +
+ + +

Please make sure to enable Application Default Credentials for authentication. Click here to do so.

+ + +
+ +
+ + + + + diff --git a/codelabs/stackdriver.md b/codelabs/stackdriver.md new file mode 100644 index 00000000..45f16249 --- /dev/null +++ b/codelabs/stackdriver.md @@ -0,0 +1,38 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Google Stackdriver +environments: Web +id: stackdriver + +# Setup and Configure Google Stackdriver + +## Overview of the tutorial +Duration: 0:01 + +This tutorial shows you how to setup and configure Google Stackdriver Tracing and Metrics. + +Requirements: + +* A cloud provider based project; it should support Stackdriver Monitoring and Tracing — we’ll use Google Cloud Platform for this example + +## Create a Project on Google Cloud +Duration: 0:02 + +If you haven't already created a project on Google Cloud, [you can do so here](https://console.cloud.google.com/projectcreate). + +## Enable the Stackdriver APIs +Duration: 0:05 + +You will be enabling these two APIs: + +* Stackdriver Monitoring API +* Stackdriver Trace API + +[Enable APIs](https://console.cloud.google.com/apis/library?q=stackdriver) + +![img](https://cdn-images-1.medium.com/max/2000/1*aLEDq5bHmV5u6WJzDRiF7w.png) +![img](https://cdn-images-1.medium.com/max/1600/1*8K5fzp8T1RQ9YC5PnRUn4Q.png) + +## Enable Application Default Credentials +Duration: 0:02 + +Please make sure to enable Application Default Credentials for authentication. [Click here](https://developers.google.com/identity/protocols/application-default-credentials) to do so. diff --git a/codelabs/zipkin.md b/codelabs/zipkin.md new file mode 100644 index 00000000..8259cc57 --- /dev/null +++ b/codelabs/zipkin.md @@ -0,0 +1,41 @@ +author: Emmanuel Odeke and Henry Ventura +summary: Setup and configure Zipkin +environments: Web +id: zipkin + +# Setup and Configure Zipkin + +## Overview of the tutorial +Duration: 0:05 + +This tutorial shows you how to setup and configure Zipkin + +![](https://zipkin.io/public/img/zipkin-logo-200x119.jpg) + +Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. + +It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapper paper. + +Requirements: + +* Docker, if you don't already have it, you can learn [How to install Docker](https://docs.docker.com/install/) + +## Downloading the Zipkin Docker image +Duration: 0:01 + +We'll get the Zipkin Docker image from https://hub.docker.com/u/openzipkin/ + +by + +``` +docker pull openzipkin/zipkin +``` + +## Starting Zipkin +Duration: 0.01 + +``` +docker run -d -p 9411:9411 openzipkin/zipkin +``` + +and now the Zipkin user interface can be opened in your web browser by visiting [http://localhost:9411](http://localhost:9411/) diff --git a/codelabs/zipkin/codelab.json b/codelabs/zipkin/codelab.json new file mode 100644 index 00000000..a2928a90 --- /dev/null +++ b/codelabs/zipkin/codelab.json @@ -0,0 +1,20 @@ +{ + "environment": "web", + "source": "zipkin.md", + "format": "html", + "prefix": "../../", + "mainga": "UA-49880327-14", + "updated": "2018-07-21T17:10:56-07:00", + "id": "zipkin", + "duration": 2, + "title": "Setup and Configure Zipkin", + "author": "Emmanuel Odeke and Henry Ventura", + "summary": "Setup and configure Zipkin", + "theme": "", + "status": null, + "category": null, + "tags": [ + "web" + ], + "url": "zipkin" +} diff --git a/codelabs/zipkin/img/2dc5a8ae4249fb14.png b/codelabs/zipkin/img/2dc5a8ae4249fb14.png new file mode 100644 index 00000000..9bbd23f8 Binary files /dev/null and b/codelabs/zipkin/img/2dc5a8ae4249fb14.png differ diff --git a/codelabs/zipkin/index.html b/codelabs/zipkin/index.html new file mode 100644 index 00000000..35903a34 --- /dev/null +++ b/codelabs/zipkin/index.html @@ -0,0 +1,88 @@ + + + + + + + + + Setup and Configure Zipkin + + + + + + + + + + + +

This tutorial shows you how to setup and configure Zipkin

+

+

Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures.

+

It manages both the collection and lookup of this data. Zipkin's design is based on the Google Dapper paper.

+

Requirements:

+ + + +
+ + +

We'll get the Zipkin Docker image from https://hub.docker.com/u/openzipkin/

+

by

+
docker pull openzipkin/zipkin
+
+ + +
+ + +
docker run -d -p 9411:9411 openzipkin/zipkin
+
+

and now the Zipkin user interface can be opened in your web browser by visiting http://localhost:9411

+ + +
+ +
+ + + + + diff --git a/config.toml b/config.toml index c3ae9593..0c5e61d1 100644 --- a/config.toml +++ b/config.toml @@ -1,10 +1,69 @@ baseURL = "https://opencensus.io/" + languageCode = "en-us" +DefaultContentLanguage = "en" title = "OpenCensus" -theme = "census" +# themesdir = "../.." +pygmentsCodeFences = true +pygmentsStyle = "monokailight" + +defaultContentLanguage = "en" +defaultContentLanguageInSubdir= false +enableMissingTranslationPlaceholders = false + +theme = "docdock" + +# [Languages] +# [Languages.en] +# title = "Documentation for Hugo docDock" +# weight = 1 +# languageName = "English" +# +# [Languages.fr] +# title = "Documentation du thème docDock" +# weight = 2 +# languageName = "Français" + + + [params] - description = "A stats collection and distributed tracing framework" +description = "A stats collection and distributed tracing framework" +editURL = "https://github.com/vjeantet/hugo-theme-docdock/edit/master/exampleSite/content/" +showVisitedLinks = true # default is false +themeStyle = "flex" # "original" or "flex" # default "flex" +themeVariant = "" # choose theme variant "green", "gold" , "gray", "blue" (default) +ordersectionsby = "weight" # ordersectionsby = "title" +disableHomeIcon = true # default is false +disableSearch = false # default is false +disableNavChevron = false # set true to hide next/prev chevron, default is false +highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter +menushortcutsnewtab = false # set true to open shortcuts links to a new tab/window +enableGitInfo = true +[outputs] +home = [ "HTML", "RSS", "JSON"] +# [[menu.shortcuts]] +# pre = "

More

" +# name = " " +# identifier = "ds" +# url = "https://github.com/vjeantet/hugo-theme-docdock" +# weight = 10 +# +# [[menu.shortcuts]] +# name = " " +# url = "https://github.com/vjeantet/hugo-theme-docdock/archive/master.zip" +# weight = 11 +# +# [[menu.shortcuts]] +# name = " " +# identifier = "hugodoc" +# url = "https://gohugo.io/" +# weight = 20 +# +# [[menu.shortcuts]] +# name = " " +# url = "/credits" +# weight = 30 diff --git a/content/_footer.md b/content/_footer.md new file mode 100644 index 00000000..1e1ce56d --- /dev/null +++ b/content/_footer.md @@ -0,0 +1,8 @@ +* [Github](https://github.com/census-instrumentation) +* [Gitter](https://gitter.im/census-instrumentation/Lobby) +* [Twitter](https://twitter.com/opencensusio) +* [Community](/community) + +
OpenCensus
+ +Content is licensed under Apache License 2.0 diff --git a/content/_header.md b/content/_header.md new file mode 100644 index 00000000..8c45aa58 --- /dev/null +++ b/content/_header.md @@ -0,0 +1 @@ +[![OpenCensus Logo](https://opencensus.io/img/logo-sm.svg) OpenCensus](/) diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 00000000..a817a70c --- /dev/null +++ b/content/_index.md @@ -0,0 +1,42 @@ +--- +title: "" +date: 2018-07-19T09:58:45-07:00 +draft: false +class: "no-pagination no-top-border-header no-search max-text-width" +--- + +{{}} + +##### What is OpenCensus? + +{{}} is a vendor-agnostic single distribution of libraries to provide **metrics** collection and **tracing** for your microservices and monoliths alike. + +{{<button class="btn-light" icon="true" href="/introduction/overview">}}Overview{{</button>}} + +{{<button class="btn-light" icon="true" href="/quickstart">}}Quickstart{{</button>}} + +##### Can I use OpenCensus in my project? +Our libraries support Go, Java, C++, Ruby, Erlang, Python, and PHP. + +Supported backends include Datadog, Instana, Jaeger, SignalFX, Stackdriver, and Zipkin. You can also [add support for other backends](/). + +{{<button class="btn-light" icon="true" href="/introduction/language-support">}}Language Support{{</button>}} + +{{<button class="btn-light" icon="true" href="/supported-exporters">}}Supported Backends{{</button>}} + +##### Who is behind it? +OpenCensus originates from Google, where a set of libraries called Census were used to automatically capture traces and metrics from services. Since going open source, the project is now composed of a group of cloud providers, application performance management vendors, and open source contributors. The project is hosted on GitHub and all work occurs there. + +{{<button class="btn-light" icon="true" href="https://github.com/census-instrumentation/">}}Github{{</button>}} + +{{<button class="btn-light" icon="true" href="/community">}}Community{{</button>}} + +##### What are *Metrics* and *Tracing*? + +[**Metrics**](/core-concepts/metrics) are any quantifiable piece of data that you would like to track, such as latency in a service or database, request content length, or number of open file descriptors. Viewing graphs of your metrics can help you understand and gauge the performance and overall quality of your application and set of services. + +[**Traces**](/core-concepts/tracing) show you how a request propagates throughout your application or set of services. Viewing graphs of your traces can help you understand the bottlenecks in your architecture by visualizing how data flows between all of your services. + +##### Partners & Contributors + +{{<partners>}} diff --git a/content/about.md b/content/about.md deleted file mode 100644 index 60bdef6c..00000000 --- a/content/about.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -title = "About" -Description = "about" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -date = "2018-05-08T13:19:03+07:00" -+++ - -OpenCensus is being developed by a group of cloud providers, Application Performance Management vendors, and open source contributors. This project is hosted on [GitHub](https://github.com/census-instrumentation) and all work occurs there. - -OpenCensus was initiated by Google, and is based on instrumentation systems used inside of Google. diff --git a/content/advanced-concepts/_index.md b/content/advanced-concepts/_index.md new file mode 100644 index 00000000..4a534283 --- /dev/null +++ b/content/advanced-concepts/_index.md @@ -0,0 +1,12 @@ +--- +title: "Advanced Concepts" +date: 2018-07-16T14:44:49-07:00 +draft: false +weight: 80 +--- + +OpenCensus provides observability throughout your microservices and monoliths alike. + +In this section, we'll cover some advanced topics such as: + +{{% children %}} diff --git a/content/advanced-concepts/context-propagation.md b/content/advanced-concepts/context-propagation.md new file mode 100644 index 00000000..62fdd8e0 --- /dev/null +++ b/content/advanced-concepts/context-propagation.md @@ -0,0 +1,18 @@ ++++ +title = "Context Propagation" +type = "leftnav" ++++ + +This page contains several information about +the context propagations used by OpenCensus. + +--- + +### Table of contents +- [B3 Propagation](#b3-propagation) +- [CloudTrace](#cloudtrace) + +#### B3 Propagation +"B3 propagation" aka "Zipkin Propagation" + +#### CloudTrace diff --git a/content/troubleshooting.md b/content/advanced-concepts/troubleshooting.md similarity index 81% rename from content/troubleshooting.md rename to content/advanced-concepts/troubleshooting.md index 23f1a0a3..c9c2b862 100644 --- a/content/troubleshooting.md +++ b/content/advanced-concepts/troubleshooting.md @@ -20,13 +20,13 @@ the handler is violating the error rate SLO. In order to debug, they query the tracing backend to search for a trace where -`inbox.Timeline.Messages` span is errored. +inbox.Timeline.Messages span is errored. ![Errored Span](/img/troubleshoot-errortrace.png) -From the traces, it is visible that `mysql.Query` is -consistently erroring for `inbox.Timeline.Messages`. -The error is `INVALID_ARGUMENT`. +From the traces, it is visible that mysql.Query is +consistently erroring for inbox.Timeline.Messages. +The error is INVALID_ARGUMENT. Carefully investigating the code, they see that there is an escaping problem with the MySQL query. @@ -55,8 +55,8 @@ taking more than 100ms. From the traces, it is visible that auth.AccessToken is often retried when serving the /timeline endpoint. -By looking at the logs with the NetOps team, -they realize that there is a networking outage affecting +By looking at the logs with the NetOps team and they +realize that there is a networking outage affecting the requests between the HTTP server and the auth service. Operations fix the networking issue and retries @@ -70,20 +70,20 @@ Latency returns back to normal. Operations get an alert for increasing latency for the `inbox.Timeline.Messages` RPC handler. Team looks at the dashboards and confirms that -`inbox.Timeline.Messages` handler is violating the latency SLO. +inbox.Timeline.Messages handler is violating the latency SLO. ![Unexpected RPC Latency](/img/troubleshoot-cachemiss.png) -They search for a trace where `inbox.Timeline.Messages` +They search for a trace where inbox.Timeline.Messages span is taking more than 100ms and violating the SLOs. ![No Caching](/img/troubleshoot-nocacheput.png) -They realize for all cases `inbox.Timeline.Messages` +They realize for all cases inbox.Timeline.Messages are querying the database and never see any cache hits. By looking at the handler source code, they see the latest development push mistakenly removed the -`cache.Put` call after database is queries. +cache.Put call after database is queries. They roll back the new release and fix the bug. diff --git a/content/blog.md b/content/blog.md deleted file mode 100644 index c423b8cb..00000000 --- a/content/blog.md +++ /dev/null @@ -1,187 +0,0 @@ -+++ -title = "Blog" -+++ - - -##### July 11, 2018 - -#### [Monitoring HTTP Latency with OpenCensus and Stackdriver](https://medium.com/google-cloud/monitoring-http-latency-with-opencensus-and-stackdriver-bf561608e81a) - -This post will describe how to code your own monitoring probes, similar in function to Stackdriver uptime checks on Google Cloud. Code, configuration files, commands, and detailed instructions… [\[read more\]](https://medium.com/google-cloud/monitoring-http-latency-with-opencensus-and-stackdriver-bf561608e81a) - ---- - -##### June 13, 2018 - -#### [Redis clients instrumented by OpenCensus in Java and Go](https://medium.com/@orijtech/redis-clients-instrumented-by-opencensus-in-java-and-go-402470d92c5c) - -In this post we’ll examine Redis clients instrumented with OpenCensus in Java and Go, and apply them directly to use Redis in a media search service to alleviate costs, throttling, load… [\[read more\]](https://medium.com/@orijtech/redis-clients-instrumented-by-opencensus-in-java-and-go-402470d92c5c) - ---- - -##### June 13, 2018 - -#### [Microsoft joins the OpenCensus project](https://open.microsoft.com/2018/06/13/microsoft-joins-the-opencensus-project/) - -We are happy to announce that Microsoft is joining the open source OpenCensus project, and they are excited to help it achieve the goal of “a single distribution of libraries for metrics and distributed tracing”… [\[read more\]](https://open.microsoft.com/2018/06/13/microsoft-joins-the-opencensus-project/) - ---- - -##### June 12, 2018 - -#### [Hit the Ground Running with Distributed Tracing Core Concepts](https://medium.com/nikeengineering/hit-the-ground-running-with-distributed-tracing-core-concepts-ff5ad47c7058) - -Wondering what Distributed Tracing is, or having trouble making it work? Understanding its core concepts is a critical first step. Monolithic service architectures for large backend applications… [\[read more\]](https://medium.com/nikeengineering/hit-the-ground-running-with-distributed-tracing-core-concepts-ff5ad47c7058) - ---- - -##### May 13, 2018 - -#### [OpenCensus for Go gRPC developers](https://medium.com/@orijtech/opencensus-for-go-grpc-developers-7f3ee1ac3d6d) - -In this tutorial, we’ll examine how to use OpenCensus in your gRPC projects in the Go programming language for observability both into your server and then client! We’ll then examine how we can integrate with… [\[read more\]](https://medium.com/@orijtech/opencensus-for-go-grpc-developers-7f3ee1ac3d6d) - ---- - -##### May 7, 2018 - -#### [OpenCensus’s journey ahead: platforms and languages](https://opensource.googleblog.com/2018/05/opencensus-journey-ahead-part-1.html) - -We recently blogged about the value of OpenCensus and how Google uses Census internally. Today, we want to share more about our long-term vision for OpenCensus. The goal of OpenCensus is to… [\[read more\]](https://opensource.googleblog.com/2018/05/opencensus-journey-ahead-part-1.html) - ---- - -##### May 4, 2018 - -#### [Practical and Useful Latency Analysis using Istio and OpenCenus](https://www.youtube.com/watch?v=ME-EhOKqFOY) - -Want to view more sessions and keep the conversations going? Join us for KubeCon + CloudNativeCon North America in Seattle, December 11 - 13, 2018 [\[read more\]](https://www.youtube.com/watch?v=ME-EhOKqFOY) - ---- - -##### April 30, 2018 - -#### [Memcached clients instrumented with OpenCensus in Go and Python](https://medium.com/@orijtech/memcached-clients-instrumented-with-opencensus-in-go-and-python-dacbd01b269c) - -One of the most used server caching and scaling technologies is Memcached [http://memcached.org/](http://memcached.org/) Memcached is a high performance, free and open… [\[read more\]](https://medium.com/@orijtech/memcached-clients-instrumented-with-opencensus-in-go-and-python-dacbd01b269c) - ---- - -##### April 18, 2018 - -#### [“Hello, world!” for web servers in Go with OpenCensus](https://medium.com/@orijtech/hello-world-for-web-servers-in-go-with-opencensus-29955b3f02c6) - -In this post, we’ll examine how you can minimally add distributed tracing and monitoring to your web server written in Go, with OpenCensus [https://opencensus.io](https://opencensus.io) [\[read more\]](https://medium.com/@orijtech/hello-world-for-web-servers-in-go-with-opencensus-29955b3f02c6) - ---- - -##### April 4, 2018 - -#### [Twitter - Bob Quillin](https://twitter.com/bobquillin/status/981571739720167425) - -Great OpenCensus 101 explaining its role in microservices stats collection, distributed tracing, and support for multiple backends [https://storage.googleapis.com/opencensusio/OpenCensusVideo.mp4](https://storage.googleapis.com/opencensusio/OpenCensusVideo.mp4) [\[read more\]](https://twitter.com/bobquillin/status/981571739720167425) - ---- - - -##### April 3, 2018 - -#### [Tracing all the Fn things with OpenCensus](https://medium.com/fnproject/tracing-all-the-fn-things-with-opencensus-e579b268aeca) - -The Fn Project has decided to join all the other cool kids and become obsessed with tracing. Congratulations people, your meetup talks did not fall entirely on deaf ears. We’re really excited about moving all of our metrics… [\[read more\]](https://medium.com/fnproject/tracing-all-the-fn-things-with-opencensus-e579b268aeca) - ---- - -##### April 3, 2018 - -#### [Twitter - Chad Arimura](https://twitter.com/chadarimura/status/981319453282467840) - -“Tracing all the Fn things with OpenCensus” by @rdallman10 [https://medium.com/fnproject/tracing-all-the-fn-things-with-opencensus-e579b268aeca](https://medium.com/fnproject/tracing-all-the-fn-things-with-opencensus-e579b268aeca) … #serverless #golang cc @opencensusio @CloudNativeFdn [\[read more\]](https://medium.com/fnproject/tracing-all-the-fn-things-with-opencensus-e579b268aeca) - ---- - -##### April 3, 2018 - -#### [Twitter - Bruce MacVarish](https://twitter.com/brucemacv/status/981324918330744833) - -We’re really excited about moving all of our metrics and trace reporting to OpenCensus. #serverless #cloudnative @OracleIaaS [\[read more\]](https://twitter.com/brucemacv/status/981324918330744833) - ---- - -##### March 20, 2018 - -#### [Measure Once — Export Anywhere: OpenCensus in the wild](https://blog.doit-intl.com/measure-once-export-anywhere-opencensus-in-the-wild-61724f44eb00) - -A few months ago, Google has announced OpenCensus, a vendor-neutral open source library for telemetry and tracing collection. [\[read more\]](https://blog.doit-intl.com/measure-once-export-anywhere-opencensus-in-the-wild-61724f44eb00) - ---- - -##### March 14, 2018 - -#### [OpenCensus with Morgan McLean and JBD](https://www.gcppodcast.com/post/episode-118-opencensus-with-morgan-mclean-and-jbd/) - -Product Manager Morgan McLean and Software Engineer JBD join Melanie and Mark this week to discuss the new open source project OpenCensus, a single distribution of libraries for metrics and… [\[read more\]](https://www.gcppodcast.com/post/episode-118-opencensus-with-morgan-mclean-and-jbd/) - ---- - -##### March 13, 2018 - -#### [The value of OpenCensus](https://opensource.googleblog.com/2018/03/the-value-of-opencensus.html) - -This post is the second in a series about OpenCensus. You can find the first post here. Early this year we open sourced OpenCensus, a distributed tracing and stats instrumentation framework. [\[read more\]](https://opensource.googleblog.com/2018/03/the-value-of-opencensus.html) - ---- - -##### March 12, 2018 - -#### [OpenCensus Tracing w/ Stackdriver](https://medium.com/google-cloud/opencensus-tracing-w-stackdriver-a079fae52499) - -A customer’s engineers asked how they could combine OpenCensus tracing w/ App Engine Flexible in their Java apps and surface the results in Stackdriver. [\[read more\]](https://medium.com/google-cloud/opencensus-tracing-w-stackdriver-a079fae52499) - ---- - -##### March 8, 2018 - -#### [Cloud Spanner, instrumented by OpenCensus and exported to Stackdriver](https://medium.com/@orijtech/cloud-spanner-instrumented-by-opencensus-and-exported-to-stackdriver-6ed61ed6ab4e) - -In this post, we’ll explore the power of OpenCensus’ exporters, using the Google Cloud Spanner package for both the Go and Java programming languages. [\[read more\]](https://medium.com/@orijtech/cloud-spanner-instrumented-by-opencensus-and-exported-to-stackdriver-6ed61ed6ab4e) - ---- - -##### March 7, 2018 - -#### [How Google uses Census internally](https://opensource.googleblog.com/2018/03/how-google-uses-opencensus-internally.html) - -This post is the first in a series about OpenCensus, a set of open source instrumentation libraries based on what we use inside Google. This series will cover the benefits of OpenCensus for developers and vendors… [\[read more\]](https://opensource.googleblog.com/2018/03/how-google-uses-opencensus-internally.html) - ---- - -##### February 18, 2018 - -#### [What is distributed tracing. Zoom on opencensus and opentracing](https://gianarb.it/blog/what-is-distributed-tracing-opentracing-opencensus) - -A few months ago I started to actively study, support and use opentracing and more in general the distributed tracing topic. In this article, I will share something about… [\[read more\]](https://gianarb.it/blog/what-is-distributed-tracing-opentracing-opencensus) - ---- - -##### January 23, 2018 - -#### [OpenCensus — towards harmonizing your Instrumentation](http://dieswaytoofast.blogspot.com/2018/01/opencensustowards-harmonizing-your.html) - -You’ve really gotten into this whole Observability thing, and have started plugging Prometheus into, well, everything that doesn’t already have it. [\[read more\]](http://dieswaytoofast.blogspot.com/2018/01/opencensustowards-harmonizing-your.html) - ---- - -##### January 18, 2018 - -#### [OpenCensus with Prometheus and Kubernetes](https://kausal.co/blog/opencensus-prometheus-kausal/) - -Yesterday, Google announced OpenCensus, an instrumentation framework for monitoring and tracing. It comes with a set of client libraries for Golang and Java, with more to come. [\[read more\]](https://kausal.co/blog/opencensus-prometheus-kausal/) - ---- - -##### January 17, 2018 - -#### [OpenCensus: A Stats Collection and Distributed Tracing Framework](https://opensource.googleblog.com/2018/01/opencensus.html) - -Today we’re pleased to announce the release of OpenCensus, a vendor-neutral open source library for metric collection and tracing. [\[read more\]](https://opensource.googleblog.com/2018/01/opencensus.html) diff --git a/content/codelabs/_index.html b/content/codelabs/_index.html new file mode 100644 index 00000000..4656fa0c --- /dev/null +++ b/content/codelabs/_index.html @@ -0,0 +1,6 @@ +--- +title: "Codelabs" +date: 2018-07-19T13:41:01-07:00 +draft: false +hidden: true +--- diff --git a/content/codelabs/googlecloudstorage.md b/content/codelabs/googlecloudstorage.md new file mode 100644 index 00000000..63807719 --- /dev/null +++ b/content/codelabs/googlecloudstorage.md @@ -0,0 +1,7 @@ +--- +title: "Google Cloud Storage" +date: 2018-07-23T23:10:00-07:00 +draft: false +hidden: true +layout: googlecloudstorage +--- diff --git a/content/codelabs/jaeger.md b/content/codelabs/jaeger.md new file mode 100644 index 00000000..a2a9cde0 --- /dev/null +++ b/content/codelabs/jaeger.md @@ -0,0 +1,7 @@ +--- +title: "Jaeger" +date: 2018-07-19T18:01:30-11:00 +draft: false +hidden: true +layout: jaeger +--- diff --git a/content/codelabs/prometheus.md b/content/codelabs/prometheus.md new file mode 100644 index 00000000..85a04905 --- /dev/null +++ b/content/codelabs/prometheus.md @@ -0,0 +1,7 @@ +--- +title: "Prometheus" +date: 2018-07-19T15:08:00-07:00 +draft: false +hidden: true +layout: prometheus +--- diff --git a/content/codelabs/spanner.md b/content/codelabs/spanner.md new file mode 100644 index 00000000..c9881570 --- /dev/null +++ b/content/codelabs/spanner.md @@ -0,0 +1,7 @@ +--- +title: "Spanner" +date: 2018-07-23T22:23:00-07:00 +draft: false +hidden: true +layout: spanner +--- diff --git a/content/codelabs/stackdriver.md b/content/codelabs/stackdriver.md new file mode 100644 index 00000000..3df5cc36 --- /dev/null +++ b/content/codelabs/stackdriver.md @@ -0,0 +1,7 @@ +--- +title: "Stackdriver" +date: 2018-07-19T15:08:00-07:00 +draft: false +hidden: true +layout: stackdriver +--- diff --git a/content/codelabs/zipkin.md b/content/codelabs/zipkin.md new file mode 100644 index 00000000..2047d0ee --- /dev/null +++ b/content/codelabs/zipkin.md @@ -0,0 +1,7 @@ +--- +title: "Zipkin" +date: 2018-07-19T17:05:00-26:00 +draft: false +hidden: true +layout: zipkin +--- diff --git a/content/community.md b/content/community.md deleted file mode 100644 index 38288474..00000000 --- a/content/community.md +++ /dev/null @@ -1,26 +0,0 @@ -+++ -title = "Community" -Description = "community" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -date = "2018-05-30T13:47:11-05:00" -+++ - -OpenCensus has an active community of developers who are using, enhancing and building valuable integrations with other software projects. We’d love your help to improve and extend the project. You can reach us via [Email](mailto:census-developers@googlegroups.com), [Gitter channel](https://gitter.im/census-instrumentation/Lobby) or [Twitter](https://twitter.com/opencensusio) to start engaging with the project and its members. - ---- - -#### Contribute on Github -OpenCensus has an active community of developers who are using, enhancing and building valuable integrations with other software projects. We are always looking for active contributors in OpenCensus and OpenCensus Ecosystem. We would appreciate and love any community contributions to the OpenCensus project. Here is the link for development of [OpenCensus on GitHub](https://github.com/census-instrumentation). We look forward to your contributions. -  - ---- - -#### Mailing List -Any questions or suggestions? You can reach us via email: [census-developers@googlegroups.com](mailto:census-developers@googlegroups.com). Just want to be in the loop of what is going on with the project? Join the [mailing list](https://groups.google.com/forum/#!forum/census-developers). - ---- - -#### Gitter Channel -Join other developers and users on the OpenCensus [Gitter channel](https://gitter.im/census-instrumentation/Lobby). diff --git a/content/community/_index.md b/content/community/_index.md new file mode 100644 index 00000000..dc96f5dd --- /dev/null +++ b/content/community/_index.md @@ -0,0 +1,18 @@ +--- +title: "Community" +date: 2018-07-16T14:46:21-07:00 +draft: false +weight: 110 +--- + +OpenCensus has an active community of developers who are using, enhancing and building valuable integrations with other software projects. We’d love your help to improve and extend the project. You can reach us via [Email](mailto:census-developers@googlegroups.com), [Gitter channel](https://gitter.im/census-instrumentation/Lobby) or [Twitter](https://twitter.com/opencensusio) to start engaging with the project and its members. + +#### Contribute on Github +OpenCensus has an active community of developers who are using, enhancing and building valuable integrations with other software projects. We are always looking for active contributors in OpenCensus and OpenCensus Ecosystem. We would appreciate and love any community contributions to the OpenCensus project. Here is the link for development of [OpenCensus on GitHub](https://github.com/census-instrumentation). We look forward to your contributions. +  + +#### Mailing List +Any questions or suggestions? You can reach us via email: [census-developers@googlegroups.com](mailto:census-developers@googlegroups.com). Just want to be in the loop of what is going on with the project? Join the [mailing list](https://groups.google.com/forum/#!forum/census-developers). + +#### Gitter Channel +Join other developers and users on the OpenCensus [Gitter channel](https://gitter.im/census-instrumentation/Lobby). diff --git a/content/core-concepts/_index.md b/content/core-concepts/_index.md new file mode 100644 index 00000000..942ad75f --- /dev/null +++ b/content/core-concepts/_index.md @@ -0,0 +1,12 @@ +--- +title: "Core Concepts" +date: 2018-07-16T14:28:33-07:00 +draft: false +weight: 30 +--- + +In this section we will walk through the core technical components of OpenCensus and what problems they solve. If these concepts look confusing -- don't worry! You will come out of this section with a rudimentary understanding of what tools are available to you and how to use them to solve your challenges. + +{{% children %}} + +If you haven't already, consider giving the [Quickstart](/quickstart) a try. diff --git a/content/core-concepts/exporters.md b/content/core-concepts/exporters.md new file mode 100644 index 00000000..baf422af --- /dev/null +++ b/content/core-concepts/exporters.md @@ -0,0 +1,99 @@ +--- +title: "Exporters" +date: 2018-07-16T14:28:45-07:00 +draft: false +--- + +Data collected by OpenCensus can be exported to any analysis tool or storage backend. +OpenCensus exporters can be contributed by anyone, and we provide support for several +open source backends and vendors out-of-the-box. + +Once you choose your backend, follow the instructions to initialize an exporter. +Then, register the initialized exporter. + +#### Stats + +As an example, a Prometheus exporter is registered and Prometheus is going to scrape +`:9091` to read the collected data: + +{{<tabs Go Java>}} + {{<highlight go>}} +import ( + "go.opencensus.io/exporter/prometheus" + "go.opencensus.io/stats/view" +) + +func main() { + exporter, err := prometheus.NewExporter(prometheus.Options{Namespace: "demo"}) + if err != nil { + log.Fatal(err) + } + view.RegisterExporter(exporter) + + // In a seperate go routine, run the Prometheus metrics scraping handler + go func() { + http.Handle("/metrics", exporter) + log.Fatal(http.ListenAndServe(":9091", nil)) + }() + // ... continue with your code +} + {{</highlight>}} + + {{<highlight java>}} +// Add the dependencies by following the instructions at +// https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/prometheus + +PrometheusStatsCollector.createAndRegister(); + +// Uses a simple Prometheus HTTPServer to export metrics. +io.prometheus.client.exporter.HTTPServer server = + new HTTPServer("localhost", 9091, true); + {{</highlight>}} +{{</tabs>}} + +#### Traces + +As an example, a Zipkin exporter is registered. All collected trace data will be reported +to the registered Zipkin endpoint: + +{{<tabs Go Java>}} + {{<highlight go>}} +import ( + openzipkin "github.com/openzipkin/zipkin-go" + "github.com/openzipkin/zipkin-go/reporter/http" + "go.opencensus.io/exporter/zipkin" + "go.opencensus.io/trace" +) + +localEndpoint, err := openzipkin.NewEndpoint("example-server", "192.168.1.5:5454") +if err != nil { + log.Println(err) +} +reporter := http.NewReporter("http://localhost:9411/api/v2/spans") +defer reporter.Close() + +exporter := zipkin.NewExporter(reporter, localEndpoint) +trace.RegisterExporter(exporter) + {{</highlight>}} + + {{<highlight java>}} +// Add the dependencies by following the instructions +// at https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/zipkin + +ZipkinTraceExporter.createAndRegister( + "http://localhost:9411/api/v2/spans", "example-server"); + {{</highlight>}} +{{</tabs>}} + +Exporters can be registered dynamically and unregistered. But most users will register +an exporter in their main application and never unregister it. + +Libraries instrumented with OpenCensus should not register exporters. Exporters should +only be registered by main applications. + +#### Supported Backends + +<abbr class="trace-exporter blue white-text">T</abbr> Backend supports Tracing + +<abbr class="stats-exporter teal white-text">S</abbr> Backend supports Stats +{{<feature-matrix>}} diff --git a/content/core-concepts/metrics.md b/content/core-concepts/metrics.md new file mode 100644 index 00000000..4fe51a32 --- /dev/null +++ b/content/core-concepts/metrics.md @@ -0,0 +1,90 @@ +--- +title: "Metrics" +date: 2018-07-16T14:28:40-07:00 +draft: false +--- + +Application and request metrics are important indicators +of availability. Custom metrics can provide insights into +how availability indicators impact user experience or the business. +Collected data can help automatically +generate alerts at an outage or trigger better scheduling +decisions to scale up a deployment automatically upon high demand. + + + +Stats collection allows users to collect custom metrics and provide +a set of predefined metrics through the framework integrations. +Collected data can be multidimensional and +it can be filtered and grouped by [tags](/tags). + +Stats collection requires two steps: + +* Definition of measures and recording of data points. +* Definition and registration of views to aggregate the recorded values. + +#### Measures + +A measure represents a metric type to be recorded. For example, request latency +in µs and request size in KBs are examples of measures to collect from a server. +All measures are identified by a name and also have a description and a unit. +Libraries and frameworks can define and export measures for their end users to +collect data on the provided measures. + +Below, there is an example measure that represents HTTP latency in ms: + +```go +RequestLatecy = { + "http/request_latency", + "HTTP request latency in microseconds", + "microsecs", +} +``` + +#### Recording +Measurement is a data point to be collected for a measure. For example, for a latency (ms) measure, 100 is a measurement that represents a 100 ms latency event. Users collect data points on the existing measures with the current context. Tags from the current context are recorded with the measurements if they are any. + +Recorded measurements are dropped if user is not aggregating them via views. Users don’t necessarily need to conditionally enable/disable recording to reduce cost. Recording of measurements is cheap. + +Libraries can record measurements and provide measures, +and end-users can later decide on which measures +they want to collect. + +#### Views + +In order to aggregate measurements and export, users need to define views. +A view allows recorded measurements to be aggregated with a one of the +aggregation methods set by the user cumulatively. +All recorded measurements is broken down by user-provided [tag](/core-concepts/tags) keys. + +Following aggregation methods are supported: + +* **Count**: The count of the number of measurement points. +* **Distribution**: Histogram distribution of the measurement points. +* **Sum**: A sum up of the measurement points. +* **LastValue**: Keeps the last recorded value, drops everything else. + +Users can dynamically create and delete views at runtime. Libraries may +export their own views and claim the view names by registering them. + +#### Sampling + +Stats are NOT sampled to be able to represent uncommon +cases. For example, a [99th percentile latency issue](https://www.youtube.com/watch?v=lJ8ydIuPFeU) +is rare. Combined with a low sampling rate, +it might be hard to capture it. This is why stats are not sampled. + +On the other hand, exporting every individual measurement would +be very expensive in terms of network traffic. This is why stats +collection aggregates data in the process and exports only the +aggregated data. + +#### Exporting + +Collected and aggregated data can be exported to a stats collection +backend by registering an exporter. + +Multiple exporters can be registered to upload the data to various different backends. +Users can unregister the exporters if they no longer are needed. + +See [exporters](/core-concepts/exporters) to learn more. diff --git a/content/tags.md b/content/core-concepts/tags.md similarity index 80% rename from content/tags.md rename to content/core-concepts/tags.md index e049270a..20485b83 100644 --- a/content/tags.md +++ b/content/core-concepts/tags.md @@ -1,7 +1,10 @@ -+++ -title = "Tags" -type = "leftnav" -+++ +--- +title: "Tags" +date: 2018-07-18T10:39:08-07:00 +draft: false +class: "shadow-images" +--- + Tags allow us to associate contextual key-value pairs with collected data. @@ -11,21 +14,21 @@ cases in isolation even in highly complex systems. Tags have keys and values. Examples of tags: -* {frontend: "web-0.12"} -* {frontend: "ios-10.2.12"} -* {http_endpoint: "server:8909/api/users"} +* `{frontend: "web-0.12"}` +* `{frontend: "ios-10.2.12"}` +* `{http_endpoint: "server:8909/api/users"}` Frontend tag allow users to breakdown the data between web, iOS and Android users. HTTP endpoint allows to filter or group by a specific endpoint when looking at the HTTP latency data. -## Propagation +#### Propagation Tags may be defined in one service and used in a view in a different service; they are propagated on the wire. -In distributed systems, a service is likely to be depending -on many other services. +In distributed systems, a service is likely to be depending +on many of other services. This results in many challenges when analyzing the data collected at the lower ends of the stack. Instrumentation at lower layer might not be very valuable @@ -37,7 +40,7 @@ Instead, we use tag propagation. Higher level services produce tags, and lower-end uses them when recording data. -![Tag propagation](/img/tags-propagation.png) +![Tag propagation](https://opencensus.io/img/tags-propagation.png) Above, frontend depends on the authentication service. Authentication service needs to query database that depends on the lower-level diff --git a/content/core-concepts/tracing.md b/content/core-concepts/tracing.md new file mode 100644 index 00000000..8d0b83a0 --- /dev/null +++ b/content/core-concepts/tracing.md @@ -0,0 +1,136 @@ +--- +title: "Tracing" +date: 2018-07-16T14:28:37-07:00 +draft: false +class: "shadow-images" +--- + + +A trace tracks the progression of a single user request +as it is handled by other services that make up an application. + +Each unit work is called a span in a trace. Spans include metadata about the work, +including the time spent in the step (latency) and status. +You can use tracing to debug errors and +latency issues of your application. + +#### Spans + +A trace is a tree of spans. + +A span is the unit work represented in a trace. A span may +represent a HTTP request, an RPC, a server handler, +a database query or a section customly marked in user code. + +![A trace](https://opencensus.io/img/trace-trace.png) + +Above, you see a trace with various spans. In order to respond +to `/messages`, several other internal requests are made. First, +we are checking if the user is authenticated, we are trying to +get the results from the cache. It is a cache miss, hence we +query the database for the results, we cache the results back, +and respond back to the user. + +There are two types of spans: + +* **Root span**: Root spans don't have a parent span. They are the + first span. `/messages` span above is a root span. +* **Child span**: Child spans have an existing span as their parent. + + +Spans are identified with an ID and are associated to a trace. +These identifiers and options byte together are called span context. +Inside the same process, span context is propagated in a context +object. When crossing process boundaries, it is serialized into +protocol headers. The receiving end can read the span context +and create child spans. + +#### Name + +Span names represent what span does. Span names should +be statistically meaningful. Most tracing backend and analysis +tools use span names to auto generate reports for the +represented work. + +Examples of span names: + +* "cache.Get" represents the Get method of the cache service. +* "/messages" represents the messages web page. +* "/api/user/(\\d+)" represents the user detail pages. + +#### Status + +Status represents the current state of the span. +It is represented by a canonical status code which maps onto a +predefined set of error values and an optional string message. + +Status allows tracing visualization tools to highlight +unsuccessful spans and helps tracing users to debug errors. + +![A trace with an error span](https://opencensus.io/img/trace-errorspan.png) + +Above, you can see `cache.Put` is errored because of the +violation of the key size limit. As a result of this error, + `/messages` request responded with an error to the user. + +#### Annotations + +Annotations are timestamped strings with optional attributes. +Annotations are used like log lines, but the log is per-Span. + +Example annotations: + +* 0.001s Evaluating database failover rules. +* 0.002s Failover replica selected. attributes:{replica:ab_001 zone:xy} +* 0.006s Response received. +* 0.007s Response requires additional lookups. attributes:{fanout:4} + +Annotations provide rich details to debug problems in the scope of a span. + +#### Attributes + +Attributes are additional information that is included in the +span which can represent arbitrary data assigned by the user. +They are key value pairs with the key being a string and the +value being either a string, boolean, or integer. + +Examples of attributes: + +* {http_code: 200} +* {zone: "us-central2"} +* {container_id: "replica04ed"} + +Attributes can be used to query the tracing data and allow +users to filter large volume tracing data. For example, you can +filter the traces by HTTP status code or availability zone by +using the example attributes above. + +#### Sampling + +Trace data is often very large in size and is expensive to collect. +This is why rather than collecting traces for every request, downsampling +is prefered. By default, OpenCensus provides a probabilistic sampler that +will trace once in every 10,000 requests. + +You can set a custom probablistic sampler, prefer to always sample or +not sample at all. +There are two ways to set samplers: + +* **Global sampler**: Global sampler is the global default. +* **Span sampler**: When starting a new span, a custom + sampler can be provided. If no custom sampling is + provided, global sampler is used. Span samplers are + useful if you want to over-sample some sections of your + code. For example, a low throughput background service + may use a higher sampling rate than a high-load RPC + server. + +#### Exporting + +Recorded spans will be reported by the registered exporters. + +Multiple exporters can be registered to upload the data to +various different backends. Users can unregister the exporters +if they no longer are needed. + +See [exporters](/core-concepts/exporters) to learn more. diff --git a/content/core-concepts/z-pages.md b/content/core-concepts/z-pages.md new file mode 100644 index 00000000..7375abee --- /dev/null +++ b/content/core-concepts/z-pages.md @@ -0,0 +1,74 @@ +--- +title: "zPages" +date: 2018-07-16T14:28:48-07:00 +draft: false +class: "shadow-images" +--- + +OpenCensus provides in-process web pages that displays +collected data from the process. These pages are called zPages +and they are useful to see collected data from a specific process +without having to depend on any metric collection or +distributed tracing backend. + +zPages can be useful during the development time or when +the process to be inspected is known in production. +zPages can also be used to debug [exporter](/core-concepts/exporters) issues. + +In order to serve zPages, register their handlers and +start a web server. Below, there is an example how to +serve these pages from `127.0.0.1:7777/debug`. + +{{<tabs Go Java>}} + {{<highlight go>}} +import ( + "log" + "net/http" + + "go.opencensus.io/zpages" +) + +func main() { + // Using the default serve mux, but you can create your own + mux := http.DefaultServeMux + zpages.Handle(mux, "/debug") + log.Fatal(http.ListenAndServe("127.0.0.1:7777", mux)) +} + {{</highlight>}} + + {{<highlight java>}} +// Add the dependencies by following the instructions at +// https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages + +ZPageHandlers.startHttpServerAndRegisterAll(7777); + {{</highlight>}} +{{</tabs>}} + +Once handler is registered, there are various pages provided +from the libraries: + +* [127.0.0.1:7777/debug/rpcz](http://127.0.0.1:7777/debug/rpcz) +* [127.0.0.1:7777/debug/tracez](http://127.0.0.1:7777/debug/tracez) + +#### /rpcz + +/rpcz serves stats about sent and received RPCs. For example at [/rpcz](http://127.0.0.1:7777/debug/rpcz) + +Available stats include: + +* Number of RPCs made per minute, hour and in total. +* Average latency in the last minute, hour and since the process started. +* RPCs per second in the last minute, hour and since the process started. +* Input payload in KB/s in the last minute, hour and since the process started. +* Output payload in KB/s in the last minute, hour and since the process started. +* Number of RPC errors in the last minute, hour and in total. + +#### /tracez + +[/tracez](http://127.0.0.1:7777/debug/tracez) serves details about +the trace spans collected in the process. It provides several sample spans +per latency bucket and sample errored spans. + +An example screenshot from this page is below: + +![/tracez](https://opencensus.io/img/traceZ.png) diff --git a/content/cpp.md b/content/cpp.md deleted file mode 100644 index fd47a2f6..00000000 --- a/content/cpp.md +++ /dev/null @@ -1,111 +0,0 @@ -+++ -title = "C++" -Description = "C++" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" -date = "2018-05-16T12:02:16-05:00" -+++ - -Build and run the example: - -```cpp -git clone https://github.com/census-instrumentation/opencensus-cpp.git - -cd opencensus-cpp -bazel build //examples/helloworld:helloworld -bazel-bin/opencensus/examples/helloworld/hello_world -``` - ---- - -#### Quickstart Example - -The example demonstrates how to record stats and traces for a video processing system. It records data with the “frontend” tag so that collected data can be broken by the frontend user who initiated the video processing. - -In this case we are using stdout exporters which we register at the beginning. - -```cpp -// Register stdout exporters. -opencensus::exporters::stats::StdoutExporter::Register(); -opencensus::exporters::trace::StdoutExporter::Register(); -``` - -We define a measure for video size which records the sizes in megabytes "MBy". - -```cpp -// Call measure so that it is initialized. -VideoSizeMeasure(); -``` - -We create a view and register it with the local Stdout exporter. - -``` cpp -// Create view to see the processed video size distribution broken down -// by frontend. The view has bucket boundaries (0, 256, 65536) -//that will group measure values into histogram buckets. -constopencensus::stats::ViewDescriptor video_size_view = -opencensus::stats::ViewDescriptor() - .set_name(kVideoSizeViewName) - .set_description("processed video size over time") - .set_measure(kVideoSizeMeasureName) - .set_aggregation(opencensus::stats::Aggregation::Distribution - (opencensus::stats::BucketBoundaries::Exponential(2, 256, 256))) - .add_column(kFrontendKey); - -// Create the view. -opencensus::stats::View view(video_size_view); - -// Register the view for export. -video_size_view.RegisterForExport(); -``` - -Example View - -``` -name: "my.org/views/video_size" -measure: name: "my.org/measure/video_size"; units: "MBy"; -description: "size of processed videos"; type: int64 -aggregation: Distribution with Buckets: - 0,256,512,1024,2048,4096,8192,16384,32768 -aggregation window: Cumulative -columns: my.org/keys/frontend -description: "processed video size over time" -video size : count: 1 mean: 25648 sum of squared deviation: 0 min: 25648 max: 25648 -histogram counts: 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 -``` - -In this case the view stores a distribution. The example records 1 video size to the view, which is 25648. This shows up in the histogram, with 1 bucket having a single value in it. - -```cpp -opencensus::stats::Record({{VideoSizeMeasure(), 25648}},{{kFrontendKey, "video size"}}); -``` - -Example Span - -``` -Name: my.org/ProcessVideo -TraceId-SpanId-Options: - a17625c6ed57d878092ea01fe87ded35-e9ec94e4de02fadb-01 -Parent SpanId: 0000000000000000 (remote: false) -Start time: 2018-03-04T22:42:54.492839757-08:00 -End time: 2018-03-04T22:42:54.500995971-08:00 -Attributes: (0 dropped) -Annotations: (0 dropped) - 2018-03-04T22:42:54.492858312-08:00: Start processing video. - 2018-03-04T22:42:54.500992796-08:00: Finished processing video. -Message events: (0 dropped) -Links: (0 dropped) -Span ended: true -Status: OK -``` - -Span context information is displayed in hexadecimal on a single line which is the concatenation of TraceId, SpanId, and span options. Parent SpanId is displayed on the following line. In this case there is no parent (root span), so the parent id is 0. There were 2 attributes added. After work has been completed a span must be ended by the user. A span that is still active (i.e. not ended), will not be exported. - -```cpp -span.AddAnnotation("Start processing video."); -... -span.AddAnnotation("Finished processing video."); -span.End(); -``` diff --git a/content/docs.md b/content/docs.md deleted file mode 100644 index 46118395..00000000 --- a/content/docs.md +++ /dev/null @@ -1,156 +0,0 @@ -+++ -title = "Documentation" -+++ - -Welcome to the developer documentation for OpenCensus. -Learn about key OpenCensus concepts, find library docs, -reference material, and tutorials. - -OpenCensus terminology is explained at the [glossary](/glossary). - ---- - -## Concepts - -* [Overview](/overview) -* [Tags](/tags) -* [Stats](/stats) -* [Exporters](/exporters) -* [Z-Pages](/zpages) - ---- - -## Libraries - -<div class="col-md-12 box" style="margin-top:20px"> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th data-label="C++:">C++</th> - </tr> - <tr> - <td><a href="/cpp">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://github.com/census-instrumentation/opencensus-cpp/blob/master/opencensus/stats/README.md">Stats API Reference</a></td> - </tr> - <tr> - <td><a href="https://github.com/census-instrumentation/opencensus-cpp/blob/master/opencensus/trace/README.md">Trace API Reference</a></td> - </tr> - </table> - </div> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th data-label="Erlang:">Erlang</th> - </tr> - <tr> - <td><a href="/erlang">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://hexdocs.pm/opencensus/0.3.1/">API Reference</a></td> - </tr> - <tr> - <td><a href="https://hex.pm/packages/opencensus">Package</a></td> - </tr> - </table> - </div> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th>Go</th> - </tr> - <tr> - <td><a href="/go">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://godoc.org/go.opencensus.io">API Reference</a></td> - </tr> - <tr> - <td> </td> - </tr> - </table> - </div> -</div> -<div class="col-md-12 box" style="margin-top:20px"> - <div class="col-md-4 box" id="docbox" style="align:left;"> - <table> - <tr> - <th>Java</th> - </tr> - <tr> - <td><a href="/java">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://www.javadoc.io/doc/io.opencensus/opencensus-api/">API Reference</a></td> - </tr> - <tr> - <td> </td> - </tr> - </table> - </div> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th>PHP</th> - </tr> - <tr> - <td><a href="/php">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://packagist.org/packages/opencensus/opencensus">API Reference</a></td> - </tr> - <tr> - <td> </td> - </tr> - </table> - </div> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th>Python</th> - </tr> - <tr> - <td><a href="/python">Quickstart Guide</td> - </tr> - <tr> - <td><a href="https://census-instrumentation.github.io/opencensus-python/trace/api/index.html">API Reference</a></td> - </tr> - <tr> - <td> </td> - </tr> - </table> - </div> -</div> -<div class="col-md-12 box" style="margin-top:20px"> - <div class="col-md-4 box" id="docbox"> - <table> - <tr> - <th>Ruby</th> - </tr> - <tr> - <td><a href="/ruby">Quickstart Guide</a></td> - </tr> - <tr> - <td><a href="https://www.rubydoc.info/gems/opencensus">API Reference</a></td> - </tr> - <tr> - <td> </td> - </tr> - </table> - </div> -</div> - - -<br clear="both"> - ---- - -## Use Cases - -* [Cloud Spanner - Instrumented by OpenCensus and exported to Stackdriver][1] -* [OpenCensus for gRPC Go][2] - - -[1]: https://medium.com/@orijtech/cloud-spanner-instrumented-by-opencensus-and-exported-to-stackdriver-6ed61ed6ab4e -[2]: /gogrpc diff --git a/content/erlang.md b/content/erlang.md deleted file mode 100644 index c32fb03e..00000000 --- a/content/erlang.md +++ /dev/null @@ -1,144 +0,0 @@ -+++ -Description = "erlang" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" - -title = "Erlang" -date = "2018-05-17T15:41:51-05:00" -+++ - - -The example demonstrates how to record stats and traces for a video processing system. It records data with the "frontend" tag so that collected data can be broken by the frontend user who initiated the video processing. Code for this example can be found under the `examples/helloworld` directory of the [OpenCensus Erlang repo](https://github.com/census-instrumentation/opencensus-erlang). - ---- - -#### API Documentation - -The OpenCensus Erlang API artifact is available [here](https://hexdocs.pm/opencensus/0.3.0/index.html). - ---- - -#### Example - -**Prerequisite** -[Erlang/OTP 20](http://www.erlang.org/) and [rebar3](http://www.rebar3.org/) are required. - -**Using** -Create a new Erlang application with `rebar3 new` named `helloworld`: - -```erlang -$ rebar3 new app helloworld -===> Writing helloworld/src/helloworld_app.erl -===> Writing helloworld/src/helloworld_sup.erl -===> Writing helloworld/src/helloworld.app.src -===> Writing helloworld/rebar.config -===> Writing helloworld/.gitignore -===> Writing helloworld/LICENSE -===> Writing helloworld/README.md -$ cd helloworld -``` - -Add `opencensus` as a dependency in `rebar.config`. For development purposes it is also useful to include the `shell` section of the config which tells rebar3 to boot the application and load configuration when running `rebar3 shell`: - -```erlang -{erl_opts, [debug_info]}. -{deps, [opencensus]}. - -{shell, [{apps, [helloworld]}, - {config, "config/sys.config"}]}. -``` - -```erlang -[ -{opencensus, [{sampler, {oc_sampler_always, []}}, - {reporter, {oc_reporter_stdout, []}}, - {stat, [{exporters, [{oc_stat_exporter_stdout, []}]}]} -]. -``` - -`opencensus` is a runtime dependency so it is added to the applications list in `src/helloworld.app.src`, ensuring it is included and started in a release of `helloworld`: - -```erlang -{application, helloworld, - [{description, "Example OpenCensus application"}, - {vsn, "0.1.0"}, - {registered, []}, - {mod, { helloworld_app, []}}, - {applications, - [kernel, - stdlib, - opencensus - ]}, - {env,[]}, - {modules, []}, - - {maintainers, []}, - {licenses, ["Apache 2.0"]}, - {links, []} -]}. -``` - -Building the application with `rebar3 compile` will fetch the OpenCensus Erlang library and its dependencies. - -When our application starts it needs to create and subscribe to the statistics that we'll record. So a call to `subscribe_views/0` is added to the application start function, `helloworld_app:start/2`: - -```erlang -subscribe_views() -> - oc_stat_view:subscribe(#{name => "video_size", - description => "size of processed videos", - tags => ['frontend'], - measure => 'my.org/measure/video_size', - aggregation => default_size_distribution()}). - -default_size_distribution() -> - {oc_stat_aggregation_distribution, - [{buckets, [0, 1 bsl 16, 1 bsl 32]}]}. -``` - -The main module called to actually do the video processing is `helloworld`. It creates a tag for who made the process request to include with the record statistic and creates a span for the duration of the video processing (a random sleep between 0 and 10 seconds): - -```erlang --module(helloworld). - --export([process/0]). - -process() -> - %% create a tag for who sent the request and start a child span - Tags = oc_tags:new(#{'frontend' => "mobile-ios9.3.5"}), - ocp:with_child_span(<<"my.org/ProcessVideo">>), - - %% sleep for 0-10 seconds to simulate processing time - timer:sleep(timer:seconds(rand:uniform(10))), - - %% finish the span - ocp:finish_span(), - - %% record the size of the video - oc_stat:record(Tags, 'my.org/measure/video_size', 25648). -``` - -Run the application with `rebar3 shell` and see the stats and span reported to the console: - - -```erlang -$ rebar3 shell -… -===> Booted opencensus -===> Booted helloworld -> helloworld:process(). -ok -{span,<<“my.org/ProcessVideo”>>,1201374966367397737078249396493886473, - 10421649746227310879,undefined,1, - {-576460748652616660,2097430124176280981}, - {-576460740651723247,2097430124176280981}, - #{},undefined,[],[],undefined,undefined,undefined} -video_size: #{rows => - [#{tags => #{“frontend” => “mobile-ios9.3.5”}, - value => - #{buckets => - [{0,0},{65536,1},{4294967296,0},{infinity,0}], - count => 1,mean => 25648.0,sum => 25648}}], - type => distribution} -``` diff --git a/content/exporters.md b/content/exporters.md deleted file mode 100644 index 82cb34cb..00000000 --- a/content/exporters.md +++ /dev/null @@ -1,97 +0,0 @@ -+++ -title = "Exporters" -type = "leftnav" -+++ - -Data collected by OpenCensus can be exported to any analysis tool or storage backend. -OpenCensus exporters can be contributed by anyone, and we provide support for several -open source backends and vendors out-of-the-box. - -Once you choose your backend, follow the instructions to initialize an exporter. -Then, register the initialized exporter. - -## Stats - -As an example, a Prometheus exporter is registered and Prometheus is going to scrape -`:9091` to read the collected data: - -{{% snippets %}} -{{% go %}} -``` go -import ( - "go.opencensus.io/exporter/prometheus" - "go.opencensus.io/stats/view" -) - -exporter, err := prometheus.NewExporter(prometheus.Options{}) -if err != nil { - log.Fatal(err) -} -view.RegisterExporter(exporter) - -http.Handle("/metrics", exporter) -log.Fatal(http.ListenAndServe(":9091", nil)) -``` -{{% /go %}} -{{% java %}} -``` -// Add the dependencies by following the instructions at -// https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/prometheus. - -PrometheusStatsCollector.createAndRegister(); - -// Uses a simple Prometheus HTTPServer to export metrics. -io.prometheus.client.exporter.HTTPServer server = - new HTTPServer("localhost", 9091, true); -``` -{{% /java %}} -{{% /snippets %}} - -## Traces - -As an example, a Zipkin exporter is registered. All collected trace data will be reported -to the registered Zipkin endpoint: - -{{% snippets %}} -{{% go %}} -``` -import ( - openzipkin "github.com/openzipkin/zipkin-go" - "github.com/openzipkin/zipkin-go/reporter/http" - "go.opencensus.io/exporter/zipkin" - "go.opencensus.io/trace" -) - -localEndpoint, err := openzipkin.NewEndpoint("example-server", "192.168.1.5:5454") -if err != nil { - log.Println(err) -} -reporter := http.NewReporter("http://localhost:9411/api/v2/spans") -defer reporter.Close() - -exporter := zipkin.NewExporter(reporter, localEndpoint) -trace.RegisterExporter(exporter) -``` -{{% /go %}} -{{% java %}} -``` -// Add the dependencies by following the instructions -// at https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/zipkin. - -ZipkinTraceExporter.createAndRegister( - "http://localhost:9411/api/v2/spans", "example-server"); -``` -{{% /java %}} -{{% /snippets %}} - -Exporters can be registered dynamically and unregistered. But most users will register -an exporter in their main application and never unregister it. - -Libraries instrumented with OpenCensus should not register exporters. Exporters should -only be registered by main applications. - -## Supported Backends - -Exporter support in each language for each backend: - -{{< sc_supportedExporters />}} diff --git a/content/faq.md b/content/faq.md deleted file mode 100644 index 65e72f6f..00000000 --- a/content/faq.md +++ /dev/null @@ -1,61 +0,0 @@ -+++ -title = "FAQ" -Description = "faq" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -date = "2018-05-10T14:14:33-05:00" -+++ - -#### Who is behind OpenCensus? - -OpenCensus originates from Google, where a set of libraries called Census were used to automatically capture traces and metrics from services. Since going open source, the project is now composed of a group of cloud providers, application performance management vendors, and open source contributors. The project is hosted in [GitHub](https://github.com/census-instrumentation/) and all work occurs there. - ---- - -#### How does OpenCensus benefit the ecosystem? - -* Making application metrics and distributed traces more accessible to developers. Today, one of the biggest challenges with gathering this information is the lack of good automatic instrumentation, as tracing and APM vendors have typically supplied their own limited, incompatible instrumentation solutions. With OpenCensus, more developers will be able to use these tools, which will improve the overall quality of their services and the web at large. -* APM vendors will benefit from less setup friction for customers, broader language and framework coverage, and reduced effort spent in designing and maintaining their own instrumentation. -* Local debugging capabilities. OpenCensus’s optional agent can be used to view requests and metrics locally and can dynamically change the sampling rate of traces, both of which are incredibly useful during critical production debugging sessions.</p> -* Collaboration and support from vendors (cloud providers like Google and Microsoft in addition to APM companies) and open source providers (Zipkin). As the OpenCensus libraries include instrumentation hooks into various web and RPC frameworks and exporters, they are immediately useful out of the box. -* Allowing service providers to better debug customer issues. As OpenCensus defines a common context propagation format, customers experiencing issues can provide a request ID to providers so that they can debug the problem together. Ideally, providers can trace the same requests as customers, even if they are using different analysis systems. - ---- - -#### What languages & integrations does OpenCensus support? - -{{< sc_supportedLanguages />}} - ---- - -#### What Exporters does OpenCensus support? - -{{< sc_supportedExporters />}} - ---- - -#### How do I use OpenCensus in my application? -If you are using a supported application framework, follow its instructions for configuring OpenCensus. - -* Choose a supported APM tool and follow its configuration instructions for using OpenCensus. -* You can also use the OpenCensus z-Pages to view your tracing data without an APM tool. - -A user’s guide will be released as soon as possible. - ---- - -#### What are the z-Pages? - -OpenCensus provides a stand-alone application that uses a gRPC channel to communicate with the OpenCensus code linked into your application. The application displays configuration parameters and trace information in real time held in the OpenCensus library. - ---- - -#### How can I contribute to OpenCensus? - -* Help people on the discussion forums. -* Tell us your success story using OpenCensus. -* Tell us how we can improve OpenCensus, and help us do it. -* Contribute to an existing library or create one for a new language. -* Integrate OpenCensus with a new framework. -* Integrate OpenCensus with a new APM tool. diff --git a/content/faq/_index.md b/content/faq/_index.md new file mode 100644 index 00000000..87cf5478 --- /dev/null +++ b/content/faq/_index.md @@ -0,0 +1,74 @@ +--- +title: "FAQ" +date: 2018-07-16T14:46:09-07:00 +draft: false +weight: 90 +class: "resized-logo" +--- + +##### Who is behind OpenCensus? + +OpenCensus originates from Google, where a set of libraries called Census were used to automatically +capture traces and metrics from services. Since going open source, the project is now composed of a +group of cloud providers, application performance management vendors, and open source contributors. + +The project is hosted on [GitHub @census-instrumentation](https://github.com/census-instrumentation/) and all work occurs there. + + +##### How does OpenCensus benefit the ecosystem? + +* Making application metrics and distributed traces more accessible to developers. +Today, one of the biggest challenges with gathering this information is the lack of good +automatic instrumentation, as tracing and APM vendors have typically supplied their own limited, +incompatible instrumentation solutions. With OpenCensus, more developers will be able to use these +tools, which will improve the overall quality of their services and the web at large. + +* APM vendors will benefit from less setup friction for customers, broader language and framework coverage, and reduced effort spent in designing and maintaining their own instrumentation. + +* Local debugging capabilities. OpenCensus’s optional agent can be used to view requests and metrics locally and can dynamically change the sampling rate of traces, both of which are incredibly useful during critical production debugging sessions. + +* Collaboration and support from vendors (cloud providers like Google and Microsoft in addition to APM companies) and open source providers (Zipkin). As the OpenCensus libraries include instrumentation hooks into various web and RPC frameworks and exporters, they are immediately useful out of the box. + +* Allowing service providers to better debug customer issues. As OpenCensus defines a common context propagation format, customers experiencing issues can provide a request ID to providers so that they can debug the problem together. Ideally, providers can trace the same requests as customers, even if they are using different analysis systems. + + + +##### What languages & integrations does OpenCensus support? + +![](/images/opencensus-supported-languages.png) + +{{<languages>}} + + + +##### What Exporters does OpenCensus support? +<abbr class="trace-exporter blue white-text">T</abbr> Backend supports Tracing + +<abbr class="stats-exporter teal white-text">S</abbr> Backend supports Stats + +{{<feature-matrix>}} + + + +##### How do I use OpenCensus in my application? +If you are using a supported application framework, follow its instructions for configuring OpenCensus. + +* Choose a supported APM tool and follow its configuration instructions for using OpenCensus. +* You can also use the OpenCensus z-Pages to view your tracing data without an APM tool. + +##### What are the zPages? + +OpenCensus provides a stand-alone application that uses a gRPC channel to communicate with the OpenCensus code linked into your application. The application displays configuration parameters and trace information in real time held in the OpenCensus library. + +You can learn more by visiting [zPages](/core-concepts/z-pages/) + + + +##### How can I contribute to OpenCensus? + +* Help people on the discussion forums. +* Tell us your success story using OpenCensus. +* Tell us how we can improve OpenCensus, and help us do it. +* Contribute to an existing library or create one for a new language. +* Integrate OpenCensus with a new framework. +* Integrate OpenCensus with a new APM tool. diff --git a/content/glossary.md b/content/glossary.md deleted file mode 100644 index 83eb0a08..00000000 --- a/content/glossary.md +++ /dev/null @@ -1,115 +0,0 @@ -+++ -title = "Glossary" -Description = "glossary" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "glossary" -date = "2018-05-14T16:11:08-05:00" -+++ - -**Tracing** - -Distributed Tracing tracks the progression of a request as it is handled by the services and processes that make up a distributed system. Each step in the Trace is called a Span. Each Span contains metadata, such as the length of time spent in the step, and optionally annotations about the work being performed. This information can be used for debugging and performance tuning of distributed systems. - ---- - -**Span** - -A unit work in a trace. Each span might have children spans within. If a span does not have a parent, it is called a root span. - ---- - -**Root Span** -The first span in a trace; this span does not have a parent. - ---- - -**Child Span** -A span with a parent span; it represents a unit of work that originates from an existing span. -A span MAY or MAY NOT be a child and spans can coexist as siblings on the same level. - ---- - -**Trace** -A tree of spans. A trace has a root span that encapsulates all the spans from start to end, and the children spans being the distinct calls invoked in between. - ---- - -**Sampling** - -Sampling determines how often requests will be traced. -There are three types of sampling made available from OpenCensus libraries: - -* **Always sample:** With this sampling, every single request is traced. -* **Probabilisticly sample:** A probability is set (e.g 0.0001) and the libraries will sample according to that probability (e.g. 1 in 10000 requests). -* **Never sample:** No request is traced. - ---- - -**Measure** -Any quantifiable metric. Examples of measures are number of requests, number of failed responses, bytes downloaded, cache misses, number of transactions, etc. - ---- - -**Aggregation** - -OpenCensus doesn't export each collected measurement. It preaggregates measurements in the process. -OpenCensus provides the following aggregations: - -* **Count:** Reports the count of the recorded data points. For example, number of requests. -* **Distribution:** Reports the histogram distribution of the recorded measurements. -* **Sum:** Reports the sum of the recorded measurements. -* **Last Value:** Reports on the last recorded measurement and drops everything else. - ---- - -**Tags** - -Tags are key-value pairs that can be recorded with measurements. -They are later used to breakdown the collected data in the metric collection backend. -Tags should be designed to meet the data querying requirements. Examples of tags: - -* ip=10.32.103.12 -* version=1.23 -* frontend=ios-10.3.1 - ---- - -**Views** - -A view manages the aggregation of a measure and exports the collected data. -Recordings on the measures won't be exported until a view is registered to -collect from the measure. - ---- - -**View Data** - -View Data is the exported data from a view. -It contains view information, aggregated data, -start and end time of the collection. - ---- - -**Exporters** - -Exporters allow for metrics and traces collected by -OpenCensus to be uploaded to the other services. -Various providers have OpenCensus exporters, examples are -Stackdriver Monitoring and Tracing, Prometheus, SignalFX, Jaeger. - ---- - -**Context Propagation** - -The mechanism to transmit identifiers or metadata on the wire -and in-process. For example, trace span identifier and stats tags -can be propagated in the process and among multiple processors. - ---- - -**RPC** - -Remote Procedure Call. The mechanism of invoking a procedure/subroutine in a different scope/address space. - ---- \ No newline at end of file diff --git a/content/go.md b/content/go.md deleted file mode 100644 index 9002e7ae..00000000 --- a/content/go.md +++ /dev/null @@ -1,3 +0,0 @@ -<meta http-equiv="refresh" content="0; url=https://github.com/census-instrumentation/opencensus-go" /> - -See the [OpenCensus Go](https://github.com/census-instrumentation/opencensus-go) repo. diff --git a/content/gogrpc.md b/content/gogrpc.md deleted file mode 100644 index 1737ac8a..00000000 --- a/content/gogrpc.md +++ /dev/null @@ -1,669 +0,0 @@ -+++ -Description = "go grpc" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -title = "OpenCensus for Go gRPC" -date = "2018-05-31T11:12:41-05:00" -+++ - -In this tutorial, we’ll examine how to use OpenCensus in your gRPC projects in the Go programming language for observability both into your server and then client! We’ll then examine how we can integrate with OpenCensus exporters from AWS X-Ray, Prometheus, Zipkin and Google Stackdriver Tracing and Monitoring. - ---- - -gRPC is a modern high performance framework for remote procedure calls, powered by Protocol Buffer encoding. It is polyglot in nature, accessible and useable on a variety of environments ranging from mobile mobile devices, general purpose computers to data centres for distributed computing, and it is implemented in a variety of languages: Go, Java, Python, C/C++, Node.js, Ruby, PHP. See [gRPC homepage](https://grpc.io/). - -OpenCensus is a modern observability framework for distributed tracing and monitoring across microservices and monoliths alike. It is polyglot in nature, accessible and useable too on a variety of environments from mobile devices, general purpose computers and data centres for distributed computing and it is implemented in a plethora of languages: Go, Java, Python, C++, Node.js, Ruby, PHP, C# (coming soon). - -Go is a modern programming language that powers the cloud as well as modern systems programming, making it easy to build simple, reliable and efficient software. It is a cross platform, fast, statically typed and a simple language. See [golang.org](https://golang.org). - -With the above three introductory paragraphs, perhaps you already noticed the common themes: high performance, distributed computing, modern nature, cross platform, simplicity, reliability — those points make the three a match #compatibility, hence the motivation for this tutorial/article. - ---- - -For this tutorial, we have a company’s service that’s in charge of capitalizing letters sent in from various clients and internal microservices using gRPC. - -To use gRPC, we firstly need to create Protocol Buffer definitions and from those, use the Protocol Buffer compiler with the gRPC plugin to generate code stubs. If you need to take a look at the pre-requisites or a primer into gRPC, please check out the docs at [grpc.io/docs/](https://grpc.io/docs/). - -Our service takes in a payload with bytes, and then capitalizes them on the server. - -``` -syntax = "proto3"; - -package rpc; - -message Payload { - int32 id = 1; - bytes data = 2; -} - -service Fetch { - rpc Capitalize(Payload) returns (Payload) {} -} -``` - -{{< sc_center >}}Payload Message and Fetch service{{< /sc_center >}} - -To generate code, we’ll firstly put our definition in a file called “defs.proto” and move it into our “rpc” directory and then run this command to generate gRPC code stubs in Go, using this Makefile below: - -``` -protoc: -protoc -I rpc rpc/defs.proto --go_out=plugins=grpc:rpc -``` - -{{< sc_center >}}Makefile{{< /sc_center >}} - -`make` should then generate code that’ll make the directory structure look like this - -``` -|-rpc/ - |-defs.proto - |-defs.pb.go -``` -After the code generation, we now need to add the business logic into the server - ---- - -### Plain Server - -Our server’s sole purpose is to capitalize content sent in and send it back to the client. With gRPC, as previously mentioned, the protoc plugin generated code for a server interface. This allows you create your own custom logic of operation, as we shall do below with a custom object that implements the `Capitalize`method. - -``` -package main - -import ( - "bytes" - "context" - "log" - "net" - - "google.golang.org/grpc" - - "./rpc" -) - -type fetchIt int - -// Compile time assertion that fetchIt implements FetchServer. -var _ rpc.FetchServer = (*fetchIt)(nil) - -func (fi *fetchIt) Capitalize(ctx context.Context, in *rpc.Payload) (*rpc.Payload, error) { - out := &rpc.Payload{ - Data: bytes.ToUpper(in.Data), - } - return out, nil -} - -func main() { - addr := ":9988" - ln, err := net.Listen("tcp", addr) - if err != nil { - log.Fatalf("gRPC server: failed to listen: %v", err) - } - srv := grpc.NewServer() - rpc.RegisterFetchServer(srv, new(fetchIt)) - log.Printf("fetchIt gRPC server serving at %q", addr) - if err := srv.Serve(ln); err != nil { - log.Fatalf("gRPC server: error serving: %v", err) - } -} -``` - -{{< sc_center >}}server.go{{< /sc_center >}} - -With that, we can now monetize access to generate money $$$. In order to accomplish that though, we need to create clients that speak gRPC and for that please see below: - ---- - -### Plain Client - -Our client makes a request to the gRPC server above, sending content that then gets capitalized and printed to our screen. It is interactive and can be run simply by `go run client.go`. - -``` -package main - -import ( - "bufio" - "context" - "fmt" - "log" - "os" - - "google.golang.org/grpc" - - "./rpc" -) - -func main() { - serverAddr := ":9988" - cc, err := grpc.Dial(serverAddr, grpc.WithInsecure()) - if err != nil { - log.Fatalf("fetchIt gRPC client failed to dial to server: %v", err) - } - fc := rpc.NewFetchClient(cc) - - fIn := bufio.NewReader(os.Stdin) - for { - fmt.Print("> ") - line, _, err := fIn.ReadLine() - if err != nil { - log.Fatalf("Failed to read a line in: %v", err) - } - - ctx := context.Background() - out, err := fc.Capitalize(ctx, &rpc.Payload{Data: line}) - if err != nil { - log.Printf("fetchIt gRPC client got error from server: %v", err) - continue - } - fmt.Printf("< %s\n\n", out.Data) - } -} -``` - -which when run interactively, will look like this - -![image - interactive response from the client](https://cdn-images-1.medium.com/max/800/1*rvkG7rff2y5Diy-64j74DQ.png "interactive response from the client") -{{< sc_center >}}interactive response from the client{{< /sc_center >}} - -And now that we have a client, we are open for business!! - ---- - -### Aftermath - -It’s been 1 hour since launch. Tech blogs and other programmers are sharing news of our service all over their internet and social media; our service just got so popular and is being talked about all around the business world too, high fives are shared and congrats shared — after this celebration, we all go back home and call it a night. It’s the latest and greatest API in the world, it is off the charts, customers from all over the world come in, what could go wrong? - -It hits 3AM and our servers start getting over loaded. Response time degrades overall for everyone. This however is only noticed after one of the engineers tried to give a demo to their family that they restlessly awoke at 2:00AM due to excitement, but the service is taking 15ms to give back a response. In normal usage, we saw about at most 1ms response time. What is causing the sluggishness of the system? When did our service start getting slow? What is the solution? Throw more servers at it? How many servers should we throw at it? How do we know what is going wrong? When? How can the engineering and business teams figure out what to optimize or budget for? How can we tell we’ve successfully optimized the system and removed bottlenecks? - -In comes in OpenCensus: OpenCensus is a single distribution of libraries for distributed tracing and monitoring for modern and distributed systems. OpenCensus can help answer mostly all of those questions that we asked. By “mostly”, I mean that it can answer the observability related questions such as: When did the latency increase? Why? How did it increase? By how much? What part of the system is the slowest? How can we optimize and assert successful changes? - -OpenCensus is simple to integrate and use, it adds very low latency to your applications and it is already integrated into both gRPC and HTTP transports. - -OpenCensus allows you to trace and measure once and then export to a variety of backends like Prometheus, AWS X-Ray, Stackdriver Tracing and Monitoring, Jaeger, Zipkin etc. With that mentioned, let’s get started. - -### Part 1: observability by instrumenting the server - -To collect statistics from gRPC servers, OpenCensus is already integrated with gRPC out of the box, and one just has to import `go.opencensus.io/plugin/ocgrpc`. And then also subscribe to the gRPC server views. This amounts to a 7 line change - -``` -10a11,13 -> "go.opencensus.io/plugin/ocgrpc" -> "go.opencensus.io/stats/view" -> -32c35,38 -< srv := grpc.NewServer() ---- -> if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { -> log.Fatalf("Failed to register gRPC server views: %v", err) -> } -> srv := grpc.NewServer(grpc.StatsHandler(new(ocgrpc.ServerHandler))) -``` - -and then to trace the application, we’ll start a span on entering the function, then end it on exiting. This amounts to a 7 line change too - -``` -12a13 -> "go.opencensus.io/trace" -22a24,29 -> _, span := trace.StartSpan(ctx, "(*fetchIt).Capitalize") -> defer span.End() -> -> span.Annotate([]trace.Attribute{ -> trace.Int64Attribute("len", int64(len(in.Data))), -> }, "Data in") -``` - -In the tracing, notice the `trace.StartSpan(ctx, "(*fetchIt).Capitalize")`? We take a `context.Context`as the first argument, to use context propagation which carries over RPC specific information about a request to uniquely identify it. - -### How do we examine that “observability”? -  - -Now that we’ve got tracing and monitoring in, let’s export that data out. Earlier on, I made claims that with OpenCensus you collect and trace once, then export to a variety of backends, simulatenously. Well, it is time for me to walk that talk! - -To do that, we’ll need to use the exporter integrations in our app to send data to our favorite backends: AWS X-Ray, Prometheus, Stackdriver Tracing and Monitoring - -``` -7a8 -> "net/http" -10a12,14 -> xray "github.com/census-instrumentation/opencensus-go-exporter-aws" -> "go.opencensus.io/exporter/prometheus" -> "go.opencensus.io/exporter/stackdriver" -12a17 -> "go.opencensus.io/trace" -22a28,33 -> _, span := trace.StartSpan(ctx, "(*fetchIt).Capitalize") -> defer span.End() -> -> span.Annotate([]trace.Attribute{ -> trace.Int64Attribute("len", int64(len(in.Data))), -> }, "Data in") -40a52,56 -> -> // OpenCensus exporters -> createAndRegisterExporters() -> -> // Finally serve -44a61,97 -> -> func createAndRegisterExporters() { -> // For demo purposes, set this to always sample. -> trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) -> // 1. Prometheus -> prefix := "fetchit" -> pe, err := prometheus.NewExporter(prometheus.Options{ -> Namespace: prefix, -> }) -> if err != nil { -> log.Fatalf("Failed to create Prometheus exporter: %v", err) -> } -> view.RegisterExporter(pe) -> // We need to expose the Prometheus collector via an endpoint /metrics -> go func() { -> mux := http.NewServeMux() -> mux.Handle("/metrics", pe) -> log.Fatal(http.ListenAndServe(":9888", mux)) -> }() -> -> // 2. AWS X-Ray -> xe, err := xray.NewExporter(xray.WithVersion("latest")) -> if err != nil { -> log.Fatalf("Failed to create AWS X-Ray exporter: %v", err) -> } -> trace.RegisterExporter(xe) -> -> // 3. Stackdriver Tracing and Monitoring -> se, err := stackdriver.NewExporter(stackdriver.Options{ -> MetricPrefix: prefix, -> }) -> if err != nil { -> log.Fatalf("Failed to create Stackdriver exporter: %v", err) -> } -> view.RegisterExporter(se) -> trace.RegisterExporter(se) -> } -``` - -to finally give this code - -``` -package main - -import ( - "bytes" - "context" - "log" - "net" - "net/http" - - "google.golang.org/grpc" - - xray "github.com/census-instrumentation/opencensus-go-exporter-aws" - "go.opencensus.io/exporter/prometheus" - "go.opencensus.io/exporter/stackdriver" - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/stats/view" - "go.opencensus.io/trace" - - "./rpc" -) - -type fetchIt int - -// Compile time assertion that fetchIt implements FetchServer. -var _ rpc.FetchServer = (*fetchIt)(nil) - -func (fi *fetchIt) Capitalize(ctx context.Context, in *rpc.Payload) (*rpc.Payload, error) { - _, span := trace.StartSpan(ctx, "(*fetchIt).Capitalize") - defer span.End() - - span.Annotate([]trace.Attribute{ - trace.Int64Attribute("len", int64(len(in.Data))), - }, "Data in") - out := &rpc.Payload{ - Data: bytes.ToUpper(in.Data), - } - return out, nil -} - -func main() { - addr := ":9988" - ln, err := net.Listen("tcp", addr) - if err != nil { - log.Fatalf("gRPC server: failed to listen: %v", err) - } - if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { - log.Fatalf("Failed to register gRPC server views: %v", err) - } - srv := grpc.NewServer(grpc.StatsHandler(new(ocgrpc.ServerHandler))) - rpc.RegisterFetchServer(srv, new(fetchIt)) - log.Printf("fetchIt gRPC server serving at %q", addr) - - // OpenCensus exporters - createAndRegisterExporters() - - // Finally serve - if err := srv.Serve(ln); err != nil { - log.Fatalf("gRPC server: error serving: %v", err) - } -} - -func createAndRegisterExporters() { - // For demo purposes, set this to always sample. - trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - // 1. Prometheus - prefix := "fetchit" - pe, err := prometheus.NewExporter(prometheus.Options{ - Namespace: prefix, - }) - if err != nil { - log.Fatalf("Failed to create Prometheus exporter: %v", err) - } - view.RegisterExporter(pe) - // We need to expose the Prometheus collector via an endpoint /metrics - go func() { - mux := http.NewServeMux() - mux.Handle("/metrics", pe) - log.Fatal(http.ListenAndServe(":9888", mux)) - }() - - // 2. AWS X-Ray - xe, err := xray.NewExporter(xray.WithVersion("latest")) - if err != nil { - log.Fatalf("Failed to create AWS X-Ray exporter: %v", err) - } - trace.RegisterExporter(xe) - - // 3. Stackdriver Tracing and Monitoring - se, err := stackdriver.NewExporter(stackdriver.Options{ - MetricPrefix: prefix, - }) - if err != nil { - log.Fatalf("Failed to create Stackdriver exporter: %v", err) - } - view.RegisterExporter(se) - trace.RegisterExporter(se) -} -``` - -{{< sc_center >}}OpenCensus instrumented server.go{{< /sc_center >}} - - -and with the following variables set in our environment - -`AWS_REGION=region` - -`AWS_ACCESS_KEY_ID=keyID` - -`AWS_SECRET_ACCESS_KEY=key` - -`GOOGLE_APPLICATION_CREDENTIALS=credentials.json` - -as well as our prometheus.yml file - -``` -global: - scrape_interval: 10s - - external_labels: - monitor: 'media_search' - -scrape_configs: - - job_name: 'media_search' - - scrape_interval: 10s - - static_configs: - - targets: ['localhost:9888', 'localhost:9988', 'localhost:9989'] -``` - -`prometheus --config.file=prometheus.yml` - -`go run server.go` - -`2018/05/12 11:40:17 fetchIt gRPC server serving at ":9988"` - -### Monitoring results - -![image - Prometheus latency bucket examinations](https://cdn-images-1.medium.com/max/800/1*29bVdvaQxMH9_c34gkUJcw.png "Prometheus latency bucket examinations") -{{< sc_center >}}Prometheus latency bucket examinations{{< /sc_center >}} - -![image - Prometheus completed_rpcs examination](https://cdn-images-1.medium.com/max/800/1*iV9rSPvDjUaWeMJQ756oYQ.png "Prometheus completed_rpcs examination") -{{< sc_center >}}Prometheus completed_rpcs examination{{< /sc_center >}} - -![image - Prometheus sent_bytes_per_rpc_bucket examination](https://cdn-images-1.medium.com/max/800/1*R-_OpHEDyHe2VL7r3-vcIw.png "Prometheus sent_bytes_per_rpc_bucket examination") -{{< sc_center >}}Prometheus sent_bytes_per_rpc_bucket examination{{< /sc_center >}} - -![image - Stackdriver Monitoring completed_rpcs examination](https://cdn-images-1.medium.com/max/800/1*pEwlM76GW5gJbZbWTUD5Cw.png "Stackdriver Monitoring completed_rpcs examination") -{{< sc_center >}}Stackdriver Monitoring completed_rpcs examination{{< /sc_center >}} - -![image - Stackdriver Monitoring server_latency examination](https://cdn-images-1.medium.com/max/800/1*bON1bvwFXxpDNEVABQ-UZQ.png "Stackdriver Monitoring server_latency examination") -{{< sc_center >}}Stackdriver Monitoring server_latency examination{{< /sc_center >}} - -### Tracing results - -![image - Common case: low latency on the server](https://cdn-images-1.medium.com/max/800/1*5gACz0J1DifcjZdQBoFXQQ.png "Common case: low latency on the server") -{{< sc_center >}}Common case: low latency on the server{{< /sc_center >}} - -![image - Postulation: pathological case of inbound network congestion](https://cdn-images-1.medium.com/max/800/1*BqjljxH73vuQYoLY6mQ5yg.png "Postulation: pathological case of inbound network congestion") -{{< sc_center >}}Postulation: pathological case of inbound network congestion{{< /sc_center >}} - -![image - Postulation: pathological case of outbound network congestion](https://cdn-images-1.medium.com/max/800/1*CJUF7vKUFN8-vk1EzYGf7w.png "Postulation: pathological case of outbound network congestion") -{{< sc_center >}}Postulation: pathological case of outbound network congestion{{< /sc_center >}} - -![image - Stackdriver Trace — common case, fast response, low latency](https://cdn-images-1.medium.com/max/800/1*FRS-wp8mgrV08-iQCfomyg.png "Stackdriver Trace — common case, fast response, low latency") -{{< sc_center >}}Stackdriver Trace — common case, fast response, low latency{{< /sc_center >}} - -![image - Postulation: system overload on server hence long time for bytes.ToUpper to return](https://cdn-images-1.medium.com/max/800/1*ghEB4UJ2_qIjZt2esz2anw.png "Postulation: system overload on server hence long time for bytes.ToUpper to return") -{{< sc_center >}}Postulation: system overload on server hence long time for bytes.ToUpper to return{{< /sc_center >}} - -![image - Postulation: outbound network congestion](https://cdn-images-1.medium.com/max/800/1*-JN7dtnP83fpw8oQ7WtVkA.png "Postulation: outbound network congestion") -{{< sc_center >}}Postulation: outbound network congestion{{< /sc_center >}} - -![image - Postulation: inbound network congestion](https://cdn-images-1.medium.com/max/800/1*Q0JmvVQ_yu2nsfhzBnWPiQ.png "Postulation: inbound network congestion") -{{< sc_center >}}Postulation: inbound network congestion{{< /sc_center >}} - ---- - -### Part 2: observability by instrumenting the client -  - -And then for client monitoring, we’ll just do the same thing for gRPC stats handler except using the ClientHandler and then also start and stop a trace and that’s it, collectively giving this diff below - -``` -7a8 -> "net/http" -11a13,19 -> xray "github.com/census-instrumentation/opencensus-go-exporter-aws" -> "go.opencensus.io/exporter/prometheus" -> "go.opencensus.io/exporter/stackdriver" -> "go.opencensus.io/plugin/ocgrpc" -> "go.opencensus.io/stats/view" -> "go.opencensus.io/trace" -> -17c25 -< cc, err := grpc.Dial(serverAddr, grpc.WithInsecure()) ---- -> cc, err := grpc.Dial(serverAddr, grpc.WithInsecure(), grpc.WithStatsHandler(new(ocgrpc.ClientHandler))) -22a31,38 -> // OpenCensus exporters for the client since disjoint -> // and your customers will usually want to have their -> // own statistics too. -> createAndRegisterExporters() -> if err := view.Register(ocgrpc.DefaultClientViews...); err != nil { -> log.Fatalf("Failed to register gRPC client views: %v", err) -> } -> -31c47 -< ctx := context.Background() ---- -> ctx, span := trace.StartSpan(context.Background(), "Client.Capitalize") -32a49 -> span.End() -39c56,93 -< } -\ No newline at end of file ---- -> } -> -> func createAndRegisterExporters() { -> // For demo purposes, set this to always sample. -> trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) -> // 1. Prometheus -> prefix := "fetchit" -> pe, err := prometheus.NewExporter(prometheus.Options{ -> Namespace: prefix, -> }) -> if err != nil { -> log.Fatalf("Failed to create Prometheus exporter: %v", err) -> } -> view.RegisterExporter(pe) -> // We need to expose the Prometheus collector via an endpoint /metrics -> go func() { -> mux := http.NewServeMux() -> mux.Handle("/metrics", pe) -> log.Fatal(http.ListenAndServe(":9889", mux)) -> }() -> -> // 2. AWS X-Ray -> xe, err := xray.NewExporter(xray.WithVersion("latest")) -> if err != nil { -> log.Fatalf("Failed to create AWS X-Ray exporter: %v", err) -> } -> trace.RegisterExporter(xe) -> -> // 3. Stackdriver Tracing and Monitoring -> se, err := stackdriver.NewExporter(stackdriver.Options{ -> MetricPrefix: prefix, -> }) -> if err != nil { -> log.Fatalf("Failed to create Stackdriver exporter: %v", err) -> } -> view.RegisterExporter(se) -> trace.RegisterExporter(se) -> } -``` - -or this which now becomes this code - -``` -package main - -import ( - "bufio" - "context" - "fmt" - "log" - "net/http" - "os" - - "google.golang.org/grpc" - - xray "github.com/census-instrumentation/opencensus-go-exporter-aws" - "go.opencensus.io/exporter/prometheus" - "go.opencensus.io/exporter/stackdriver" - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/stats/view" - "go.opencensus.io/trace" - - "./rpc" -) - -func main() { - serverAddr := ":9988" - cc, err := grpc.Dial(serverAddr, grpc.WithInsecure(), grpc.WithStatsHandler(new(ocgrpc.ClientHandler))) - if err != nil { - log.Fatalf("fetchIt gRPC client failed to dial to server: %v", err) - } - fc := rpc.NewFetchClient(cc) - - // OpenCensus exporters for the client since disjoint - // and your customers will usually want to have their - // own statistics too. - createAndRegisterExporters() - if err := view.Register(ocgrpc.DefaultClientViews...); err != nil { - log.Fatalf("Failed to register gRPC client views: %v", err) - } - - fIn := bufio.NewReader(os.Stdin) - for { - fmt.Print("> ") - line, _, err := fIn.ReadLine() - if err != nil { - log.Fatalf("Failed to read a line in: %v", err) - } - - ctx, span := trace.StartSpan(context.Background(), "Client.Capitalize") - out, err := fc.Capitalize(ctx, &rpc.Payload{Data: line}) - span.End() - if err != nil { - log.Printf("fetchIt gRPC client got error from server: %v", err) - continue - } - fmt.Printf("< %s\n\n", out.Data) - } -} - -func createAndRegisterExporters() { - // For demo purposes, set this to always sample. - trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - // 1. Prometheus - prefix := "fetchit" - pe, err := prometheus.NewExporter(prometheus.Options{ - Namespace: prefix, - }) - if err != nil { - log.Fatalf("Failed to create Prometheus exporter: %v", err) - } - view.RegisterExporter(pe) - // We need to expose the Prometheus collector via an endpoint /metrics - go func() { - mux := http.NewServeMux() - mux.Handle("/metrics", pe) - log.Fatal(http.ListenAndServe(":9889", mux)) - }() - - // 2. AWS X-Ray - xe, err := xray.NewExporter(xray.WithVersion("latest")) - if err != nil { - log.Fatalf("Failed to create AWS X-Ray exporter: %v", err) - } - trace.RegisterExporter(xe) - - // 3. Stackdriver Tracing and Monitoring - se, err := stackdriver.NewExporter(stackdriver.Options{ - MetricPrefix: prefix, - }) - if err != nil { - log.Fatalf("Failed to create Stackdriver exporter: %v", err) - } - view.RegisterExporter(se) - trace.RegisterExporter(se) -} -``` - -which gives this visualization - -![image - observability by instrumenting the client](https://cdn-images-1.medium.com/max/800/1*WisjA_lozi69PnHz7tMhdw.png "observability by instrumenting the client") - -![image - observability by instrumenting the client](https://cdn-images-1.medium.com/max/800/1*96_zFVZol6XkWODkkl8zyA.png "observability by instrumenting the client") - -![image - observability by instrumenting the client](https://cdn-images-1.medium.com/max/800/1*epDwWf-pNu0_VHi4md9ipw.png "observability by instrumenting the client") - -![image - observability by instrumenting the client](https://cdn-images-1.medium.com/max/800/1*znQiaxLKUd5Iv0xPetnG8g.png "observability by instrumenting the client") - -![image - observability by instrumenting the client](https://cdn-images-1.medium.com/max/800/1*4Qx_NM7t-Vfnv7BGqDUIoA.png "observability by instrumenting the client") - -Engineers can add alerts with Prometheus [https://prometheus.io/docs/alerting/overview/](https://prometheus.io/docs/alerting/overview/) or Stackdriver Monitoring [https://cloud.google.com/monitoring/alerts/](https://cloud.google.com/monitoring/alerts/) but also the various teams can examine system behaviour simultaneously, be it traces or metrics on a variety of backends. A question one might have is: “how about observability for streaming?” — for streaming you can use the same logic, but since in order to export a trace, the span needs to have been ended. However, with streaming, you have a single persistent connection that’s perhaps infinitely open. What you can do is register unique identifying information from a streaming request and then per stream response, start and end a span! -  - -With that we are off to the races! - -Thank you for reading this far and hope this tutorial was useful, you can find all the code in this tutorial at [https://github.com/orijtech/opencensus-for-grpc-go-developers](https://github.com/orijtech/opencensus-for-grpc-go-developers). - -Please feel free to check out the OpenCensus community https://opencensus.io send us feedback, instrument your backends and share with your friends and teams! - -This tutorial is part of a bunch more coming where we’ll use different languages, different transports and provide more samples etc. - -Emmanuel T Odeke diff --git a/content/index.md b/content/index.md deleted file mode 100644 index 8a7bf83c..00000000 --- a/content/index.md +++ /dev/null @@ -1,125 +0,0 @@ -+++ -Description = "index" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "index" -title = "OpenCensus" -date = "2018-05-22T11:02:24-05:00" -+++ - -{{% sc_index1 %}} - -<i class="fa fa fa-quote-left" style="color:#C1272D"></i> Kudos to whoever came up with the design and architecture of OpenCensus. Tried it for the first time yesterday and it was a great experience for me as a monitoring developer. It feels a lot more thought out and robust than other solutions. <i class="fa fa fa-quote-right" style="color:#C1272D"></i> -   ***- Ben Ripkens, Staff Software Engineer - Instana*** -  -  - -{{% sc_index2 %}} -#### What is OpenCensus? -A single distribution of libraries that automatically collects traces and metrics from your app, displays them locally, and sends them to any analysis tool. See an [{{% sc_gloss1 %}}overview{{% /sc_gloss1 %}}](/overview). -  -  -{{% /sc_index2 %}} - -{{% sc_index2 %}} -#### Who is behind OpenCensus? -OpenCensus originates from Google, where a set of libraries called Census were used to automatically capture traces and metrics from services. Since going open source, the project is now composed of a group of cloud providers, application performance management vendors, and open source contributors. The project is hosted in GitHub and all work occurs there. -{{% /sc_index2 %}} - -{{% sc_index3 %}} -#### How do I contribute? -Contributions are highly appreciated! Please see our [{{% sc_gloss1 %}}community{{% /sc_gloss1 %}}](community) page to contribute. -{{% /sc_index3 %}} -{{% /sc_index1 %}} - -{{% sc_index4 %}} -{{% sc_index5 %}} -#### Key Features -{{% /sc_index5 %}} - -{{% sc_index6 %}} -![icon-tools](./img/icon-tools.svg) -### Wire protocols and consistent APIs -Standard wire protocols and consistent APIs for handling trace and metric data. -{{% /sc_index6 %}} - -{{% sc_index7 %}} -![icon-book-open](./img/icon-book-open.svg) -### Single set of Libraries -A single set of libraries for many languages, including Java, C++, Go. In progress - Python, PHP, Erlang, and Ruby. -{{% /sc_index7 %}} - -{{% sc_index6 %}} -![icon-gears](./img/icon-gears.svg) -### Integrations -Included integrations with web and RPC frameworks, democratizing good tracing and metric collection. -{{% /sc_index6 %}} - -{{% sc_index7 %}} -![icon-download](./img/icon-download.svg) -### Exporters -Included exporters for storage and analysis tools. Right now the list includes Zipkin, Prometheus, Jaeger, Stackdriver, Datadog, and SignalFx. -{{% /sc_index7 %}} - -{{% sc_index6 %}} -![icon-global](./img/icon-global.svg) -### Open Source -All the code is entirely open source, to easily add your own integrations and exporters. -{{% /sc_index6 %}} - -{{% sc_index7 %}} -![icon-layers](./img/icon-layers.svg) -### No Add-ons Needed -No additional server or daemon is required to support OpenCensus. -  -  -{{% /sc_index7 %}} - -{{% sc_index6 %}} -![icon-linegraph](./img/icon-linegraph.svg) -### Optional Agent -In process debugging: an optional agent for displaying request and metrics data on instrumented hosts. -{{% /sc_index6 %}} - -{{% sc_index7 %}} -![Google Summer of Code](./img/summerOfCode.png) -  -**Get Involved** - Interested in developing for OpenCensus? Here are some ideas: [{{< sc_red >}}2018 Google Summer of Code{{< /sc_red >}}](https://storage.googleapis.com/summer-of-code/OpenCensusIdeasList.pdf) -{{% /sc_index7 %}} -{{% /sc_index4 %}} - -{{% sc_index8 %}} -{{% sc_index9 %}} -#### languages -Go straight to the language of your choice: -{{% /sc_index9 %}} - - -<div class="button-group filter-work"> - <a href="/cpp" class="btn">C++</a> - <a href="/erlang" class="btn">Erlang</a> - <a href="/go" class="btn">Go</a> -</div> -<div class="button-group filter-work"> - <a href="/java" class="btn">Java</a> - <a href="/php" class="btn">PHP</a> - <a href="/python" class="btn">Python</a> - <a href="/ruby" class="btn">Ruby</a> -</div> - -  - ---- -  -{{% sc_index9 %}} -#### Roadmap -See the [{{% sc_gloss1 %}}current roadmap{{% /sc_gloss1 %}}](/roadmap) of OpenCensus. -  - ---- -  - -#### Partners & Contributors -{{% /sc_index9 %}} -{{% /sc_index8 %}} diff --git a/content/integrations/_index.md b/content/integrations/_index.md new file mode 100644 index 00000000..d4d7be67 --- /dev/null +++ b/content/integrations/_index.md @@ -0,0 +1,8 @@ +--- +title: "Integrations" +date: 2018-07-16T14:34:38-07:00 +draft: false +weight: 70 +--- + +{{% children %}} diff --git a/content/integrations/caddy.md b/content/integrations/caddy.md new file mode 100644 index 00000000..cac6b8f1 --- /dev/null +++ b/content/integrations/caddy.md @@ -0,0 +1,121 @@ +--- +title: "Caddy" +date: 2018-07-16T14:42:17-07:00 +draft: false +class: "integration-page" +--- + +![caddy logo](/img/caddyserver-logo.png) + +#### Table of contents + +- [Background](#background) +- [Enabling Observability](#enabling-observability) + - [Git checkout](#git-checkout) + - [Syntax](#syntax) + - [Variables Table](#variables-table) + - [Examples](#examples) + +#### Background + +Caddy is a modern server that is deployable for modern web services. +With the increasing complexity and style of deployment of many web services, +examining the behavior of the entire system quickly becomes very complex, +and gains from any updates, optimizations or load shedding become +very hard to qualify or examine. + +To fill this void, Caddy rightfully so deserves modern observability. + +Modern observability on the web server means that any operations after a request +hits the web server can be observed, measured and examined irrespective of +the destination of the request, whatever centric serving it performs or the big +picture system behavior. + +Distributed Tracing and Monitoring is the mechanism by which we can gain +insights into the behavior of a distributed system. + +Tracing gives us timing and territorial information about the progression +of a request. Using context propagation on the transport e.g HTTP, we can +send over information between remote services and after completion examine +the propagations on various backends, without any vendor lock-in or any +single cloud lock-in. + +With monitoring/metric collection, we can collect any quantifiable metrics such as: +* Client and Server latency +* Memory statistics +* Runtime behavior + +An added advantage of vendor agnostic distributed tracing is that we can then export +these traces and metrics simultaneously to a plethora of backends that your +site reliability engineers and generally other developers can examine on such as: +* Instana +* Prometheus/Grafana +* AWS X-Ray +* Zipkin +* Jaeger +* DataDog +* Stackdriver Monitoring and Tracing +and many more + +However, the distributed tracing and monitoring framework should provide very low +latency and optionality so that users of the server will not incur expensive overhead. +Also the addition of observability the web server should not add a maintainence burden +for your teams, the project maintainers either nor should they require sophisticated +and specialized distributed systems and observability knowledge, nor should it require +sophisicated infrastructure deployments. + +#### Enabling Observability + +```shell +caddy -observability "<sampler_rate>;exporter1:[config1Key=config1Value:config2Key=config2Value...][,]exporter2...]" +``` + +##### Git checkout + +You can enable observability by checking out the instrumented branch of caddy +```shell +go get github.com/mholt/caddy/caddy +cd $GOPATH/src/github.com/mholt/caddy +git add orijtech git@github.com:orijtech/caddy.git && git fetch orijtech && git checkout instrument-with-opencensus && go get ./caddy +``` + +##### Syntax + +```xml +observability := SamplerRate;Exporters +SamplerRate := float64 value +Exporters := [ExporterConfig](,ExporterConfig)? +ExporterConfig := Name:[Key-ValuePairs]* +Name := collection of symbolic names for exporters +Key-Value Pair := KeyToken=ValueToken +KeyToken := string +ValueToken := string +``` + +##### Variables Table + +Exporter Name|Key|Type|Notes|Example +---|---|---|---|--- +aws-xray|AWS_REGION|String|The region that your project is located in|`AWS_REGION=us-west-2` +aws-xray|AWS_ACCESS_KEY_ID|Your access key|`AWS_ACCESS_KEY_ID=keyID` +aws-xray|AWS_SECRET_ACCESS_KEY|Your access key|`AWS_SECRET_ACCESS_KEY=secretKey` +jaeger|agent|The URL of the Jaeger|`caddy -observability "jaeger:agent=localhost:6831"` +jaeger|collector|The URL of the Jaeger|`caddy -observability "jaeger:collector=http://localhost:9411"` +jaeger|service-name|The service name when inspected by Jaeger|`caddy -observability "jaeger:service-name=search_endpoint"` +prometheus|port|The port that will be scraped from your `prometheus.yml` file|`caddy -observability "prometheus:port=9987"` +stackdriver|GOOGLE_APPLICATION_CREDENTIALS|File path for value|The credentials for your Google Cloud Platform project|`GOOGLE_APPLICATION_CREDENTIALS=~/creds.json caddy -observability "1;stackdriver:tracing=true"` +stackdriver|monitoring|boolean for value|A commandline option to toggle monitoring|`caddy -observability "stackdriver:monitoring=true"` +stackdriver|tracing|boolean for value|A commandline option to toggle tracing|`caddy -observability "stackdriver:tracing=true"` +stackdriver|project-id|string for value|A commandline option|`caddy -observability "stackdriver:project-id=census-demos"` +zipkin|local|URL|The URL of the local endpoint|`caddy -observability "zipkin:local=192.168.1.5:5454"` +zipkin|reporter|URL|The URL of the reporter endpoint|`caddy -observability "zipkin:reporter=http://localhost:9411/api/v2/spans"` +zipkin|service-name|string|The name of your service|`caddy -observability "service-name=server"` + +##### Examples + +* Comprehensive example running with all the environment variables too + +```shell +GOOGLE_APPLICATION_CREDENTIALS=./creds.json AWS_REGION=us-west-2 AWS_ACCESS_KEY_ID=keyId AWS_SECRET_ACCESS_KEY=secretKey \ + caddy -observability "0.9;zipkin,prometheus:port=8999,aws-xray,stackdriver:tracing=true:monitoring=true:project-id=census-demos,jaeger:agent=localhost:6831,service-name=search-endpoint" +``` diff --git a/content/integrations/google_cloud_spanner/Go.md b/content/integrations/google_cloud_spanner/Go.md new file mode 100644 index 00000000..48d797f5 --- /dev/null +++ b/content/integrations/google_cloud_spanner/Go.md @@ -0,0 +1,192 @@ +--- +title: "Go" +date: 2018-07-24T15:14:00-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/gopher.png) + +{{% notice note %}} +This guide makes use of a couple of APIs + +API|Guided codelab +---|--- +Spanner|[Spanner codelab](/codelabs/spanner) +Stackdriver |[Stackdriver codelab](/codelabs/stackdriver) +{{% /notice %}} + +Cloud Spanner's Go package was already instrumented for: +* Tracing with OpenCensus +* Metrics with gRPC + +## Table of contents +- [Packages to import](#packages-to-import) +- [Enable metric reporting](#register-views) + - [Register client metric views](#register-client-metric-views) + - [Register server metric views](#register-server-metric-views) +- [Enable tracing](#enable-tracing) +- [End to end code sample](#end-to-end-code-sample) +- [Viewing your traces](#viewing-your-traces) +- [Viewing your metrics](#viewing-your-metrics) + +#### Packages to import + +For tracing and metrics on Spanner, we'll import a couple of packages + +Package Name|Package link +---|--- +The Cloud Spanner Go package|[cloud.google.com/spanner](https://godoc.org/cloud.google.com/spanner) +The OpenCensus trace package|[go.opencensus.io/trace](https://godoc.org/go.opencensus.io/trace) +The OpenCensus metrics views package|[go.opencensus.io/stats](https://godoc.org/go.opencensus.io/stats) +The OpenCensus gRPC plugin|[go.opencensus.io/plugin/ocgrpc](https://godoc.org/go.opencensus.io/plugin/ocgrpc) + +And when imported in code +{{<highlight go>}} +import ( + "cloud.google.com/spanner" + "go.opencensus.io/plugin/ocgrpc" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" +) +{{</highlight>}} + +#### Enable metric reporting + +To enable metric reporting/exporting, we need to enable a metrics exporter, but before that we'll need +to register and enable the views that match the metrics to collect. For a complete list of the available views +available please visit [https://godoc.org/go.opencensus.io/plugin/ocgrpc](https://godoc.org/go.opencensus.io/plugin/ocgrpc) + +However, for now we'll split them into client and server views + +##### Register client metric views +{{<highlight go>}} +if err := view.Register(ocgrcp.DefaultClientViews...); err != nil { + log.Fatalf("Failed to register gRPC client views: %v", err) +} +{{</highlight>}} + +##### Register server metric views +{{<highlight go>}} +if err := view.Register(ocgrcp.DefaultServerViews...); err != nil { + log.Fatalf("Failed to register gRPC server views: %v", err) +} +{{</highlight>}} + +##### Exporting traces and metrics +The last step is to enable trace and metric exporting. For that we'll use say [Stackdriver Exporter](/supported-exporters/go/stackdriver) or +any of the [Go exporters](/supported-exporters/go/) + +##### End to end code sample +With all the steps combined, we'll finally have this code snippet +{{<highlight go>}} +package main + +import ( + "fmt" + "log" + "time" + + "cloud.google.com/go/spanner" + "golang.org/x/net/context" + + "go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/plugin/ocgrpc" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +type Player struct { + FirstName string `spanner:"first_name"` + LastName string `spanner:"last_name"` + UUID string `spanner:"uuid"` + Email string `spanner:"email"` +} + +func main() { + se, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "census-demos", + MetricPrefix: "spanner-oc-demo", + }) + if err != nil { + log.Fatalf("StatsExporter err: %v", err) + } + // Let's ensure that the Stackdriver exporter uploads all its data before the program exits + defer se.Flush() + + // Enable tracing + trace.RegisterExporter(se) + + // Enable metrics collection + view.RegisterExporter(se) + + // Register all the gRPC client views + if err := view.Register(ocgrpc.DefaultClientViews...); err != nil { + log.Fatalf("Failed to register gRCP default client views for metrics: %v", err) + } + // Register all the gRPC server views + if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { + log.Fatalf("Failed to register gRCP default server views for metrics: %v", err) + } + + // Enable the trace sampler. + // We are always sampling for demo purposes only: it is very high + // depending on the QPS, but sufficient for the purpose of this quick demo. + // More realistically perhaps tracing 1 in 10,000 might be more useful + trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) + + ctx := context.Background() + + // The database must exist + databaseName := "projects/census-demos/instances/census-demos/databases/demo1" + sessionPoolConfig := spanner.SessionPoolConfig{MinOpened: 5, WriteSessions: 1} + client, err := spanner.NewClientWithConfig(ctx, databaseName, spanner.ClientConfig{SessionPoolConfig: sessionPoolConfig}) + if err != nil { + log.Fatalf("SpannerClient err: %v", err) + } + defer client.Close() + + // Warm up the spanner client session. In normal usage + // you'd have hit this point after the first operation. + _, _ = client.Single().ReadRow(ctx, "Players", spanner.Key{"foo@gmail.com"}, []string{"email"}) + + for i := 0; i < 3; i++ { + ctx, span := trace.StartSpan(ctx, "create-players") + + players := []*Player{ + {FirstName: "Poke", LastName: "Mon", Email: "poke.mon@example.org", UUID: "f1578551-eb4b-4ecd-aee2-9f97c37e164e"}, + {FirstName: "Go", LastName: "Census", Email: "go.census@census.io", UUID: "540868a2-a1d8-456b-a995-b324e4e7957a"}, + {FirstName: "Quick", LastName: "Sort", Email: "q.sort@gmail.com", UUID: "2b7e0098-a5cc-4f32-aabd-b978fc6b9710"}, + } + up := fmt.Sprintf("%d-%d.", i, time.Now().Unix()) + for _, player := range players { + player.Email = up + player.Email + } + + if err := newPlayers(ctx, client, players...); err != nil { + log.Printf("Creating newPlayers err: %v", err) + } + span.End() + } +} + +func newPlayers(ctx context.Context, client *spanner.Client, players ...*Player) error { + var ml []*spanner.Mutation + for _, player := range players { + m, err := spanner.InsertStruct("Players", player) + if err != nil { + return err + } + ml = append(ml, m) + } + _, err := client.Apply(ctx, ml) + return err +} +{{</highlight>}} + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/integrations/google_cloud_spanner/Java.md b/content/integrations/google_cloud_spanner/Java.md new file mode 100644 index 00000000..23ecd7fd --- /dev/null +++ b/content/integrations/google_cloud_spanner/Java.md @@ -0,0 +1,300 @@ +--- +title: "Java" +date: 2018-07-24T15:14:00-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/java.png) + +{{% notice note %}} +This guide makes use of a couple of APIs + +API|Guided codelab +---|--- +Spanner|[Spanner codelab](/codelabs/spanner) +Stackdriver |[Stackdriver codelab](/codelabs/stackdriver) +{{% /notice %}} + +Cloud Spanner's Java package was already instrumented for: +* Tracing with OpenCensus +* Metrics with gRPC + +## Table of contents +- [Packages to import](#packages-to-import) + - [Pom.xml](#pom.xml) +- [Enable metric reporting](#register-views) + - [Register client metric views](#register-client-metric-views) + - [Register server metric views](#register-server-metric-views) +- [Enable tracing](#enable-tracing) +- [End to end code sample](#end-to-end-code-sample) +- [Running it](#running-it) + - [Maven install](#maven-install) + - [Run the code](#run-the-code) +- [Viewing your traces](#viewing-your-traces) +- [Viewing your metrics](#viewing-your-metrics) + +#### Packages to import + +For tracing and metrics on Spanner, we'll import a couple of packages + +Package Name|Package link +---|--- +The Cloud Spanner Java package|[com.google.cloud.spanner](https://googlecloudplatform.github.io/google-cloud-java) +The OpenCensus trace package|[io.opencensus.trace](https://www.javadoc.io/doc/io.opencensus/opencensus-trace) +The OpenCensus Java gRPC views|[io.opencensus.contrib.grpc.metrics.RpcViews](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/grpc_metrics) + +And when imported in code: + +```java +import com.google.cloud.spanner; +import io.opencensus.contrib.grpc.metrics.RpcViews; +import io.opencensus.trace.Tracing; +``` + +#### Enable metric reporting + +To enable metric reporting/exporting, we need to enable a metrics exporter, but before that we'll need +to register and enable the views that match the metrics to collect. For a complete list of the available views +available please visit [io.opencensus.contrib.grpc.metrics.RpcViews](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/grpc_metrics) + +Finally, we'll register all the views + +##### Register gRPC views + +```java +RpcViews.registerAllGrpcViews(); +``` + +##### Exporting traces and metrics +The last step is to enable trace and metric exporting. For that we'll use say [Stackdriver Exporter](/supported-exporters/java/stackdriver) or +any of the [Java exporters](/supported-exporters/java/) + +##### End to end code sample +With all the steps combined, we'll finally have this code snippet + +{{<tabs Source Pom_xml>}} +{{<highlight java>}} +package com.opencensus.examples; + +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.Key; +import com.google.cloud.spanner.Mutation; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.Statement; + +import io.opencensus.common.Scope; +import io.opencensus.contrib.grpc.metrics.RpcViews; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; +import io.opencensus.trace.Tracing; +import io.opencensus.trace.samplers.Samplers; + +import java.util.Arrays; +import java.util.List; + +public class SpannerOpenCensusTutorial { + private DatabaseClient dbClient; + private Spanner spanner; + + private static String parentSpanName = "create-players"; + public SpannerOpenCensusTutorial(String instanceId, String databaseId) throws Exception { + // Instantiate the client. + SpannerOptions options = SpannerOptions.getDefaultInstance(); + this.spanner = options.getService(); + + // And then create the Spanner database client. + this.dbClient = this.spanner.getDatabaseClient(DatabaseId.of( + options.getProjectId(), instanceId, databaseId)); + + // Next up let's install the exporter for Stackdriver tracing. + StackdriverTraceExporter.createAndRegister(); + Tracing.getExportComponent().getSampledSpanStore() + .registerSpanNamesForCollection(Arrays.asList(parentSpanName)); + + // Then the exporter for Stackdriver monitoring/metrics. + StackdriverStatsExporter.createAndRegister(); + RpcViews.registerAllGrpcViews(); + } + + public void close() { + this.spanner.close(); + } + + public void warmUpRead() { + this.dbClient.singleUse().readRow("Players", Key.of("foo@gmail.com"), Arrays.asList("email")); + } + + public static void main(String ...args) throws Exception { + if (args.length < 2) { + System.err.println("Usage: ZeuSports <instance_id> <database_id>"); + return; + } + + try { + SpannerOpenCensusTutorial zdb = new SpannerOpenCensusTutorial(args[0], args[1]); + // Warm up the spanner client session. In normal usage + // you'd have hit this point after the first operation. + zdb.warmUpRead(); + + for (int i=0; i < 3; i++) { + String up = i + "-" + (System.currentTimeMillis() / 1000) + "."; + List<Mutation> mutations = Arrays.asList( + playerMutation("Poke", "Mon", up + "poke.mon@example.org", "f1578551-eb4b-4ecd-aee2-9f97c37e164e"), + playerMutation("Go", "Census", up + "go.census@census.io", "540868a2-a1d8-456b-a995-b324e4e7957a"), + playerMutation("Quick", "Sort", up + "q.sort@gmail.com", "2b7e0098-a5cc-4f32-aabd-b978fc6b9710") + ); + + zdb.insertPlayers(mutations); + } + + zdb.close(); + } catch (Exception e) { + System.out.printf("Exception while adding player: " + e); + } finally { + System.out.println("Bye!"); + } + } + + public static Mutation playerMutation(String firstName, String lastName, String email, String uuid) { + return Mutation.newInsertBuilder("Players") + .set("first_name") + .to(firstName) + .set("last_name") + .to(lastName) + .set("uuid") + .to(uuid) + .set("email") + .to(email) + .build(); + } + + public void insertPlayers(List<Mutation> players) throws Exception { + try (Scope ss = Tracing.getTracer() + .spanBuilderWithExplicitParent(parentSpanName, null) + // Enable the trace sampler. + // We are always sampling for demo purposes only: this is a very high sampling + // rate, but sufficient for the purpose of this quick demo. + // More realistically perhaps tracing 1 in 10,000 might be more useful + .setSampler(Samplers.alwaysSample()) + .startScopedSpan()) { + + this.dbClient.write(players); + } finally { + } + } +} +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.opencensus.tutorials</groupId> + <artifactId>opencensus-tutorials</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>opencensus-examples</name> + <url>http://maven.apache.org</url> + + <properties> + <maven.compiler.target>1.8</maven.compiler.target> + <maven.compiler.source>1.8</maven.compiler.source> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.11.0</opencensus.version> + </properties> + + <dependencies> + <dependency> + <groupId>com.google.cloud</groupId> + <artifactId>google-cloud-spanner</artifactId> + <version>0.33.0-beta</version> + <exclusions> + <exclusion> + <groupId>com.google.guava</groupId> + <artifactId>guava-jdk5</artifactId> + </exclusion> + <exclusion> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>20.0</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>0.11.0</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-stackdriver</artifactId> + <version>0.11.0</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-stackdriver</artifactId> + <version>0.11.0</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-contrib-grpc-metrics</artifactId> + <version>0.11.0</version> + </dependency> + + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>0.11.0</version> + <scope>runtime</scope> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.4.0</version> + <configuration> + <mainClass>com.opencensus.tutorials.spanner</mainClass> + </configuration> + </plugin> + </plugins> + </build> + +</project> +{{</highlight>}} +{{</tabs>}} + +#### Running it +##### Maven install +```shell +mvn install +``` + +##### Run the code +```shell +mvn exec:java -Dexec.mainClass=com.opencensus.tutorials.spanner -Dexec.args="census-demos demo1" +``` + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/integrations/google_cloud_spanner/_index.md b/content/integrations/google_cloud_spanner/_index.md new file mode 100644 index 00000000..7a5a5f40 --- /dev/null +++ b/content/integrations/google_cloud_spanner/_index.md @@ -0,0 +1,19 @@ +--- +title: "Google Cloud Spanner" +date: 2018-07-24T14:20:00-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/cloud_spanner.png) + +Cloud Spanner is a fully managed, mission-critical, relational database service that offers transactional consistency at +global scale, schemas, SQL (ANSI 2011 with extensions), and automatic, synchronous replication for high availability. + +However, OpenCensus was used to instrument Cloud Spanner clients in the following languages: +{{%children%}} + +Or you can read an [all-in one blog post/tutorial](https://medium.com/@orijtech/cloud-spanner-instrumented-by-opencensus-and-exported-to-stackdriver-6ed61ed6ab4e) + +For more information, you can read about it here and get started [Spanner docs](https://cloud.google.com/spanner/docs) diff --git a/content/integrations/google_cloud_storage/Go.md b/content/integrations/google_cloud_storage/Go.md new file mode 100644 index 00000000..a355a447 --- /dev/null +++ b/content/integrations/google_cloud_storage/Go.md @@ -0,0 +1,183 @@ +--- +title: "Go" +date: 2018-07-24T23:19:00-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/gopher.png) + +{{% notice note %}} +This guide makes use of a couple of APIs + +API|Guided codelab +---|--- +Storage |[Storage codelab](/codelabs/storage) +Stackdriver |[Stackdriver codelab](/codelabs/stackdriver) +{{% /notice %}} + +Google Cloud Storage (GCS) is a unified object storage for developers and enterprises, managed by Google. +For more information you can read about it here and get started [Storage docs](https://godoc.org/cloud.google.com/go/storage/docs) + +Cloud Storage 's Go package was already instrumented for: +* Tracing with OpenCensus + +## Table of contents +- [Packages to import](#packages-to-import) +- [Technical detour](#technical-detour) +- [Enable tracing](#enable-tracing) +- [End to end code sample](#end-to-end-code-sample) +- [Viewing your traces](#viewing-your-traces) + +#### Packages to import + +For tracing and metrics on Spanner, we'll import a couple of packages + +Package Name|Package link +---|--- +The Cloud Storage Go package|[cloud.google.com/storage](https://godoc.org/cloud.google.com/storage) +The OpenCensus trace package|[go.opencensus.io/trace](https://godoc.org/go.opencensus.io/trace) +The OpenCensus stats packages|[go.opencensus.io/stats](https://godoc.org/go.opencensus.io/stats) +The OpenCensus HTTP plugin package|[go.opencensus.io/plugin/ochttp](https://godoc.org/go.opencensus.io/plugin/ochttp) + +And when imported in code +{{<highlight go>}} +import ( + "cloud.google.com/storage" + "go.opencensus.io/plugin/ochttp" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" + "google.golang.org/api/option" +) +{{</highlight>}} + +#### Technical detour + +Because GCS uses HTTP to connect to Google's backend, we'll need to enable metrics and tracing using a custom client +for GCP uploads. The custom client will have an `ochttp` enabled transport and then the rest is simple + +##### Setting up the ochttp enabled transport + +{{<highlight go>}} +import ( + "context" + "net/http" + + "go.opencensus.io/plugin/ochttp" + "google.golang.org/api/option" +) + +hc := &http.Client{Transport: new(ochttp.Transport)} +gcsClient := storage.NewClient(context.Background(), option.WithHTTPClient(hc)) +{{</highlight>}} + +#### Enable metric reporting + +To enable metric reporting/exporting, we need to enable a metrics exporter, but before that we'll need +to register and enable the views that match the HTTP metrics to collect. For a complete list of the available views +available please visit [https://godoc.org/go.opencensus.io/plugin/ochttp](https://godoc.org/go.opencensus.io/plugin/ochttp) + +However, for now we'll split them into client and server views + +##### Register client metric views +{{<highlight go>}} +if err := view.Register(ochttp.DefaultClientViews...); err != nil { + log.Fatalf("Failed to register HTTP client views: %v", err) +} +{{</highlight>}} + +##### Register server metric views +{{<highlight go>}} +if err := view.Register(ochttp.DefaultServerViews...); err != nil { + log.Fatalf("Failed to register HTTP server views: %v", err) +} +{{</highlight>}} + +##### Exporting traces and metrics +The last step is to enable trace and metric exporting. For that we'll use say [Stackdriver Exporter](/supported-exporters/go/stackdriver) or +any of the [Go exporters](/supported-exporters/go/) + +##### End to end code sample +With all the steps combined, we'll finally have this code snippet +{{<highlight go>}} +package main + +import ( + "context" + "io" + "log" + "os" + + "cloud.google.com/go/storage" + "golang.org/x/oauth2/google" + "google.golang.org/api/option" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/plugin/ochttp" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +func main() { + // Create the Stackdriver exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "census-demos", + MetricPrefix: "gcs-oc", + }) + if err != nil { + log.Fatalf("Failed to create Stackdriver exporter: %v", err) + } + defer sd.Flush() + + // And for the custom transport to enable metrics collection + ctx := context.Background() + dc, err := google.DefaultClient(ctx, storage.ScopeReadWrite) + if err != nil { + log.Fatalf("Failed to create the google OAuth2 client: %v", err) + } + // Enable ochttp.Transport on the base transport + dc.Transport = &ochttp.Transport{Base: dc.Transport} + gcsClient, err := storage.NewClient(ctx, option.WithHTTPClient(dc)) + if err != nil { + log.Fatalf("Failed to create GCS client: %v", err) + } + + if err := view.Register(ochttp.DefaultClientViews...); err != nil { + log.Fatalf("Failed to register HTTP client views: %v", err) + } + + if err := view.Register(ochttp.DefaultServerViews...); err != nil { + log.Fatalf("Failed to register HTTP server views: %v", err) + } + + // For the purposes of demo, we'll always sample + trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) + + bucket := gcsClient.Bucket("census-demos") + obj := bucket.Object("hello.txt") + // Write "Hello, world!" to the object + w := obj.NewWriter(ctx) + if _, err := w.Write([]byte("Hello, world!")); err != nil { + log.Fatalf("Failed to write to object: %v", err) + } + if err := w.Close(); err != nil { + log.Fatalf("Failed to close object handle: %v", err) + } + + // Now read back the content + r, err := obj.NewReader(ctx) + if err != nil { + log.Fatalf("Failed to read from object: %v", err) + } + defer r.Close() + + _, _ = io.Copy(os.Stdout, r) +} +{{</highlight>}} + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/integrations/google_cloud_storage/_index.md b/content/integrations/google_cloud_storage/_index.md new file mode 100644 index 00000000..a9758ad0 --- /dev/null +++ b/content/integrations/google_cloud_storage/_index.md @@ -0,0 +1,17 @@ +--- +title: "Google Cloud Storage" +date: 2018-07-24T14:28:00-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/cloud_storage.png) + + +Cloud Storage is a unified object storage for developers and enterprises, managed by Google. +For more information you can read about it here and get started [Storage docs](https://cloud.google.com/storage/docs) + +However, OpenCensus is already integrated into some Google Cloud Storage API clients in the various languages: + +{{%children%}} diff --git a/content/integrations/groupcache.md b/content/integrations/groupcache.md new file mode 100644 index 00000000..4c09264f --- /dev/null +++ b/content/integrations/groupcache.md @@ -0,0 +1,14 @@ +--- +title: "GroupCache" +date: 2018-07-16T14:42:31-07:00 +draft: false +class: "integration-page" +--- + +#### Resources + +* [Go driver](https://github.com/orijtech/groupcache) + +#### Tutorials + +* [Go](https://medium.com/@orijtech/groupcache-instrumented-by-opencensus-6a625c3724c) diff --git a/content/integrations/memcached.md b/content/integrations/memcached.md new file mode 100644 index 00000000..2d077982 --- /dev/null +++ b/content/integrations/memcached.md @@ -0,0 +1,17 @@ +--- +title: "Memcached" +date: 2018-07-16T14:42:06-07:00 +draft: false +class: "integration-page" +--- + +![memcached logo](/img/memcached-logo.jpg) + +#### Resources + +* [Go Driver](https://github.com/orijtech/gomemcache) +* [Python Driver](https://github.com/orijtech/pymemcache/pull/1) + +#### Tutorials + +* [Go & Python](https://medium.com/@orijtech/memcached-clients-instrumented-with-opencensus-in-go-and-python-dacbd01b269c) diff --git a/content/integrations/mongodb.md b/content/integrations/mongodb.md new file mode 100644 index 00000000..5fec8d4c --- /dev/null +++ b/content/integrations/mongodb.md @@ -0,0 +1,17 @@ +--- +title: "MongoDB" +date: 2018-07-16T14:42:10-07:00 +draft: false +class: "integration-page" +--- + +![mongodb logo](/img/mongodb-logo.jpg) + +#### Resources + +* [Go Driver](https://github.com/orijtech/mongo-go-driver) +* [Java Driver](https://github.com/orijtech/mongo-java-driver/pull/1) + +#### Tutorials + +* [Go](https://medium.com/@orijtech/mongodb-driver-instrumented-with-opencensus-in-go-e691370b8184) diff --git a/content/integrations/redis/Go.md b/content/integrations/redis/Go.md new file mode 100644 index 00000000..4e1c0727 --- /dev/null +++ b/content/integrations/redis/Go.md @@ -0,0 +1,15 @@ +--- +title: "Go" +date: 2018-07-24T07:09:03-07:00 +draft: false +class: "integration-page" +--- + +![](/images/go-opencensus.png) + +Some Redis clients were already instrumented to provide traces and metrics with OpenCensus + +Packages|Godoc +---|--- +gomodule/redigo|https://godoc.org/github.com/opencensus-integrations/redigo +goredis/redis|https://godoc.org/github.com/opencensus-integrations/redis diff --git a/content/integrations/redis/Java.md b/content/integrations/redis/Java.md new file mode 100644 index 00000000..310b3046 --- /dev/null +++ b/content/integrations/redis/Java.md @@ -0,0 +1,254 @@ +--- +title: "Java" +date: 2018-07-25T09:38:03-07:00 +draft: false +class: "integration-page" +--- + +![](/images/java-opencensus.png) + +{{% notice note %}} +This guide makes use of Redis. If you don't yet have an installation of Redis, please [Click here to get started](https://redis.io/topics/quickstart) +{{% /notice %}} + +{{% notice note %}} +This guide makes use of Stackdriver. If you haven't yet, please [Click here to get started with Stackdriver](/codelabs/stackdriver) +{{% /notice %}} + + +Some Redis clients were already instrumented to provide traces and metrics with OpenCensus + +Packages|Repository link +---|--- +jedis|https://github.com/opencensus-integrations/jedis + +## Table of contents +- [Generating the JAR](#generating-the-jar) + - [Clone this repository](#clone-this-repository) + - [Generate and install](#generate-and-install) +- [Available metrics](#available-metrics) +- [Enabling observability](#enabling-observability) +- [End to end example](#end-to-end-example) + - [Running it](#running-it) + +#### Generating the JAR + +##### Clone this repository +```shell +git clone https://github.com/opencensus-integrations +``` + +##### Generating the JAR +Inside the cloned repository's directory run +```shell +mvn install:install-file -Dfile=$(pwd)/target/jedis-3.0.0-SNAPSHOT.jar \ +-DgroupId=redis.clients -DartifactId=jedis -Dversion=3.0.0 \ +-Dpackaging=jar -DgeneratePom=true +``` + +#### Enabling observability +To enable observability, we'll need to use Jedis normally but with one change + +{{<highlight java>}} +import redis.clients.jedis.Observability; +{{</highlight>}} + +and then finally to enable metrics +{{<highlight java>}} +// Enable exporting of all the Jedis specific metrics and views +Observability.registerAllViews(); +{{</highlight>}} + +#### Available metrics +Metric search suffix|Description +---|--- +redis/bytes_read|The number of bytes read from the Redis server +redis/bytes_written|The number of bytes written out to the Redis server +redis/dials|The number of connection dials made to the Redis server +redis/dial_latency_milliseconds|The number of milliseconds spent performing Redis operations +redis/errors|The number of errors encountered +redis/connections_opened|The number of new connections +redis/roundtrip_latency|The latency spent for various Redis operations +redis/reads|The number of reads performed +redis/writes|The number of writes performed + +#### End to end example +{{<tabs Source Pom>}} + +{{<highlight java>}} +package io.opencensus.tutorials.jedis; + +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; +import io.opencensus.trace.Tracing; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.config.TraceParams; +import io.opencensus.trace.samplers.Samplers; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.IOException; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.Observability; + +public class JedisOpenCensus { + private static final Jedis jedis = new Jedis("localhost"); + + public static void main(String ...args) { + // Enable exporting of all the Jedis specific metrics and views. + Observability.registerAllViews(); + + // Now enable OpenCensus exporters + setupOpenCensusExporters(); + + // Now for the repl + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + System.out.print("> "); + System.out.flush(); + String query = stdin.readLine(); + + // Check Redis if we've got a hit firstly + String result = jedis.get(query); + if (result == null || result == "") { + // Cache miss so process it and memoize it + result = "$" + query + "$"; + jedis.set(query, result); + } + System.out.println("< " + result + "\n"); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static void setupOpenCensusExporters() { + String gcpProjectId = "census-demos"; + + try { + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + + StackdriverStatsExporter.createAndRegister( + StackdriverStatsConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } catch (Exception e) { + System.err.println("Failed to setup OpenCensus " + e); + } + + // Change the sampling rate to always sample + TraceConfig traceConfig = Tracing.getTraceConfig(); + traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); + } +} +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.ocgrpc</groupId> + <artifactId>ocgrpc</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>ocgrpc</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.15.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>redis.clients</groupId> + <artifactId>jedis</artifactId> + <version>3.0.0</version> + </dependency> + + </dependencies> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + </plugins> + </pluginManagement> + + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>JedisOpenCensus</id> + <mainClass>io.opencensus.tutorials.jedis.JedisOpenCensus</mainClass> + </program> + </programs> + </configuration> + </plugin> + + </plugins> + </build> + +</project> +{{</highlight>}} +{{</tabs>}} + +##### Running it +```shell +mvn install && mvn exec:java -Dexec.mainClass=io.opencensus.tutorials.jedis.JedisOpenCensus +``` + +#### Examining your metrics and traces diff --git a/content/integrations/redis/_index.md b/content/integrations/redis/_index.md new file mode 100644 index 00000000..fc5a0655 --- /dev/null +++ b/content/integrations/redis/_index.md @@ -0,0 +1,14 @@ +--- +title: "Redis" +date: 2018-07-16T14:42:03-07:00 +draft: false +class: "integration-page" +--- + +![redis logo](/img/redis-logo.png) + +Some Redis clients have been instrumented with OpenCensus to provide metrics and traces. +We have integrations in the following languages +{{% children %}} + +Please see the [blog post announcement and examples](https://medium.com/@orijtech/redis-clients-instrumented-by-opencensus-in-java-and-go-402470d92c5c) diff --git a/content/integrations/sql.md b/content/integrations/sql.md new file mode 100644 index 00000000..82eaec1d --- /dev/null +++ b/content/integrations/sql.md @@ -0,0 +1,14 @@ +--- +title: "SQL" +date: 2018-07-16T14:42:23-07:00 +draft: false +class: "integration-page" +--- + +#### Resources + +* [ocsql](https://github.com/basvanbeek/ocsql): A database wrapper for SQL in Go + +#### Tutorials + +* [Go](https://medium.com/@bas.vanbeek/opencensus-and-go-database-sql-322a26be5cc5) diff --git a/content/introduction/_index.md b/content/introduction/_index.md new file mode 100644 index 00000000..65ab203e --- /dev/null +++ b/content/introduction/_index.md @@ -0,0 +1,21 @@ +--- +title: "Introduction" +date: 2018-07-16T14:28:03-07:00 +draft: false +weight: 10 +--- + +{{<title>}} is a vendor-agnostic single distribution of libraries to provide observability for your microservices and monoliths alike. OpenCensus is an open source community developed project. Its origins stem from the rewrite of what has been Google's observability systems for the past 10 years. + +OpenCensus is implemented in a plethora of languages and it allows you to singly collect metrics and traces +and then export them to a variety of backends. + +In this section we will walk through what OpenCensus is, what problems it solves, and how it can help your project. + +{{% children %}} + +Or, if you are ready to integrate OpenCensus in to your project, visit the [Quickstart](/quickstart). + +#### Partners & Contributors + +{{<partners>}} diff --git a/content/introduction/features.md b/content/introduction/features.md new file mode 100644 index 00000000..92677b22 --- /dev/null +++ b/content/introduction/features.md @@ -0,0 +1,18 @@ +--- +title: "Features" +date: 2018-07-16T14:28:16-07:00 +draft: false +weight: 2 +--- + +#### Low latency +OpenCensus is simple to integrate and use, it adds very low latency to your applications and it is already integrated into both gRPC and HTTP transports. + +#### Vendor Agnosticity +OpenCensus is vendor-agnostic and can upload data to any backend with various exporter implementations. Even though, OpenCensus provides support for many backends, users can also implement their own exporters for proprietary and unofficially supported backends. [Read more](/core-concepts/exporters/). + +#### Simplified tracing +Distributed traces track the progression of a single user request as it is handled by the internal services until the user request is responded. [Read more](/core-concepts/tracing/). + +#### Context Propagation +Context propagation is the mechanism by which information (of your choosing) is sent between your services. It is usually performed by sending data in HTTP headers and trailers say across HTTP and gRPC transports. diff --git a/content/introduction/overview.md b/content/introduction/overview.md new file mode 100644 index 00000000..8d1d8f45 --- /dev/null +++ b/content/introduction/overview.md @@ -0,0 +1,34 @@ +--- +title: "Overview" +date: 2018-07-16T14:28:09-07:00 +draft: false +weight: 1 +class: "resized-logo" +--- + +OpenCensus provides observability for your microservices and monoliths alike. + +It gives you the tools to track a request as it travels through each of your services, and it helps you gather any metrics of interest. + +The core functionality of OpenCensus is to collect traces and metrics from your app, display them locally, and send them to any analysis tool. However, OpenCensus provides a lot more than just data insight. This page describes some of that functionality and points you to resources for building it into your app. + +After [instrumenting](https://en.wikipedia.org/wiki/Instrumentation_(computer_programming)#Output) your code with OpenCensus, you will equip yourself with the ability to optimize the speed of your services, understand exactly how a request travels between your services, gather any useful metrics about your entire architecture, and more. + +{{<button href="/quickstart" class="btn-info">}}Visit the Quickstart guide to begin{{</button>}} + +{{% notice note %}} +Already familiar with OpenCensus? [Click here](https://opencensus.io/docs/) for a full overview of our API to get started. +{{% /notice %}} + +## Why OpenCensus? + +##### Visualize Request Lifecycle +You can track a request as it propagates throughout all of your services. Additionally, you can visualize your data in any [backend](/core-concepts/exporters/#supported-backends) with a one-step solution. + +##### Perform Root-Cause Analysis +Gain total situation-clarity in your distributed services architecture. When your service runs in to a problem, use OpenCensus to identify the point of failure. + +##### Optimize Service Latency +Become empowered to optimize every component in your distributed services by gaining key insights in to the latency and performance of every microservice and data storage you manage. + +![](/images/opencensus-supported-languages.png) diff --git a/content/java.md b/content/java.md deleted file mode 100644 index 949f4687..00000000 --- a/content/java.md +++ /dev/null @@ -1,145 +0,0 @@ -+++ -Description = "java" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" -title = "Java" -date = "2018-05-18T09:59:40-05:00" -+++ - -The example demonstrates how to record stats and traces for a video processing system. It records data with the “frontend” tag so that collected data can be broken by the frontend user who initiated the video processing. - ---- - -#### API Documentation - -The OpenCensus Java artifacts are released to Maven Central [maven.org](http://search.maven.org/), each contains the jar file, the associated javadoc, and the associated source code. The OpenCensus Java API artifact (along with the associated javadoc and source) is available on Maven Central here: [Open Census API](https://search.maven.org/#search%7Cga%7C1%7Copencensus%20api) - ---- - -#### Example - -1. Clone the OpenCensus Java GitHub repository: -``` java -git clone https://github.com/census-instrumentation/opencensus-java.git -cd opencensus-java/examples -``` - -2. Code is in the following directory: -``` -src/main/java/io/opencensus/examples/helloworld/ -``` - ---- - -#### To Build/Run The Example -Further build instructions can be found in [examples/README.md](https://github.com/census-instrumentation/opencensus-java/blob/master/examples/README.md). - -The OpenCensus Java Quickstart example can be built/executed using either gradle, maven, or bazel: - -3. Build the example code e.g.: (assuming current directory is opencensus/examples/) - * Gradle: ./gradlew installDist - * Maven: mvn package appassembler:assemble - * Bazel: bazel build :all - -4. Run the Quickstart example e.g.: (assuming current directory is opencensus/examples/) - * Gradle: ./build/install/opencensus-examples/bin/QuickStart - * Maven: ./target/appassembler/bin/QuickStart - * Bazel: ./bazel-bin/QuickStart - ---- - -#### The Example Code -``` java -/** Simple program that collects data for video size. **/ -public final class QuickStart { - static Logger logger = Logger.getLogger( - QuickStart.class.getName()); - static Tagger tagger = Tags.getTagger(); - static ViewManager viewManager = Stats.getViewManager(); - static StatsRecorder statsRecorder = Stats.getStatsRecorder(); - static Tracer tracer = Tracing.getTracer(); - - // frontendKey allows us to break down the recorded data - static final TagKey FRONTEND_KEY = TagKey.create( - "my.org/keys/frontend"); - - // videoSize will measure the size of processed videos. - static final MeasureLong VIDEO_SIZE = MeasureLong.create( - "my.org/measure/video_size", - "size of processed videos", - "MBy"); - - // Create view to see the processed video size distribution broken - // down by frontend. The view has bucket boundaries (0, 256, 65536) - // that will group measure values into histogram buckets. - private static final View.Name VIDEO_SIZE_VIEW_NAME = - View.Name.create("my.org/views/video_size"); - private static final View VIDEO_SIZE_VIEW = View.create( - VIDEO_SIZE_VIEW_NAME, - "processed video size over time", - VIDEO_SIZE, - Aggregation.Distribution.create( - BucketBoundaries.create(Arrays.asList(0.0, 256.0, 65536.0))), - Collections.singletonList(FRONTEND_KEY), - Cumulative.create()); - - /** Main launcher for the QuickStart example. */ - public static void main(String[] args) throws - InterruptedException { - TagContextBuilder tagContextBuilder = tagger.currentBuilder() - .put(FRONTEND_KEY, TagValue.create("mobile-ios9.3.5")); - SpanBuilder spanBuilder = tracer.spanBuilder( - "my.org/ProcessVideo") - .setRecordEvents(true) - .setSampler(Samplers.alwaysSample()); - viewManager.registerView(VIDEO_SIZE_VIEW); - LoggingTraceExporter.register(); - - // Process video. Record the processed video size. - try (Scope scopedTags = tagContextBuilder.buildScoped(); - Scope scopedSpan = spanBuilder.startScopedSpan()) { - tracer.getCurrentSpan() - .addAnnotation("Start processing video."); - // Sleep for [0,10] milliseconds to fake work. - Thread.sleep(new Random().nextInt(10) + 1); - statsRecorder.newMeasureMap().put(VIDEO_SIZE, 25648).record(); - tracer.getCurrentSpan() - .addAnnotation("Finished processing video."); - } catch (Exception e) { - tracer.getCurrentSpan() - .addAnnotation("Exception thrown when processing video."); - tracer.getCurrentSpan().setStatus(Status.UNKNOWN); - logger.severe(e.getMessage()); - } - - logger.info("Wait longer than the reporting duration..."); - // Wait for a duration longer than reporting duration (5s) to - // ensure spans are exported. - Thread.sleep(5100); - ViewData viewData = viewManager.getView(VIDEO_SIZE_VIEW_NAME); - logger.info( - String.format("Recorded stats for %s:\n %s", - VIDEO_SIZE_VIEW_NAME.asString(), viewData)); - } -} -``` - ---- - -#### The Example Output (Raw) -``` -Mar 02, 2018 6:38:26 PM io.opencensus.examples.helloworld.QuickStart main -INFO: Wait longer than the reporting duration... -Mar 02, 2018 6:38:31 PM -io.opencensus.exporter.trace.logging.LoggingTraceExporter - $LoggingExporterHandler export -INFO: -SpanData{context=SpanContext{traceId=TraceId{traceId= - 6490d4a26cffac83529a7679a0ef978b}, spanId=SpanId{spanId=2e1f17c65921d367}, traceOptions=TraceOptions{sampled=true}}, parentSpanId=null, hasRemoteParent=null, name=my.org/ProcessVideo, startTimestamp=Timestamp{seconds=1520044706, nanos=41005486}, attributes=Attributes{attributeMap={}, droppedAttributesCount=0}, annotations=TimedEvents{events=[TimedEvent{timestamp=Timestamp{seconds=1520044706, nanos=44080800}, event=Annotation{description=Start processing video., attributes={}}}, TimedEvent{timestamp=Timestamp{seconds=1520044706, nanos=53061607}, event=Annotation{description=Finished processing video., attributes={}}}], droppedEventsCount=0}, messageEvents=TimedEvents{events=[], droppedEventsCount=0}, links=Links{links=[], droppedLinksCount=0}, childSpanCount=null, status=Status{canonicalCode=OK, description=null}, endTimestamp=Timestamp{seconds=1520044706, nanos=54084898}} - -Mar 02, 2018 6:38:31 PM -io.opencensus.examples.helloworld.QuickStart main INFO: -Recorded stats for my.org/views/video_size: ViewData{view=View{name=Name{asString=my.org/views/video_size}, description=processed video size over time, measure=MeasureLong{name=my.org/measure/video_size, description=size of processed videos, unit=MBy}, aggregation=Distribution{bucketBoundaries=BucketBoundaries{boundaries=[0.0, 256.0, 65536.0]}}, columns=[TagKey{name=my.org/keys/frontend}], window=Cumulative{}}, aggregationMap={[TagValue{asString=mobile-ios9.3.5}]=DistributionData{mean=25648.0, count=1, min=25648.0, max=25648.0, sumOfSquaredDeviations=0.0, bucketCounts=[0, 0, 1, 0]}}, windowData=CumulativeData{start=Timestamp{seconds=1520044706, nanos=28000000}, end=Timestamp{seconds=1520044711, nanos=170000000}}} -``` diff --git a/content/language-support/_index.md b/content/language-support/_index.md new file mode 100644 index 00000000..fd000aed --- /dev/null +++ b/content/language-support/_index.md @@ -0,0 +1,19 @@ +--- +title: "Language Support" +date: 2018-07-16T14:37:29-07:00 +draft: false +weight: 40 +class: "resized-logo" +--- + +![](/images/opencensus-supported-languages.png) + +Language|API reference +---|--- +Go|https://godoc.org/go.opencensus.io +Java|https://www.javadoc.io/doc/io.opencensus/opencensus-api/ +C++|https://github.com/census-instrumentation/opencensus-cpp +Ruby|https://www.rubydoc.info/gems/opencensus +Erlang|https://hexdocs.pm/opencensus/ +Python|https://census-instrumentation.github.io/opencensus-python/trace/api/index.html +PHP|https://packagist.org/packages/opencensus/opencensus diff --git a/content/overview.md b/content/overview.md deleted file mode 100644 index 9ae0d3e7..00000000 --- a/content/overview.md +++ /dev/null @@ -1,56 +0,0 @@ -+++ -title = "Overview" -type = "leftnav" -date = "2018-05-30T10:49:38-05:00" -+++ - -OpenCensus is a framework for stats collection and distributed tracing. It supports multiple backends. - -<div class="video-responsive"> - <video width="550px" poster="../img/vidposter.svg" controls> - <source src="https://storage.googleapis.com/opencensusio/OpenCensusVideo.mp4" type="video/mp4"> - <p>This browser does not support the video element. <a href="https://storage.googleapis.com/opencensusio/OpenCensusVideo.mp4">Here</a> is a link to the video instead.</p> - </video> -</div> - -In microservices architectures, it is difficult to understand how services use resources across shared infrastructure. In monolithic systems, we depend on traditional tools that report per-process resource usage and latency characteristics that are limited to a single process. In order to be able to collect and analyze resource utilization and performance characteristics of distributed systems, OpenCensus tracks resource utilization through the chain of services processing a user request. - -__Data collected by OpenCensus can be used for:__ - -* Monitoring of resource usage. -* Analyzing performance and efficiency characteristics of systems to reduce the overall resource consumption of resources and improve latency. -* Analyzing the collected data for capacity planning. Being able to predict the overall impact of a product on the infrastructure and being able to estimate how much more resources are required if a product grows. -* Being able to debug problems in isolation in complex systems. - -__OpenCensus aims to provide:__ - -* Low-overhead collection. -* Standard wire protocols and consistent APIs for handling trace and stats data. -* A single set of libraries for many languages, including Java, C++, Go, Python, PHP, Erlang, and Ruby. -* Integrations with web and RPC frameworks, making traces and stats available out of the box. Full extendability in implementing additional integrations. -* Exporters for storage and analysis tools. Full extendability in implementing additional integrations. -* In process debugging: an optional handler for displaying request stats and traces on instrumented hosts. - -No additional server or daemon is required to support OpenCensus. - -## Concepts - -### Tags - -OpenCensus allows systems to associate measurements with dimensions as they are recorded. Recorded data allows us to breakdown the measurements, analyze them from various different perspectives and be able to target specific cases in isolation even in highly interconnected and complex systems. [Read more](/tags). - -### Stats - -*Stats* is collection allow libraries and applications to record measurements, aggregate the recorded data and export them. [Read more](/stats). - -### Traces - -*Distributed traces* track the progression of a single user request as it is handled by the internal services until the user request is responded. [Read more](/traces). - -### Exporters - -OpenCensus is vendor-agnostic and can upload data to any backend with various exporter implementations. Even though, OpenCensus provides support for many backends, users can also implement their own exporters for proprietary and unofficially supported backends. [Read more](/exporters). - -### Z-Pages - -OpenCensus provides in-process dashboards that displays diagnostics data from the process. These pages are called z-pages and they are useful to understand to see collected data from a specific process without having to depend on any metric collection or distributed tracing backend. [Read more](/zpages). \ No newline at end of file diff --git a/content/php.md b/content/php.md deleted file mode 100644 index f483e941..00000000 --- a/content/php.md +++ /dev/null @@ -1,505 +0,0 @@ -+++ -Description = "php" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" -title = "PHP" -date = "2018-05-18T12:37:28-05:00" -+++ - -The example demonstrates how to record traces for a simple website that calculate Fibonacci numbers recursively. - ---- - -#### API Documentation -The OpenCensus libraries artifacts are released to Packagist ([packagist.org](https://packagist.org/)) [opencensus/opencensus](https://packagist.org/packages/opencensus/opencensus). The API documentation is available [here](https://census-instrumentation.github.io/opencensus-php/api/). - ---- -#### Example -1. Clone the OpenCensus PHP github repository: - -``` php -git clone https://github.com/census-instrumentation/opencensus-php.git -``` - -2.Code is in directory: -``` php -examples/silex/ -``` - ---- - -#### To Build/Run The Example -1. Install dependencies via composer: - -``` php -$ composer install -``` - -2. The OpenCensus PHP Quickstart example can be run using the build-in PHP webserver: - -``` php -$ php -S localhost:8000 -t web -``` - -3. Make a HTTP request to hit the application: -``` php -$ curl http://localhost:8000/fib/3 -``` - ---- - -#### The Example Code - -``` php -<?php - -require_once __DIR__ . '/../vendor/autoload.php'; - -// Configure and start the OpenCensus Tracer -use OpenCensus\Trace\Tracer; -$exporter = new OpenCensus\Trace\Exporter\EchoExporter(); -Tracer::start($exporter); - -function fib($n) -{ - return Tracer::inSpan([ - 'name' => 'fib', - 'attributes' => [ - 'n' => $n - ] - ], function () use ($n) { - if ($n < 3) { - return $n; - } - return fib($n - 1) + fib($n - 2); - }); -} - -$app = new Silex\Application(); - -$app->get('/', function () { - return 'Hello World!'; -}); - -$app->get('/fib/{n}', function ($n) use ($app) { - $n = (int) $n; - $fib = fib($n); - return sprintf('The %dth Fibonacci number is %d', $n, $fib); -}); - -$app->run(); -``` - ---- - -#### The Example Output (Raw) -``` -The 3th Fibonacci number is 3.Array -( - [0] => OpenCensus\Trace\Span Object - ( - [traceId:OpenCensus\Trace\Span:private] => - [spanId:OpenCensus\Trace\Span:private] => 526d3545 - [parentSpanId:OpenCensus\Trace\Span:private] => - [name:OpenCensus\Trace\Span:private] => /fib/3 - [startTime:OpenCensus\Trace\Span:private] => - DateTime Object - ( - [date] => 2018-03-22 19:47:00.739414 - [timezone_type] => 3 - [timezone] => UTC - ) - - [endTime:OpenCensus\Trace\Span:private] => - DateTime Object - ( - [date] => 2018-03-22 19:47:00.794824 - [timezone_type] => 3 - [timezone] => UTC - ) - - [stackTrace:OpenCensus\Trace\Span:private] => Array - ( - ) - - [timeEvents:OpenCensus\Trace\Span:private] => Array - ( - ) - - [links:OpenCensus\Trace\Span:private] => Array - ( - ) - - [status:OpenCensus\Trace\Span:private] => - OpenCensus\Trace\Status Object - ( - [code:OpenCensus\Trace\Status:private] => 200 - [message:OpenCensus\Trace\Status:private] => - HTTP status code: 200 - ) - - [sameProcessAsParentSpan:OpenCensus\Trace\Span:private] - => - [attributes:OpenCensus\Trace\Span:private] => Array - ( - ) - - ) - - [1] => OpenCensus\Trace\Span Object - ( - [traceId:OpenCensus\Trace\Span:private] => - [spanId:OpenCensus\Trace\Span:private] => 60c9a7b2 - [parentSpanId:OpenCensus\Trace\Span:private] => 526d3545 - [name:OpenCensus\Trace\Span:private] => fib - [startTime:OpenCensus\Trace\Span:private] => DateTime Object - ( - [date] => 2018-03-22 19:47:00.788716 - [timezone_type] => 3 - [timezone] => UTC - ) - - [endTime:OpenCensus\Trace\Span:private] => DateTime Object - ( - [date] => 2018-03-22 19:47:00.789070 - [timezone_type] => 3 - [timezone] => UTC - ) - - [stackTrace:OpenCensus\Trace\Span:private] => Array - ( - [0] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 33 - [function] => fib - ) - - [1] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 151 - [function] => {closure} - ) - - [2] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 68 - [function] => handleRaw - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [3] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 496 - [function] => handle - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [4] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 477 - [function] => handle - [class] => Silex\Application - [type] => -> - ) - - [5] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 37 - [function] => run - [class] => Silex\Application - [type] => -> - ) - - ) - - [timeEvents:OpenCensus\Trace\Span:private] => Array - ( - ) - - [links:OpenCensus\Trace\Span:private] => Array - ( - ) - - [status:OpenCensus\Trace\Span:private] => - [sameProcessAsParentSpan:OpenCensus\Trace\Span:private] - => - [attributes:OpenCensus\Trace\Span:private] => Array - ( - [n] => 3 - ) - - ) - - [2] => OpenCensus\Trace\Span Object - ( - [traceId:OpenCensus\Trace\Span:private] => - [spanId:OpenCensus\Trace\Span:private] => 2c9be766 - [parentSpanId:OpenCensus\Trace\Span:private] => 60c9a7b2 - [name:OpenCensus\Trace\Span:private] => fib - [startTime:OpenCensus\Trace\Span:private] => - DateTime Object - ( - [date] => 2018-03-22 19:47:00.788845 - [timezone_type] => 3 - [timezone] => UTC - ) - - [endTime:OpenCensus\Trace\Span:private] => - DateTime Object - ( - [date] => 2018-03-22 19:47:00.788921 - [timezone_type] => 3 - [timezone] => UTC - ) - - [stackTrace:OpenCensus\Trace\Span:private] => Array - ( - [0] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 21 - [function] => fib - ) - - [1] => Array - ( - [function] => {closure} - ) - - [2] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/opencensus/ - opencensus/src/Trace/Tracer/ContextTracer.php - [line] => 66 - [function] => call_user_func_array - ) - - [3] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 33 - [function] => fib - ) - - [4] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 151 - [function] => {closure} - ) - - [5] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 68 - [function] => handleRaw - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [6] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 496 - [function] => handle - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [7] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 477 - [function] => handle - [class] => Silex\Application - [type] => -> - ) - - [8] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 37 - [function] => run - [class] => Silex\Application - [type] => -> - ) - - ) - - [timeEvents:OpenCensus\Trace\Span:private] => Array - ( - ) - - [links:OpenCensus\Trace\Span:private] => Array - ( - ) - - [status:OpenCensus\Trace\Span:private] => - [sameProcessAsParentSpan:OpenCensus\Trace\Span:private] => - [attributes:OpenCensus\Trace\Span:private] => Array - ( - [n] => 2 - ) - - ) - - [3] => OpenCensus\Trace\Span Object - ( - [traceId:OpenCensus\Trace\Span:private] => - [spanId:OpenCensus\Trace\Span:private] => 4241b61 - [parentSpanId:OpenCensus\Trace\Span:private] => 60c9a7b2 - [name:OpenCensus\Trace\Span:private] => fib - [startTime:OpenCensus\Trace\Span:private] => DateTime - Object - ( - [date] => 2018-03-22 19:47:00.788978 - [timezone_type] => 3 - [timezone] => UTC - ) - - [endTime:OpenCensus\Trace\Span:private] => DateTime - Object - ( - [date] => 2018-03-22 19:47:00.789041 - [timezone_type] => 3 - [timezone] => UTC - ) - - [stackTrace:OpenCensus\Trace\Span:private] => Array - ( - [0] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 21 - [function] => fib - ) - - [1] => Array - ( - [function] => {closure} - ) - - [2] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/opencensus/ - opencensus/src/Trace/Tracer/ContextTracer.php - [line] => 66 - [function] => call_user_func_array - ) - - [3] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 33 - [function] => fib - ) - - [4] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 151 - [function] => {closure} - ) - - [5] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/symfony/http- - kernel/HttpKernel.php - [line] => 68 - [function] => handleRaw - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [6] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 496 - [function] => handle - [class] => Symfony\Component\HttpKernel\HttpKernel - [type] => -> - ) - - [7] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/vendor/silex/silex/src/ - Silex/Application.php - [line] => 477 - [function] => handle - [class] => Silex\Application - [type] => -> - ) - - [8] => Array - ( - [file] => /Users/chingor/php/opencensus- - php/examples/silex/web/index.php - [line] => 37 - [function] => run - [class] => Silex\Application - [type] => -> - ) - - ) - - [timeEvents:OpenCensus\Trace\Span:private] => Array - ( - ) - - [links:OpenCensus\Trace\Span:private] => Array - ( - ) - - [status:OpenCensus\Trace\Span:private] => - [sameProcessAsParentSpan:OpenCensus\Trace\Span:private] - => - [attributes:OpenCensus\Trace\Span:private] => Array - ( - [n] => 1 - ) - - ) - -) -``` diff --git a/content/python.md b/content/python.md deleted file mode 100644 index 496f0bc3..00000000 --- a/content/python.md +++ /dev/null @@ -1,102 +0,0 @@ -+++ -Description = "python" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" -title = "Python" -date = "2018-05-18T13:08:20-05:00" -+++ - -The example demonstrates how to record traces for a simple Flask web application. - ---- - -#### API Documentation - -The OpenCensus libraries artifacts are released to [PyPI](https://pypi.python.org/pypi/opencensus). The API documentation is available [here](https://census-instrumentation.github.io/opencensus-python/trace/api/index.html). - ---- - -#### The Quickstart Example Code - -1. Clone the OpenCensus Python GitHub repo: -``` -git clone https://github.com/census-instrumentation/opencensus-python.git -``` - -2. Code is in directory: -``` -examples/trace/helloworld/flask -``` - ---- - -#### To Run The Example - -1. Install dependencies via pip: -``` python -$ pip install opencensus -``` - -2. The OpenCensus Python Quickstart example can be run as below: -``` python -$ python simple.py -``` - -3. Make a HTTP request to hit the application: -``` python -$ curl http://localhost:8080/ -``` - ---- - -#### The Example Code -``` python -import flask -from opencensus.trace.exporters import stackdriver_exporter -from opencensus.trace.ext.flask.flask_middleware import FlaskMiddleware - - -app = flask.Flask(__name__) - -# Enable tracing the requests -middleware = FlaskMiddleware(app) - - -@app.route('/') -def hello(): - return 'Hello world!' - - -if __name__ == '__main__': - app.run(host='localhost', port=8080) -``` - ---- - -#### The Example Output (Raw) -``` -[ - SpanData( - name='[GET]http://localhost:8080/', - context=, - span_id='0eadaaabacea4ca7', - parent_span_id=None, - attributes={ - '/http/method': 'GET', - '/http/url': 'http://localhost:8080/', - '/http/status_code': '200 - }, - start_time='2018-04-09T23:04:41.784921Z', - end_time='2018-04-09T23:04:41.785165Z', - child_span_count=0, - stack_trace=None, - time_events=[], - links=[], - status=None, - same_process_as_parent_span=None, - span_kind=0 - ) -] -``` diff --git a/content/quickstart/_index.md b/content/quickstart/_index.md new file mode 100644 index 00000000..e3e0be53 --- /dev/null +++ b/content/quickstart/_index.md @@ -0,0 +1,14 @@ +--- +title: "Quickstart" +date: 2018-07-16T14:28:57-07:00 +draft: false +weight: 20 +--- + +By completing this quickstart, you will learn how to: + +* Collect [metrics](/core-concepts/metrics) from your services +* [Trace](/core-concepts/tracing) a request as it passes through your services +* [Export](/core-concepts/exporters) your data to one of our [supported backends](/supported-exporters/) + +{{<quickstart-list>}} diff --git a/content/quickstart/go/_index.md b/content/quickstart/go/_index.md new file mode 100644 index 00000000..edd0d4b5 --- /dev/null +++ b/content/quickstart/go/_index.md @@ -0,0 +1,18 @@ +--- +title: "Go" +date: 2018-07-16T14:29:03-07:00 +draft: false +class: "resized-logo" +--- + +![](/images/go-opencensus.png) + +In this quickstart, using OpenCensus Go, you will gain hands-on experience with: +{{% children %}} + +For full API references, please take a look at: + +Resource|Link +---|--- +GoDoc|https://godoc.org/go.opencensus.io +Github repository|https://github.com/census-instrumentation/opencensus-go diff --git a/content/quickstart/go/metrics.md b/content/quickstart/go/metrics.md new file mode 100644 index 00000000..25367450 --- /dev/null +++ b/content/quickstart/go/metrics.md @@ -0,0 +1,1572 @@ +--- +title: "Metrics" +date: 2018-07-16T14:29:10-07:00 +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Brief Overview](#brief-overview) +- [Getting started](#getting-started) +- [Enable Metrics](#enable-metrics) + - [Import Packages](#import-metrics-packages) + - [Create Metrics](#create-metrics) + - [Create Tags](#create-tags) + - [Inserting Tags](#inserting-tags) + - [Recording Metrics](#recording-metrics) +- [Enable Views](#enable-views) + - [Import Packages](#import-views-packages) + - [Create Views](#create-views) + - [Register Views](#register-views) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Views](#export-views) +- [Viewing your Metrics on Stackdriver](#viewing-your-metrics-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Collect metrics using [OpenCensus Metrics](/core-concepts/metrics) and [Tags](/core-concepts/tags) +2. Register and enable an exporter for a [backend](http://localhost:1313/core-concepts/exporters/#supported-backends) of our choice +3. View the metrics on the backend of our choice + +#### Requirements +- Go1.9 and above +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation + +OpenCensus: `go get go.opencensus.io/*` + +Stackdriver exporter: `go get contrib.go.opencensus.io/exporter/stackdriver` + +#### Brief Overview +By the end of this tutorial, we will do these four things to obtain metrics using OpenCensus: + +1. Create quantifiable metrics (numerical) that we will record +2. Create [tags](/core-concepts/tags) that we will associate with our metrics +3. Organize our metrics, similar to a writing a report, in to a `View` +4. Export our views to a backend (Stackdriver in this case) + + +#### Getting Started + +{{% notice note %}} +Unsure how to write and execute Go code? [Click here](https://golang.org/doc/code.html). +{{% /notice %}} + +We will be a simple "read-evaluate-print" (REPL) app. In there we'll collect some metrics to observe the work that is going on this code, such as: + +- Latency per processing loop +- Number of lines read +- Number of errors +- Line lengths + +First, create a file called `repl.go`. +```bash +touch repl.go +``` + +Next, put the following code inside of `repl.go`: + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "fmt" + "log" + "os" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + return bytes.ToUpper(in), nil +} +{{</highlight>}} + +You can run the code via `go run repl.go`. + +#### Enable Metrics + +<a name="import-metrics-packages"></a> +##### Import Packages + +To enable metrics, we’ll import a number of core and OpenCensus packages + +{{<tabs Snippet All>}} +{{<highlight go>}} +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +<a name="create-metrics"></a> +##### Create Metrics + +First, we will create the variables needed to later record our metrics. + +{{<tabs Snippet All>}} +{{<highlight go>}} +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Create Tags + +Now we will create the variable later needed to add extra text meta-data to our metrics. + +{{<tabs Snippet All>}} +{{<highlight go>}} +var ( + KeyMethod, _ = tag.NewKey("method") +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +We will later use this tag, called KeyMethod, to record what method is being invoked. In our scenario, we will only use it to record that "repl" is calling our data. + +Again, this is arbitrary and purely up the user. For example, if we wanted to track what operating system a user is using, we could do so like this: +```go +osKey, _ := tag.NewKey("operating_system") +``` + +Later, when we use osKey, we will be given an opportunity to enter values such as "windows" or "mac". + +##### Inserting Tags +Now we will insert a specific tag called "repl". It will give us a new `context.Context ctx` which we will use while we later record our metrics. This `ctx` has all tags that have previously been inserted, thus allowing for context propagation. + +{{<tabs Snippet All>}} +{{<highlight go>}} +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +When recording metrics, we will need the `ctx` from `tag.New`. We will be recording metrics in `processLine`, so let's go ahead and make `ctx` available now. + +{{<tabs Snippet All>}} +{{<highlight go>}} +// ... +out, err := processLine(ctx, line) + +// ... +func processLine(ctx context.Context, in []byte) (out []byte, err error) { +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + return err + } + + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Recording Metrics + +Now we will record the desired metrics. To do so, we will use `stats.Record` and pass in our `ctx` and [previously instantiated metrics variables](#create-metrics). + +{{<tabs Snippet All>}} +{{<highlight go>}} +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +#### Enable Views +We will be adding the View package: `"go.opencensus.io/stats/view"` + +<a name="import-views-packages"></a> +##### Import Packages +{{<tabs Snippet All>}} +{{<highlight go>}} +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Create Views +We now determine how our metrics will be organized by creating `Views`. + +{{<tabs Snippet All>}} +{{<highlight go>}} +var ( + LatencyView = &view.View{ + Name: "demo/latency", + Measure: MLatencyMs, + Description: "The distribution of the latencies", + + // Latency in buckets: + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + Aggregation: view.Distribution(0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000), + TagKeys: []tag.Key{KeyMethod}} + + LineCountView = &view.View{ + Name: "demo/lines_in", + Measure: MLinesIn, + Description: "The number of lines from standard input", + Aggregation: view.Count(), + } + + ErrorCountView = &view.View{ + Name: "demo/errors", + Measure: MErrors, + Description: "The number of errors encountered", + Aggregation: view.Count(), + } + + LineLengthView = &view.View{ + Description: "Groups the lengths of keys in buckets", + Measure: MLineLengths, + // Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + Aggregation: view.Distribution(0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000), + } +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +var ( + LatencyView = &view.View{ + Name: "demo/latency", + Measure: MLatencyMs, + Description: "The distribution of the latencies", + + // Latency in buckets: + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + Aggregation: view.Distribution(0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000), + TagKeys: []tag.Key{KeyMethod}} + + LineCountView = &view.View{ + Name: "demo/lines_in", + Measure: MLinesIn, + Description: "The number of lines from standard input", + Aggregation: view.Count(), + } + + ErrorCountView = &view.View{ + Name: "demo/errors", + Measure: MErrors, + Description: "The number of errors encountered", + Aggregation: view.Count(), + } + + LineLengthView = &view.View{ + Description: "Groups the lengths of keys in buckets", + Measure: MLineLengths, + // Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + Aggregation: view.Distribution(0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000), + } +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Register Views +We now register the views and set the reporting period. + +{{<tabs Snippet All>}} +{{<highlight go>}} +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Register the views + if err := view.Register(LatencyView, LineCountView, ErrorCountView, LineLengthView); err != nil { + log.Fatalf("Failed to register views: %v", err) + } + + // But also we can change the metrics reporting period to 2 seconds + view.SetReportingPeriod(2 * time.Second) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +var ( + LatencyView = &view.View{ + Name: "demo/latency", + Measure: MLatencyMs, + Description: "The distribution of the latencies", + + // Latency in buckets: + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + Aggregation: view.Distribution(0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000), + TagKeys: []tag.Key{KeyMethod}} + + LineCountView = &view.View{ + Name: "demo/lines_in", + Measure: MLinesIn, + Description: "The number of lines from standard input", + Aggregation: view.Count(), + } + + ErrorCountView = &view.View{ + Name: "demo/errors", + Measure: MErrors, + Description: "The number of errors encountered", + Aggregation: view.Count(), + } + + LineLengthView = &view.View{ + Description: "Groups the lengths of keys in buckets", + Measure: MLineLengths, + // Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + Aggregation: view.Distribution(0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000), + } +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Register the views + if err := view.Register(LatencyView, LineCountView, ErrorCountView, LineLengthView); err != nil { + log.Fatalf("Failed to register views: %v", err) + } + + // But also we can change the metrics reporting period to 2 seconds + view.SetReportingPeriod(2 * time.Second) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +#### Exporting to Stackdriver + +<a name="import-exporting-packages"></a> +##### Import Packages +We will be adding the Stackdriver package: `"contrib.go.opencensus.io/exporter/stackdriver"` + +{{<tabs Snippet All>}} +{{<highlight go>}} +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +var ( + LatencyView = &view.View{ + Name: "demo/latency", + Measure: MLatencyMs, + Description: "The distribution of the latencies", + + // Latency in buckets: + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + Aggregation: view.Distribution(0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000), + TagKeys: []tag.Key{KeyMethod}} + + LineCountView = &view.View{ + Name: "demo/lines_in", + Measure: MLinesIn, + Description: "The number of lines from standard input", + Aggregation: view.Count(), + } + + ErrorCountView = &view.View{ + Name: "demo/errors", + Measure: MErrors, + Description: "The number of errors encountered", + Aggregation: view.Count(), + } + + LineLengthView = &view.View{ + Description: "Groups the lengths of keys in buckets", + Measure: MLineLengths, + // Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + Aggregation: view.Distribution(0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000), + } +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Register the views + if err := view.Register(LatencyView, LineCountView, ErrorCountView, LineLengthView); err != nil { + log.Fatalf("Failed to register views: %v", err) + } + + // But also we can change the metrics reporting period to 2 seconds + view.SetReportingPeriod(2 * time.Second) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Export Views +In our `main` function, first we create the Stackdriver exporter: +```go +// Create that Stackdriver stats exporter +sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECT_ID"), + MetricPrefix: os.Getenv("GCP_METRIC_PREFIX"), +}) +if err != nil { + log.Fatalf("Failed to create the Stackdriver stats exporter: %v", err) +} +defer sd.Flush() +``` + +Then we register the views with Stackdriver: +```go +// Register the stats exporter +view.RegisterExporter(sd) +``` + +{{<tabs Snippet All>}} +{{<highlight go>}} +func main() { + // Create that Stackdriver stats exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECT_ID"), + MetricPrefix: os.Getenv("GCP_METRIC_PREFIX"), + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver stats exporter: %v", err) + } + defer sd.Flush() + + // Register the stats exporter + view.RegisterExporter(sd) + + // Register the views + if err := view.Register(LatencyView, LineCountView, ErrorCountView, LineLengthView); err != nil { + log.Fatalf("Failed to register views: %v", err) + } + + // But also we can change the metrics reporting period to 2 seconds + view.SetReportingPeriod(2 * time.Second) + + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "time" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +var ( + // The latency in milliseconds + MLatencyMs = stats.Float64("repl/latency", "The latency in milliseconds per REPL loop", "ms") + + // Counts the number of lines read in from standard input + MLinesIn = stats.Int64("repl/lines_in", "The number of lines read in", "1") + + // Encounters the number of non EOF(end-of-file) errors. + MErrors = stats.Int64("repl/errors", "The number of errors encountered", "1") + + // Counts/groups the lengths of lines read in. + MLineLengths = stats.Int64("repl/line_lengths", "The distribution of line lengths", "By") +) + +var ( + KeyMethod, _ = tag.NewKey("method") +) + +var ( + LatencyView = &view.View{ + Name: "demo/latency", + Measure: MLatencyMs, + Description: "The distribution of the latencies", + + // Latency in buckets: + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + Aggregation: view.Distribution(0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000), + TagKeys: []tag.Key{KeyMethod}} + + LineCountView = &view.View{ + Name: "demo/lines_in", + Measure: MLinesIn, + Description: "The number of lines from standard input", + Aggregation: view.Count(), + } + + ErrorCountView = &view.View{ + Name: "demo/errors", + Measure: MErrors, + Description: "The number of errors encountered", + Aggregation: view.Count(), + } + + LineLengthView = &view.View{ + Description: "Groups the lengths of keys in buckets", + Measure: MLineLengths, + // Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + Aggregation: view.Distribution(0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000), + } +) + +func main() { + // Create that Stackdriver stats exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECT_ID"), + MetricPrefix: os.Getenv("GCP_METRIC_PREFIX"), + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver stats exporter: %v", err) + } + defer sd.Flush() + + // Register the stats exporter + view.RegisterExporter(sd) + + // Register the views + if err := view.Register(LatencyView, LineCountView, ErrorCountView, LineLengthView); err != nil { + log.Fatalf("Failed to register views: %v", err) + } + + // But also we can change the metrics reporting period to 2 seconds + view.SetReportingPeriod(2 * time.Second) + + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, err := tag.New(context.Background(), tag.Insert(KeyMethod, "repl")) + if err != nil { + return err + } + + fmt.Printf("> ") + line, _, err := br.ReadLine() + if err != nil { + if err != io.EOF { + stats.Record(ctx, MErrors.M(1)) + } + return err + } + + out, err := processLine(ctx, line) + if err != nil { + stats.Record(ctx, MErrors.M(1)) + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + startTime := time.Now() + defer func() { + ms := float64(time.Since(startTime).Nanoseconds()) / 1e6 + stats.Record(ctx, MLinesIn.M(1), MLatencyMs.M(ms), MLineLengths.M(int64(len(in)))) + }() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +#### Viewing your Metrics on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://app.google.stackdriver.com/metrics-explorer), select your project, and view the metrics. + +In the query box to find metrics, type `quickstart` as a prefix: + +![viewing metrics 1](https://cdn-images-1.medium.com/max/1600/1*kflo3l46PslT6oZDNCJ23A.png) + +And on selecting any of the metrics e.g. `quickstart/demo/lines_in`, we’ll get... + +![viewing metrics 2](https://cdn-images-1.medium.com/max/1600/1*6lUs1yCzewMgzCWv2wtbVQ.png) + +Let’s examine the latency buckets: + +![viewing metrics 3](https://cdn-images-1.medium.com/max/1600/1*o0cPi--Y5IYrrvdQ0IJQKw.png) + +On checking out the Stacked Area display of the latency, we can see that the 99th percentile latency was 24.75ms. And, for `line_lengths`: + +![viewing metrics 4](https://cdn-images-1.medium.com/max/1600/1*roe_0ZNOZiMnTVs3VzG0AQ.png) diff --git a/content/quickstart/go/tracing.md b/content/quickstart/go/tracing.md new file mode 100644 index 00000000..5c5a9b45 --- /dev/null +++ b/content/quickstart/go/tracing.md @@ -0,0 +1,729 @@ +--- +title: "Tracing" +date: 2018-07-16T14:29:06-07:00 +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Getting started](#getting-started) +- [Enable Tracing](#enable-tracing) + - [Import Packages](#import-tracing-packages) + - [Instrumentation](#instrument-tracing) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Traces](#export-traces) + - [Create Annotations](#create-annotations) +- [Viewing your Traces on Stackdriver](#viewing-your-traces-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Trace the code using [OpenCensus Tracing](/core-concepts/tracing) +2. Register and enable an exporter for a [backend](/core-concepts/exporters/#supported-backends) of our choice +3. View traces on the backend of our choice + +#### Requirements +- Go1.9 and above +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation + +OpenCensus: `go get go.opencensus.io/*` + +Stackdriver exporter: `go get contrib.go.opencensus.io/exporter/stackdriver` + +#### Getting Started + +{{% notice note %}} +Unsure how to write and execute Go code? [Click here](https://golang.org/doc/code.html). +{{% /notice %}} + +It would be nice if we could trace the following code, thus giving us observability in to how the code functions. + +First, create a file called `repl.go`. +```bash +touch repl.go +``` + +Next, put the following code inside of `repl.go`: + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "fmt" + "log" + "os" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + + line, err := readLine(br) + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(br *bufio.Reader) ([]byte, error) { + line, _, err := br.ReadLine() + if err != nil { + return nil, err + } + + return line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} + +You can run the code via `go run repl.go`. + +#### Enable Tracing + +<a name="import-tracing-packages"></a> +##### Import Packages + +To enable tracing, we’ll import the context package (`context`) as well as the OpenCensus Trace package (`go.opencensus.io/trace`). Your import statement will look like this: + +{{<tabs Snippet All>}} +{{<highlight go>}} +import ( + "bufio" + "bytes" + "context" + "fmt" + "log" + "os" + + "go.opencensus.io/trace" +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "log" + "os" + + "go.opencensus.io/trace" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + + line, err := readLine(br) + if err != nil { + return err + } + + out, err := processLine(line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(br *bufio.Reader) ([]byte, error) { + line, _, err := br.ReadLine() + if err != nil { + return nil, err + } + + return line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(in []byte) (out []byte, err error) { + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +<a name="instrument-tracing"></a> +##### Instrumentation + +We will be tracing the execution as it starts in `readEvaluateProcess`, goes to `readLine`, and finally travels through `processLine`. + +To accomplish this, we must do two things: + +**1. Create a span in each of the three functions** + +You can create a span by inserting the following two lines in each of the three functions: +```go +ctx, span := trace.StartSpan(context.Context ctx, "spanName") +defer span.End() +``` + +**2. Provide `context.Context ctx` to all spans** + +In order to trace each span, we will provide the **ctx returned from the first `StartSpan` function to all future `StartSpan` functions**. + +This means that we will modify the `readLine` and `processLine` functions so they accept a `context.Context ctx` argument. + + +{{<tabs Snippet All>}} +{{<highlight go>}} +func readEvaluateProcess(br *bufio.Reader) error { + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + fmt.Printf("> ") + + _, line, err := readLine(ctx, br) + if err != nil { + return err + } + + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(ctx context.Context, br *bufio.Reader) (context.Context, []byte, error) { + ctx, span := trace.StartSpan(ctx, "readLine") + defer span.End() + + line, _, err := br.ReadLine() + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return ctx, nil, err + } + + return ctx, line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + _, span := trace.StartSpan(ctx, "processLine") + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "log" + "os" + + "go.opencensus.io/trace" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + fmt.Printf("> ") + + _, line, err := readLine(ctx, br) + if err != nil { + return err + } + + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(ctx context.Context, br *bufio.Reader) (context.Context, []byte, error) { + ctx, span := trace.StartSpan(ctx, "readLine") + defer span.End() + + line, _, err := br.ReadLine() + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return ctx, nil, err + } + + return ctx, line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + _, span := trace.StartSpan(ctx, "processLine") + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +When creating a new span with `trace.StartSpan(context.Context, "spanName")`, the package first checks if a parent Span already exists in the `context.Context` argument. If it exists, a child span is created. Otherwise, a newly created span is inserted in to `context` to become the parent Span so that subsequent reuse of `context.Context` will have that span. + +#### Exporting to Stackdriver + +<a name="import-exporting-packages"></a> +##### Import Packages +To turn on Stackdriver Tracing, we’ll need to import the Stackdriver exporter from `contrib.go.opencensus.io/exporter/stackdriver`. + +{{<tabs Snippet All>}} +{{<highlight go>}} +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/trace" +) +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/trace" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + fmt.Printf("> ") + + _, line, err := readLine(ctx, br) + if err != nil { + return err + } + + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(ctx context.Context, br *bufio.Reader) (context.Context, []byte, error) { + ctx, span := trace.StartSpan(ctx, "readLine") + defer span.End() + + line, _, err := br.ReadLine() + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return ctx, nil, err + } + + return ctx, line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + _, span := trace.StartSpan(ctx, "processLine") + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Export Traces +To get our code ready to export, we will be adding a few lines of code to our `main` function. + +1. We want to make our traces export to Stackdriver +```go +stackdriver.NewExporter +trace.RegisterExporter +``` + +2. We want to trace a large percentage of executions (this is called [sampling](/core-concepts/tracing/#sampling)) +```go +stackdriver.ApplyConfig +``` + +Now, let's look at what our `main` function will look like: +{{<tabs Snippet All>}} +{{<highlight go>}} +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Enable the Stackdriver Tracing exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECTID"), + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + defer sd.Flush() + + // Register/enable the trace exporter + trace.RegisterExporter(sd) + + // For demo purposes, set the trace sampling probability to be high + trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(1.0)}) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/trace" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Enable the Stackdriver Tracing exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECTID"), + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + defer sd.Flush() + + // Register/enable the trace exporter + trace.RegisterExporter(sd) + + // For demo purposes, set the trace sampling probability to be high + trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(1.0)}) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + fmt.Printf("> ") + + _, line, err := readLine(ctx, br) + if err != nil { + return err + } + + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(ctx context.Context, br *bufio.Reader) (context.Context, []byte, error) { + ctx, span := trace.StartSpan(ctx, "readLine") + defer span.End() + + line, _, err := br.ReadLine() + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return ctx, nil, err + } + + return ctx, line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + _, span := trace.StartSpan(ctx, "processLine") + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +##### Create Annotations +When looking at our traces on a backend (such as Stackdriver), we can add metadata to our traces to increase our post-mortem insight. + +Let's record the length of each requested string so that it is available to view when we are looking at our traces. We can do this by annotating our `readEvaluateProcess` function. + +{{<tabs Snippet All>}} +{{<highlight go>}} +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + // Not timing from: prompt to when we read a + // line, because you can infinitely wait on stdin. + line, _, err := br.ReadLine() + + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return err + } + + span.Annotate([]trace.Attribute{ + trace.Int64Attribute("len", int64(len(line))), + trace.StringAttribute("use", "repl"), + }, "Invoking processLine") + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "os" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/trace" +) + +func main() { + // In a REPL: + // 1. Read input + // 2. process input + br := bufio.NewReader(os.Stdin) + + // Enable the Stackdriver Tracing exporter + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: os.Getenv("GCP_PROJECTID"), + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + defer sd.Flush() + + // Register/enable the trace exporter + trace.RegisterExporter(sd) + + // For demo purposes, set the trace sampling probability to be high + trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(1.0)}) + + // repl is the read, evaluate, print, loop + for { + if err := readEvaluateProcess(br); err != nil { + if err == io.EOF { + return + } + log.Fatal(err) + } + } +} + +// readEvaluateProcess reads a line from the input reader and +// then processes it. It returns an error if any was encountered. +func readEvaluateProcess(br *bufio.Reader) error { + fmt.Printf("> ") + // Not timing from: prompt to when we read a + // line, because you can infinitely wait on stdin. + line, _, err := br.ReadLine() + + ctx, span := trace.StartSpan(context.Background(), "repl") + defer span.End() + + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return err + } + + span.Annotate([]trace.Attribute{ + trace.Int64Attribute("len", int64(len(line))), + trace.StringAttribute("use", "repl"), + }, "Invoking processLine") + out, err := processLine(ctx, line) + if err != nil { + return err + } + fmt.Printf("< %s\n\n", out) + return nil +} + +func readLine(ctx context.Context, br *bufio.Reader) (context.Context, []byte, error) { + ctx, span := trace.StartSpan(ctx, "readLine") + defer span.End() + + line, _, err := br.ReadLine() + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + return ctx, nil, err + } + + return ctx, line, err +} + +// processLine takes in a line of text and +// transforms it. Currently it just capitalizes it. +func processLine(ctx context.Context, in []byte) (out []byte, err error) { + _, span := trace.StartSpan(ctx, "processLine") + defer span.End() + + return bytes.ToUpper(in), nil +} +{{</highlight>}} +{{</tabs>}} + +#### Viewing your Traces on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://console.cloud.google.com/traces/traces), select your project, and view the traces. + +![viewing traces 1](https://cdn-images-1.medium.com/max/1600/1*v7qiO8nX8WAxpX4LjiQ2oA.png) + +And on clicking on one of the traces, we should be able to see the annotation whose description `isInvoking processLine` and on clicking on it, it should show our attributes `len` and `use`. + +![viewing traces 2](https://cdn-images-1.medium.com/max/1600/1*SEsUxV1GXu-jM8dLQwtVMw.png) diff --git a/content/quickstart/java/_index.md b/content/quickstart/java/_index.md new file mode 100644 index 00000000..72f7011b --- /dev/null +++ b/content/quickstart/java/_index.md @@ -0,0 +1,18 @@ +--- +title: "Java" +date: 2018-07-16T14:29:15-07:00 +draft: false +class: "resized-logo" +--- + +![](/images/java-opencensus.png) + +In this quickstart, using OpenCensus Java, you will gain hands-on experience with: +{{% children %}} + +For full API references, please take a look at: + +Resource|Link +---|--- +JavaDoc|https://javadoc.io/doc/io.opencensus/opencensus-api/ +Github repository|https://github.com/census-instrumentation/opencensus-java diff --git a/content/quickstart/java/metrics.md b/content/quickstart/java/metrics.md new file mode 100644 index 00000000..fa111166 --- /dev/null +++ b/content/quickstart/java/metrics.md @@ -0,0 +1,1903 @@ +--- +title: "Metrics" +date: 2018-07-16T14:29:27-07:00 +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Brief Overview](#brief-overview) +- [Getting started](#getting-started) +- [Enable Metrics](#enable-metrics) + - [Import Packages](#import-metrics-packages) + - [Create Metrics](#create-metrics) + - [Create Tags](#create-tags) + - [Inserting Tags](#inserting-tags) + - [Recording Metrics](#recording-metrics) +- [Enable Views](#enable-views) + - [Import Packages](#import-views-packages) + - [Create Views](#create-views) + - [Register Views](#register-views) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Views](#export-views) +- [Viewing your Metrics on Stackdriver](#viewing-your-metrics-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Collect metrics using [OpenCensus Metrics](/core-concepts/metrics) and [Tags](/core-concepts/tags) +2. Register and enable an exporter for a [backend](http://localhost:1313/core-concepts/exporters/#supported-backends) of our choice +3. View the metrics on the backend of our choice + +#### Requirements +- Java 8+ +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation +```bash +mvn archetype:generate \ + -DgroupId=io.opencensus.quickstart \ + -DartifactId=repl-app \ + -DarchetypeArtifactId=maven-archetype-quickstart \ + -DinteractiveMode=false \ + +cd repl-app/src/main/java/io/opencensus/quickstart + +mv App.Java Repl.java +``` +Put this in your newly generated `pom.xml` file: + +```xml +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +``` + +Put this in `src/main/java/io/opencensus/quickstart/Repl.java`: + +```java +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Repl { + public static void main(String ...args) { + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + System.out.print("> "); + System.out.flush(); + String line = stdin.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } +} +``` + +Install required dependencies: +```bash +mvn install +``` + +#### Brief Overview +By the end of this tutorial, we will do these four things to obtain metrics using OpenCensus: + +1. Create quantifiable metrics (numerical) that we will record +2. Create [tags](/core-concepts/tags) that we will associate with our metrics +3. Organize our metrics, similar to a writing a report, in to a `View` +4. Export our views to a backend (Stackdriver in this case) + +#### Getting Started +We will be creating a simple "read-evaluate-print" (REPL) app. Let's collect some metrics to observe the work that is going on this code, such as: + +- Latency per processing loop +- Number of lines read +- Number of errors +- Line lengths + +Let's first run the application and see what we have. +```bash +mvn exec:java -Dexec.mainClass=io.opencensus.quickstart.Repl +``` +You should see something like this: +![java image 1](https://cdn-images-1.medium.com/max/1600/1*VFN-txsDL6qYkN_UH3VwhA.png) + +Now, in preparation of collecting metrics, lets abstract some of the core functionality in `main()` to a suite of helper functions: + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Repl { + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} + +#### Enable Metrics + +##### Import Packages +To enable metrics, we’ll declare the dependencies in your `pom.xml` file: + +{{<tabs Snippet All>}} +{{<highlight xml>}} +<dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> +</dependencies> +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +{{</highlight>}} +{{</tabs>}} + +Now add the import statements to your `Repl.java`: +{{<tabs Snippet All>}} +{{<highlight java>}} +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; + +public class Repl { + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Create Metrics +First, we will create the variables needed to later record our metrics. + +{{<tabs Snippet All>}} +{{<highlight java>}} +// The latency in milliseconds +private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + +// Counts the number of lines read in from standard input. +private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + +// Counts the number of non EOF(end-of-file) errors. +private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + +// Counts/groups the lengths of lines read in. +private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + +private static final Tagger TAGGER = Tags.getTagger(); +private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + +private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Create Tags +Now we will create the variable later needed to add extra text meta-data to our metrics. + +{{<tabs Snippet All>}} +{{<highlight java>}} +// The tag "method" +private static final TagKey KeyMethod = TagKey.create("method"); +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} +{{</tabs>}} + +We will later use this tag, called KeyMethod, to record what method is being invoked. In our scenario, we will only use it to record that "repl" is calling our data. + +Again, this is arbitrary and purely up the user. For example, if we wanted to track what operating system a user is using, we could do so like this: +```java +private static final TagKey OSKey = TagKey.create("operating_system"); +``` + +Later, when we use OSKey, we will be given an opportunity to enter values such as "windows" or "mac". + +We will now create helper functions to assist us with recording Tagged Stats. + +{{<tabs Snippet All>}} +{{<highlight java>}} +private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } +} + +private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Recording Metrics +Finally, we'll hook our stat recorders in to `main`, `processLine`, and `readEvaluateProcess`: + +{{<tabs Snippet All>}} +{{<highlight java>}} +public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } +} + +private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } +} + +private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } + } +} +{{</highlight>}} +{{</tabs>}} + +#### Enable Views +In order to examine these stats, we’ll need to export them to the backend of our choice for processing and aggregation. + +To do this, we need to define a mechanism for which the backend will process and aggregate those metrics and for this we define Views to categorically describe how we’ll examine the measures. + +<a name="import-views-packages"></a> +##### Import Packages + +{{<tabs Snippet All>}} +{{<highlight java>}} +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.Stats; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; +import io.opencensus.tags.TagKey; +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } + } +} +{{</highlight>}} +{{</tabs>}} + +##### Create Views +We now determine how our metrics will be organized by creating `Views`. + +{{<tabs Snippet All>}} +{{<highlight java>}} +private static void registerAllViews() { + // Defining the distribution aggregations + Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + 0.0, 25.0, 50.0, 75.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, 2000.0, 4000.0, 6000.0) + )); + + Aggregation lengthsDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0B, >=5B, >=10B, >=20B, >=40B, >=60B, >=80B, >=100B, >=200B, >=400B, >=600B, >=800B, >=1000B] + 0.0, 5.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0) + )); + + // Define the count aggregation + Aggregation countAggregation = Aggregation.Count.create(); + + // So tagKeys + List<TagKey> noKeys = new ArrayList<TagKey>(); + + // Define the views + View[] views = new View[]{ + View.create(Name.create( + "demo/latency", "The distribution of latencies", MLatencyMs, latencyDistribution, Collections.singletonList(KeyMethod))), + View.create(Name.create( + "demo/lines_in", "The number of lines read in from standard input", MLinesIn, countAggregation, noKeys)), + View.create(Name.create( + "demo/errors", "The number of errors encountered", MErrors, countAggregation, noKeys)), + View.create(Name.create( + "demo/line_length", "The distribution of line lengths", MLineLengths, lengthsDistribution, noKeys)) + }; + + // Create the view manager + ViewManager vmgr = Stats.getViewManager(); + + // Then finally register the views + for (View view : views) + vmgr.registerView(view); +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } + } + + private static void registerAllViews() { + // Defining the distribution aggregations + Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + 0.0, 25.0, 50.0, 75.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, 2000.0, 4000.0, 6000.0) + )); + + Aggregation lengthsDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0B, >=5B, >=10B, >=20B, >=40B, >=60B, >=80B, >=100B, >=200B, >=400B, >=600B, >=800B, >=1000B] + 0.0, 5.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0) + )); + + // Define the count aggregation + Aggregation countAggregation = Aggregation.Count.create(); + + // So tagKeys + List<TagKey> noKeys = new ArrayList<TagKey>(); + + // Define the views + View[] views = new View[]{ + View.create(Name.create( + "demo/latency", "The distribution of latencies", MLatencyMs, latencyDistribution, Collections.singletonList(KeyMethod))), + View.create(Name.create( + "demo/lines_in", "The number of lines read in from standard input", MLinesIn, countAggregation, noKeys)), + View.create(Name.create( + "demo/errors", "The number of errors encountered", MErrors, countAggregation, noKeys)), + View.create(Name.create( + "demo/line_length", "The distribution of line lengths", MLineLengths, lengthsDistribution, noKeys)) + }; + + // Create the view manager + ViewManager vmgr = Stats.getViewManager(); + + // Then finally register the views + for (View view : views) + vmgr.registerView(view); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Register Views +We will create a function called `setupOpenCensusAndStackdriverExporter` and call it from our main function: + +{{<tabs Snippet All>}} +{{<highlight java>}} +public static void main(String ...args) { + // Step 1. Enable OpenCensus Metrics. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } +} + +private static void setupOpenCensusAndStackdriverExporter() throws IOException { + // Firstly register the views + registerAllViews(); +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Metrics. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } + } + + private static void registerAllViews() { + // Defining the distribution aggregations + Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + 0.0, 25.0, 50.0, 75.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, 2000.0, 4000.0, 6000.0) + )); + + Aggregation lengthsDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0B, >=5B, >=10B, >=20B, >=40B, >=60B, >=80B, >=100B, >=200B, >=400B, >=600B, >=800B, >=1000B] + 0.0, 5.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0) + )); + + // Define the count aggregation + Aggregation countAggregation = Aggregation.Count.create(); + + // So tagKeys + List<TagKey> noKeys = new ArrayList<TagKey>(); + + // Define the views + View[] views = new View[]{ + View.create(Name.create( + "demo/latency", "The distribution of latencies", MLatencyMs, latencyDistribution, Collections.singletonList(KeyMethod))), + View.create(Name.create( + "demo/lines_in", "The number of lines read in from standard input", MLinesIn, countAggregation, noKeys)), + View.create(Name.create( + "demo/errors", "The number of errors encountered", MErrors, countAggregation, noKeys)), + View.create(Name.create( + "demo/line_length", "The distribution of line lengths", MLineLengths, lengthsDistribution, noKeys)) + }; + + // Create the view manager + ViewManager vmgr = Stats.getViewManager(); + + // Then finally register the views + for (View view : views) + vmgr.registerView(view); + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + // Firstly register the views + registerAllViews(); + } +} +{{</highlight>}} +{{</tabs>}} + + + +#### Exporting to Stackdriver + +##### Import Packages + +`pom.xml` +{{<tabs Snippet All>}} +{{<highlight xml>}} +<dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-stackdriver</artifactId> + <version>${opencensus.version}</version> +</dependency> +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +{{</highlight>}} +{{</tabs>}} + +`Repl.java` +{{<tabs Snippet All>}} +{{<highlight java>}} +import java.io.IOException; + +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.io.IOException; + +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; +import io.opencensus.common.Scope; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Metrics. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + STATSRECORDER.newMeasureMap().put(ml, n); + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + try { + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } catch(Exception e) { + recordTaggedStat(KeyMethod, "repl", MLinesIn, new Long(1)); + } + } + + private static void registerAllViews() { + // Defining the distribution aggregations + Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + 0.0, 25.0, 50.0, 75.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, 2000.0, 4000.0, 6000.0) + )); + + Aggregation lengthsDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0B, >=5B, >=10B, >=20B, >=40B, >=60B, >=80B, >=100B, >=200B, >=400B, >=600B, >=800B, >=1000B] + 0.0, 5.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0) + )); + + // Define the count aggregation + Aggregation countAggregation = Aggregation.Count.create(); + + // So tagKeys + List<TagKey> noKeys = new ArrayList<TagKey>(); + + // Define the views + View[] views = new View[]{ + View.create(Name.create( + "demo/latency", "The distribution of latencies", MLatencyMs, latencyDistribution, Collections.singletonList(KeyMethod))), + View.create(Name.create( + "demo/lines_in", "The number of lines read in from standard input", MLinesIn, countAggregation, noKeys)), + View.create(Name.create( + "demo/errors", "The number of errors encountered", MErrors, countAggregation, noKeys)), + View.create(Name.create( + "demo/line_length", "The distribution of line lengths", MLineLengths, lengthsDistribution, noKeys)) + }; + + // Create the view manager + ViewManager vmgr = Stats.getViewManager(); + + // Then finally register the views + for (View view : views) + vmgr.registerView(view); + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + // Firstly register the views + registerAllViews(); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Export Views +We will further expand upon `setupOpenCensusAndStackdriverExporter`: + +```java +private static void setupOpenCensusAndStackdriverExporter() throws IOException { + // Firstly register the views + registerAllViews(); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverStatsExporter.createAndRegister( + StackdriverStatsConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); +} +``` + +Let's create the helper function `envOrAlternative` to assist with getting the Google Cloud Project ID: + +```java +private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; +} +``` + +Here is the final state of the code: +```java +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import io.opencensus.common.Scope; +import io.opencensus.stats.Aggregation; +import io.opencensus.stats.Aggregation.Distribution; +import io.opencensus.stats.BucketBoundaries; +import io.opencensus.stats.Stats; +import io.opencensus.stats.Measure; +import io.opencensus.stats.Measure.MeasureLong; +import io.opencensus.stats.Measure.MeasureDouble; +import io.opencensus.stats.Stats; +import io.opencensus.stats.StatsRecorder; +import io.opencensus.stats.View; +import io.opencensus.tags.Tags; +import io.opencensus.tags.Tagger; +import io.opencensus.tags.TagContext; +import io.opencensus.tags.TagContextBuilder; +import io.opencensus.tags.TagKey; +import io.opencensus.tags.TagValue; +import io.opencensus.stats.View; +import io.opencensus.stats.View.Name; +import io.opencensus.stats.ViewManager; +import io.opencensus.stats.View.AggregationWindow.Cumulative; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; + +public class Repl { + // The latency in milliseconds + private static final MeasureDouble MLatencyMs = MeasureDouble.create("repl/latency", "The latency in milliseconds per REPL loop", "ms"); + + // Counts the number of lines read in from standard input. + private static final MeasureLong MLinesIn = MeasureLong.create("repl/lines_in", "The number of lines read in", "1"); + + // Counts the number of non EOF(end-of-file) errors. + private static final MeasureLong MErrors = MeasureLong.create("repl/errors", "The number of errors encountered", "1"); + + // Counts/groups the lengths of lines read in. + private static final MeasureLong MLineLengths = MeasureLong.create("repl/line_lengths", "The distribution of line lengths", "By"); + + // The tag "method" + private static final TagKey KeyMethod = TagKey.create("method"); + + private static final Tagger TAGGER = Tags.getTagger(); + private static final StatsRecorder STATSRECORDER = Stats.getStatsRecorder(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Metrics. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("EOF bye "+ e); + return; + } catch (Exception e) { + recordTaggedStat(KeyMethod, "repl", MErrors, new Long(1)); + } + } + } + + private static void recordStat(MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureLong ml, Long n) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(ml, n).record(); + } + } + + private static void recordTaggedStat(TagKey key, String value, MeasureDouble md, Double d) { + TagContext tctx = TAGGER.emptyBuilder().put(key, TagValue.create(value)).build(); + try (Scope ss = TAGGER.withTagContext(tctx)) { + STATSRECORDER.newMeasureMap().put(md, d).record(); + } + } + + private static String processLine(String line) { + long startTimeNs = System.nanoTime(); + + try { + return line.toUpperCase(); + } catch (Exception e) { + recordTaggedStat(KeyMethod, "processLine", MErrors, new Long(1)); + return ""; + } finally { + long totalTimeNs = System.nanoTime() - startTimeNs; + double timespentMs = (new Double(totalTimeNs))/1e6; + recordTaggedStat(KeyMethod, "processLine", MLatencyMs, timespentMs); + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + + String line = in.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + if (line != null && line.length() > 0) { + recordStat(MLinesIn, new Long(1)); + recordStat(MLineLengths, new Long(line.length())); + } + } + + private static void registerAllViews() { + // Defining the distribution aggregations + Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + 0.0, 25.0, 50.0, 75.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, 2000.0, 4000.0, 6000.0) + )); + + Aggregation lengthsDistribution = Distribution.create(BucketBoundaries.create( + Arrays.asList( + // [>=0B, >=5B, >=10B, >=20B, >=40B, >=60B, >=80B, >=100B, >=200B, >=400B, >=600B, >=800B, >=1000B] + 0.0, 5.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0) + )); + + // Define the count aggregation + Aggregation countAggregation = Aggregation.Count.create(); + + // So tagKeys + List<TagKey> noKeys = new ArrayList<TagKey>(); + + // Define the views + View[] views = new View[]{ + View.create(Name.create("demo/latency"), "The distribution of latencies", MLatencyMs, latencyDistribution, Collections.singletonList(KeyMethod)), + View.create(Name.create("demo/lines_in"), "The number of lines read in from standard input", MLinesIn, countAggregation, noKeys), + View.create(Name.create("demo/errors"), "The number of errors encountered", MErrors, countAggregation, Collections.singletonList(KeyMethod)), + View.create(Name.create("demo/line_lengths"), "The distribution of line lengths", MLineLengths, lengthsDistribution, noKeys) + }; + + // Create the view manager + ViewManager vmgr = Stats.getViewManager(); + + // Then finally register the views + for (View view : views) + vmgr.registerView(view); + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + // Firstly register the views + registerAllViews(); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverStatsExporter.createAndRegister( + StackdriverStatsConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } + + private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; + } +} +``` + +#### Viewing your Metrics on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://app.google.stackdriver.com/metrics-explorer), select your project, and view the metrics. + +In the query box to find metrics, type `quickstart` as a prefix: + +![viewing metrics 1](https://cdn-images-1.medium.com/max/1600/1*kflo3l46PslT6oZDNCJ23A.png) + +And on selecting any of the metrics e.g. `quickstart/demo/lines_in`, we’ll get... + +![viewing metrics 2](https://cdn-images-1.medium.com/max/1600/1*6lUs1yCzewMgzCWv2wtbVQ.png) + +Let’s examine the latency buckets: + +![viewing metrics 3](https://cdn-images-1.medium.com/max/1600/1*o0cPi--Y5IYrrvdQ0IJQKw.png) + +On checking out the Stacked Area display of the latency, we can see that the 99th percentile latency was 24.75ms. And, for `line_lengths`: + +![viewing metrics 4](https://cdn-images-1.medium.com/max/1600/1*roe_0ZNOZiMnTVs3VzG0AQ.png) diff --git a/content/quickstart/java/tracing.md b/content/quickstart/java/tracing.md new file mode 100644 index 00000000..0d5cc391 --- /dev/null +++ b/content/quickstart/java/tracing.md @@ -0,0 +1,1100 @@ +--- +title: "Tracing" +date: 2018-07-16T14:29:21-07:00 +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Getting started](#getting-started) +- [Enable Tracing](#enable-tracing) + - [Import Packages](#import-tracing-packages) + - [Instrumentation](#instrument-tracing) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Traces](#export-traces) + - [Create Annotations](#create-annotations) +- [Viewing your Traces on Stackdriver](#viewing-your-traces-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Trace the code using [OpenCensus Tracing](/core-concepts/tracing) +2. Register and enable an exporter for a [backend](http://localhost:1313/core-concepts/exporters/#supported-backends) of our choice +3. View traces on the backend of our choice + +#### Requirements +- Java 8+ +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation +```bash +mvn archetype:generate \ + -DgroupId=io.opencensus.quickstart \ + -DartifactId=repl-app \ + -DarchetypeArtifactId=maven-archetype-quickstart \ + -DinteractiveMode=false \ + +cd repl-app/src/main/java/io/opencensus/quickstart + +mv App.Java Repl.java +``` +Put this in your newly generated `pom.xml` file: + +```xml +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +``` + +Put this in `src/main/java/io/opencensus/quickstart/Repl.java`: + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Repl { + public static void main(String ...args) { + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + System.out.print("> "); + System.out.flush(); + String line = stdin.readLine(); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } +} +{{</highlight>}} + +Install required dependencies: +```bash +mvn install +``` + +#### Getting Started +Let's first run the application and see what we have. +```bash +mvn exec:java -Dexec.mainClass=io.opencensus.quickstart.Repl +``` +We have ourselves a lower-to-UPPERCASE REPL. You should see something like this: +![java image 1](https://cdn-images-1.medium.com/max/1600/1*VFN-txsDL6qYkN_UH3VwhA.png) + +Now, in preparation of tracing, lets abstract some of the core functionality in `main()` to a suite of helper functions: + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +public class Repl { + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static String readLine(BufferedReader in) { + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + System.err.println("Failed to read line "+ e); + } finally { + return line; + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = readLine(in); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} + +#### Enable Tracing + +##### Import Packages +To enable tracing, we’ll declare the dependencies in your `pom.xml` file: + +{{<tabs Snippet All>}} +{{<highlight xml>}} +<dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> +</dependencies> +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +{{</highlight>}} +{{</tabs>}} + +Now add the import statements to your `Repl.java`: + +{{<tabs Snippet All>}} +{{<highlight java>}} +import io.opencensus.common.Scope; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +public class Repl { + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + return line.toUpperCase(); + } + + private static String readLine(BufferedReader in) { + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + System.err.println("Failed to read line "+ e); + } finally { + return line; + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + System.out.print("> "); + System.out.flush(); + String line = readLine(in); + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } +} +{{</highlight>}} +{{</tabs>}} + +##### Instrumentation +We will begin by creating a private static `Tracer` as a property of our Repl class. + +```java +private static final Tracer TRACER = Tracing.getTracer(); +``` + +We will be tracing the execution as it flows through `readEvaluateProcess`, `readLine`, and finally `processLine`. + +To do this, we will create a [span](http://localhost:1313/core-concepts/tracing/#spans). + +You can create a span by inserting the following line in each of the three functions: +```java +Scope ss = TRACER.spanBuilder("repl").startScopedSpan(); +``` + +Here is our updated state of `Repl.java`: + +```java +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import io.opencensus.common.Scope; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } +} +``` + +#### Exporting to Stackdriver + +##### Import Packages +To turn on Stackdriver Tracing, we’ll need to declare the Stackdriver dependency in your `pom.xml`: + +{{<tabs Snippet All>}} +{{<highlight xml>}} +<dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-stackdriver</artifactId> + <version>${opencensus.version}</version> +</dependency> +{{</highlight>}} + +{{<highlight xml>}} +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>io.opencensus.quickstart</groupId> + <artifactId>quickstart</artifactId> + <packaging>jar</packaging> + <version>1.0-SNAPSHOT</version> + <name>quickstart</name> + <url>http://maven.apache.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> + + <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + <version>1.5.0.Final</version> + </extension> + </extensions> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>appassembler-maven-plugin</artifactId> + <version>1.10</version> + <configuration> + <programs> + <program> + <id>Repl</id> + <mainClass>io.opencensus.quickstart.Repl</mainClass> + </program> + </programs> + </configuration> + </plugin> + </plugins> + + </pluginManagement> + + </build> +</project> +{{</highlight>}} +{{</tabs>}} + +Now add the import statements to your `Repl.java`: + +{{<tabs Snippet All>}} +{{<highlight java>}} +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Our OpenCensus initialization will eventually go here + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } +} +{{</highlight>}} +{{</tabs>}} + +##### Export Traces + +Now it is time to implement `Step 1: OpenCensus Initialization`! + +We will create a function called `setupOpenCensusAndStackdriverExporter` and call it from our `main` function: + +{{<tabs Snippet All>}} +{{<highlight java>}} +public static void main(String ...args) { + // Step 1. Enable OpenCensus Tracing. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + //.. +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Tracing. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } +} +{{</highlight>}} +{{</tabs>}} + +We will do three things in our `setupOpenCensusAndStackdriverExporter` function: + +1. Set our [sampling rate](http://localhost:1313/core-concepts/tracing/#sampling) +```java +TraceConfig traceConfig = Tracing.getTraceConfig(); +// For demo purposes, lets always sample. +traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); +``` + +2. Retrieve our Google Cloud Project ID +```java +// Implementation will come later +String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); +``` + +3. Export our Traces to Stackdriver +```java +StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); +``` + +The function ends up looking like this: + +{{<tabs Snippet All>}} +{{<highlight java>}} +private static void setupOpenCensusAndStackdriverExporter() throws IOException { + TraceConfig traceConfig = Tracing.getTraceConfig(); + // For demo purposes, lets always sample. + traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Tracing. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + TraceConfig traceConfig = Tracing.getTraceConfig(); + // For demo purposes, lets always sample. + traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } +} +{{</highlight>}} +{{</tabs>}} + +Now we will handle our implementation of `envOrAlternative`: + +{{<tabs Snippet All>}} +{{<highlight java>}} +private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; +} +{{</highlight>}} + +{{<highlight java>}} +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Tracing. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + TraceConfig traceConfig = Tracing.getTraceConfig(); + // For demo purposes, lets always sample. + traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } + + private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; + } +} +{{</highlight>}} +{{</tabs>}} + + +##### Create Annotations +When looking at our traces on a backend (such as Stackdriver), we can add metadata to our traces to increase our post-mortem insight. + +Let's record the length of each requested string so that it is available to view when we are looking at our traces. + +To do this, we'll dive in to `readEvaluateProcess`. + +Between `String line = readLine(in)` and `String processed = processLine(line)`, add this: + +```java +// Annotate the span to indicate we are invoking processLine next. +Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>(); +attributes.put("len", AttributeValue.longAttributeValue(line.length())); +attributes.put("use", AttributeValue.stringAttributeValue("repl")); +Span span = TRACER.getCurrentSpan(); +span.addAnnotation("Invoking processLine", attributes); +``` + +The final state of `Repl.java` should be this: + +```java +package io.opencensus.quickstart; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +import io.opencensus.common.Scope; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.config.TraceConfig; +import io.opencensus.trace.samplers.Samplers; +import io.opencensus.trace.Span; +import io.opencensus.trace.Status; +import io.opencensus.trace.Tracer; +import io.opencensus.trace.Tracing; + +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class Repl { + private static final Tracer TRACER = Tracing.getTracer(); + + public static void main(String ...args) { + // Step 1. Enable OpenCensus Tracing. + try { + setupOpenCensusAndStackdriverExporter(); + } catch (IOException e) { + System.err.println("Failed to create and register OpenCensus Stackdriver Trace exporter "+ e); + return; + } + + // Step 2. The normal REPL. + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + + while (true) { + try { + readEvaluateProcess(stdin); + } catch (IOException e) { + System.err.println("Exception "+ e); + } + } + } + + private static String processLine(String line) { + try (Scope ss = TRACER.spanBuilder("processLine").startScopedSpan()) { + return line.toUpperCase(); + } + } + + private static String readLine(BufferedReader in) { + Scope ss = TRACER.spanBuilder("readLine").startScopedSpan(); + + String line = ""; + + try { + line = in.readLine(); + } catch (Exception e) { + Span span = TRACER.getCurrentSpan(); + span.setStatus(Status.INTERNAL.withDescription(e.toString())); + } finally { + ss.close(); + return line; + } + } + + private static void readEvaluateProcess(BufferedReader in) throws IOException { + try (Scope ss = TRACER.spanBuilder("repl").startScopedSpan()) { + System.out.print("> "); + System.out.flush(); + String line = readLine(in); + + // Annotate the span to indicate we are invoking processLine next. + Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>(); + attributes.put("len", AttributeValue.longAttributeValue(line.length())); + attributes.put("use", AttributeValue.stringAttributeValue("repl")); + Span span = TRACER.getCurrentSpan(); + span.addAnnotation("Invoking processLine", attributes); + + String processed = processLine(line); + System.out.println("< " + processed + "\n"); + } + } + + private static void setupOpenCensusAndStackdriverExporter() throws IOException { + TraceConfig traceConfig = Tracing.getTraceConfig(); + // For demo purposes, lets always sample. + traceConfig.updateActiveTraceParams( + traceConfig.getActiveTraceParams().toBuilder().setSampler(Samplers.alwaysSample()).build()); + + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } + + private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; + } +} +``` + +#### Viewing your Traces on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://console.cloud.google.com/traces/traces), select your project, and view the traces. + +![viewing traces 1](https://cdn-images-1.medium.com/max/1600/1*v7qiO8nX8WAxpX4LjiQ2oA.png) + +And on clicking on one of the traces, we should be able to see the annotation whose description `isInvoking processLine` and on clicking on it, it should show our attributes `len` and `use`. + +![viewing traces 2](https://cdn-images-1.medium.com/max/1600/1*SEsUxV1GXu-jM8dLQwtVMw.png) diff --git a/content/quickstart/python/_index.md b/content/quickstart/python/_index.md new file mode 100644 index 00000000..e329b30b --- /dev/null +++ b/content/quickstart/python/_index.md @@ -0,0 +1,18 @@ +--- +title: "Python" +date: 2018-07-16T14:29:03-07:00 +draft: false +class: "resized-logo" +--- + +![](/images/python-opencensus.png) + +In this quickstart, using OpenCensus Python, you will gain hands-on experience with: +{{% children %}} + +For full API references, please take a look at: + +Resource|Link +---|--- +Python API Documentation|https://census-instrumentation.github.io/opencensus-python +Github repository|https://github.com/census-instrumentation/opencensus-python diff --git a/content/quickstart/python/metrics.md b/content/quickstart/python/metrics.md new file mode 100644 index 00000000..73b16d10 --- /dev/null +++ b/content/quickstart/python/metrics.md @@ -0,0 +1,304 @@ +--- +title: "Metrics" +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. + +This tutorial is also incomplete, pending OpenCensus Python adding Metrics exporters +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Brief Overview](#brief-overview) +- [Getting started](#getting-started) +- [Enable Metrics](#enable-metrics) + - [Import Packages](#import-metrics-packages) + - [Create Metrics](#create-metrics) + - [Create Tags](#create-tags) + - [Inserting Tags](#inserting-tags) + - [Recording Metrics](#recording-metrics) +- [Enable Views](#enable-views) + - [Import Packages](#import-views-packages) + - [Create Views](#create-views) + - [Register Views](#register-views) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Views](#export-views) +- [Viewing your Metrics on Stackdriver](#viewing-your-metrics-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Collect metrics using [OpenCensus Metrics](/core-concepts/metrics) and [Tags](/core-concepts/tags) +2. Register and enable an exporter for a [backend](/core-concepts/exporters/#supported-backends) of our choice +3. View the metrics on the backend of our choice + +#### Requirements +- Python2 and above +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation + +OpenCensus: `pip install opencensus` + +#### Brief Overview +By the end of this tutorial, we will do these four things to obtain metrics using OpenCensus: + +1. Create quantifiable metrics (numerical) that we will record +2. Create [tags](/core-concepts/tags) that we will associate with our metrics +3. Organize our metrics, similar to a writing a report, in to a `View` +4. Export our views to a backend (Stackdriver in this case) + + +#### Getting Started + +{{% notice note %}} +Unsure how to write and execute Python code? [Click here](https://docs.python.org/). +{{% /notice %}} + +We will be a simple "read-evaluate-print" (REPL) app. In there we'll collect some metrics to observe the work that is going on this code, such as: + +- Latency per processing loop +- Number of lines read +- Number of errors +- Line lengths + +First, create a file called `repl.py`. +```bash +touch repl.py +``` + +Next, put the following code inside of `repl.py`: + +{{<highlight python>}} +#!/usr/bin/env python + +import sys + +def main(): + # In a REPL: + #1. Read input + #2. process input + while True: + line = sys.stdin.readline() + print(line.upper()) +{{</highlight>}} + +You can run the code via `python repl.py`. + +#### Create and record Metrics + +<a name="import-metrics-packages"></a> +##### Import Packages + +To enable metrics, we’ll import a number of core and OpenCensus packages + +{{<tabs Snippet All>}} +{{<highlight python>}} +import opencensus.stats import aggregation as aggregation_module +import opencensus.stats import measure as measure_module +import opencensus.stats import stats as stats_module +import opencensus.stats import view as view_module +import opencensus.tags import tag_key as tag_key_module +import opencensus.tags import tag_map as tag_map_module +import opencensus.tags import tag_value as tag_value_module + +# Create the measures +# The latency in milliseconds +m_latency_ms = measure_module.MeasureFloat("repl/latency", "The latency in milliseconds per REPL loop", "ms") + +# Counts the number of lines read in from standard input +m_lines_in = measure_module.MeasureInt("repl/lines_in", "The number of lines read in", "1") + +# Encounters the number of non EOF(end-of-file) errors. +m_errors = measure_module.Int("repl/errors", "The number of errors encountered", "1") + +# Counts/groups the lengths of lines read in. +m_line_lengths = measure_module.Int("repl/line_lengths", "The distribution of line lengths", "By") +{{</highlight>}} + +{{<highlight python>}} +#!/usr/bin/env python + +import sys +import time + +from opencensus.stats import aggregation as aggregation_module +from opencensus.stats import measure as measure_module +from opencensus.stats import stats +from opencensus.tags import tag_key as tag_key_module +from opencensus.tags import tag_map as tag_map_module +from opencensus.tags import tag_value as tag_value_module + +# Create the measures +# The latency in milliseconds +m_latency_ms = measure_module.MeasureFloat("repl/latency", "The latency in milliseconds per REPL loop", "ms") + +# Counts the number of lines read in from standard input +m_lines_in = measure_module.MeasureInt("repl/lines_in", "The number of lines read in", "1") + +# Encounters the number of non EOF(end-of-file) errors. +m_errors = measure_module.MeasureInt("repl/errors", "The number of errors encountered", "1") + +# Counts/groups the lengths of lines read in. +m_line_lengths = measure_module.MeasureInt("repl/line_lengths", "The distribution of line lengths", "By") + +# The stats recorder +stats_recorder = stats.Stats().stats_recorder + +# Create the tag key +key_method = tag_key_module.TagKey("method") + +def main(): + # In a REPL: + # 1. Read input + # 2. process input + while True: + readEvaluateProcess() + +def readEvaluateProcess(): + line = sys.stdin.readline() + start = time.time() + print(line.upper()) + + # Now record the stats + # Create the measure_map into which we'll insert the measurements + mmap = stats_recorder.new_measurement_map() + end_ms = (time.time() - start) * 1000.0 # Seconds to milliseconds + + # Record the latency + mmap.measure_float_put(m_latency_ms, end_ms) + + # Record the number of lines in + mmap.measure_int_put(m_lines_in, 1) + + # Record the line length + mmap.measure_int_put(m_line_lengths, len(line)) + + tmap = tag_map_module.TagMap() + tmap.insert(key_method, tag_value_module.TagValue("repl")) + + # Insert the tag map finally + mmap.record(tmap) + +if __name__ == "__main__": + main() +{{</highlight>}} +{{</tabs>}} + +#### With views and all enabled +```python +#!/usr/bin/env python + +import sys +import time + +from opencensus.stats import stats +from opencensus.stats import aggregation as aggregation_module +from opencensus.stats import measure as measure_module +from opencensus.stats import view as view_module +from opencensus.tags import tag_key as tag_key_module +from opencensus.tags import tag_map as tag_map_module +from opencensus.tags import tag_value as tag_value_module + +# Create the measures +# The latency in milliseconds +m_latency_ms = measure_module.MeasureFloat("repl/latency", "The latency in milliseconds per REPL loop", "ms") + +# Counts the number of lines read in from standard input +m_lines_in = measure_module.MeasureInt("repl/lines_in", "The number of lines read in", "1") + +# Encounters the number of non EOF(end-of-file) errors. +m_errors = measure_module.MeasureInt("repl/errors", "The number of errors encountered", "1") + +# Counts/groups the lengths of lines read in. +m_line_lengths = measure_module.MeasureInt("repl/line_lengths", "The distribution of line lengths", "By") + +# The stats recorder +stats_recorder = stats.Stats().stats_recorder + +# Create the tag key +key_method = tag_key_module.TagKey("method") + +latency_view = view_module.View("demo/latency", "The distribution of the latencies", + [key_method], + m_latency_ms, + # Latency in buckets: + # [>=0ms, >=25ms, >=50ms, >=75ms, >=100ms, >=200ms, >=400ms, >=600ms, >=800ms, >=1s, >=2s, >=4s, >=6s] + aggregation_module.DistributionAggregation([0, 25, 50, 75, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000])) + +line_count_view = view_module.View("demo/lines_in", "The number of lines from standard input", + [], + m_lines_in, + aggregation_module.CountAggregation()) + +error_count_view = view_module.View("demo/errors", "The number of errors encountered", + [key_method], + m_errors, + aggregation_module.CountAggregation()) + +line_length_view = view_module.View("demo/line_lengths", "Groups the lengths of keys in buckets", + [], + m_line_lengths, + # Lengths: [>=0B, >=5B, >=10B, >=15B, >=20B, >=40B, >=60B, >=80, >=100B, >=200B, >=400, >=600, >=800, >=1000] + aggregation_module.DistributionAggregation([0, 5, 10, 15, 20, 40, 60, 80, 100, 200, 400, 600, 800, 1000])) + +def main(): + # In a REPL: + # 1. Read input + # 2. process input + while True: + readEvaluateProcess() + +def readEvaluateProcess(): + line = sys.stdin.readline() + start = time.time() + print(line.upper()) + + # Now record the stats + # Create the measure_map into which we'll insert the measurements + mmap = stats_recorder.new_measurement_map() + end_ms = (time.time() - start) * 1000.0 # Seconds to milliseconds + + # Record the latency + mmap.measure_float_put(m_latency_ms, end_ms) + + # Record the number of lines in + mmap.measure_int_put(m_lines_in, 1) + + # Record the line length + mmap.measure_int_put(m_line_lengths, len(line)) + + tmap = tag_map_module.TagMap() + tmap.insert(key_method, tag_value_module.TagValue("repl")) + + # Insert the tag map finally + mmap.record(tmap) + +if __name__ == "__main__": + main() +``` + +#### Viewing your Metrics on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://app.google.stackdriver.com/metrics-explorer), select your project, and view the metrics. + +In the query box to find metrics, type `quickstart` as a prefix: + +![viewing metrics 1](https://cdn-images-1.medium.com/max/1600/1*kflo3l46PslT6oZDNCJ23A.png) + +And on selecting any of the metrics e.g. `quickstart/demo/lines_in`, we’ll get... + +![viewing metrics 2](https://cdn-images-1.medium.com/max/1600/1*6lUs1yCzewMgzCWv2wtbVQ.png) + +Let’s examine the latency buckets: + +![viewing metrics 3](https://cdn-images-1.medium.com/max/1600/1*o0cPi--Y5IYrrvdQ0IJQKw.png) + +On checking out the Stacked Area display of the latency, we can see that the 99th percentile latency was 24.75ms. And, for `line_lengths`: + +![viewing metrics 4](https://cdn-images-1.medium.com/max/1600/1*roe_0ZNOZiMnTVs3VzG0AQ.png) diff --git a/content/quickstart/python/tracing.md b/content/quickstart/python/tracing.md new file mode 100644 index 00000000..956408ea --- /dev/null +++ b/content/quickstart/python/tracing.md @@ -0,0 +1,262 @@ +--- +title: "Tracing" +date: 2018-07-22T20:29:06-07:00 +draft: false +class: "shadowed-image lightbox" +--- + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +#### Table of contents + +- [Requirements](#background) +- [Installation](#installation) +- [Getting started](#getting-started) +- [Enable Tracing](#enable-tracing) + - [Import Packages](#import-tracing-packages) + - [Instrumentation](#instrument-tracing) +- [Exporting to Stackdriver](#exporting-to-stackdriver) + - [Import Packages](#import-exporting-packages) + - [Export Traces](#export-traces) + - [Create Annotations](#create-annotations) +- [Viewing your Traces on Stackdriver](#viewing-your-traces-on-stackdriver) + +In this quickstart, we’ll learn gleam insights into a segment of code and learn how to: + +1. Trace the code using [OpenCensus Tracing](/core-concepts/tracing) +2. Register and enable an exporter for a [backend](/core-concepts/exporters/#supported-backends) of our choice +3. View traces on the backend of our choice + +#### Requirements +- Python +- Google Cloud Platform account anproject +- Google Stackdriver Tracing enabled on your project (Need help? [Click here](/codelabs/stackdriver)) + +#### Installation + +OpenCensus: `pip install opencensus` + +#### Getting Started + +{{% notice note %}} +Unsure how to write and execute Python code? [Click here](https://docs.python.org/). +{{% /notice %}} + +It would be nice if we could trace the following code, thus giving us observability in to how the code functions. + +First, create a file called `repl.py`. +```bash +touch repl.py +``` + +Next, put the following code inside of `repl.py`: + +{{<highlight python>}} +#!/usr/bin/env python + +import sys + +def main(): + # In a REPL: + #1. Read input + #2. process input + while True: + line = sys.stdin.readline() + print(line.upper()) +{{</highlight>}} + +You can run the code via `python repl.py`. + +#### Enable Tracing + +<a name="import-tracing-packages"></a> +##### Import Packages + +To enable tracing, we’ll import the `trace.tracer` package from `opencensus` +{{<tabs Snippet All>}} +{{<highlight python>}} +from opencensus.trace.tracer import Tracer +{{</highlight>}} + +{{<highlight python>}} +#!/usr/bin/env python + +import sys + +from opencensus.trace.tracer import Tracer + +def main(): + # In a REPL: + #1. Read input + #2. process input + while True: + line = sys.stdin.readline() + print(line.upper()) + +{{</highlight>}} +{{</tabs>}} + +<a name="instrument-tracing"></a> +##### Instrumentation + +We will be tracing the execution as it starts in `readEvaluateProcess`, goes to `readLine`, and finally travels through `processLine`. + +To accomplish this, we must do two things: + +**1. Create a span in each of the three functions** + +You can create a span by inserting the following two lines in each of the three functions: +```python +with tracer.span(name=name): + # Code here + pass +``` + +{{<tabs Snippet All>}} +{{<highlight python>}} +from opencensus.trace.tracer import Tracer + +tracer = Tracer() +with tracer.span(name="repl") as span: + print(line.upper()) +{{</highlight>}} + +{{<highlight python>}} +#!/usr/bin/env python + +import sys + +from opencensus.trace.tracer import Tracer + +def main(): + # In a REPL: + # 1. Read input + # 2. process input + while True: + readEvaluateProcess() + +def readEvaluateProcess(): + tracer = Tracer() + with tracer.span(name="repl") as span: + line = sys.stdin.readline() + print(line.upper()) +{{</highlight>}} +{{</tabs>}} + +When creating a new span with `tracer.span("spanName")`, the package first checks if a parent Span already exists in the current thread local storage/context. If it exists, a child span is created. Otherwise, a newly created span is inserted in to the thread local storage/context to become the parent Span. + +#### Exporting traces to Stackdriver + +<a name="import-exporting-packages"></a> +##### Import Packages +To turn on Stackdriver Tracing, we’ll need to import the Stackdriver exporter from `opencensus.trace.exporters` + +{{<tabs Snippet All>}} +{{<highlight python>}} +from opencensus.trace.exporters import stackdriver_exporter +from opencensus.trace.exporters.transports.background_thread import BackgroundThreadTransport +from opencensus.trace.samplers import always_on +{{</highlight>}} + +{{<highlight python>}} +#!/usr/bin/env python + +import os +import sys + +from opencensus.trace.tracer import Tracer + +# Firstly create the exporter +sde = stackdriver_exporter.StackdriverExporter( + project_id=os.environ.get("GCP_PROJECT_ID"), + transport=BackgroundThreadTransport +) + +def main(): + # Firstly enable the exporter + + # In a REPL: + # 1. Read input + # 2. process input + while True: + readEvaluateProcess() + +def readEvaluateProcess(): + # For demo purposes, we are always sampling + tracer = Tracer(sampler=always_on.AlwaysOnSampler(), exporter=sde) + with tracer.span(name="repl") as span: + line = sys.stdin.readline() + out = processInput(tracer, line) + print("< %s"%(out)) + +def processInput(tracer, data): + with tracer.span(name='processInput') as span: + return data.upper() +{{</highlight>}} +{{</tabs>}} + +##### Create Annotations +We can add metadata to our traces to increase our post-mortem insight. + +Let's record the length of each requested string so that it is available to view when we are looking at our traces. We can do this by annotating our `readEvaluateProcess` function. + +{{<tabs Snippet All>}} +{{<highlight python>}} +span.add_annotation("Invoking processLine", len=len(line), use="repl") +{{</highlight>}} + +{{<highlight python>}} +#!/usr/bin/env python + +import os +import sys + +from opencensus.trace.tracer import Tracer +from opencensus.trace.exporters import stackdriver_exporter +from opencensus.trace.exporters.transports.background_thread import BackgroundThreadTransport +from opencensus.trace.samplers import always_on + +# Firstly create the exporter +sde = stackdriver_exporter.StackdriverExporter( + project_id=os.environ.get("GCP_PROJECT_ID"), + transport=BackgroundThreadTransport +) + +def main(): + # Firstly enable the exporter + + # In a REPL: + # 1. Read input + # 2. process input + while True: + readEvaluateProcess() + +def readEvaluateProcess(): + # For demo purposes, we are always sampling + tracer = Tracer(sampler=always_on.AlwaysOnSampler(), exporter=sde) + with tracer.span(name="repl") as span: + line = sys.stdin.readline() + span.add_annotation("Invoking processLine", len_=len(line), use="repl") + out = processInput(tracer, line) + print("< %s"%(out)) + span.finish() + +def processInput(tracer, data): + with tracer.span(name='processInput'): + return data.upper() + +if __name__ == "__main__": + main() +{{</highlight>}} +{{</tabs>}} + +#### Viewing your Traces on Stackdriver +With the above you should now be able to navigate to the [Google Cloud Platform console](https://console.cloud.google.com/traces/traces), select your project, and view the traces. + +![viewing traces 1](/images/python-trace-overall.png) + +And on clicking on one of the traces, we should be able to see the annotation whose description `isInvoking processLine` and on clicking on it, it should show our attributes `len` and `use`. + +![viewing traces 2](/images/python-trace-attributes.png) diff --git a/content/reporting-issues/_index.md b/content/reporting-issues/_index.md new file mode 100644 index 00000000..05a5c7ff --- /dev/null +++ b/content/reporting-issues/_index.md @@ -0,0 +1,23 @@ +--- +title: "Reporting issues" +date: 2018-07-22T20:14:00-07:00 +draft: false +weight: 120 +--- + +If you'd like to report any bugs, security issues or any other sort of issues, please find below, links to each language implementation's repository: + +Language|URL +---|--- +Go|https://github.com/census-instrumentation/opencensus-go +Java|https://github.com/census-instrumentation/opencensus-java +Python|https://github.com/census-instrumentation/opencensus-python +PHP|https://github.com/census-instrumentation/opencensus-php +Node.js|https://github.com/census-instrumentation/opencensus-node +C#|https://github.com/census-instrumentation/opencensus-csharp +Erlang|https://github.com/census-instrumentation/opencensus-erlang + +For all other issues, please send an email to +[census-developers@googlegroups.com](mailto:census-developers@googlegroups.com) + +or reach out via the [Gitter channel](https://gitter.im/census-instrumentation/Lobby) diff --git a/content/resources/_index.md b/content/resources/_index.md new file mode 100644 index 00000000..df47b3ff --- /dev/null +++ b/content/resources/_index.md @@ -0,0 +1,6 @@ +--- +title: "Resources" +date: 2018-07-16T14:47:02-07:00 +draft: true +--- + diff --git a/content/roadmap.md b/content/roadmap.md deleted file mode 100644 index 71422935..00000000 --- a/content/roadmap.md +++ /dev/null @@ -1,30 +0,0 @@ -+++ -Description = "roadmap" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" - -title = "Roadmap" -date = "2018-05-11T12:09:08-05:00" -+++ - -Read OpenCensus’s journey ahead: [platforms and languages](https://opensource.googleblog.com/2018/05/opencensus-journey-ahead-part-1.html). - ---- - -#### Languages - -{{< sc_supportedLanguages />}} - - ---- - -#### Exporters - -{{< sc_supportedExporters />}} - ---- - -#### How do I contribute? - -Contributions are highly appreciated! Please follow the steps to [contribute](/community). diff --git a/content/roadmap/_index.md b/content/roadmap/_index.md new file mode 100644 index 00000000..9d0482bc --- /dev/null +++ b/content/roadmap/_index.md @@ -0,0 +1,20 @@ +--- +title: "Roadmap" +date: 2018-07-16T14:49:14-07:00 +draft: false +weight: 100 +--- +Read OpenCensus’s journey ahead: [platforms and languages](https://opensource.googleblog.com/2018/05/opencensus-journey-ahead-part-1.html). + + +#### Languages + +{{<languages>}} + +#### Exporters + +<abbr class="trace-exporter blue white-text">T</abbr> Backend supports Tracing + +<abbr class="stats-exporter teal white-text">S</abbr> Backend supports Stats + +{{<feature-matrix>}} diff --git a/content/ruby.md b/content/ruby.md deleted file mode 100644 index 4b2e94b1..00000000 --- a/content/ruby.md +++ /dev/null @@ -1,103 +0,0 @@ -+++ -Description = "ruby" -Tags = ["Development", "OpenCensus"] -Categories = ["Development", "OpenCensus"] -menu = "main" -type = "leftnav" -title = "Ruby" -date = "2018-05-18T13:52:18-05:00" -+++ - - -This example application demonstrates how to use OpenCensus to record traces for a Sinatra-based web application. You can find the source code for the application at https://github.com/census-instrumentation/opencensus-ruby/tree/master/examples/hello-world. - - -#### API Documentation -The OpenCensus Ruby API is documented at http://www.rubydoc.info/gems/opencensus. - ---- - -#### Prerequisites -Ruby 2.2 or later is required. Make sure you have Bundler installed as well. -```ruby -gem install bundler -``` - ---- - -#### Installation -Get the example from the OpenCensus Ruby repository on Github, and cd into the example application directory. - -``` -git clone https://github.com/census-instrumentation/opencensus-ruby.git -cd opencensus-ruby/examples/hello-world -``` - -Install the dependencies using Bundler. - -``` -bundle install -``` - -#### Running the example -Run the application locally on your workstation with: - -```ruby -bundle exec ruby hello.rb -``` - -This will run on port 4567 by default, and display application logs on the terminal. From a separate shell, you can send requests using a tool such as curl: - -```ruby -curl http://localhost:4567/ -curl http://localhost:4567/lengthy -``` -The running application will log the captured traces. -  -#### The example application code -The example application’s Gemfile includes the **opencensus** gem: - -```ruby -source "https://rubygems.org" -gem "faraday", "~> 0.14" -gem "opencensus", "~> 0.3" -gem "sinatra", "~> 2.0" -``` - -Following is the **hello.rb** source file from the example: -```ruby -require "sinatra" - -# Install the Rack middleware to trace incoming requests. -require "opencensus/trace/integrations/rack_middleware" -use OpenCensus::Trace::Integrations::RackMiddleware - -# Access the Faraday middleware which will be used to trace outgoing -# HTTP requests. -require "opencensus/trace/integrations/faraday_middleware" - -# Each request will be traced automatically by the middleware. -get "/" do - "Hello world!" -end - -# Traces for this request will also include sub-spans as indicated -# below. -get "/lengthy" do - # Configure this Faraday connection with a middleware to trace - # outgoing requests. - conn = Faraday.new(url: "http://www.google.com") do |c| - c.use OpenCensus::Trace::Integrations::FaradayMiddleware - c.adapter Faraday.default_adapter - end - conn.get "/" - - # You may instrument your code to create custom spans for - # long-running operations. - OpenCensus::Trace.in_span "long task" do - sleep rand - end - - "Done!" -end -``` diff --git a/content/stats.md b/content/stats.md deleted file mode 100644 index eb247924..00000000 --- a/content/stats.md +++ /dev/null @@ -1,98 +0,0 @@ -+++ -title = "Stats" -type = "leftnav" -+++ - -Application and request metrics are important indicators -of availibility. Custom metrics can provide insights into -how availability indicators impact user experience or the business. -Collected data can help automatically -generate alerts at an outage or trigger better scheduling -decisions to scale up a deployment automatically upon high demand. - - - -Stats collection allows users to collect custom metrics and provide -a set of predefined metrics through the framework integrations. -Collected data can be multidimensional and -it can be filtered and grouped by [tags](/tags). - -Stats collection reqires two steps: - -* Definition of measures and recording of data points. -* Definition and registeration of views to aggregate the recorded values. - ---- - -## Measures - -A measure represents a metric type to be recorded. For example, request latency -in µs and request size in KBs are examples of measures to collect from a server. -All measures are identified by a name and also have a description and a unit. -Libraries and frameworks can define and export measures for their end users to -collect data on the provided measures. - -Below, there is an example measure that represents HTTP latency in ms: - -``` -RequestLatency = { - "http/request_latency", - "HTTP request latency in microseconds", - "microsecs", -} -``` ---- - -## Recording -Measurement is a data point to be collected for a measure. For example, for a latency (ms) measure, 100 is a measurement that represents a 100 ms latency event. Users collect data points on the existing measures with the current context. Tags from the current context are recorded with the measurements if they are any. - -Recorded measurements are dropped if user is not aggregating them via views. Users don’t necessarily need to conditionally enable/disable recording to reduce cost. Recording of measurements is cheap. - -Libraries can record measurements and provide measures, -and end-users can later decide on which measures -they want to collect. - ---- - -## Views - -In order to aggregate measurements and export, users need to define views. -A view allows recorded measurements to be aggregated with a one of the -aggregation methods set by the user cumulatively. -All recorded measurements is broken down by user-provided [tag](/tags) keys. - -Following aggregation methods are supported: - -* **Count**: The count of the number of measurement points. -* **Distribution**: Histogram distribution of the measurement points. -* **Sum**: A sum up of the measurement points. -* **LastValue**: Keeps the last recorded value, drops everything else. - -Users can dynamically create and delete views at runtime. Libraries may -export their own views and claim the view names by registering them. - ---- - -## Sampling - -Stats are NOT sampled to be able to represent uncommon -cases. For example, a [99th percentile latency issue](https://www.youtube.com/watch?v=lJ8ydIuPFeU) -is rare. Combined with a low sampling rate, -it might be hard to capture it. This is why stats are not sampled. - -On the other hand, exporting every indiviual measurement would -be very expensive in terms of network traffic. This is why stats -collection aggregates data in the process and exports only the -aggregated data. - ---- - -## Exporting - -Collected and aggregated data can be exported to a stats collection -backend by registering an exporter. - -Multiple exporters can be registered to upload the data to various different backends. -Users can unregister the exporters if they no longer are needed. - -See [exporters](/exporters) to learn more. diff --git a/content/supported-exporters/C++/_index.md b/content/supported-exporters/C++/_index.md new file mode 100644 index 00000000..e69de29b diff --git a/content/supported-exporters/Go/DataDog.md b/content/supported-exporters/Go/DataDog.md new file mode 100644 index 00000000..b4d12495 --- /dev/null +++ b/content/supported-exporters/Go/DataDog.md @@ -0,0 +1,119 @@ +--- +title: "DataDog (Stats and Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://datadog-prod.imgix.net/img/press-logo-v-purpleb.png) + +[DataDog](https://www.datadoghq.com/) is a real-time monitoring system that supports distributed tracing and monitoring. + +Its OpenCensus Go exporter is available at [https://godoc.org/github.com/DataDog/opencensus-go-exporter-datadog](https://godoc.org/github.com/DataDog/opencensus-go-exporter-datadog) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your metrics](#viewing-your-metrics) +- [Viewing your traces](#viewing-your-traces) + +##### Creating the exporter + +To create the exporter, we'll need: +* DataDog credentials which you can get from [Here](https://docs.datadoghq.com/getting_started/) +* Create an exporter in code + +This is possible by importing the exporter + +{{<highlight go>}} +import "github.com/DataDog/opencensus-go-exporter-datadog" + +// then create the actual exporter +dd, err := datadog.NewExporter(datadog.Options{}) +if err != nil { + log.Fatalf("Failed to create the DataDog exporter: %v", err) +} +{{</highlight>}} + +and then to add stats, tracing and then collectively + +{{<tabs Stats Tracing All>}} +{{<highlight go>}} +package main + +import ( + "log" + + "github.com/DataDog/opencensus-go-exporter-datadog" + "go.opencensus.io/stats/view" +) + +func main() { + dd, err := datadog.NewExporter(datadog.Options{}) + if err != nil { + log.Fatalf("Failed to create the DataDog exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer dd.Stop() + + // Register it as a metrics exporter + view.RegisterExporter(dd) +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "log" + + "github.com/DataDog/opencensus-go-exporter-datadog" + "go.opencensus.io/trace" +) + +func main() { + dd, err := datadog.NewExporter(datadog.Options{}) + if err != nil { + log.Fatalf("Failed to create the DataDog exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer dd.Stop() + + // Register it as a metrics exporter + trace.RegisterExporter(dd) +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "log" + + "github.com/DataDog/opencensus-go-exporter-datadog" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +func main() { + dd, err := datadog.NewExporter(datadog.Options{}) + if err != nil { + log.Fatalf("Failed to create the DataDog exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer dd.Stop() + + // Register it as a metrics exporter + view.RegisterExporter(sd) + + // Register it as a metrics exporter + trace.RegisterExporter(dd) +} +{{</highlight>}} +{{</tabs>}} + +#### Viewing your metrics +Please visit [https://docs.datadoghq.com/graphing/](https://docs.datadoghq.com/graphing/) + +#### Viewing your traces +Please visit [https://docs.datadoghq.com/tracing/](https://docs.datadoghq.com/tracing/) diff --git a/content/supported-exporters/Go/Jaeger.md b/content/supported-exporters/Go/Jaeger.md new file mode 100644 index 00000000..ce578aaf --- /dev/null +++ b/content/supported-exporters/Go/Jaeger.md @@ -0,0 +1,69 @@ +--- +title: "Jaeger (Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://www.jaegertracing.io/img/jaeger-logo.png) + +{{% notice note %}} +This guide makes use of Jaeger for visualizing your data. For assistance setting up Jaeger, [Click here](/codelabs/jaeger) for a guided codelab. +{{% /notice %}} + +Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. +It is used for monitoring and troubleshooting microservices-based distributed systems, including: + +* Distributed context propagation +* Distributed transaction monitoring +* Root cause analysis +* Service dependency analysis +* Performance / latency optimization + +OpenCensus Go has support for this exporter available through package [go.opencensus.io/exporter/jaeger](https://godoc.org/go.opencensus.io/exporter/jaeger) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Jaeger endpoint available to receive traces + +{{<highlight go>}} +package main + +import ( + "log" + + "go.opencensus.io/exporter/jaeger" + "go.opencensus.io/trace" +) + +func main() { + agentEndpointURI := "localhost:6831" + collectorEndpointURI := "http://localhost:9411" + + je, err := jaeger.NewExporter(jaeger.Options{ + AgentEndpoint: agentEndpointURI, + Endpoint: collectorEndpointURI, + ServiceName: "demo", + }) + if err != nil { + log.Fatalf("Failed to create the Jaeger exporter: %v", err) + } + + // And now finally register it as a Trace Exporter + trace.RegisterExporter(je) +} +{{</highlight>}} + +#### Viewing your traces +Please visit the Jaeger UI endpoint [http://localhost:6831](http://localhost:6831) + +#### Project link +You can find out more about the Jaeger project at [https://www.jaegertracing.io/](https://www.jaegertracing.io/) diff --git a/content/supported-exporters/Go/Prometheus.md b/content/supported-exporters/Go/Prometheus.md new file mode 100644 index 00000000..17cc7ee5 --- /dev/null +++ b/content/supported-exporters/Go/Prometheus.md @@ -0,0 +1,104 @@ +--- +title: "Prometheus (Stats)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/img/prometheus-logo.png) + +{{% notice note %}} +This guide makes use of Prometheus for receiving and visualizing your data. For assistance setting up Prometheus, [Click here](/codelabs/prometheus) for a guided codelab. +{{% /notice %}} + +Prometheus is a monitoring system that collects metrics, by scraping +exposed endpoints at regular intervals, evaluating rule expressions. +It can also trigger alerts if certain conditions are met. + +OpenCensus Go allows exporting stats to Prometheus by means of the Prometheus package +[go.opencensus.io/exporter/prometheus](https://godoc.org/go.opencensus.io/exporter/prometheus) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Running Prometheus](#running-prometheus) +- [Viewing your metrics](#viewing-your-metrics) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Import and use the Prometheus exporter package +* Define a namespace that will uniquely identify our metrics when viewed on Prometheus +* Expose a port on which we shall run a `/metrics` endpoint +* With the defined port, we'll need a Promethus configuration file so that Prometheus can scrape from this endpoint +{{<highlight go>}} +import "go.opencensus.io/exporter/prometheus" + +// Then create the actual exporter +pe, err := prometheus.NewExporter(prometheus.Options{ + Namespace: "demo", +}) +if err != nil { + log.Fatalf("Failed to create the Prometheus exporter: %v", err) +} +{{</highlight>}} + +An instance of the Prometheus exporter implements [http.Handler](https://golang.org/net/http#Handler) +so we'll need to expose it on our port of choice say ":8888" +{{<highlight go>}} +package main + +import ( + "log" + "net/http" + + "go.opencensus.io/exporter/prometheus" +) + +func main() { + pe, err := prometheus.NewExporter(prometheus.Options{ + Namespace: "demo", + }) + if err != nil { + log.Fatalf("Failed to create Prometheus exporter: %v", err) + } + go func() { + mux := http.NewServeMux() + mux.Handle("/metrics", pe) + if err := http.ListenAndServe(":8888", mux); err != nil { + log.Fatalf("Failed to run Prometheus /metrics endpoint: %v", err) + } + }() +} +{{</highlight>}} + +and then for our corresponding `prometheus.yaml` file: + +```shell +global: + scrape_interval: 10s + + external_labels: + monitor: 'demo' + +scrape_configs: + - job_name: 'demo' + + scrape_interval: 10s + + static_configs: + - targets: ['localhost:8888'] +``` + +##### Running Prometheus +And then run Prometheus with your configuration +```shell +prometheus --config.file=prometheus.yaml +``` + +##### Viewing your metrics +Please visit [http://localhost:9090](http://localhost:9090) + +#### Project link +You can find out more about the Prometheus project at [https://prometheus.io/](https://prometheus.io/) diff --git a/content/supported-exporters/Go/Stackdriver.md b/content/supported-exporters/Go/Stackdriver.md new file mode 100644 index 00000000..62a57553 --- /dev/null +++ b/content/supported-exporters/Go/Stackdriver.md @@ -0,0 +1,142 @@ +--- +title: "Stackdriver (Stats and Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/logo_gcp_vertical_rgb.png) + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +Stackdriver Trace is a distributed tracing system that collects latency data from your applications and displays it in the Google Cloud Platform Console. +You can track how requests propagate through your application and receive detailed near real-time performance insights. +Stackdriver Trace automatically analyzes all of your application's traces to generate in-depth latency reports to surface performance degradations, +and can capture traces from all of your VMs, containers, or Google App Engine projects. + +Stackdriver Monitoring provides visibility into the performance, uptime, and overall health of cloud-powered applications. +Stackdriver collects metrics, events, and metadata from Google Cloud Platform, Amazon Web Services, hosted uptime probes, application instrumentation, +and a variety of common application components including Cassandra, Nginx, Apache Web Server, Elasticsearch, and many others. +Stackdriver ingests that data and generates insights via dashboards, charts, and alerts. Stackdriver alerting helps you collaborate by +integrating with Slack, PagerDuty, HipChat, Campfire, and more. + +OpenCensus Go has support for this exporter available through package [contrib.go.opencensus.io/exporter/stackdriver](https://godoc.org/contrib.go.opencensus.io/exporter/stackdriver) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your metrics](#viewing-your-metrics) +- [Viewing your traces](#viewing-your-traces) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Have a GCP Project ID +* Create an exporter in code + +{{<highlight go>}} +import "contrib.go.opencensus.io/exporter/stackdriver" + +// Then create the actual exporter +sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "demo-project-id", +}) +if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) +} +{{</highlight>}} + +{{<tabs Stats Tracing All>}} +{{<highlight go>}} +package main + +import ( + "log" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/stats/view" +) + +func main() { + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "demo-project-id", + // MetricPrefix helps uniquely identify your metrics. + MetricPrefix: "demo-prefix", + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer sd.Flush() + + // Register it as a metrics exporter + view.RegisterExporter(sd) +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "log" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/trace" +) + +func main() { + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "demo-project-id", + // MetricPrefix helps uniquely identify your metrics. + MetricPrefix: "demo-prefix", + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer sd.Flush() + + // Register it as a trace exporter + trace.RegisterExporter(sd) +} +{{</highlight>}} + +{{<highlight go>}} +package main + +import ( + "log" + + "contrib.go.opencensus.io/exporter/stackdriver" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +func main() { + sd, err := stackdriver.NewExporter(stackdriver.Options{ + ProjectID: "demo-project-id", + // MetricPrefix helps uniquely identify your metrics. + MetricPrefix: "demo-prefix", + }) + if err != nil { + log.Fatalf("Failed to create the Stackdriver exporter: %v", err) + } + // It is imperative to invoke flush before your main function exits + defer sd.Flush() + + // Register it as a metrics exporter + view.RegisterExporter(sd) + + // Register it as a trace exporter + trace.RegisterExporter(sd) +} +{{</highlight>}} +{{</tabs>}} + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/supported-exporters/Go/XRay.md b/content/supported-exporters/Go/XRay.md new file mode 100644 index 00000000..1ccdd93c --- /dev/null +++ b/content/supported-exporters/Go/XRay.md @@ -0,0 +1,64 @@ +--- +title: "AWS X-Ray (Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://d1.awsstatic.com/product-marketing/X-Ray/x-ray_web-app_diagram_light.21c38e4500dca09b3c8ca4cf87f896f7bbfb8a3b.png) + +AWS X-Ray is a distributed trace collection and analysis system from Amazon Web Services. + +Its support is available by means of the X-Ray package [https://godoc.org/github.com/census-instrumentation/opencensus-go-exporter-aws](https://godoc.org/github.com/census-instrumentation/opencensus-go-exporter-aws) + +#### Table of contents +- [Requirements](#requirements) +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) + + +##### Requirements +You'll need to have an AWS Developer account, if you haven't yet, please visit +In case you haven't yet enabled AWS X-Ray, please visit [https://console.aws.amazon.com/xray/home](https://console.aws.amazon.com/xray/home) + +##### Creating the exporter + +This is possible by importing + +{{<highlight go>}} +import xray "github.com/census-instrumentation/opencensus-go-exporter-aws" + +// Then create the actual exporter +xe, err := xray.NewExporter(xray.WithVersion("latest")) +if err != nil { + log.Fatalf("Failed to create the AWS X-Ray exporter: %v", err) +} +{{</highlight>}} + +Then finally register it as a trace exporter, to collectively give +{{<highlight go>}} +package main + +import ( + "log" + + xray "github.com/census-instrumentation/opencensus-go-exporter-aws" + "go.opencensus.io/trace" +) + +func main() { + xe, err := xray.NewExporter(xray.WithVersion("latest")) + if err != nil { + log.Fatalf("Failed to create the AWS X-Ray exporter: %v", err) + } + // It is imperative that your exporter invokes Flush before your program exits! + defer xe.Flush() + + trace.RegisterExporter(xe) +} +{{</highlight>}} + + +##### Viewing your traces +Please visit [https://console.aws.amazon.com/xray/home](https://console.aws.amazon.com/xray/home) diff --git a/content/supported-exporters/Go/Zipkin.md b/content/supported-exporters/Go/Zipkin.md new file mode 100644 index 00000000..a99e8116 --- /dev/null +++ b/content/supported-exporters/Go/Zipkin.md @@ -0,0 +1,67 @@ +--- +title: "Zipkin (Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/img/zipkin-logo.jpg) + +{{% notice note %}} +This guide makes use of Zipkin for visualizing your data. For assistance setting up Zipkin, [Click here](/codelabs/zipkin) for a guided codelab. +{{% /notice %}} + +Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. + +It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapper paper. + +OpenCensus Go has support for this exporter available through package [go.opencensus.io/exporter/zipkin](https://godoc.org/go.opencensus.io/exporter/zipkin) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Zipkin endpoint available to receive traces + +{{<highlight go>}} +package main + +import ( + "log" + + "go.opencensus.io/exporter/zipkin" + "go.opencensus.io/trace" + + openzipkin "github.com/openzipkin/zipkin-go" + zipkinHTTP "github.com/openzipkin/zipkin-go/reporter/http" +) + +func main() { + localEndpointURI := "192.168.1.5:5454" + reporterURI := "http://localhost:9411/api/v2/spans" + serviceName := "server" + + localEndpoint, err := openzipkin.NewEndpoint(serviceName, localEndpointURI) + if err != nil { + log.Fatalf("Failed to create Zipkin localEndpoint with URI %q error: %v", localEndpointURI, err) + } + + reporter := zipkinHTTP.NewReporter(reporterURI) + ze := zipkin.NewExporter(reporter, localEndpoint) + + // And now finally register it as a Trace Exporter + trace.RegisterExporter(ze) +} +{{</highlight>}} + +#### Viewing your traces +Please visit the Zipkin UI endpoint [http://localhost:9411](http://localhost:9411) + +#### Project link +You can find out more about the Zipkin project at [https://zipkin.io/](https://zipkin.io/) diff --git a/content/supported-exporters/Go/_index.md b/content/supported-exporters/Go/_index.md new file mode 100644 index 00000000..a45d6815 --- /dev/null +++ b/content/supported-exporters/Go/_index.md @@ -0,0 +1,18 @@ +--- +title: "Go" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 2 +class: "resized-logo" +--- + +![](/images/gopher.png) + +OpenCensus Go provides support for various exporters like: + +* [AWS X-Ray](/supported-exporters/go/xray/) +* [Google Stackdriver Tracing and Monitoring](/supported-exporters/go/stackdriver/) +* [DataDog APM and Tracing](/supported-exporters/go/datadog/) +* [Prometheus Monitoring](/supported-exporters/go/prometheus/) +* [Zipkin](/supported-exporters/go/zipkin) +* [Jaeger](/supported-exporters/go/jaeger) diff --git a/content/supported-exporters/Java/Instana.md b/content/supported-exporters/Java/Instana.md new file mode 100644 index 00000000..b664c3b7 --- /dev/null +++ b/content/supported-exporters/Java/Instana.md @@ -0,0 +1,71 @@ +--- +title: "Instana (Tracing)" +date: 2018-07-21T18:52:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/instana.png) + +Instant provides AI Powered Application and Infrastructure Monitoring, allowing you to +deliver Faster With Confidence, and automatic Analysis and Optimization. + +OpenCensus Java has support for this exporter available through package [io.opencensus.exporter.trace.instana](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-trace-instana) + +More information can be found at the [Instana website](https://www.instana.com/) + +#### Table of contents +- [Creating the exporters](#creating-the-exporters) +- [Viewing your traces](#viewing-your-traces) + +##### Creating the trace exporter +To create the trace exporter, you'll need to: + +* Have Instana credentials +* Use Maven setup your pom.xml file +* Create the exporter in code + +##### pom.xml + +```xml + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-instana</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> +``` + +##### Creating the exporter in code + +{{<highlight java>}} +package io.opencensus.tutorial.instana; + +import io.opencensus.exporter.trace.instana.InstanaTraceExporter; + +public class InstanaTutorial { + public static void main(String ...args) { + String agentEndpointURI = "http://localhost:42699/com.instana.plugin.generic.trace"; + InstanaTraceExporter.createAndRegister(agentEndpointURI); + } +} +{{</highlight>}} diff --git a/content/supported-exporters/Java/Jaeger.md b/content/supported-exporters/Java/Jaeger.md new file mode 100644 index 00000000..df76e39c --- /dev/null +++ b/content/supported-exporters/Java/Jaeger.md @@ -0,0 +1,81 @@ +--- +title: "Jaeger (Tracing)" +date: 2018-07-22T17:35:15-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://www.jaegertracing.io/img/jaeger-logo.png) + +{{% notice note %}} +This guide makes use of Jaeger for visualizing your data. For assistance setting up Jaeger, [Click here](/codelabs/jaeger) for a guided codelab. +{{% /notice %}} + +Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. +It is used for monitoring and troubleshooting microservices-based distributed systems, including: + +* Distributed context propagation +* Distributed transaction monitoring +* Root cause analysis +* Service dependency analysis +* Performance / latency optimization + +OpenCensus Java has support for this exporter available through package [io.opencensus.exporter.trace.jaeger](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-trace-jaeger) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Jaeger endpoint available to receive traces + +#### pom.xml +If using Maven, add these to your pom.xml file +```xml +<properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> +</properties> + +<dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-jaeger</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + <scope>runtime</scope> + </dependency> +</dependencies> +``` + +{{<highlight java>}} +package io.opencensus.tutorial.jaeger; + +import io.opencensus.exporter.trace.jaeger.JaegerTraceExporter; + +public class JaegerTutorial { + public static void main(String ...args) throws Exception { + JaegerTraceExporter.createAndRegister("http://127.0.0.1:14268/api/traces", "service-b"); + } +} +{{</highlight>}} + +#### Viewing your traces +Please visit the Jaeger UI endpoint [http://localhost:6831](http://localhost:6831) + +#### Project link +You can find out more about the Jaeger project at [https://www.jaegertracing.io/](https://www.jaegertracing.io/) diff --git a/content/supported-exporters/Java/Prometheus.md b/content/supported-exporters/Java/Prometheus.md new file mode 100644 index 00000000..2a5541d4 --- /dev/null +++ b/content/supported-exporters/Java/Prometheus.md @@ -0,0 +1,121 @@ +--- +title: "Prometheus (Stats)" +date: 2018-07-22T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/img/prometheus-logo.png) + +{{% notice note %}} +This guide makes use of Prometheus for receiving and visualizing your data. For assistance setting up Prometheus, [Click here](/codelabs/prometheus) for a guided codelab. +{{% /notice %}} + +Prometheus is a monitoring system that collects metrics, by scraping +exposed endpoints at regular intervals, evaluating rule expressions. +It can also trigger alerts if certain conditions are met. + +OpenCensus Java allows exporting stats to Prometheus by means of the Prometheus package +[io.opencensus.exporter.stats.prometheus](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-stats-prometheus) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Running Prometheus](#running-prometheus) +- [Viewing your metrics](#viewing-your-metrics) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Import and use the Prometheus exporter package +* Define a namespace that will uniquely identify our metrics when viewed on Prometheus +* Expose a port on which we shall run a `/metrics` endpoint +* With the defined port, we'll need a Promethus configuration file so that Prometheus can scrape from this endpoint + + +#### pom.xml + +Add this to your pom.xml file: + +```xml + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-prometheus</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>prometheus</groupId> + <artifactId>simpleclient_httpserver</artifactId> + <version>0.3.0</version> + </dependency> + </dependencies> +``` + +We also need to expose the Prometheus endpoint say on address "localhost:8888". + +{{<highlight java>}} +package io.opencensus.tutorial.prometheus; + +import io.opencensus.exporter.stats.prometheus.PrometheusStatsExporter; +import io.prometheus.client.exporter.HTTPServer; + +public class PrometheusTutorial { + public static void main(String ...args) { + // Register the Prometheus exporter + PrometheusStatsExporter.createAndRegister(); + + // Run the server as a daemon on address "localhost:8888" + HTTPServer server = new HTTPServer("localhost", 8888, true); + } +} +{{</highlight>}} + +and then for our corresponding `prometheus.yaml` file: + +```shell +global: + scrape_interval: 10s + + external_labels: + monitor: 'demo' + +scrape_configs: + - job_name: 'demo' + + scrape_interval: 10s + + static_configs: + - targets: ['localhost:8888'] +``` + +##### Running Prometheus +And then run Prometheus with your configuration +```shell +prometheus --config.file=prometheus.yaml +``` + +##### Viewing your metrics +Please visit [http://localhost:9090](http://localhost:9090) + +#### Project link +You can find out more about the Prometheus project at [https://prometheus.io/](https://prometheus.io/) diff --git a/content/supported-exporters/Java/SignalFx.md b/content/supported-exporters/Java/SignalFx.md new file mode 100644 index 00000000..4c2d9d72 --- /dev/null +++ b/content/supported-exporters/Java/SignalFx.md @@ -0,0 +1,79 @@ +--- +title: "SignalFx (Stats)" +date: 2018-07-22T16:58:03-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://opencensus.io/img/signalFx_logo.svg) + +{{% notice note %}} +This guide makes use of SignalFx. +You'll need to have: + +* A [SignalFx account](https://signalfx.com/) +* The corresponding [data ingest token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html) +{{% /notice %}} + +SignalFx is a real-time monitoring solution for cloud and distributed applications. +SignalFx ingests that data and offers various visualizations on charts, dashboards and service maps, +as well as real-time anomaly detection. + +OpenCensus Java has support for this exporter available through the package: + +* Stats [io.opencensus.exporter.stats.signalfx](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-stats-signalfx) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) + +##### pom.xml + +```xml +<properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> +</properties> + +<dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-signalfx</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + <scope>runtime</scope> + </dependency> +</dependencies> +``` + +#### Creating the exporter in code + +{{<highlight java>}} +package io.opencensus.tutorial.signalfx; + +import io.opencensus.common.Duration; +import io.opencensus.exporter.stats.stackdriver.SignalFxStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.SignalFxStatsExporter; + +public class SignalFxTutorial { + public static void main(String ...args) { + String signalFxToken = "<this is my token>"; + + SignalFxStatsExporter.create( + SignalFxStatsConfiguration.builder() + .setToken(signalFxToken) + .setExportInterval(Duration.create(3, 2)) + .build(); + ); + } +} +{{</highlight>}} diff --git a/content/supported-exporters/Java/Stackdriver.md b/content/supported-exporters/Java/Stackdriver.md new file mode 100644 index 00000000..cdf97423 --- /dev/null +++ b/content/supported-exporters/Java/Stackdriver.md @@ -0,0 +1,154 @@ +--- +title: "Stackdriver (Stats and Tracing)" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/logo_gcp_vertical_rgb.png) + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +Stackdriver Trace is a distributed tracing system that collects latency data from your applications and displays it in the Google Cloud Platform Console. +You can track how requests propagate through your application and receive detailed near real-time performance insights. +Stackdriver Trace automatically analyzes all of your application's traces to generate in-depth latency reports to surface performance degradations, +and can capture traces from all of your VMs, containers, or Google App Engine projects. + +Stackdriver Monitoring provides visibility into the performance, uptime, and overall health of cloud-powered applications. +Stackdriver collects metrics, events, and metadata from Google Cloud Platform, Amazon Web Services, hosted uptime probes, application instrumentation, +and a variety of common application components including Cassandra, Nginx, Apache Web Server, Elasticsearch, and many others. +Stackdriver ingests that data and generates insights via dashboards, charts, and alerts. Stackdriver alerting helps you collaborate by +integrating with Slack, PagerDuty, HipChat, Campfire, and more. + +OpenCensus Java has support for this exporter available through packages: +* Stats [io.opencensus.exporter.stats.stackdriver](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-stats-stackdriver) +* Trace [io.opencensus.exporter.trace.stackdriver](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-trace-stackdriver) + +#### Table of contents +- [Creating the exporters](#creating-the-exporters) +- [Viewing your metrics](#viewing-your-metrics) +- [Viewing your traces](#viewing-your-traces) + +##### Creating the exporters +To create the exporters, you'll need to: + +* Have a GCP Project ID +* Have already enabled Stackdriver Tracing and Metrics, if not, please visit the [Code lab](/codelabs/stackdriver) +* Use Maven setup your pom.xml file +* Create the exporters in code + +##### pom.xml + +```xml + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> + </properties> + + <dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-stats-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-stackdriver</artifactId> + <version>${opencensus.version}</version> + </dependency> + </dependencies> +``` + +##### Creating the exporters in code +* To enable each of the respective APIs, please click on the respective tabs and then on "ALL" at the end + +{{<tabs Tracing Metrics>}} +{{<highlight java>}} +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); +{{</highlight>}} + +{{<highlight java>}} +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; + +StackdriverStatsExporter.createAndRegister( + StackdriverStatsConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); +{{</highlight>}} +{{</tabs>}} + + +##### All exporters combined +* Finally, combining tracing and stats exporters together, we should now have + +{{<highlight java>}} +package io.opencensus.tutorial.stackdriver; + +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsConfiguration; +import io.opencensus.exporter.stats.stackdriver.StackdriverStatsExporter; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration; +import io.opencensus.exporter.trace.stackdriver.StackdriverTraceExporter; + +public class StackdriverTutorial { + public static void main(String ...args) { + String gcpProjectId = envOrAlternative("GCP_PROJECT_ID"); + + // The trace exporter + StackdriverTraceExporter.createAndRegister( + StackdriverTraceConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + + // The stats exporter + StackdriverStatsExporter.createAndRegister( + StackdriverStatsConfiguration.builder() + .setProjectId(gcpProjectId) + .build()); + } + + private static String envOrAlternative(String key, String ...alternatives) { + String value = System.getenv().get(key); + if (value != null && value != "") + return value; + + // Otherwise now look for the alternatives. + for (String alternative : alternatives) { + if (alternative != null && alternative != "") { + value = alternative; + break; + } + } + + return value; + } +} +{{</highlight>}} + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/supported-exporters/Java/Zipkin.md b/content/supported-exporters/Java/Zipkin.md new file mode 100644 index 00000000..0b5789b7 --- /dev/null +++ b/content/supported-exporters/Java/Zipkin.md @@ -0,0 +1,76 @@ +--- +title: "Zipkin (Tracing)" +date: 2018-07-22T17:20:12-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/img/zipkin-logo.jpg) + +{{% notice note %}} +This guide makes use of Zipkin for visualizing your data. For assistance setting up Zipkin, [Click here](/codelabs/zipkin) for a guided codelab. +{{% /notice %}} + +Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. + +It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapper paper. + +OpenCensus Java has support for this exporter available through package [io.opencensus.exporter.trace.zipkin](https://www.javadoc.io/doc/io.opencensus/opencensus-exporter-trace-zipkin) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Zipkin endpoint available to receive traces + +#### pom.xml +If using Maven, add these to your pom.xml file +```xml +<properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <opencensus.version>0.14.0</opencensus.version> <!-- The OpenCensus version to use --> +</properties> + +<dependencies> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-api</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-exporter-trace-zipkin</artifactId> + <version>${opencensus.version}</version> + </dependency> + <dependency> + <groupId>io.opencensus</groupId> + <artifactId>opencensus-impl</artifactId> + <version>${opencensus.version}</version> + <scope>runtime</scope> + </dependency> +</dependencies> +``` + +{{<highlight java>}} +package io.opencensus.tutorial.zipkin; + +import io.opencensus.exporter.trace.zipkin.ZipkinTraceExporter; + +public class ZipkinTutorial { + public static void main(String ...args) throws Exception { + ZipkinTraceExporter.createAndRegister("http://localhost:9411/api/v2/spans", "service-a"); + } +} +{{</highlight>}} + +#### Viewing your traces +Please visit the Zipkin UI endpoint [http://localhost:9411](http://localhost:9411) + +#### Project link +You can find out more about the Zipkin project at [https://zipkin.io/](https://zipkin.io/) diff --git a/content/supported-exporters/Java/_index.md b/content/supported-exporters/Java/_index.md new file mode 100644 index 00000000..3f6c71f4 --- /dev/null +++ b/content/supported-exporters/Java/_index.md @@ -0,0 +1,24 @@ +--- +title: "Java" +date: 2018-07-21T18:40:01-02:00 +draft: false +weight: 2 +class: "resized-logo" +--- + +![](/images/java.png) + +For full reference, you can visit: + +* JavaDoc [https://www.javadoc.io/doc/io.opencensus/opencensus-api](https://www.javadoc.io/doc/io.opencensus/opencensus-api) +* Github repository [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java) + +OpenCensus Java provides support for various exporters like: + +* [Google Stackdriver Tracing and Monitoring](/supported-exporters/java/stackdriver) +* [Instana](/supported-exporters/java/instana) +* [Prometheus Monitoring](/supported-exporters/java/prometheus) +* [Zipkin](/supported-exporters/java/zipkin) +* [Jaeger](/supported-exporters/java/jaeger) +* [SignalFX](/supported-exporters/java/signalfx) +* [Logging](/supported-exporters/java/logging) diff --git a/content/supported-exporters/Node.js/_index.md b/content/supported-exporters/Node.js/_index.md new file mode 100644 index 00000000..e69de29b diff --git a/content/supported-exporters/PHP/_index.md b/content/supported-exporters/PHP/_index.md new file mode 100644 index 00000000..e69de29b diff --git a/content/supported-exporters/Python/Jaeger.md b/content/supported-exporters/Python/Jaeger.md new file mode 100644 index 00000000..5872c672 --- /dev/null +++ b/content/supported-exporters/Python/Jaeger.md @@ -0,0 +1,63 @@ +--- +title: "Jaeger (Tracing)" +date: 2018-07-22T23:33:31-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](https://www.jaegertracing.io/img/jaeger-logo.png) + +{{% notice note %}} +This guide makes use of Jaeger for visualizing your data. For assistance setting up Jaeger, [Click here](/codelabs/jaeger) for a guided codelab. +{{% /notice %}} + +Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. +It is used for monitoring and troubleshooting microservices-based distributed systems, including: + +* Distributed context propagation +* Distributed transaction monitoring +* Root cause analysis +* Service dependency analysis +* Performance / latency optimization + +OpenCensus Python has support for this exporter available through package [opencensus.trace.exporters.jaeger_exporter](https://github.com/census-instrumentation/opencensus-python/blob/master/opencensus/trace/exporters/jaeger_exporter.py) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Jaeger endpoint available to receive traces + +{{<highlight python>}} +#!/usr/bin/env python + +from opencensus.trace.exporters.jaeger_exporter import JaegerExporter +from opencensus.trace.tracer import Tracer + +def main(): + je = JaegerExporter(service_name="service-b", + host_name='localhost', + agent_port=6831, + endpoint='/api/traces') + + tracer = Tracer(exporter=je) + with tracer.span(name='doingWork') as span: + for i in range(10): + continue + +if __name__ == "__main__": + main() +{{</highlight>}} + + +#### Viewing your traces +Please visit the Jaeger UI endpoint [http://localhost:6831](http://localhost:6831) + +#### Project link +You can find out more about the Jaeger project at [https://www.jaegertracing.io/](https://www.jaegertracing.io/) diff --git a/content/supported-exporters/Python/Stackdriver.md b/content/supported-exporters/Python/Stackdriver.md new file mode 100644 index 00000000..593891d9 --- /dev/null +++ b/content/supported-exporters/Python/Stackdriver.md @@ -0,0 +1,68 @@ +--- +title: "Stackdriver (Tracing)" +date: 2018-07-22T23:47:14-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/images/logo_gcp_vertical_rgb.png) + +{{% notice note %}} +This guide makes use of Stackdriver for visualizing your data. For assistance setting up Stackdriver, [Click here](/codelabs/stackdriver) for a guided codelab. +{{% /notice %}} + +Stackdriver Trace is a distributed tracing system that collects latency data from your applications and displays it in the Google Cloud Platform Console. +You can track how requests propagate through your application and receive detailed near real-time performance insights. +Stackdriver Trace automatically analyzes all of your application's traces to generate in-depth latency reports to surface performance degradations, +and can capture traces from all of your VMs, containers, or Google App Engine projects. + +Stackdriver Monitoring provides visibility into the performance, uptime, and overall health of cloud-powered applications. +Stackdriver collects metrics, events, and metadata from Google Cloud Platform, Amazon Web Services, hosted uptime probes, application instrumentation, +and a variety of common application components including Cassandra, Nginx, Apache Web Server, Elasticsearch, and many others. +Stackdriver ingests that data and generates insights via dashboards, charts, and alerts. Stackdriver alerting helps you collaborate by +integrating with Slack, PagerDuty, HipChat, Campfire, and more. + +OpenCensus Python has support for this exporter available through package: +* Trace [opencensus.trace.exporters.stackdriver_exporter](https://census-instrumentation.github.io/opencensus-python/trace/api/stackdriver_exporter.html) + +#### Table of contents +- [Creating the exporters](#creating-the-exporters) +- [Viewing your traces](#viewing-your-traces) + +##### Creating the exporters +To create the exporters, you'll need to: + +* Have a GCP Project ID +* Have already enabled Stackdriver Tracing and Metrics, if not, please visit the [Code lab](/codelabs/stackdriver) +* Create the exporters in code + +##### Creating the exporter in code +{{<highlight python>}} +#!/usr/bin/env python + +import os + +from opencensus.trace.tracer import Tracer +from opencensus.trace.exporters import stackdriver_exporter +from opencensus.trace.exporters.transports.background_thread import BackgroundThreadTransport + +def main(): + sde = stackdriver_exporter.StackdriverExporter( + project_id=os.environ.get("GCP_PROJECT_ID"), + transport=BackgroundThreadTransport) + + tracer = Tracer(exporter=sde) + with tracer.span(name='doingWork') as span: + for i in range(10): + continue + +if __name__ == "__main__": + main() +{{</highlight>}} + +#### Viewing your metrics +Please visit [https://console.cloud.google.com/monitoring](https://console.cloud.google.com/monitoring) + +#### Viewing your traces +Please visit [https://console.cloud.google.com/traces/traces](https://console.cloud.google.com/traces/traces) diff --git a/content/supported-exporters/Python/Zipkin.md b/content/supported-exporters/Python/Zipkin.md new file mode 100644 index 00000000..c7861996 --- /dev/null +++ b/content/supported-exporters/Python/Zipkin.md @@ -0,0 +1,57 @@ +--- +title: "Zipkin (Tracing)" +date: 2018-07-22T23:12:15-07:00 +draft: false +weight: 3 +class: "resized-logo" +--- + +![](/img/zipkin-logo.jpg) + +{{% notice note %}} +This guide makes use of Zipkin for visualizing your data. For assistance setting up Zipkin, [Click here](/codelabs/zipkin) for a guided codelab. +{{% /notice %}} + +Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. + +It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapper paper. + +OpenCensus Python has support for this exporter available through package [opencensus.trace.exporters.zipkin_exporter](https://census-instrumentation.github.io/opencensus-python/trace/api/zipkin_exporter.html) + +#### Table of contents +- [Creating the exporter](#creating-the-exporter) +- [Viewing your traces](#viewing-your-traces) +- [Project link](#project-link) + +##### Creating the exporter +To create the exporter, we'll need to: + +* Create an exporter in code +* Have the Zipkin endpoint available to receive traces + +{{<highlight python>}} +#!/usr/bin/env python + +from opencensus.trace.exporters.zipkin_exporter import ZipkinExporter +from opencensus.trace.tracer import Tracer + +def main(): + ze = ZipkinExporter(service_name="service-a", + host_name='localhost', + port=9411, + endpoint='/api/v2/spans') + + tracer = Tracer(exporter=ze) + with tracer.span(name='doingWork') as span: + for i in range(10): + continue + +if __name__ == "__main__": + main() +{{</highlight>}} + +#### Viewing your traces +Please visit the Zipkin UI endpoint [http://localhost:9411](http://localhost:9411) + +#### Project link +You can find out more about the Zipkin project at [https://zipkin.io/](https://zipkin.io/) diff --git a/content/supported-exporters/Python/_index.md b/content/supported-exporters/Python/_index.md new file mode 100644 index 00000000..4f9355ee --- /dev/null +++ b/content/supported-exporters/Python/_index.md @@ -0,0 +1,15 @@ +--- +title: "Python" +date: 2018-07-22T23:12:15-07:00 +draft: false +weight: 2 +class: "resized-logo" +--- + +![](/images/python-opencensus.png) + +OpenCensus Python provides support for various exporters like: + +* [Google Stackdriver Tracing](/supported-exporters/python/stackdriver/) +* [Jaeger](/supported-exporters/python/jaeger) +* [Zipkin](/supported-exporters/python/zipkin) diff --git a/content/supported-exporters/Ruby/_index.md b/content/supported-exporters/Ruby/_index.md new file mode 100644 index 00000000..e69de29b diff --git a/content/supported-exporters/_index.md b/content/supported-exporters/_index.md new file mode 100644 index 00000000..37464cb4 --- /dev/null +++ b/content/supported-exporters/_index.md @@ -0,0 +1,9 @@ +--- +title: "Supported Exporters" +date: 2018-07-21T14:27:35-07:00 +draft: false +weight: 50 +--- + +OpenCensus' language implementations have support for various exporters. +If you don't yet know what an exporter is, please visit [exporter](/core-concepts/exporters) diff --git a/content/supported-transports/_index.md b/content/supported-transports/_index.md new file mode 100644 index 00000000..54c0d8df --- /dev/null +++ b/content/supported-transports/_index.md @@ -0,0 +1,8 @@ +--- +title: "Supported Transports" +date: 2018-07-16T14:29:35-07:00 +draft: false +weight: 60 +--- + +{{% children %}} diff --git a/content/supported-transports/grpc.md b/content/supported-transports/grpc.md new file mode 100644 index 00000000..3d04be50 --- /dev/null +++ b/content/supported-transports/grpc.md @@ -0,0 +1,19 @@ +--- +title: "gRPC" +date: 2018-07-16T14:29:38-07:00 +draft: false +class: "resized-logo" +--- + +![](/images/grpc.png) + +gRPC is a high performance, open-source universal RPC framework. + +Out of the box, OpenCensus is integrated with gRPC in the following languages: + +Language|Integration|Resource +---|---|--- +C++|grpc|https://github.com/census-instrumentation/opencensus-cpp/tree/master/examples/grpc +Go|grpc-go|https://medium.com/@orijtech/opencensus-for-go-grpc-developers-7f3ee1ac3d6d +Java|grpc-java|https://medium.com/@orijtech/opencensus-for-java-grpc-developers-23c25de0a057 +Python|grpc-python|https://medium.com/@orijtech/opencensus-for-python-grpc-developers-9e460e054395 diff --git a/content/supported-transports/http.md b/content/supported-transports/http.md new file mode 100644 index 00000000..661eb971 --- /dev/null +++ b/content/supported-transports/http.md @@ -0,0 +1,5 @@ +--- +title: "HTTP" +date: 2018-07-16T14:29:41-07:00 +draft: false +--- diff --git a/content/traces.md b/content/traces.md deleted file mode 100644 index ad23aeed..00000000 --- a/content/traces.md +++ /dev/null @@ -1,140 +0,0 @@ -+++ -title = "Traces" -type = "leftnav" -date = "2018-05-30T15:37:24-05:00" -+++ - -A trace tracks the progression of a single user request -as it is handled by other services that make up an application. - -Each unit work is called a span in a trace. Spans include metadata about the work, -including the time spent in the step (latency) and status. -You can use tracing to debug errors and -latency issues of your application. - ---- - -## Spans - -A trace is a tree of spans. - -A span is the unit of work represented in a trace. A span may -represent a HTTP request, an RPC, a server handler, -a database query or a section customly marked in user code. - -![A trace](/img/trace-trace.png) - -Above, you see a trace with various spans. In order to respond -to `/messages`, several other internal requests are made. First, -we are checking if the user is authenticated, we are trying to -get the results from the cache. It is a cache miss, hence we -query the database for the results, we cache the results back, -and respond back to the user. - -There are two types of spans: - -* **Root span**: Root spans don't have a parent span. They are the - first span. `/messages` span above is a root span. -* **Child span**: Child spans have an existing span as their parent. - - -Spans are identified with an ID and are associated to a trace. -These identifiers and options byte together are called span context. -Inside the same process, span context is propagated in a context -object. When crossing process boundaries, it is serialized into -protocol headers. The receiving end can read the span context -and create child spans. - -### Name - -Span names represent what span does. Span names should -be statistically meaningful. Most tracing backend and analysis -tools use span names to auto generate reports for the -represented work. - -Examples of span names: - -* "cache.Get" represents the Get method of the cache service. -* "/messages" represents the messages web page. -* "/api/user/(\\d+)" represents the user detail pages. - -### Status - -Status represents the current state of the span. -It is represented by a canonical status code which maps onto a -predefined set of error values and an optional string message. - -Status allows tracing visualization tools to highlight -unsuccessful spans and helps tracing users to debug errors. - -![A trace with an error span](/img/trace-errorspan.png) - -Above, you can see `cache.Put` is errored because of the -violation of the key size limit. As a result of this error, - `/messages` request responded with an error to the user. - -### Annotations - -Annotations are timestamped strings with optional attributes. -Annotations are used like log lines, but the log is per-Span. - -Example annotations: - -* 0.001s Evaluating database failover rules. -* 0.002s Failover replica selected. attributes:{replica:ab_001 zone:xy} -* 0.006s Response received. -* 0.007s Response requires additional lookups. attributes:{fanout:4} - -Annotations provide rich details to debug problems in the scope of a span. - -### Attributes - -Attributes are additional information that is included in the -span which can represent arbitrary data assigned by the user. -They are key-value pairs with the key being a string and the -value being either a string, boolean, or integer. - -Examples of attributes: - -* {http_code: 200} -* {zone: "us-central2"} -* {container_id: "replica04ed"} - -Attributes can be used to query the tracing data and allow -users to filter large volumes of tracing data. For example, you can -filter the traces by HTTP status code or availability zone by -using the example attributes above. - ---- - -## Sampling - -Trace data is often very large in size and is expensive to collect. -This is why rather than collecting traces for every request, downsampling -is prefered. By default, OpenCensus provides a probabilistic sampler that -will trace once in every 10,000 requests. - -You can set a custom probablistic sampler, prefer to always sample or -not sample at all. -There are two ways to set samplers: - -* **Global sampler**: Global sampler is the global default. -* **Span sampler**: When starting a new span, a custom - sampler can be provided. If no custom sampling is - provided, global sampler is used. Span samplers are - useful if you want to over-sample some sections of your - code. For example, a low throughput background service - may use a higher sampling rate than a high-load RPC - server. - ---- - -## Exporting - -Recorded spans will be reported by the registered exporters. - -Multiple exporters can be registered to upload the data to -various different backends. Users can unregister the exporters -if they no longer are needed. - -See [exporters](/exporters) to learn more. diff --git a/content/zpages.md b/content/zpages.md deleted file mode 100644 index c0244f3a..00000000 --- a/content/zpages.md +++ /dev/null @@ -1,68 +0,0 @@ -+++ -title = "Z-Pages" -type = "leftnav" -+++ - -OpenCensus provides in-process web pages that displays -collected data from the process. These pages are called z-pages -and they are useful to see collected data from a specific process -without having to depend on any metric collection or -distributed tracing backend. - -Z-Pages can be useful during the development time or when -the process to be inspected is known in production. -Z-Pages can also be used to debug [exporter](/exporters) issues. - -In order to serve Z-pages, register their handlers and -start a web server. Below, there is an example how to -serve these pages from `127.0.0.1:7777/debug`. - - -{{% snippets %}} -{{% go %}} -``` -import "go.opencensus.io/zpages" - -zpages.Handle(nil, "/debug") -log.Fatal(http.ListenAndServe("127.0.0.1:7777", nil)) -``` -{{% /go %}} -{{% java %}} -``` -// Add the dependencies by following the instructions at -// https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages - -ZPageHandlers.startHttpServerAndRegisterAll(7777); -``` -{{% /java %}} -{{% /snippets %}} - -Once handler is registered, there are various pages provided -from the libraries: - -* [127.0.0.1:7777/debug/rpcz](http://127.0.0.1:7777/debug/rpcz) -* [127.0.0.1:7777/debug/tracez](http://127.0.0.1:7777/debug/tracez) - -## /rpcz - -Rpcz page is available at [/rpcz](http://127.0.0.1:7777/debug/rpcz). -This page serves stats about sent and received RPCs. - -Available stats: - -* Number of RPCs made per minute, hour and in total. -* Average latency in the last minute, hour and since the process started. -* RPCs per second in the last minute, hour and since the process started. -* Input payload in KB/s in the last minute, hour and since the process started. -* Output payload in KB/s in the last minute, hour and since the process started. -* Number of RPC errors in the last minute, hour and in total. - -## /tracez - -Tracez page is available at [/tracez](http://127.0.0.1:7777/debug/tracez). -This page serves details about the trace spans collected in the process. -It provides several sample spans per latency bucket and sample errored spans. - -An example screenshot from this page is below: - -![/tracez](/img/traceZ.png) diff --git a/layouts/.gitkeep b/layouts/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/layouts/codelabs/googlecloudstorage.html b/layouts/codelabs/googlecloudstorage.html new file mode 100644 index 00000000..6f536fe1 --- /dev/null +++ b/layouts/codelabs/googlecloudstorage.html @@ -0,0 +1,90 @@ + +<!doctype html> + +<html> +<head> + <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> + <meta name="theme-color" content="#4F7DC9"> + <meta charset="UTF-8"> + <title>Setup and Configure Google Cloud Storage + + + + + + + + + + + +

This tutorial shows you how to setup and configure Google Cloud Storage

+

Requirements:

+
    +
  • A Google Cloud Platform project
  • +
+ + +
+ + +

If you haven't already created a project on Google Cloud, you can do so here.

+ + +
+ + +

You will be enabling this API:

+ +

img

+ + +
+ + +

Please make sure to enable Application Default Credentials for authentication. Click here to do so.

+ + +
+ +
+ + + + + diff --git a/layouts/codelabs/jaeger.html b/layouts/codelabs/jaeger.html new file mode 100644 index 00000000..6068f69b --- /dev/null +++ b/layouts/codelabs/jaeger.html @@ -0,0 +1,97 @@ + + + + + + + + + Setup and Configure Jaeger + + + + + + + + + + + +

This tutorial shows you how to setup and configure Jaeger

+

+

Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. It is used for monitoring and troubleshooting microservices-based distributed systems, including:

+

Distributed context propagation
Distributed transaction monitoring
Root cause analysis
Service dependency analysis
Performance / latency optimization

+

Requirements:

+ + + +
+ + +

We'll get the Jaeger Docker image from https://hub.docker.com/u/jaegertracing/

+

by

+
docker pull jaegertracing/all-in-one:latest
+
+ + +
+ + +
docker run -d --name jaeger \
+  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
+  -p 5775:5775/udp \
+  -p 6831:6831/udp \
+  -p 6832:6832/udp \
+  -p 5778:5778 \
+  -p 16686:16686 \
+  -p 14268:14268 \
+  -p 9411:9411 \
+  jaegertracing/all-in-one:latest
+
+

and now the Jaeger user interface can be opened in your web browser by visiting http://localhost:16686

+ + +
+ +
+ + + + + diff --git a/layouts/codelabs/prometheus.html b/layouts/codelabs/prometheus.html new file mode 100644 index 00000000..e4c31308 --- /dev/null +++ b/layouts/codelabs/prometheus.html @@ -0,0 +1,104 @@ + + + + + + + + + Setup and Configure Prometheus + + + + + + + + + + + +

This tutorial shows you how to setup and configure Prometheus

+

+

Prometheus is a monitoring system that collects metrics from systems, by scraping exposed endpoints at
a regular interval. It evaluates rule expressions and displays results. It can also trigger alerts if
alert conditions are met.

+

Requirements:

+ + + +
+ + +

Prometheus Monitoring requires a system configuration usually in the form a ".yaml" file. For example, here is
a sample "prometheus.yaml" file to scrape from our servers running at localhost:9888, localhost:9988 and localhost:9989

+
global:
+  scrape_interval: 10s
+
+  external_labels:
+    monitor: 'media_search'
+
+scrape_configs:
+  - job_name: 'media_search'
+
+    scrape_interval: 10s
+
+    static_configs:
+      - targets: ['localhost:9888', 'localhost:9988', 'localhost:9989']
+
+ + +
+ + +

Having successfully downloaded Prometheus and setup your config.yaml file, you should now be able to run

+
prometheus --config.file=config.yaml
+
+ + +
+ + +

You should now be able to navigate to http://localhost:9090/

+ + +
+ +
+ + + + + diff --git a/layouts/codelabs/spanner.html b/layouts/codelabs/spanner.html new file mode 100644 index 00000000..23e1d728 --- /dev/null +++ b/layouts/codelabs/spanner.html @@ -0,0 +1,106 @@ + + + + + + + + + Setup and Configure Google Cloud Spanner + + + + + + + + + + + +

This tutorial shows you how to setup and configure Google Cloud Spanner.

+

Requirements:

+
    +
  • A Google Cloud Platform project
  • +
+ + +
+ + +

If you haven't already created a project on Google Cloud, you can do so here.

+ + +
+ + +

You will be enabling this API:

+ +

imgimg

+
+ + +

Please make sure to enable Application Default Credentials for authentication.

+ +
+ + ENABLE DEFAULT CREDENTIALS + +
+
+
+
+
+ + + + +
+ + + + + diff --git a/layouts/codelabs/stackdriver.html b/layouts/codelabs/stackdriver.html new file mode 100644 index 00000000..8fff24fc --- /dev/null +++ b/layouts/codelabs/stackdriver.html @@ -0,0 +1,111 @@ + + + + + + + + + Setup and Configure Google Stackdriver + + + + + + + + + + + +

This tutorial shows you how to setup and configure Google Stackdriver.

+

Requirements:

+
    +
  • A cloud provider based project; it should support Stackdriver Monitoring and Tracing — we'll use Google Cloud Platform for this example
  • +
+ + +
+ + +

If you haven't already created a project on Google Cloud, you can do so here.

+ + +
+ + +

You will be enabling these two APIs:

+
    +
  • Stackdriver Monitoring API
  • +
  • Stackdriver Trace API
  • +
+ + + + Enable APIs + +
+
+
+
+
+ +

imgimg

+ + +
+ + +

Please make sure to enable Application Default Credentials for authentication.

+ + + + ENABLE DEFAULT CREDENTIALS + +
+
+
+
+
+ +
+ +
+ + + + + diff --git a/layouts/codelabs/zipkin.html b/layouts/codelabs/zipkin.html new file mode 100644 index 00000000..4e172d43 --- /dev/null +++ b/layouts/codelabs/zipkin.html @@ -0,0 +1,88 @@ + + + + + + + + + Setup and Configure Zipkin + + + + + + + + + + + +

This tutorial shows you how to setup and configure Zipkin

+

+

Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures.

+

It manages both the collection and lookup of this data. Zipkin's design is based on the Google Dapper paper.

+

Requirements:

+ + + +
+ + +

We'll get the Zipkin Docker image from https://hub.docker.com/u/openzipkin/

+

by

+
docker pull openzipkin/zipkin
+
+ + +
+ + +
docker run -d -p 9411:9411 openzipkin/zipkin
+
+

and now the Zipkin user interface can be opened in your web browser by visiting http://localhost:9411

+ + +
+ +
+ + + + + diff --git a/layouts/partials/contribute.html b/layouts/partials/contribute.html deleted file mode 100644 index 40908c89..00000000 --- a/layouts/partials/contribute.html +++ /dev/null @@ -1,3 +0,0 @@ -
- Edit {{.File.Path}} -
diff --git a/layouts/partials/custom-footer.html b/layouts/partials/custom-footer.html new file mode 100644 index 00000000..ee6a0f2c --- /dev/null +++ b/layouts/partials/custom-footer.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/layouts/partials/custom-head.html b/layouts/partials/custom-head.html new file mode 100644 index 00000000..7d84b738 --- /dev/null +++ b/layouts/partials/custom-head.html @@ -0,0 +1,63 @@ + + + + + + + + diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html deleted file mode 100644 index b483824e..00000000 --- a/layouts/partials/footer.html +++ /dev/null @@ -1,85 +0,0 @@ - -
-
-
-
- - - - - - - -
-
Documents
-

Overview


-

Documentation


-
- - -
-
Resources
-

About


-

Blog


-

FAQ


-

Glossary


-
- - -
-
Community
-

Community


-

Github


-

Twitter


-

Gitter


- -
- - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/layouts/partials/header.html b/layouts/partials/header.html deleted file mode 100644 index f8740bef..00000000 --- a/layouts/partials/header.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - {{ .Hugo.Generator }} - - - - - - - - - {{ if .IsHome -}} - {{ .Site.Title }} - {{- else -}} - {{ .Title }} · {{ .Site.Title }} - {{- end }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/layouts/partials/index_nav.html b/layouts/partials/index_nav.html deleted file mode 100644 index 8ecac56a..00000000 --- a/layouts/partials/index_nav.html +++ /dev/null @@ -1,96 +0,0 @@ - -
-
- - - - - - -
-
-
  • OpenCensus

-

A single distribution of libraries for metrics and distributed tracing
with minimal overhead that allows you to export data to multiple backends.

- - -
-
- -
-
- \ No newline at end of file diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html deleted file mode 100644 index 40b00459..00000000 --- a/layouts/partials/nav.html +++ /dev/null @@ -1,73 +0,0 @@ -
-
- - - -
\ No newline at end of file diff --git a/layouts/partials/partners.html b/layouts/partials/partners.html deleted file mode 100644 index 778a1c85..00000000 --- a/layouts/partials/partners.html +++ /dev/null @@ -1,51 +0,0 @@ - -
-
-
-
- Stackdriver logo -
-
- Prometheus logo -
-
- Zipkin logo -
-
- Jaeger logo -
-
-
-
-
-
- Cesar logo -
-
- SignalFX logo -
-
- Datadog logo -
-
- The Creative Few logo -
-
-
-
-
-
- Google logo -
-
- Microsoft logo -
-
- Solarwinds logo -
-
- -
-
-
-
diff --git a/layouts/partials/statsExporter.html b/layouts/partials/statsExporter.html deleted file mode 100644 index 0b424502..00000000 --- a/layouts/partials/statsExporter.html +++ /dev/null @@ -1 +0,0 @@ -S \ No newline at end of file diff --git a/layouts/partials/traceExporter.html b/layouts/partials/traceExporter.html deleted file mode 100644 index c9a2e8a9..00000000 --- a/layouts/partials/traceExporter.html +++ /dev/null @@ -1 +0,0 @@ -T \ No newline at end of file diff --git a/layouts/shortcodes/button.html b/layouts/shortcodes/button.html new file mode 100644 index 00000000..339e2354 --- /dev/null +++ b/layouts/shortcodes/button.html @@ -0,0 +1,17 @@ +{{- $icon := .Get "icon" | default false }} + +{{ with .Get "align" }}
{{end}} + +{{- if eq $icon "true"}} +
+ + {{.Inner}} +
+{{- else}} +{{.Inner}} +{{end}} +
+{{ with .Get "align" }}
{{end}} diff --git a/layouts/shortcodes/feature-matrix.html b/layouts/shortcodes/feature-matrix.html new file mode 100644 index 00000000..912cd6e2 --- /dev/null +++ b/layouts/shortcodes/feature-matrix.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BackendC++ErlangGoJavaNode.jsPHPPythonRuby
DatadogT S
InstanaTT
JaegerTTTT
PrometheusSSSS
SignalFXS
StackdriverT STT ST STT
ZipkinTTTTTT
diff --git a/layouts/shortcodes/languages.html b/layouts/shortcodes/languages.html new file mode 100644 index 00000000..bbbf943d --- /dev/null +++ b/layouts/shortcodes/languages.html @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LanguageStatsTracing
C#PlannedPlanned
C++SupportedSupported
ErlangSupportedSupported
GoSupportedSupported
Java (JVM, OpenJDK, Android)SupportedSupported
Node.jsSupportedSupported
PHPPlannedSupported
PythonIn ProgressSupported
RubyPlannedSupported
diff --git a/layouts/shortcodes/partners.html b/layouts/shortcodes/partners.html new file mode 100644 index 00000000..5bba76b6 --- /dev/null +++ b/layouts/shortcodes/partners.html @@ -0,0 +1,57 @@ +
+
+
+
+ Google logo +
+
+ Datadog logo +
+
+ Orijtech Logo +
+
+ SignalFX logo +
+
+
+
+
+
+ Cesar logo +
+
+ The Creative Few logo +
+
+ Microsoft logo +
+
+ Jaeger logo +
+
+
+
+
+
+ Zipkin logo +
+
+ Solarwinds logo +
+
+ Stackdriver logo +
+
+ Prometheus logo +
+
+
+
+
+
+ Instana logo +
+
+
+
diff --git a/layouts/shortcodes/quickstart-list.html b/layouts/shortcodes/quickstart-list.html new file mode 100644 index 00000000..7a8f4320 --- /dev/null +++ b/layouts/shortcodes/quickstart-list.html @@ -0,0 +1,50 @@ +
+ +
Go
+
+ +Metrics + + +Tracing + + +
+ +
Java
+
+ +Metrics + + +Tracing + + +
+ +
Python
+
+ +Metrics + + +Tracing + diff --git a/layouts/shortcodes/tabs.html b/layouts/shortcodes/tabs.html new file mode 100644 index 00000000..145a74ef --- /dev/null +++ b/layouts/shortcodes/tabs.html @@ -0,0 +1,13 @@ +
+ + + + {{ .Inner }} + +
diff --git a/layouts/shortcodes/title-card.html b/layouts/shortcodes/title-card.html new file mode 100644 index 00000000..2b82688e --- /dev/null +++ b/layouts/shortcodes/title-card.html @@ -0,0 +1,8 @@ +
+ +
+ + Modern planet scale observability:
+ distributed tracing and monitoring for your microservices and monoliths alike +
+
diff --git a/layouts/shortcodes/title.html b/layouts/shortcodes/title.html new file mode 100644 index 00000000..e645301f --- /dev/null +++ b/layouts/shortcodes/title.html @@ -0,0 +1,11 @@ +{{- $red := .Get "red" | default false }} + + diff --git a/layouts/shortcodes/what-is-opencensus.html b/layouts/shortcodes/what-is-opencensus.html new file mode 100644 index 00000000..dff70368 --- /dev/null +++ b/layouts/shortcodes/what-is-opencensus.html @@ -0,0 +1 @@ +

What is ?

diff --git a/static/.gitkeep b/static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/static/404.html b/static/404.html deleted file mode 100644 index 54ba382a..00000000 --- a/static/404.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Page Not Found - - - - -
-

404

-

Page Not Found

-

The specified file was not found on this website. Please check the URL for mistakes and try again.

- - -
- - diff --git a/static/api/php/.gitkeep b/static/api/php/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/static/api/php/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/api/python/.gitkeep b/static/api/python/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/static/api/python/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/bower_components/app-layout/.github/ISSUE_TEMPLATE.md b/static/bower_components/app-layout/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..d2bafe7c --- /dev/null +++ b/static/bower_components/app-layout/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/app-layout/.gitignore b/static/bower_components/app-layout/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/app-layout/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/app-layout/.travis.yml b/static/bower_components/app-layout/.travis.yml new file mode 100644 index 00000000..8ebcbaa8 --- /dev/null +++ b/static/bower_components/app-layout/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: required +dist: trusty +node_js: stable +addons: + sauce_connect: true + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +before_script: +- npm install -g bower polylint web-component-tester +- bower install +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +env: + global: + - secure: aLLRRtzSz/QImXYAEO7lBZcmp8xhXH28J6HONXOboy8H2eQmie0kAG8EIL1EYw1OMomAwawvh9BMJqhJHiLg23h6+asXdEaYefF+QDKIKh11dCZFUPJ71DAwKOLQpL+3D4iV/Wmndr4dIEGASCUdPufoBbmG1ZVY5dGkQYG8TO7mAOwzCciPNRaHws5fkMhWbm+tzWCDrIoMOWKDBZiAk4Rm7pXQ7c+Vnr07R0qrWlsCuiaMMc9J34q0bqrzmnV+EWjqKHXzhv1hJEbKHvO73cJorwtdpkeqLi1UsdkDCBuA8soxLSicCcpFe7eMkpr9WrbuJZ5QOEVlq+qb3aW9tH5wABiXSL4K8J7otvaXgRIaTg6i5pRGrivmNAOS6YXzT7oQAdmfFxHSpUr4OeV3Nvm9Ik7p8sOLHMGj4Eo00djjPtbO9MutF3CBLvYuEmdfa0BRXe3WqeJdaCVyYiMAPG7lYqz+aNAl6O4qAVRLMzXIRl/+vF2cso/rG7SsZORSuMk34NZhdXiHlBI+e5lyNrdrCyirukZmTd5rLiyEfbO9ty8BgxQ5MlomEXoZM3GYgFKgViYiMFQ8QuaGBUJBdeyo0IJiqp7ohcbUZq46XOXz//5hOOcp4ddgMNNjyIqjGmBJff0+oYalhJXK56UivTAXhoiXDLIQXHsJ3rUexcE= + - secure: TqRTXbcw5+a/XY/pb3rh8a/PkbLluNZKdN9FI/ZfHOVJu1xWCQSPUcI8XNmnPks/SVz8aCSWpPi4dh6oa8k1FXo7Q0lQ+2wAdfe7imnqoj6YIt0guHbe/YWGZoUmzuptSgufygzKGRh37oZx8fOH9bMb0vyMxCTZs4PcTeaqhmRQRHfVK/W2dyDRnSuHior5niKnboLXXR+XitcT3k+0S/jUGUwice0BivjHPpB9CNgm2lChRX3tHIru4iE3XW5U4+8Eg4SulLXd8DybQ3hzMIEmapPU7T/EO/xpIe1hIfVbJBY0LB4Ri5GGCK00OEDEcHSSJmubJ4usn2jitAyfztXg8BLEg8d/1BSTmAF+l7gUKgqhJ968Prc09EUdnyBPwRmnt1sPcZpDaDZuegg+y5Gx3qmWuqDAVSsHw08BbtK37ppHFRwswtRUMFOQKuOQXM74uI10BOWshONGitqKNYFvXniZxqO7Ezc/LSAfxSn278ews/KRNl/elGLgOtw92cJPXw515h56FvWb7gc1cm5WtJir2NwX7KlhHU3IPoDYq3QDKKQ63sPmUGPhCBAtfBGRDd5Os1MbcoyChpMr4osxHv03PNvQPY5hKjg2mUnb5QwMpJiEPs70CLXdx8Q7psX56RKjDHunFpXf5M4/SQIEmVFVi2PLoUymWlpvdBc= diff --git a/static/bower_components/app-layout/CONTRIBUTING.md b/static/bower_components/app-layout/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/app-layout/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/app-layout/README.md b/static/bower_components/app-layout/README.md new file mode 100644 index 00000000..79df397b --- /dev/null +++ b/static/bower_components/app-layout/README.md @@ -0,0 +1,38 @@ +# App Layout [![Build Status](https://travis-ci.org/PolymerElements/app-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/app-layout) + + +[](https://polymerelements.github.io/app-layout/) + +https://polymerelements.github.io/app-layout/ + +For additional documentation, please check out [Responsive app layout](https://www.polymer-project.org/1.0/toolbox/app-layout). + +A set of layout elements for your app. It includes: + +- [app-box](/app-box) - A container element that can have scroll effects - visual effects based on scroll position. + +- [app-drawer](/app-drawer) - A navigation drawer that can slide in from the left or right. + +- [app-drawer-layout](/app-drawer-layout) - A wrapper element that positions an app-drawer and other content. + +- [app-grid](/app-grid) - A helper class useful for creating responsive, fluid grid layouts using custom properties. + +- [app-header](/app-header) - A container element for app-toolbars at the top of the screen that can have scroll effects - visual effects based on scroll position. + +- [app-header-layout](/app-header-layout) - A wrapper element that positions an app-header and other content. + +- [app-scrollpos-control](/app-scrollpos-control) - A manager for saving and restoring the scroll position when multiple pages are sharing the same document scroller. + +- [app-toolbar](/app-toolbar) - A horizontal toolbar containing items that can be used for label, navigation, search and actions. + +### Install + +```bash +$ bower install PolymerElements/app-layout --save +``` + +### Import + +```html + +``` diff --git a/static/bower_components/app-layout/app-box/README.md b/static/bower_components/app-layout/app-box/README.md new file mode 100644 index 00000000..ecdd77e1 --- /dev/null +++ b/static/bower_components/app-layout/app-box/README.md @@ -0,0 +1,43 @@ +##<app-box> + +app-box is a container element that can have scroll effects - visual effects based on +scroll position. For example, the parallax effect can be used to move an image at a slower +rate than the foreground. + +```html + + + +``` + +Notice the `background` attribute in the `img` element; this attribute specifies that that image is used as the background. +By adding the background to the light dom, you can compose backgrounds that can change dynamically. +Alternatively, the mixin `--app-box-background-front-layer` allows to style the background. For example: + +```css + .parallaxAppBox { + --app-box-background-front-layer: { + background-image: url(picture.png); + }; + } +``` + +Finally, app-box can have content inside. For example: + +```html + +

Sub title

+
+``` + +## Scroll effects + +Effect name | Description +----------------|------------- +`parallax-background` | A parallax effect + +## Styling + +Mixin | Description | Default +----------------|-------------|---------- +`--app-box-background-front-layer` | Applies to the front layer of the background | {} \ No newline at end of file diff --git a/static/bower_components/app-layout/app-box/app-box.html b/static/bower_components/app-layout/app-box/app-box.html new file mode 100644 index 00000000..da159f41 --- /dev/null +++ b/static/bower_components/app-layout/app-box/app-box.html @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-box/demo/document-scroll.html b/static/bower_components/app-layout/app-box/demo/document-scroll.html new file mode 100644 index 00000000..9281b3e3 --- /dev/null +++ b/static/bower_components/app-layout/app-box/demo/document-scroll.html @@ -0,0 +1,146 @@ + + + + + + + + + + app-box demo using the document scroll + + + + + + + + + + + + + + +
+
+
+

Built for Speed

+

Polymer 1.0 replaces the shadow DOM polyfill with a lightweight shim, uses a new, faster data-binding system, and significantly reduces code size.

+
+ + + + +
+ +
+
+
+

For Modern Browsers

+

Polymer is built from the ground up for modern browsers, using the latest web platform APIs. Polyfills provide support on evergreen browsers for APIs that aren't universal yet.

+
+ + +
+ +
+
+
+

Using Web Components

+

Polymer leverages web components, a new set of standards designed to provide reusable components for the web.

+
+ +
+ +
+
+
+

Create your own elements

+

The Polymer library makes it easy to create your own powerful elements. Give your element some markup and properties, and then use it on a site. Polymer provides useful features like templating and data binding to reduce the amount of boilerplate you need to write.

+
+ +
+ + + diff --git a/static/bower_components/app-layout/app-box/demo/index.html b/static/bower_components/app-layout/app-box/demo/index.html new file mode 100644 index 00000000..991839bc --- /dev/null +++ b/static/bower_components/app-layout/app-box/demo/index.html @@ -0,0 +1,40 @@ + + + + + + app-box demos + + + + + + + + + + +
+
+

app-box demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-box/demo/scrolling-region.html b/static/bower_components/app-layout/app-box/demo/scrolling-region.html new file mode 100644 index 00000000..4cd812e8 --- /dev/null +++ b/static/bower_components/app-layout/app-box/demo/scrolling-region.html @@ -0,0 +1,173 @@ + + + + + + + + + + app-box using a custom scrolling region + + + + + + + + + + + + + + +
+
+
+
+
+

Built for Speed

+

Polymer 1.0 replaces the shadow DOM polyfill with a lightweight shim, uses a new, faster data-binding system, and significantly reduces code size.

+
+ + + + + +
+ +
+
+
+

For Modern Browsers

+

Polymer is built from the ground up for modern browsers, using the latest web platform APIs. Polyfills provide support on evergreen browsers for APIs that aren't universal yet.

+
+ + +
+ +
+
+
+

Using Web Components

+

Polymer leverages web components, a new set of standards designed to provide reusable components for the web.

+
+ +
+ +
+
+
+

Create your own elements

+

The Polymer library makes it easy to create your own powerful elements. Give your element some markup and properties, and then use it on a site. Polymer provides useful features like templating and data binding to reduce the amount of boilerplate you need to write.

+
+ +
+
+
+ + + diff --git a/static/bower_components/app-layout/app-drawer-layout/README.md b/static/bower_components/app-layout/app-drawer-layout/README.md new file mode 100644 index 00000000..d5ddb861 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/README.md @@ -0,0 +1,93 @@ +##<app-drawer-layout> + +app-drawer-layout is a wrapper element that positions an app-drawer and other content. When +the viewport width is smaller than `responsiveWidth`, this element changes to narrow layout. +In narrow layout, the drawer will be stacked on top of the main content. The drawer will slide +in/out to hide/reveal the main content. + + +By default the drawer is aligned to the start, which is left in LTR layouts: + +```html + + + drawer content + +
+ main content +
+
+``` + +Align the drawer at the end: + +```html + + + drawer content + +
+ main content +
+
+``` + +With an app-header-layout: + +```html + + + drawer-content + + + + +
App name
+
+
+ + main content + +
+
+``` + +Add the `drawer-toggle` attribute to elements inside `app-drawer-layout` that toggle the drawer on tap events: + +```html + + + drawer-content + + + + + +
App name
+
+
+ + main content + +
+
+``` + +Add the `fullbleed` attribute to app-drawer-layout to make it fit the size of its container: + +```html + + + drawer content + +
+ main content +
+
+``` + +### Styling + +Custom property | Description | Default +-----------------------------------------|--------------------------------------|--------- +`--app-drawer-layout-content-transition` | Transition for the content container | none diff --git a/static/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html b/static/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html new file mode 100644 index 00000000..f49e55a8 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer-layout/demo/index.html b/static/bower_components/app-layout/app-drawer-layout/demo/index.html new file mode 100644 index 00000000..cc3ac976 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/demo/index.html @@ -0,0 +1,40 @@ + + + + + + app-drawer-layout demos + + + + + + + + + + +
+
+

app-drawer-layout demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-drawer-layout/demo/simple-drawer.html b/static/bower_components/app-layout/app-drawer-layout/demo/simple-drawer.html new file mode 100644 index 00000000..eaf4b788 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/demo/simple-drawer.html @@ -0,0 +1,67 @@ + + + + + + + + + app-drawer-layout demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer-layout/demo/two-drawers.html b/static/bower_components/app-layout/app-drawer-layout/demo/two-drawers.html new file mode 100644 index 00000000..52dd87df --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/demo/two-drawers.html @@ -0,0 +1,70 @@ + + + + + + + + + app-drawer-layout demo + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/static/bower_components/app-layout/app-drawer-layout/test/app-drawer-layout.html b/static/bower_components/app-layout/app-drawer-layout/test/app-drawer-layout.html new file mode 100644 index 00000000..e012c853 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/test/app-drawer-layout.html @@ -0,0 +1,175 @@ + + + + + + test for app-drawer-layout + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer-layout/test/index.html b/static/bower_components/app-layout/app-drawer-layout/test/index.html new file mode 100644 index 00000000..f4bb953b --- /dev/null +++ b/static/bower_components/app-layout/app-drawer-layout/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-drawer-layout tests + + + + + + diff --git a/static/bower_components/app-layout/app-drawer/README.md b/static/bower_components/app-layout/app-drawer/README.md new file mode 100644 index 00000000..f232c04d --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/README.md @@ -0,0 +1,37 @@ +##<app-drawer> + +![app-drawer] +(http://app-layout-assets.appspot.com/assets/docs/app-drawer/drawer.gif) + +app-drawer is a navigation drawer that can slide in from the left or right. + +Example: + +Align the drawer at the start, which is left in LTR layouts (default): + +```html + +``` + +Align the drawer at the end: + +```html + +``` + +To make the contents of the drawer scrollable, create a wrapper for the scroll +content, and apply height and overflow styles to it. + +```html + +
+
+``` + +### Styling + +Custom property | Description | Default +---------------------------------|----------------------------------------|-------------------- +`--app-drawer-width` | Width of the drawer | 256px +`--app-drawer-content-container` | Mixin for the drawer content container | {} +`--app-drawer-scrim-background` | Background for the scrim | rgba(0, 0, 0, 0.5) diff --git a/static/bower_components/app-layout/app-drawer/app-drawer.html b/static/bower_components/app-layout/app-drawer/app-drawer.html new file mode 100644 index 00000000..85db9af8 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/app-drawer.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer/demo/index.html b/static/bower_components/app-layout/app-drawer/demo/index.html new file mode 100644 index 00000000..dc3bd0ac --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/demo/index.html @@ -0,0 +1,40 @@ + + + + + + app-drawer demos + + + + + + + + + + +
+
+

app-drawer demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-drawer/demo/left-drawer.html b/static/bower_components/app-layout/app-drawer/demo/left-drawer.html new file mode 100644 index 00000000..30d80c9e --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/demo/left-drawer.html @@ -0,0 +1,70 @@ + + + + + + + + + app-drawer demo + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer/demo/right-drawer.html b/static/bower_components/app-layout/app-drawer/demo/right-drawer.html new file mode 100644 index 00000000..1872e210 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/demo/right-drawer.html @@ -0,0 +1,94 @@ + + + + + + + + + app-drawer demo + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer/test/app-drawer.html b/static/bower_components/app-layout/app-drawer/test/app-drawer.html new file mode 100644 index 00000000..8cd46e2e --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/test/app-drawer.html @@ -0,0 +1,724 @@ + + + + + + test for app-drawer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-drawer/test/index.html b/static/bower_components/app-layout/app-drawer/test/index.html new file mode 100644 index 00000000..8a177728 --- /dev/null +++ b/static/bower_components/app-layout/app-drawer/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-drawer tests + + + + + + diff --git a/static/bower_components/app-layout/app-grid/README.md b/static/bower_components/app-layout/app-grid/README.md new file mode 100644 index 00000000..9912d061 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/README.md @@ -0,0 +1,110 @@ +##<app-grid> + +app-grid is a helper class useful for creating responsive, fluid grid layouts using custom properties. +Because custom properties can be defined inside a `@media` rule, you can customize the grid layout +for different breakpoints. + +Example: + +Within an element definition, import `app-grid-style.html`, then include the style sheet in the style +element inside the template. + +```html + +``` + +In this example, the grid will take 3 columns per row and only 1 column if the viewport width is +smaller than 640px. + +### Expandible items + +In many cases, it's useful to expand an item more than 1 column. To achieve this type of layout, +you can specify the number of columns the item should expand to by setting the custom property +`--app-grid-expandible-item`. To indicate which item should expand, apply the mixin +`--app-grid-expandible-item` to a rule with a selector to the item. For example: + +```css + +``` + +### Preserving the aspect ratio + +When the size of a grid item should preserve the aspect ratio, you can add the `has-aspect-ratio` +attribute to the element with the class `.app-grid`. Now, every item element becomes a wrapper around +the item content. For example: + +```css + +``` + +### Styling + +Custom property | Description | Default +----------------------------------------------|------------------------------------------------------------|------------------ +`--app-grid-columns` | The number of columns per row. | 1 +`--app-grid-gutter` | The space between two items. | 0px +`--app-grid-item-height` | The height of the items. | auto +`--app-grid-expandible-item-columns` | The number of columns an expandible item should expand to. | 1 diff --git a/static/bower_components/app-layout/app-grid/app-grid-style.html b/static/bower_components/app-layout/app-grid/app-grid-style.html new file mode 100644 index 00000000..4b3773a7 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/app-grid-style.html @@ -0,0 +1,89 @@ + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/demo/aspect-ratio.html b/static/bower_components/app-layout/app-grid/demo/aspect-ratio.html new file mode 100644 index 00000000..aa55b2b0 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/demo/aspect-ratio.html @@ -0,0 +1,113 @@ + + + + + + + + + Preserving aspect ratio using app-grid-style + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/demo/flickr-grid-layout.html b/static/bower_components/app-layout/app-grid/demo/flickr-grid-layout.html new file mode 100644 index 00000000..37d7f406 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/demo/flickr-grid-layout.html @@ -0,0 +1,257 @@ + + + + + + + + + Flickr grid layout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/demo/index.html b/static/bower_components/app-layout/app-grid/demo/index.html new file mode 100644 index 00000000..62804fc6 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/demo/index.html @@ -0,0 +1,41 @@ + + + + + + app-grid demos + + + + + + + + + +
+
+

app-grid demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-grid/demo/md-grid-layout.html b/static/bower_components/app-layout/app-grid/demo/md-grid-layout.html new file mode 100644 index 00000000..8d77ea89 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/demo/md-grid-layout.html @@ -0,0 +1,160 @@ + + + + + + + + + Material design grid layout using app-grid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/demo/simple-responsive-grid.html b/static/bower_components/app-layout/app-grid/demo/simple-responsive-grid.html new file mode 100644 index 00000000..f6239afb --- /dev/null +++ b/static/bower_components/app-layout/app-grid/demo/simple-responsive-grid.html @@ -0,0 +1,125 @@ + + + + + + + + + Responsive grid layout using app-grid-style + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/test/app-grid.html b/static/bower_components/app-layout/app-grid/test/app-grid.html new file mode 100644 index 00000000..1a52ca59 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/test/app-grid.html @@ -0,0 +1,154 @@ + + + + + + test for app-grid + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-grid/test/index.html b/static/bower_components/app-layout/app-grid/test/index.html new file mode 100644 index 00000000..91765235 --- /dev/null +++ b/static/bower_components/app-layout/app-grid/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-grid tests + + + + + + \ No newline at end of file diff --git a/static/bower_components/app-layout/app-header-layout/README.md b/static/bower_components/app-layout/app-header-layout/README.md new file mode 100644 index 00000000..65dc24ff --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/README.md @@ -0,0 +1,42 @@ +##<app-header-layout> + +app-header-layout is a wrapper element that positions an app-header and other content. This +element uses the document scroll by default, but it can also define its own scrolling region. + +Using the document scroll: + +```html + + + +
App name
+
+
+
+ main content +
+
+``` + +Using an own scrolling region: + +```html + + + +
App name
+
+
+
+ main content +
+
+``` + +Add the `fullbleed` attribute to app-header-layout to make it fit the size of its container: + +```html + + ... + +``` \ No newline at end of file diff --git a/static/bower_components/app-layout/app-header-layout/app-header-layout.html b/static/bower_components/app-layout/app-header-layout/app-header-layout.html new file mode 100644 index 00000000..60e17e03 --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/app-header-layout.html @@ -0,0 +1,222 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-header-layout/demo/footer.html b/static/bower_components/app-layout/app-header-layout/demo/footer.html new file mode 100644 index 00000000..6d57333e --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/demo/footer.html @@ -0,0 +1,90 @@ + + + + + + + + + app-header-layout demo + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
My Drive
+
+
+ +
+ +
+ +
+ © Polymer project +
+ +
+ + + diff --git a/static/bower_components/app-layout/app-header-layout/demo/index.html b/static/bower_components/app-layout/app-header-layout/demo/index.html new file mode 100644 index 00000000..faaf12cc --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/demo/index.html @@ -0,0 +1,42 @@ + + + + + + app-header-layout demos + + + + + + + + + + +
+
+

app-header-layout demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-header-layout/demo/music.html b/static/bower_components/app-layout/app-header-layout/demo/music.html new file mode 100644 index 00000000..34b2b0d7 --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/demo/music.html @@ -0,0 +1,239 @@ + + + + + + + + Music Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ +

GIRL

+
+
Pharrell Williams
+
+ + Girl is the second studio album by American recording artist and record producer Pharrell Williams. The album was released on March 3, 2014, through Williams' label i Am Other and Columbia Records. + + + + +
+ + + +
+ + + + + diff --git a/static/bower_components/app-layout/app-header-layout/demo/scrolling-region.html b/static/bower_components/app-layout/app-header-layout/demo/scrolling-region.html new file mode 100644 index 00000000..91775140 --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/demo/scrolling-region.html @@ -0,0 +1,87 @@ + + + + + + + + + app-header-layout demo + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
My Drive
+
+
+ + + +
+ + + diff --git a/static/bower_components/app-layout/app-header-layout/demo/simple.html b/static/bower_components/app-layout/app-header-layout/demo/simple.html new file mode 100644 index 00000000..6e07d76d --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/demo/simple.html @@ -0,0 +1,74 @@ + + + + + + + + + app-header-layout demo + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
My Drive
+
+
+ +
+ +
+ +
+ + + diff --git a/static/bower_components/app-layout/app-header-layout/test/app-header-layout.html b/static/bower_components/app-layout/app-header-layout/test/app-header-layout.html new file mode 100644 index 00000000..8c6f2ca6 --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/test/app-header-layout.html @@ -0,0 +1,115 @@ + + + + + + test for app-header-layout + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-header-layout/test/index.html b/static/bower_components/app-layout/app-header-layout/test/index.html new file mode 100644 index 00000000..3141b8a5 --- /dev/null +++ b/static/bower_components/app-layout/app-header-layout/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-header-layout tests + + + + + + diff --git a/static/bower_components/app-layout/app-header/README.md b/static/bower_components/app-layout/app-header/README.md new file mode 100644 index 00000000..127b83d9 --- /dev/null +++ b/static/bower_components/app-layout/app-header/README.md @@ -0,0 +1,202 @@ +##<app-header> + +![app-header] +(http://app-layout-assets.appspot.com/assets/docs/app-header/header.gif) + +app-header is container element for app-toolbars at the top of the screen that can have scroll +effects. By default, an app-header moves away from the viewport when scrolling down and +if using `reveals`, the header slides back when scrolling back up. For example, + +```html + + +
App name
+
+
+``` + +app-header can also condense when scrolling down. To achieve this behavior, the header +must have a larger height than the `sticky` element in the light DOM. For example: + +```html + + +
App name
+
+
+``` + +In this case the header is initially `96px` tall, and it shrinks to `64px` when scrolling down. +That is what is meant by "condensing". + +### Sticky element + +The element that is positioned fixed to top of the header's `scrollTarget` when a threshold +is reached, similar to `position: sticky` in CSS. This element **must** be an immediate +child of app-header. By default, the `sticky` element is the first `app-toolbar that +is an immediate child of app-header. + +```html + + Sticky element + +``` + +#### Customizing the sticky element + +```html + + + Sticky element + +``` + +### Scroll target + +The app-header's `scrollTarget` property allows to customize the scrollable element to which +the header responds when the user scrolls. By default, app-header uses the document as +the scroll target, but you can customize this property by setting the id of the element, e.g. + +```html +
+ + +
+``` + +In this case, the `scrollTarget` property points to the outer div element. Alternatively, +you can set this property programmatically: + +```js +appHeader.scrollTarget = document.querySelector("#scrollingRegion"); +``` + +## Backgrounds +app-header has two background layers that can be used for styling when the header is condensed +or when the scrollable element is scrolled to the top. + +## Scroll effects + +Scroll effects are _optional_ visual effects applied in app-header based on scroll position. For example, +The [Material Design scrolling techniques](https://www.google.com/design/spec/patterns/scrolling-techniques.html) +recommends effects that can be installed via the `effects` property. e.g. + +```html + + App name + +``` + +#### Importing the effects + +To use the scroll effects, you must explicitly import them in addition to `app-header`: + +```html + +``` + +#### List of effects + +* **blend-background** +Fades in/out two background elements by applying CSS opacity based on scroll position. +You can use this effect to smoothly change the background color or image of the header. +For example, using the mixin `--app-header-background-rear-layer` lets you assign a different +background when the header is condensed: + +```css +app-header { + background-color: red; + --app-header-background-rear-layer: { + /* The header is blue when condensed */ + background-color: blue; + }; +} +``` + +* **fade-background** +Upon scrolling past a threshold, this effect will trigger an opacity transition to +fade in/out the backgrounds. Compared to the `blend-background` effect, +this effect doesn't interpolate the opacity based on scroll position. + + +* **parallax-background** +A simple parallax effect that vertically translates the backgrounds based on a fraction +of the scroll position. For example: + +```css +app-header { + --app-header-background-front-layer: { + background-image: url(...); + }; +} +``` +```html + + App name + +``` + +The fraction determines how far the background moves relative to the scroll position. +This value can be assigned via the `scalar` config value and it is typically a value +between 0 and 1 inclusive. If `scalar=0`, the background doesn't move away from the header. +[More about configuration for scroll effects](/app-scroll-effects#configuring-effects) + +* **resize-title** +Progressively interpolates the size of the title from the element with the `main-title` attribute +to the element with the `condensed-title` attribute as the header condenses. For example: + +```html + + +

App name

+
+ +

App name

+
+
+``` + +* **resize-snapped-title** +Upon scrolling past a threshold, this effect fades in/out the titles using opacity transitions. +Similarly to `resize-title`, the `main-title` and `condensed-title` elements must be placed in the +light DOM. + +* **waterfall** +Toggles the shadow property in app-header to create a sense of depth (as recommended in the +MD spec) between the header and the underneath content. You can change the shadow by +customizing the `--app-header-shadow` mixin. For example: + +```css +app-header { + --app-header-shadow: { + box-shadow: inset 0px 5px 2px -3px rgba(0, 0, 0, 0.2); + }; +} +``` + +```html + + +

App name

+
+
+``` + +* **material** +Installs the waterfall, resize-title, blend-background and parallax-background effects. + +### Content attributes + +Attribute | Description | Default +----------|---------------------|---------------------------------------- +`sticky` | Element that remains at the top when the header condenses. | The first app-toolbar in the light DOM. + + +## Styling + +Mixin | Description | Default +----------------|-------------|---------- +`--app-header-background-front-layer` | Applies to the front layer of the background | {} +`--app-header-background-rear-layer` | Applies to the rear layer of the background | {} +`--app-header-shadow` | Applies to the shadow | {} + diff --git a/static/bower_components/app-layout/app-header/app-header.html b/static/bower_components/app-layout/app-header/app-header.html new file mode 100644 index 00000000..86fd819f --- /dev/null +++ b/static/bower_components/app-layout/app-header/app-header.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-header/demo/blend-background-1.html b/static/bower_components/app-layout/app-header/demo/blend-background-1.html new file mode 100644 index 00000000..dcbee935 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/blend-background-1.html @@ -0,0 +1,109 @@ + + + + + + + + + + app-header demo + + + + + + + + + + + + + + + + + + +

What is material? — Environment

+ +
+ +

What is material?

+
+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/blend-background-2.html b/static/bower_components/app-layout/app-header/demo/blend-background-2.html new file mode 100644 index 00000000..e79d1966 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/blend-background-2.html @@ -0,0 +1,113 @@ + + + + + + + + + + app-header demo + + + + + + + + + + + + + + + + + + +

What is material? — Environment

+ +
+ +

What is material?

+
+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/blend-background-3.html b/static/bower_components/app-layout/app-header/demo/blend-background-3.html new file mode 100644 index 00000000..32bb2f7b --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/blend-background-3.html @@ -0,0 +1,110 @@ + + + + + + + + + + app-header demo + + + + + + + + + + + + + + + + + + +

What is material? — Environment

+ +
+ +

What is material?

+
+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/contacts.html b/static/bower_components/app-layout/app-header/demo/contacts.html new file mode 100644 index 00000000..9f92fe68 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/contacts.html @@ -0,0 +1,124 @@ + + + + + + + + Contacts Demo + + + + + + + + + + + + + + + + + + + +
Pharrell Williams
+ + +
+ + +
Pharrell Williams
+
+
+ + + + + + + + + diff --git a/static/bower_components/app-layout/app-header/demo/custom-sticky-element.html b/static/bower_components/app-layout/app-header/demo/custom-sticky-element.html new file mode 100644 index 00000000..c73ca6c5 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/custom-sticky-element.html @@ -0,0 +1,85 @@ + + + + + + + + + + app-header demo + + + + + + + + + + + + + + + + + + + +

+ +
+ + + TAB 1 + TAB 2 + TAB 3 + +
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/give.html b/static/bower_components/app-layout/app-header/demo/give.html new file mode 100644 index 00000000..bf07de1a --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/give.html @@ -0,0 +1,115 @@ + + + + + + + + + + app-header demo + + + + + + + + + + + + + + + + + + + +

GiveDirectly

+ +
+

GiveDirectly

+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/index.html b/static/bower_components/app-layout/app-header/demo/index.html new file mode 100644 index 00000000..cd31af44 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/index.html @@ -0,0 +1,47 @@ + + + + + + app-header demos + + + + + + + + + + +
+
+

app-header demos

+ +
+
+ + diff --git a/static/bower_components/app-layout/app-header/demo/music.html b/static/bower_components/app-layout/app-header/demo/music.html new file mode 100644 index 00000000..f66f873b --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/music.html @@ -0,0 +1,235 @@ + + + + + + + + Music Demo + + + + + + + + + + + + + + + + + + + + + +
+ +

GIRL

+
+
Pharrell Williams
+
+ + Girl is the second studio album by American recording artist and record producer Pharrell Williams. The album was released on March 3, 2014, through Williams' label i Am Other and Columbia Records. + + + + +
+ + + + + + +
+ +
+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/demo/no-effects.html b/static/bower_components/app-layout/app-header/demo/no-effects.html new file mode 100644 index 00000000..adab025c --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/no-effects.html @@ -0,0 +1,64 @@ + + + + + + + + + + app-header demo that doesn't use any effects + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-header/demo/notes.html b/static/bower_components/app-layout/app-header/demo/notes.html new file mode 100644 index 00000000..5fae0218 --- /dev/null +++ b/static/bower_components/app-layout/app-header/demo/notes.html @@ -0,0 +1,174 @@ + + + + + + + + Notes Demo + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + +
Notes
+ +
+
+ + + + + diff --git a/static/bower_components/app-layout/app-header/test/app-header.html b/static/bower_components/app-layout/app-header/test/app-header.html new file mode 100644 index 00000000..224b5e37 --- /dev/null +++ b/static/bower_components/app-layout/app-header/test/app-header.html @@ -0,0 +1,512 @@ + + + + + + test for app-header + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-header/test/index.html b/static/bower_components/app-layout/app-header/test/index.html new file mode 100644 index 00000000..a7a0cb32 --- /dev/null +++ b/static/bower_components/app-layout/app-header/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-header tests + + + + + + diff --git a/static/bower_components/app-layout/app-layout.html b/static/bower_components/app-layout/app-layout.html new file mode 100644 index 00000000..ea24c047 --- /dev/null +++ b/static/bower_components/app-layout/app-layout.html @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/README.md b/static/bower_components/app-layout/app-scroll-effects/README.md new file mode 100644 index 00000000..016d40f7 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/README.md @@ -0,0 +1,84 @@ +# Scroll effects + +`Polymer.AppScrollEffectsBehavior` provides an interface that allows an element to use scrolls effects. + +### Importing the app-layout effects + +app-layout provides a set of scroll effects that can be used by explicitly importing `app-scroll-effects.html`: + +```html + +``` + +The scroll effects can also be used by individually importing `app-layout/app-scroll-effects/effects/[effectName].html`. +For example: + +```html + +``` + +### Consuming effects + +Effects can be consumed via the `effects` property. For example: + +```html + +``` + +### Creating scroll effects + +You may want to create a custom scroll effect if you need to modify the CSS of an element +based on the scroll position. + +A scroll effect definition is an object with `setUp()`, `tearDown()` and `run()` functions. + +To register the effect, you can use `Polymer.AppLayout.registerEffect(effectName, effectDef)` +For example, let's define an effect that resizes the header's logo: + +```js +Polymer.AppLayout.registerEffect('resizable-logo', { + setUp: function(config) { + // the effect's config is passed to the setUp. + this._fxResizeLogo = { logo: Polymer.dom(this).querySelector('[logo]') }; + }, + + run: function(progress) { + // the progress of the effect + this.transform('scale3d(' + progress + ', '+ progress +', 1)', this._fxResizeLogo.logo); + }, + + tearDown: function() { + // clean up and reset of states + delete this._fxResizeLogo; + } +}); +``` +Now, you can consume the effect: + +```html + + + +``` + +### Imperative API + +```js +var logoEffect = appHeader.createEffect('resizable-logo', effectConfig); +// run the effect: logoEffect.run(progress); +// tear down the effect: logoEffect.tearDown(); +``` + +### Configuring effects + +For effects installed via the `effects` property, their configuration can be set +via the `effectsConfig` property. For example: + +```html + + +``` + +All effects have a `startsAt` and `endsAt` config property. They specify at what +point the effect should start and end. This value goes from 0 to 1 inclusive. diff --git a/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects-behavior.html b/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects-behavior.html new file mode 100644 index 00000000..bc4fdd57 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects-behavior.html @@ -0,0 +1,365 @@ + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects.html b/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects.html new file mode 100644 index 00000000..d61258fe --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/app-scroll-effects.html @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/blend-background.html b/static/bower_components/app-layout/app-scroll-effects/effects/blend-background.html new file mode 100644 index 00000000..1e1dfe15 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/blend-background.html @@ -0,0 +1,42 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/fade-background.html b/static/bower_components/app-layout/app-scroll-effects/effects/fade-background.html new file mode 100644 index 00000000..db1b1d34 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/fade-background.html @@ -0,0 +1,53 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/material.html b/static/bower_components/app-layout/app-scroll-effects/effects/material.html new file mode 100644 index 00000000..ee04b963 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/material.html @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html b/static/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html new file mode 100644 index 00000000..52fa2c02 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html @@ -0,0 +1,55 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/resize-snapped-title.html b/static/bower_components/app-layout/app-scroll-effects/effects/resize-snapped-title.html new file mode 100644 index 00000000..cbe0adc8 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/resize-snapped-title.html @@ -0,0 +1,64 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/resize-title.html b/static/bower_components/app-layout/app-scroll-effects/effects/resize-title.html new file mode 100644 index 00000000..f758801d --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/resize-title.html @@ -0,0 +1,85 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/effects/waterfall.html b/static/bower_components/app-layout/app-scroll-effects/effects/waterfall.html new file mode 100644 index 00000000..58b2fc9a --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/effects/waterfall.html @@ -0,0 +1,26 @@ + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/app-scroll-effects-behavior.html b/static/bower_components/app-layout/app-scroll-effects/test/app-scroll-effects-behavior.html new file mode 100644 index 00000000..f17ae74a --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/app-scroll-effects-behavior.html @@ -0,0 +1,189 @@ + + + + + + test for app-scroll-effects-behavior + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/blend-background.html b/static/bower_components/app-layout/app-scroll-effects/test/blend-background.html new file mode 100644 index 00000000..3ce462a5 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/blend-background.html @@ -0,0 +1,90 @@ + + + + + + test for the blend-background effect + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/fade-background.html b/static/bower_components/app-layout/app-scroll-effects/test/fade-background.html new file mode 100644 index 00000000..2cce5707 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/fade-background.html @@ -0,0 +1,99 @@ + + + + + + test for the fade-background effect + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/index.html b/static/bower_components/app-layout/app-scroll-effects/test/index.html new file mode 100644 index 00000000..214c6eeb --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/index.html @@ -0,0 +1,37 @@ + + + + + + app-scroll-effects tests + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/parallax-background.html b/static/bower_components/app-layout/app-scroll-effects/test/parallax-background.html new file mode 100644 index 00000000..7f886adb --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/parallax-background.html @@ -0,0 +1,85 @@ + + + + + + test for the parallax-background effect + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/resize-snapped-title.html b/static/bower_components/app-layout/app-scroll-effects/test/resize-snapped-title.html new file mode 100644 index 00000000..6f02e651 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/resize-snapped-title.html @@ -0,0 +1,93 @@ + + + + + + test for the resize-snappped-title effect + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/resize-title.html b/static/bower_components/app-layout/app-scroll-effects/test/resize-title.html new file mode 100644 index 00000000..949c6da2 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/resize-title.html @@ -0,0 +1,100 @@ + + + + + + test for the resize-title effect + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/utils.html b/static/bower_components/app-layout/app-scroll-effects/test/utils.html new file mode 100644 index 00000000..6793fecc --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/utils.html @@ -0,0 +1,43 @@ + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/waterfall.html b/static/bower_components/app-layout/app-scroll-effects/test/waterfall.html new file mode 100644 index 00000000..f272fad1 --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/waterfall.html @@ -0,0 +1,87 @@ + + + + + + test for the waterfall effect + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scroll-effects/test/x-container.html b/static/bower_components/app-layout/app-scroll-effects/test/x-container.html new file mode 100644 index 00000000..9fc3977d --- /dev/null +++ b/static/bower_components/app-layout/app-scroll-effects/test/x-container.html @@ -0,0 +1,100 @@ + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scrollpos-control/README.md b/static/bower_components/app-layout/app-scrollpos-control/README.md new file mode 100644 index 00000000..b8dfb117 --- /dev/null +++ b/static/bower_components/app-layout/app-scrollpos-control/README.md @@ -0,0 +1,35 @@ +##<app-scrollpos-control> + +app-scrollpos-control is a manager for saving and restoring the scroll position when multiple +pages are sharing the same document scroller. + +Example: + +```html + + + + + + + Home + About + Schedule + Account + + + +
+ + + + + + + + + +
+ +
+``` \ No newline at end of file diff --git a/static/bower_components/app-layout/app-scrollpos-control/app-scrollpos-control.html b/static/bower_components/app-layout/app-scrollpos-control/app-scrollpos-control.html new file mode 100644 index 00000000..32a74767 --- /dev/null +++ b/static/bower_components/app-layout/app-scrollpos-control/app-scrollpos-control.html @@ -0,0 +1,111 @@ + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scrollpos-control/demo/index.html b/static/bower_components/app-layout/app-scrollpos-control/demo/index.html new file mode 100644 index 00000000..8de7c8b9 --- /dev/null +++ b/static/bower_components/app-layout/app-scrollpos-control/demo/index.html @@ -0,0 +1,82 @@ + + + + + + + + + app-scrollpos-control demo + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scrollpos-control/test/app-scrollpos-control.html b/static/bower_components/app-layout/app-scrollpos-control/test/app-scrollpos-control.html new file mode 100644 index 00000000..5e5d6f93 --- /dev/null +++ b/static/bower_components/app-layout/app-scrollpos-control/test/app-scrollpos-control.html @@ -0,0 +1,69 @@ + + + + + + test for app-scrollpos-control + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-scrollpos-control/test/index.html b/static/bower_components/app-layout/app-scrollpos-control/test/index.html new file mode 100644 index 00000000..30fe0b5b --- /dev/null +++ b/static/bower_components/app-layout/app-scrollpos-control/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-scrollpos-control tests + + + + + + diff --git a/static/bower_components/app-layout/app-toolbar/README.md b/static/bower_components/app-layout/app-toolbar/README.md new file mode 100644 index 00000000..49286cd6 --- /dev/null +++ b/static/bower_components/app-layout/app-toolbar/README.md @@ -0,0 +1,43 @@ +##<app-toolbar> + +app-toolbar is a horizontal toolbar containing items that can be used for +label, navigation, search and actions. + +### Example + +Add a title to the toolbar. + +```html + +
App name
+
+``` + +Add a button to the left and right side of the toolbar. + +```html + + +
App name
+ +
+``` + +You can use the attributes `top-item` or `bottom-item` to completely fit an element +to the top or bottom of the toolbar respectively. + +### Content attributes + +Attribute | Description +---------------------|--------------------------------------------------------- +`main-title` | The main title element. +`condensed-title` | The title element if used inside a condensed app-header. +`spacer` | Adds a left margin of `64px`. +`bottom-item` | Sticks the element to the bottom of the toolbar. +`top-item` | Sticks the element to the top of the toolbar. + +### Styling + +Custom property | Description | Default +-----------------------------|------------------------------|----------------------- +`--app-toolbar-font-size` | Toolbar font size | 20px diff --git a/static/bower_components/app-layout/app-toolbar/app-toolbar.html b/static/bower_components/app-layout/app-toolbar/app-toolbar.html new file mode 100644 index 00000000..9305b27f --- /dev/null +++ b/static/bower_components/app-layout/app-toolbar/app-toolbar.html @@ -0,0 +1,121 @@ + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-toolbar/demo/index.html b/static/bower_components/app-layout/app-toolbar/demo/index.html new file mode 100644 index 00000000..2cf05a9d --- /dev/null +++ b/static/bower_components/app-layout/app-toolbar/demo/index.html @@ -0,0 +1,97 @@ + + + + + + + + + app-toolbar demo + + + + + + + + + + + + + + + Random Text + + + + + + + +
App name
+
+ + +
App name
+
+ + + +
App name
+
+ + + +
App name
+ +
+ + + +
App name
+
+ + + +
App name
+ +
+ + + diff --git a/static/bower_components/app-layout/app-toolbar/test/app-toolbar.html b/static/bower_components/app-layout/app-toolbar/test/app-toolbar.html new file mode 100644 index 00000000..67eea7e3 --- /dev/null +++ b/static/bower_components/app-layout/app-toolbar/test/app-toolbar.html @@ -0,0 +1,88 @@ + + + + + + test for app-toolbar + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/app-toolbar/test/index.html b/static/bower_components/app-layout/app-toolbar/test/index.html new file mode 100644 index 00000000..aa43d8a4 --- /dev/null +++ b/static/bower_components/app-layout/app-toolbar/test/index.html @@ -0,0 +1,25 @@ + + + + + + app-toolbar tests + + + + + + diff --git a/static/bower_components/app-layout/bower.json b/static/bower_components/app-layout/bower.json new file mode 100644 index 00000000..499fcc14 --- /dev/null +++ b/static/bower_components/app-layout/bower.json @@ -0,0 +1,45 @@ +{ + "name": "app-layout", + "version": "0.10.0", + "description": "A set of layout elements for your app", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "homepage": "https://github.com/PolymerElements/app-layout", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/app-layout" + }, + "main": "app-layout.html", + "license": "http://polymer.github.io/LICENSE.txt", + "ignore": [], + "dependencies": { + "polymer": "polymer/polymer#^1.6.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-media-query": "polymerelements/iron-media-query#^1.0.0", + "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0", + "iron-scroll-target-behavior": "polymerelements/iron-scroll-target-behavior#^1.0.0" + }, + "devDependencies": { + "font-roboto": "polymerelements/font-roboto#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-list": "polymerelements/iron-list#^1.0.0", + "iron-pages": "polymerelements/iron-pages#^1.0.0", + "iron-scroll-threshold": "polymerelements/iron-scroll-threshold#^1.0.0", + "paper-card": "polymerelements/paper-card#^1.0.0", + "paper-fab": "polymerelements/paper-fab#^1.0.0", + "paper-icon-button": "polymerelements/paper-icon-button#^1.0.0", + "paper-item": "polymerelements/paper-item#^1.0.0", + "paper-menu": "polymerelements/paper-menu#^1.0.0", + "paper-tabs": "polymerelements/paper-tabs#^1.0.0", + "paper-progress": "polymerelements/paper-progress#~1.0.2", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "paper-spinner": "polymerelements/paper-spinner#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + } +} diff --git a/static/bower_components/app-layout/build.sh b/static/bower_components/app-layout/build.sh new file mode 100644 index 00000000..360c83c0 --- /dev/null +++ b/static/bower_components/app-layout/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# + +#git checkout master +#git pull +#git checkout gh-pages +#git reset --hard master +#git push -f + +a=`find . -name "docs.html" -or -name "index.html" -not -path "*/test/*"` +b=`find . -name "*.html" ! -name 'sample-content.html' -path "*/demo/*"` + +c=(`for R in "${a[@]}" "${b[@]}" ; do echo "$R" ; done | sort -du`) + +for f in ${c[@]}; do + echo "vulcanize " $f + vulcanize --inline-css --inline-scripts $f > $f.build + mv $f.build $f +done + +#git commit -a -m "build" +#git push diff --git a/static/bower_components/app-layout/demo/contacts.json b/static/bower_components/app-layout/demo/contacts.json new file mode 100644 index 00000000..954b3905 --- /dev/null +++ b/static/bower_components/app-layout/demo/contacts.json @@ -0,0 +1,11002 @@ +[ + { + "index": 0, + "name": "Liz Grimes", + "first": "Isabel", + "last": "Conrad", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "boolean": true, + "guid": "8ea90ed8-83e1-4a28-a371-e5c0e1d0e021", + "integer": 28, + "date": "Sun Aug 14 1994 03:27:03 GMT-0700 (PDT)", + "shortText": "est ad reprehenderit occaecat consequat", + "mediumText": "Non duis commodo dolore et esse non adipisicing nisi tempor. Nisi culpa adipisicing quis dolore amet anim nulla aliqua excepteur labore. Adipisicing fugiat anim commodo velit in nisi ex exercitation.", + "longText": "Id aliqua ullamco ullamco commodo ipsum Lorem. Amet ut eu voluptate cillum occaecat Lorem et cillum excepteur ullamco mollit enim. Ea nostrud dolore culpa nulla nostrud ex voluptate anim laborum esse commodo sunt. Velit laboris pariatur labore dolore occaecat enim fugiat qui. Sit in eu ex aute minim deserunt qui consectetur laboris nostrud ad quis qui id.\r\n", + "address": "3 Vista Place", + "city": "Longbranch", + "state": "North Carolina", + "zip": 64470, + "country": "Lesotho", + "email": "isabelconrad@scentric.com", + "phone": "(817) 426-2901", + "color": "rgb(76,120,108)" + }, + { + "index": 1, + "name": "Frazier Lara", + "first": "Jocelyn", + "last": "Wooten", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "boolean": false, + "guid": "7017f9b1-690e-4c9d-8eee-f63285ca5148", + "integer": 10, + "date": "Tue May 24 1988 14:10:20 GMT-0700 (PDT)", + "shortText": "consectetur culpa adipisicing voluptate enim", + "mediumText": "Occaecat in do proident et deserunt quis commodo veniam occaecat mollit. Nulla enim elit nulla excepteur.", + "longText": "Laboris nisi cupidatat occaecat officia ea sunt ex deserunt mollit. Est laboris in amet eu reprehenderit nisi minim. Id nulla fugiat ad nostrud nostrud tempor adipisicing. Minim duis esse irure nostrud cillum cupidatat. Cupidatat proident labore id duis deserunt cupidatat do incididunt sint minim consectetur. Ea Lorem reprehenderit fugiat culpa dolore consequat exercitation labore sit sunt culpa laborum dolore.\r\nAd nisi incididunt ea ex ullamco magna tempor. Ipsum fugiat commodo reprehenderit deserunt in adipisicing. Reprehenderit aliqua mollit ut enim. Veniam ipsum occaecat nisi ut pariatur dolor magna ea tempor eiusmod adipisicing aliqua adipisicing. Fugiat irure laborum incididunt nostrud cupidatat consectetur.\r\nEx esse cupidatat exercitation aute eu est excepteur tempor consectetur elit elit amet. Ullamco sunt aliqua veniam eu eiusmod esse sit. Incididunt aute non ex irure in deserunt. Nulla sit nulla sunt quis Lorem tempor officia exercitation nulla esse ipsum. Non qui sint ullamco minim ut consequat consectetur Lorem consequat.\r\nEiusmod irure aliqua magna non ea enim incididunt. Irure ea sunt deserunt laboris qui. Officia nostrud aute commodo sit sunt nisi irure officia cillum tempor id do tempor et. Est cupidatat esse consequat laboris culpa minim exercitation laboris eu. Ea incididunt nulla fugiat est pariatur do velit consectetur. Veniam dolor mollit veniam dolore ea consequat qui dolore deserunt adipisicing officia officia eu est. Velit dolor nostrud veniam reprehenderit consectetur quis ad consequat aliquip dolore labore.\r\nIn nisi non sunt elit aute nisi elit in adipisicing excepteur ex. Anim nulla ex tempor qui nulla dolor aute fugiat et sit ipsum sunt eiusmod sunt. Irure est dolore proident qui est adipisicing minim. Sint consequat adipisicing aute amet adipisicing adipisicing. Do labore ea enim occaecat cupidatat et. Elit deserunt anim commodo ullamco. Consequat elit excepteur nisi mollit ea.\r\n", + "address": "2 Catherine Street", + "city": "Healy", + "state": "Connecticut", + "zip": 41121, + "country": "Mongolia", + "email": "jocelynwooten@scentric.com", + "phone": "(901) 441-2582", + "color": "rgb(134,91,60)" + }, + { + "index": 2, + "name": "Dora Griffith", + "first": "Valentine", + "last": "Meyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "boolean": true, + "guid": "8c3bd9ad-e8d6-4ea4-85e6-d145295f3f91", + "integer": 99, + "date": "Sat Feb 17 1973 03:45:57 GMT-0800 (PST)", + "shortText": "veniam qui", + "mediumText": "Nulla ex consectetur dolore dolore cillum. Proident dolor cupidatat consequat irure enim nostrud aliqua fugiat tempor commodo et eiusmod irure. Lorem deserunt eiusmod laborum velit tempor do nostrud reprehenderit exercitation amet occaecat eiusmod aliqua sint. Dolore commodo ex ea id veniam ullamco et cupidatat dolore. Sit nostrud minim irure sint eiusmod ea est est ipsum eiusmod.", + "longText": "Ullamco eiusmod velit labore sunt deserunt excepteur commodo sunt anim incididunt ullamco adipisicing labore Lorem. Est id nostrud ad eiusmod ad ex aliqua quis irure dolore nostrud. Aute nostrud magna tempor ex pariatur cupidatat occaecat cillum ipsum reprehenderit cillum aute proident ex. Lorem ea ipsum quis adipisicing sit exercitation ipsum. Consectetur amet nulla id amet exercitation labore minim eu nisi ullamco id do. Cillum laborum sint elit laborum eiusmod irure nulla irure.\r\nId officia mollit commodo do laborum ut officia officia. Irure reprehenderit aliqua mollit pariatur. Exercitation laborum reprehenderit fugiat nisi pariatur anim mollit magna aliquip eu labore culpa reprehenderit. Irure ad quis magna laboris nisi commodo.\r\nPariatur ea exercitation labore laborum amet et mollit. Magna tempor laboris officia commodo exercitation consectetur ullamco esse. Non cillum laborum et et nisi. Culpa laboris ad amet est minim qui ea. Consequat nulla voluptate incididunt enim qui proident consectetur et adipisicing mollit. Esse elit incididunt excepteur deserunt reprehenderit quis irure eu Lorem tempor. Qui ea pariatur laborum culpa nulla eu consectetur exercitation.\r\nDo nisi occaecat eiusmod ad cupidatat nostrud deserunt ea ex ullamco do exercitation. Sit aliqua magna Lorem tempor commodo duis duis eu ex. Do labore voluptate proident elit ad id. Lorem laboris nostrud esse occaecat. Deserunt elit nisi et labore fugiat consectetur excepteur esse culpa. Amet ipsum sunt minim sint laboris incididunt. Esse excepteur excepteur mollit ea ipsum exercitation.\r\nIn dolore nulla eiusmod exercitation culpa in voluptate voluptate ipsum dolore proident. Minim enim veniam occaecat deserunt eiusmod consectetur consectetur elit id magna laboris reprehenderit nisi. Magna enim cupidatat non laborum minim anim consequat. Exercitation cupidatat tempor irure consequat.\r\n", + "address": "4 Whitty Lane", + "city": "Nicholson", + "state": "South Carolina", + "zip": 41343, + "country": "Germany", + "email": "valentinemeyer@scentric.com", + "phone": "(956) 428-2996", + "color": "rgb(201,142,97)" + }, + { + "index": 3, + "name": "Shelley Molina", + "first": "Silva", + "last": "Alexander", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "boolean": true, + "guid": "37224065-ac71-4716-be9a-108ecddfee47", + "integer": 16, + "date": "Wed Aug 02 1995 07:03:12 GMT-0700 (PDT)", + "shortText": "laboris do velit ipsum non", + "mediumText": "Eiusmod ut magna sint ut dolor magna anim ipsum non velit. Occaecat reprehenderit ex aliquip consequat. Eu dolor non in pariatur dolore minim.", + "longText": "Cillum ullamco ullamco sunt sunt incididunt ea commodo enim nulla irure irure. Magna sunt incididunt do duis ad. Magna pariatur dolore commodo duis reprehenderit commodo aliqua anim sit deserunt veniam aute officia. Consequat non deserunt deserunt cupidatat ad do culpa. Labore aliqua aliqua ex sint ut.\r\nEnim ullamco elit eu mollit id ullamco. Tempor velit amet anim sint est ea consequat commodo ea. Aliquip magna veniam pariatur sint ullamco est aliquip do reprehenderit qui. Anim nulla occaecat commodo quis velit fugiat veniam ut.\r\nEst nisi proident id incididunt occaecat aliquip in cillum reprehenderit non et. Incididunt consectetur fugiat aute excepteur eu reprehenderit ex laboris dolore dolor reprehenderit mollit. Amet laboris ipsum ullamco id pariatur commodo excepteur est sint cillum incididunt.\r\n", + "address": "2 Berkeley Place", + "city": "Manila", + "state": "Michigan", + "zip": 22009, + "country": "Thailand", + "email": "silvaalexander@scentric.com", + "phone": "(823) 415-2224", + "color": "rgb(113,105,251)" + }, + { + "index": 4, + "name": "Rita Lopez", + "first": "Hopkins", + "last": "Wong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "boolean": false, + "guid": "1ea0922e-179d-4057-abeb-d8fe63e55da8", + "integer": 94, + "date": "Wed Sep 21 2011 04:03:55 GMT-0700 (PDT)", + "shortText": "ad esse ullamco", + "mediumText": "Fugiat nostrud et consectetur mollit labore incididunt est duis nostrud id tempor veniam ad. Nulla voluptate est irure ipsum commodo do nostrud. Minim aliqua voluptate officia sit tempor nulla esse pariatur eu. Ipsum deserunt est magna veniam adipisicing nisi aute officia.", + "longText": "Officia do consequat ullamco est voluptate voluptate. Esse tempor irure aute ullamco. Aliqua veniam esse mollit veniam elit consectetur aliqua anim. Irure aute nostrud voluptate tempor consequat ut elit elit ipsum cupidatat. Aliqua duis duis minim tempor mollit qui. Labore id adipisicing laborum commodo. Tempor aliqua velit excepteur velit laborum Lorem id amet pariatur.\r\nEt nisi reprehenderit aliquip dolore ea ut aliquip duis laboris pariatur tempor cillum. Pariatur quis mollit aliquip ut proident sunt. Est aute laboris tempor officia. Sint anim qui officia deserunt amet Lorem occaecat aliquip. In eiusmod elit anim id elit eiusmod ex veniam sit sit adipisicing aliquip.\r\nQuis irure fugiat labore ex pariatur fugiat est irure. Deserunt commodo in nostrud sit Lorem amet non quis commodo eu. Nulla voluptate id enim commodo fugiat esse qui magna nostrud occaecat. Excepteur sunt cupidatat esse consequat sit voluptate ipsum magna excepteur deserunt sunt laboris labore minim. Labore ipsum ullamco dolore sint ut aliqua id nisi sunt id ipsum ea aute magna. Consequat qui commodo velit esse anim reprehenderit ea anim ut duis et veniam deserunt. Consequat amet dolor esse cupidatat incididunt exercitation laboris esse in labore.\r\nCulpa commodo commodo veniam elit elit. Consequat proident deserunt voluptate ea ut consectetur sit ex ex proident dolore nisi. Mollit est mollit sint eiusmod mollit voluptate adipisicing tempor cupidatat nisi duis dolor irure id.\r\nEu velit aliquip consectetur mollit. Officia ipsum incididunt cupidatat occaecat consequat adipisicing. Aute cupidatat quis quis consectetur aliqua. Consequat ut eu exercitation elit Lorem incididunt sint commodo ut consectetur eu non. Pariatur pariatur ut sunt aliquip exercitation nostrud mollit cillum nostrud ea cillum.\r\n", + "address": "4 Tompkins Avenue", + "city": "Movico", + "state": "Maine", + "zip": 89440, + "country": "Seychelles", + "email": "hopkinswong@scentric.com", + "phone": "(814) 488-2063", + "color": "rgb(133,126,66)" + }, + { + "index": 5, + "name": "Wagner Shelton", + "first": "Harriet", + "last": "Sherman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "boolean": true, + "guid": "46a4a1bc-97af-46e0-aedd-c3cc42e6b8f5", + "integer": 27, + "date": "Wed Jul 07 2010 05:48:57 GMT-0700 (PDT)", + "shortText": "do dolore tempor labore", + "mediumText": "Enim exercitation incididunt minim eiusmod est enim qui ex sit. Sit duis eiusmod officia nostrud ullamco aliquip. Minim ipsum ad fugiat dolore sint nisi tempor. Anim minim sint nisi est ea id cillum adipisicing ullamco fugiat velit aute.", + "longText": "Do veniam eiusmod sint irure. Ad aute magna consequat sint enim duis ad laboris mollit dolore esse ex do labore. Minim pariatur incididunt velit nostrud proident minim sit ad ex Lorem dolore. Esse do do sit veniam officia non sunt aliquip non exercitation id aliquip voluptate elit.\r\n", + "address": "3 Stratford Road", + "city": "Makena", + "state": "Kansas", + "zip": 21389, + "country": "Chad", + "email": "harrietsherman@scentric.com", + "phone": "(887) 497-3612", + "color": "rgb(195,89,110)" + }, + { + "index": 6, + "name": "Bethany Adkins", + "first": "Stacie", + "last": "Bartlett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "boolean": false, + "guid": "17aac57d-4644-44d8-8a6b-b2eedd3d42dc", + "integer": 49, + "date": "Sun Mar 14 1999 23:13:33 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Lorem dolor sint labore minim eu ullamco cupidatat ea velit minim. Sint eiusmod dolor nisi adipisicing pariatur esse sint anim labore consectetur irure exercitation cillum. Quis labore nulla occaecat incididunt qui ex dolor voluptate sunt eiusmod sunt proident occaecat excepteur. Dolore quis magna adipisicing esse enim occaecat.", + "longText": "Aute labore ipsum id proident occaecat cillum magna commodo excepteur Lorem et ea incididunt. Labore reprehenderit minim ipsum id aliquip fugiat elit. Sit in esse aute mollit id elit sint amet minim commodo id. Esse tempor aliqua enim amet anim commodo non anim nisi.\r\n", + "address": "4 Luquer Street", + "city": "Newcastle", + "state": "Iowa", + "zip": 72190, + "country": "Uruguay", + "email": "staciebartlett@scentric.com", + "phone": "(957) 412-3261", + "color": "rgb(164,84,221)" + }, + { + "index": 7, + "name": "Angelia Rowe", + "first": "Charlene", + "last": "Stevens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "boolean": true, + "guid": "f3c6a195-d50e-479f-9c2a-c54c2a629852", + "integer": 13, + "date": "Sat Jan 04 1992 04:10:22 GMT-0800 (PST)", + "shortText": "eu reprehenderit aliquip minim", + "mediumText": "Fugiat ipsum ex irure dolore. Reprehenderit laborum proident commodo ut qui ea reprehenderit duis occaecat nostrud aliqua.", + "longText": "Esse ullamco veniam aliquip cillum aliqua veniam in consequat eu cupidatat. Ad amet reprehenderit sit anim dolor sit amet labore magna irure consequat duis cupidatat cillum. Voluptate aute consectetur ea elit labore nulla reprehenderit excepteur sit laboris sit.\r\nUllamco aliqua adipisicing velit adipisicing nulla anim cillum sunt mollit labore. Et anim aliquip adipisicing non. Exercitation consectetur nisi aute ipsum eiusmod nisi dolore. Excepteur deserunt reprehenderit occaecat sunt eu culpa ullamco proident qui excepteur. Sit proident sunt elit aliqua sit dolore deserunt officia fugiat laborum eiusmod nisi est dolor.\r\nQuis fugiat duis ullamco mollit do. Cillum cupidatat magna do id proident ut nisi do nostrud fugiat cillum incididunt. Est enim tempor labore tempor qui ipsum reprehenderit aliquip commodo quis est aute eiusmod.\r\nFugiat deserunt esse laborum labore sit nisi mollit eu dolore elit non ullamco. Velit id et quis aute esse culpa deserunt nostrud. Quis consequat consectetur fugiat ex aute sit proident aliqua dolor laboris et. Ipsum aliquip minim nostrud nostrud sunt quis eiusmod ea fugiat anim sint est duis aute.\r\nVelit aliqua cillum laboris sit officia deserunt incididunt. Consequat labore ad incididunt incididunt excepteur ex ad sunt dolore nulla qui pariatur. Cupidatat aute qui velit ipsum mollit. Aliqua veniam velit elit nostrud do consequat in in ea ea. Proident ea in qui adipisicing tempor irure qui eu ex dolore deserunt. Ipsum voluptate nulla id id culpa consectetur cillum nulla amet. Amet elit fugiat dolore anim laborum irure aute.\r\n", + "address": "4 Tiffany Place", + "city": "Dargan", + "state": "Vermont", + "zip": 31427, + "country": "Burkina Faso", + "email": "charlenestevens@scentric.com", + "phone": "(946) 404-2511", + "color": "rgb(99,147,74)" + }, + { + "index": 8, + "name": "Knox Rivers", + "first": "Reyes", + "last": "Hartman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "boolean": true, + "guid": "88e71d65-5a7a-4973-a1dc-9f5c1df485c8", + "integer": 41, + "date": "Sat May 28 1994 15:27:35 GMT-0700 (PDT)", + "shortText": "incididunt ut", + "mediumText": "Quis voluptate eu ea et id voluptate.", + "longText": "Nostrud esse proident laborum et ex. Cupidatat proident ex velit id fugiat nulla exercitation Lorem velit ullamco exercitation excepteur. Occaecat reprehenderit occaecat in in deserunt. Ea quis laborum cupidatat ullamco aliquip. Duis proident ad mollit do eiusmod non minim sint voluptate nisi in ea deserunt consequat. Nostrud aliqua voluptate sit aliqua. Do laborum dolor ex commodo irure.\r\nIrure ipsum laboris elit ullamco labore cillum consequat et esse reprehenderit culpa elit sint consectetur. Aute exercitation excepteur Lorem do occaecat voluptate ullamco ullamco commodo sint deserunt. Esse nulla laboris non dolore adipisicing fugiat enim Lorem cillum do id proident quis eu. Ullamco officia consectetur aliqua labore cupidatat anim sint. Ipsum aute aliquip magna nostrud sint officia id irure. Non ad non reprehenderit id sunt cupidatat esse tempor officia proident occaecat qui mollit ut.\r\nExcepteur excepteur ullamco aute deserunt magna laboris ipsum ullamco laborum laboris nostrud. Excepteur sunt fugiat aliquip nostrud magna cillum commodo voluptate amet ad laboris. Officia minim sint dolor nostrud fugiat. Consequat velit sint irure amet cillum enim sunt pariatur amet mollit aute ipsum cupidatat do.\r\n", + "address": "3 Wythe Place", + "city": "Coldiron", + "state": "Nebraska", + "zip": 76971, + "country": "Greenland", + "email": "reyeshartman@scentric.com", + "phone": "(910) 533-3832", + "color": "rgb(99,55,193)" + }, + { + "index": 9, + "name": "Warren Scott", + "first": "Alissa", + "last": "Duncan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "boolean": true, + "guid": "dfc23019-ab40-4597-91fe-74bcf60a9e2b", + "integer": 54, + "date": "Sun Feb 08 2009 21:57:53 GMT-0800 (PST)", + "shortText": "ullamco aliquip veniam", + "mediumText": "Officia est sint velit magna reprehenderit.", + "longText": "Eu ipsum ipsum nisi voluptate sit voluptate occaecat sunt laborum do aute. Et id amet consequat culpa sunt. Quis aliquip adipisicing velit officia adipisicing cupidatat. Sint Lorem et consequat consectetur. Anim adipisicing ullamco dolore pariatur aliquip quis aliqua qui cillum amet amet fugiat.\r\nCupidatat fugiat exercitation duis proident in esse eiusmod dolore nisi ut. Anim dolor minim elit est ex eiusmod est. In elit pariatur non non veniam nostrud consectetur.\r\n", + "address": "4 Henderson Walk", + "city": "Oley", + "state": "Florida", + "zip": 38878, + "country": "Fiji", + "email": "alissaduncan@scentric.com", + "phone": "(876) 584-3746", + "color": "rgb(218,58,52)" + }, + { + "index": 10, + "name": "Mai Shepherd", + "first": "Christina", + "last": "Craft", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "boolean": false, + "guid": "7b829e11-da52-4302-a645-4711c9af7df2", + "integer": 40, + "date": "Sat Apr 18 1992 20:34:36 GMT-0700 (PDT)", + "shortText": "culpa laboris aliquip veniam nostrud", + "mediumText": "Dolore voluptate esse eiusmod ea reprehenderit aliqua sunt magna pariatur tempor veniam ad reprehenderit nostrud. Deserunt esse fugiat enim nisi in fugiat eu. Enim sit deserunt nostrud adipisicing laboris voluptate eu do non exercitation culpa deserunt. Ullamco cillum occaecat cillum adipisicing cupidatat deserunt qui. Tempor nisi duis irure cillum occaecat ullamco cillum quis enim exercitation proident proident excepteur.", + "longText": "Quis incididunt in cillum in sit deserunt excepteur ipsum magna consectetur nulla. Incididunt cillum reprehenderit ut cupidatat proident officia commodo eiusmod id nulla aliquip aliquip anim pariatur. Sint tempor do elit nisi minim consequat cupidatat non mollit ex. Laboris ullamco laborum pariatur ea exercitation eu tempor. Aute incididunt voluptate ut nulla veniam sint. Eu aliquip labore aliquip dolore sunt reprehenderit elit labore elit aliqua reprehenderit duis quis. Esse qui pariatur nostrud nostrud irure nulla aliqua non pariatur.\r\nReprehenderit sunt consequat laborum eu tempor ad Lorem commodo consequat. Incididunt officia est incididunt aliquip mollit pariatur enim qui pariatur non anim veniam aute ullamco. Fugiat nisi aliqua ex in pariatur cillum aliquip nisi elit dolor laborum labore do sit.\r\nConsectetur non sit aliqua esse est aliqua. Deserunt consequat Lorem dolore proident elit occaecat in. Esse commodo aute minim adipisicing enim eiusmod aliqua magna ea magna. Qui proident id adipisicing non ea non quis sit. Et dolore dolore labore non consequat.\r\nNostrud qui irure laborum ipsum occaecat consectetur laboris. Sunt irure eiusmod irure labore cillum veniam enim. Do aliquip proident et amet sunt laborum dolore amet reprehenderit exercitation do id duis. Sunt magna labore minim nostrud enim laborum mollit ullamco amet laborum mollit magna consequat. Sunt eiusmod cupidatat tempor duis exercitation ad minim laboris. Magna dolor nulla et ut eiusmod incididunt Lorem anim magna. Ipsum sit sint quis eu deserunt nulla nisi ad in amet proident.\r\n", + "address": "3 Ocean Court", + "city": "Fairmount", + "state": "New Jersey", + "zip": 95002, + "country": "Viet Nam", + "email": "christinacraft@scentric.com", + "phone": "(842) 503-2389", + "color": "rgb(181,253,141)" + }, + { + "index": 11, + "name": "Flora Tran", + "first": "Burt", + "last": "Landry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "boolean": false, + "guid": "3efeb9cc-5705-4e17-b800-42ee8e354d30", + "integer": 64, + "date": "Fri Apr 30 1982 14:23:53 GMT-0700 (PDT)", + "shortText": "nostrud ipsum", + "mediumText": "Excepteur mollit velit nulla nisi culpa irure laboris cillum sunt ullamco. Laborum minim excepteur dolore ea labore Lorem eiusmod adipisicing.", + "longText": "Laborum exercitation id cupidatat voluptate cupidatat laboris id. Do exercitation dolor anim occaecat officia. Fugiat esse et aliqua incididunt consequat.\r\n", + "address": "2 Butler Street", + "city": "Walker", + "state": "Wisconsin", + "zip": 56241, + "country": "France, Metropolitan", + "email": "burtlandry@scentric.com", + "phone": "(914) 461-3510", + "color": "rgb(95,147,193)" + }, + { + "index": 12, + "name": "Crawford Jordan", + "first": "Baldwin", + "last": "Hammond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "boolean": true, + "guid": "758e8af9-6a3c-47e1-a062-b49e6263b6e8", + "integer": 80, + "date": "Sat Sep 22 2012 18:24:55 GMT-0700 (PDT)", + "shortText": "excepteur eiusmod sit irure", + "mediumText": "Ad esse ex exercitation aliqua cillum. Magna ut est nisi nisi aute enim officia excepteur aliqua. Excepteur aliqua dolor sunt mollit esse officia.", + "longText": "Esse fugiat laborum mollit labore exercitation dolor magna esse anim qui in. Excepteur proident exercitation duis laboris nostrud irure fugiat labore aute ut pariatur ea. Adipisicing labore ad laborum id et ad. Lorem laboris nulla velit pariatur ipsum. Cillum reprehenderit anim dolore mollit dolor. Ut velit veniam pariatur nisi dolor anim ut laborum cillum ut ad.\r\n", + "address": "3 Preston Court", + "city": "Vincent", + "state": "Washington", + "zip": 47560, + "country": "Uganda", + "email": "baldwinhammond@scentric.com", + "phone": "(800) 559-2165", + "color": "rgb(175,176,59)" + }, + { + "index": 13, + "name": "Stanley Williams", + "first": "Laverne", + "last": "Hampton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "boolean": false, + "guid": "718262e9-01e7-4016-b068-6edd11a14a38", + "integer": 62, + "date": "Sat Sep 27 1975 16:25:15 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt voluptate magna ullamco cupidatat laborum anim irure.", + "longText": "Duis magna nulla laborum reprehenderit ullamco ipsum irure. Exercitation veniam Lorem Lorem est commodo. In et occaecat et quis veniam quis esse ea anim cupidatat labore.\r\nDeserunt commodo est consectetur velit ullamco eu do nisi consequat culpa sunt. Nulla aliquip veniam anim reprehenderit irure occaecat sit nulla. Culpa Lorem in culpa adipisicing eiusmod aute cillum fugiat voluptate deserunt.\r\nDo do enim et tempor minim aliqua incididunt aute nulla ullamco fugiat magna occaecat in. Mollit aute sunt eu culpa enim magna nulla pariatur cillum amet quis consectetur et laboris. Ex officia nulla dolor ea aliqua est voluptate do Lorem aliquip irure. Lorem velit ad eiusmod aliquip. Amet irure amet consequat est aliqua quis.\r\nEt Lorem magna sunt aliquip dolore minim. Adipisicing ea ipsum dolore commodo labore eiusmod nisi consectetur. Reprehenderit culpa officia culpa mollit. Eu nostrud ullamco elit nostrud incididunt. Reprehenderit officia fugiat est sunt sunt consectetur Lorem ex magna reprehenderit.\r\nElit laboris eiusmod sunt cupidatat elit qui irure adipisicing culpa voluptate laborum eiusmod nisi. Ullamco magna minim enim ea veniam incididunt laborum aliqua qui minim commodo laborum. Consectetur nisi adipisicing voluptate velit ex. Id anim est sunt elit dolore qui incididunt aute voluptate consectetur exercitation. Sint tempor est laboris laborum incididunt fugiat dolor. Laboris est duis ullamco laborum eiusmod incididunt aliquip aute.\r\n", + "address": "4 Varet Street", + "city": "Breinigsville", + "state": "Oregon", + "zip": 54164, + "country": "Antarctica", + "email": "lavernehampton@scentric.com", + "phone": "(988) 478-3842", + "color": "rgb(225,78,134)" + }, + { + "index": 14, + "name": "Key Keith", + "first": "Kirsten", + "last": "Chang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "boolean": true, + "guid": "1e75c394-1574-4168-a33d-c5895f7af76d", + "integer": 47, + "date": "Tue Sep 18 1990 08:36:33 GMT-0700 (PDT)", + "shortText": "quis proident ea", + "mediumText": "Do voluptate et reprehenderit aute tempor exercitation ipsum enim quis elit dolore in quis. Veniam sunt dolore excepteur consectetur. Lorem occaecat laborum elit veniam ad commodo sint ullamco exercitation aliquip.", + "longText": "Nulla esse et consectetur in nulla nostrud laboris reprehenderit minim sit sunt nisi est fugiat. Duis elit id sit excepteur amet aute culpa incididunt. Nisi veniam ut nisi mollit sunt proident Lorem reprehenderit. Et voluptate occaecat veniam et proident ipsum non cillum aliquip laboris ad.\r\n", + "address": "4 Ryder Avenue", + "city": "Wheatfields", + "state": "Illinois", + "zip": 28092, + "country": "Kiribati", + "email": "kirstenchang@scentric.com", + "phone": "(882) 531-2818", + "color": "rgb(118,83,134)" + }, + { + "index": 15, + "name": "Lizzie Oneal", + "first": "Mercado", + "last": "Hancock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "boolean": false, + "guid": "8fbb9f3a-64df-4069-9aec-0d3dd0c2dd3f", + "integer": 22, + "date": "Thu Jan 02 1986 03:48:22 GMT-0800 (PST)", + "shortText": "cupidatat pariatur consequat incididunt", + "mediumText": "Non do dolore consequat nostrud. Ullamco dolore sunt anim incididunt aliqua minim mollit ad consectetur do ipsum.", + "longText": "Enim consequat dolor nostrud culpa cillum consequat mollit eu sint est commodo. Sit cillum minim incididunt id mollit eiusmod non nostrud sunt proident aliquip. Excepteur occaecat amet ullamco deserunt. Nisi elit excepteur commodo nisi anim incididunt consequat laboris exercitation pariatur occaecat deserunt sint. Aliquip in non quis enim cillum eiusmod duis pariatur elit proident consequat nostrud proident culpa.\r\nMollit culpa adipisicing laboris occaecat commodo id incididunt aliquip adipisicing ex ipsum elit elit adipisicing. Officia voluptate reprehenderit elit dolore. Consequat culpa officia id ut irure eu Lorem eu mollit excepteur adipisicing aute occaecat amet. Anim reprehenderit enim deserunt velit elit ut amet. Deserunt voluptate eiusmod labore tempor duis in est consequat adipisicing excepteur sunt consequat ea. Occaecat eiusmod fugiat do elit sunt.\r\nDeserunt fugiat velit mollit do culpa sunt in enim qui tempor anim esse sunt. Do eu fugiat culpa ex aliquip quis exercitation. Culpa non culpa duis magna officia dolore officia minim culpa non. Enim voluptate minim ullamco eiusmod dolore do sit non quis et anim incididunt aliqua tempor.\r\n", + "address": "4 Sumner Place", + "city": "Ruckersville", + "state": "West Virginia", + "zip": 65886, + "country": "Ecuador", + "email": "mercadohancock@scentric.com", + "phone": "(996) 557-3624", + "color": "rgb(244,178,231)" + }, + { + "index": 16, + "name": "Bentley Guthrie", + "first": "Obrien", + "last": "Bruce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "boolean": false, + "guid": "720e6095-dc65-4bef-b8bf-56b3e43c13e8", + "integer": 33, + "date": "Sat Sep 09 1989 04:51:19 GMT-0700 (PDT)", + "shortText": "nulla officia ullamco anim", + "mediumText": "Incididunt ut irure quis non ad ut tempor et labore enim Lorem eiusmod. Sit laborum elit duis pariatur occaecat fugiat labore. Laborum velit incididunt dolor minim aute aute. Cillum id amet ut in. Eiusmod tempor et fugiat do qui dolor aliquip labore mollit tempor.", + "longText": "Labore et amet excepteur ea id. Anim mollit cupidatat nulla in sint. Nulla nulla proident Lorem minim consequat ea quis. Non Lorem mollit duis aliquip labore est. Eiusmod excepteur do do eiusmod officia id nisi proident consequat. Occaecat anim eiusmod dolore nostrud culpa adipisicing commodo anim incididunt laborum.\r\nDuis occaecat qui ullamco in magna nisi ad ex. Qui laboris tempor nulla magna. Ut est nulla laboris mollit do id qui esse exercitation culpa officia exercitation. Ipsum mollit amet ad exercitation ut eu Lorem reprehenderit magna. Veniam laboris officia ea voluptate sint anim qui est quis mollit qui occaecat cillum. Officia magna deserunt eu laboris culpa proident.\r\nElit est eiusmod non dolor nisi tempor et in deserunt eiusmod veniam ea quis. Elit magna anim pariatur ea do elit in duis cupidatat incididunt quis qui laboris. Ad ad ex officia proident ullamco consequat labore nulla consequat enim.\r\nProident ut elit quis anim reprehenderit amet deserunt eiusmod sit sit velit proident deserunt sunt. Est quis magna fugiat in nisi proident. Adipisicing Lorem sint enim esse laboris sit laborum.\r\n", + "address": "2 Chester Street", + "city": "Finzel", + "state": "Mississippi", + "zip": 52444, + "country": "Bulgaria", + "email": "obrienbruce@scentric.com", + "phone": "(923) 461-2312", + "color": "rgb(52,103,133)" + }, + { + "index": 17, + "name": "Marsh Cleveland", + "first": "Pearl", + "last": "Moran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "boolean": true, + "guid": "9b385d87-2847-44f4-acae-a47970ff7c9f", + "integer": 8, + "date": "Tue Apr 26 1988 18:46:50 GMT-0700 (PDT)", + "shortText": "reprehenderit in reprehenderit dolor", + "mediumText": "Ex cillum in minim ullamco laborum. Dolor dolore adipisicing dolore ad.", + "longText": "Voluptate fugiat veniam do minim culpa. Proident irure mollit est exercitation est. Tempor pariatur proident excepteur aliquip cupidatat quis id ut fugiat excepteur tempor aliquip ea non. Consectetur ipsum Lorem reprehenderit laboris enim reprehenderit duis irure eu sint sit magna eu cupidatat. Sunt sunt laborum mollit ex fugiat ex quis. Proident quis labore occaecat est laborum quis ea irure ipsum magna ad nisi ut. Proident est culpa aliquip ullamco irure eu duis duis occaecat Lorem amet qui.\r\nMinim in adipisicing nostrud Lorem esse anim aute ullamco adipisicing ut enim magna. Cupidatat non dolor pariatur deserunt consectetur cillum dolor adipisicing. In proident commodo non exercitation cupidatat enim culpa officia voluptate. Et in sunt dolore mollit aute commodo sint et adipisicing. Labore velit esse occaecat esse commodo tempor veniam officia Lorem proident aute.\r\nEx magna aliqua adipisicing non esse labore non duis. Excepteur cupidatat eiusmod laborum laborum in quis reprehenderit id irure. Incididunt laboris qui adipisicing eu.\r\n", + "address": "4 Portland Avenue", + "city": "Henrietta", + "state": "Rhode Island", + "zip": 53764, + "country": "American Samoa", + "email": "pearlmoran@scentric.com", + "phone": "(964) 543-3486", + "color": "rgb(168,119,234)" + }, + { + "index": 18, + "name": "Maude Perry", + "first": "Underwood", + "last": "Barton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "boolean": true, + "guid": "0f6385b5-481e-4ddf-9ad4-b91f8e951922", + "integer": 33, + "date": "Wed Apr 23 2014 06:02:36 GMT-0700 (PDT)", + "shortText": "do pariatur quis consequat ex", + "mediumText": "Sunt magna elit adipisicing sint quis minim. Commodo irure pariatur esse deserunt proident enim incididunt et deserunt sit consectetur enim anim. Esse pariatur non magna culpa cillum culpa dolore ad id ex dolor deserunt. Dolore qui amet cupidatat et pariatur fugiat voluptate eiusmod duis commodo. Proident adipisicing irure eu aliquip nisi.", + "longText": "Nisi ipsum excepteur eiusmod irure velit. Elit ad nulla culpa eu sint veniam deserunt cupidatat. Esse culpa nisi velit aliquip esse consequat dolor amet velit culpa labore est do.\r\nLorem consectetur ad proident Lorem aute eiusmod sit incididunt. Pariatur sit cupidatat enim fugiat sunt ut. Aliquip mollit fugiat ea non laboris exercitation amet Lorem cillum.\r\n", + "address": "3 Mermaid Avenue", + "city": "Deputy", + "state": "Georgia", + "zip": 58449, + "country": "Angola", + "email": "underwoodbarton@scentric.com", + "phone": "(946) 414-3492", + "color": "rgb(112,197,153)" + }, + { + "index": 19, + "name": "Knapp Pratt", + "first": "Solomon", + "last": "Lloyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "boolean": true, + "guid": "895a8dab-d037-46f4-b822-795814f418d9", + "integer": 72, + "date": "Thu Apr 13 1978 08:14:17 GMT-0800 (PST)", + "shortText": "nisi quis", + "mediumText": "Officia id sint exercitation excepteur aliqua enim est id duis occaecat consectetur excepteur. Ea incididunt nulla quis ea ad et ex exercitation laboris sit sit aliquip. Est magna tempor ex commodo id aliquip nostrud aliquip id culpa quis velit excepteur.", + "longText": "Ut nostrud nisi sit sit laboris labore ea ullamco fugiat enim esse. Velit fugiat adipisicing amet amet. Sint cillum eiusmod cillum esse exercitation duis adipisicing incididunt eiusmod culpa laboris eiusmod.\r\nEu cupidatat anim mollit laboris excepteur do in voluptate. In voluptate exercitation proident commodo Lorem id. Laboris cillum dolor et eiusmod do eu. Amet veniam proident in id deserunt mollit incididunt quis exercitation sunt pariatur duis cillum proident. Sunt ad deserunt adipisicing adipisicing consectetur.\r\nLorem reprehenderit deserunt reprehenderit incididunt anim elit aliquip ipsum reprehenderit. Aliqua amet sint mollit fugiat ut est ut tempor aliquip elit laboris. Esse minim qui non aliquip exercitation dolore quis incididunt incididunt. Ullamco cillum excepteur eu duis eu id in commodo.\r\nVelit duis ullamco veniam dolore exercitation aliquip magna veniam et. Excepteur ipsum duis voluptate Lorem in veniam reprehenderit eu deserunt magna reprehenderit. Minim ullamco nostrud irure irure culpa esse. Laboris ad incididunt proident elit sit eiusmod voluptate ad culpa qui duis aute. Cillum ex esse non veniam nulla excepteur quis non.\r\nEiusmod adipisicing Lorem sunt est. Duis reprehenderit esse sint aute. Est dolore cillum minim anim Lorem adipisicing amet fugiat. Esse dolor commodo labore ea nulla ipsum nulla laboris proident consequat duis ex ut minim. Occaecat irure nostrud nulla eiusmod est aliqua proident irure laboris.\r\n", + "address": "4 Glenwood Road", + "city": "Berlin", + "state": "New Mexico", + "zip": 64625, + "country": "Bhutan", + "email": "solomonlloyd@scentric.com", + "phone": "(802) 539-3360", + "color": "rgb(69,68,176)" + }, + { + "index": 20, + "name": "Jodi Tanner", + "first": "Lyons", + "last": "Stevenson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "boolean": false, + "guid": "f6a0ef12-6a1e-48a8-990a-da79c0bbf30e", + "integer": 79, + "date": "Tue Feb 11 2003 17:16:18 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Eu laboris adipisicing nostrud in in officia pariatur irure occaecat ut consequat commodo adipisicing elit.", + "longText": "Ullamco aliquip reprehenderit Lorem id duis ipsum sit exercitation id Lorem consequat enim ea. Aliquip officia minim dolore ea aliqua non. Aliqua cillum ipsum qui commodo non nostrud eiusmod duis commodo officia et nisi. Proident cillum deserunt eiusmod ea nisi quis incididunt id consectetur qui excepteur ad ipsum. Proident non dolor eu laboris proident Lorem aliquip elit sunt eu tempor sint fugiat Lorem.\r\nId mollit veniam amet labore id. Est proident tempor qui excepteur. Ipsum non irure sint minim sint eu cupidatat eu exercitation dolor et.\r\nSunt sunt nulla et mollit eu in amet est do qui ipsum mollit. Cillum voluptate excepteur consectetur sunt laboris tempor sunt laborum mollit veniam incididunt voluptate pariatur laboris. Mollit cupidatat esse aute sunt dolore cillum cillum qui sunt duis consequat anim. Sit ad laboris et do proident ipsum veniam amet dolor. Id elit anim ut et laborum. Dolor aliqua Lorem Lorem consectetur sint sunt.\r\n", + "address": "3 Cropsey Avenue", + "city": "Lewis", + "state": "Arizona", + "zip": 89420, + "country": "Dominica", + "email": "lyonsstevenson@scentric.com", + "phone": "(818) 424-2348", + "color": "rgb(178,99,182)" + }, + { + "index": 21, + "name": "Mamie Crane", + "first": "Swanson", + "last": "Richardson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "boolean": true, + "guid": "66c048df-eefc-4c09-a468-b3044e4e7f11", + "integer": 26, + "date": "Sun Jun 30 2002 05:57:21 GMT-0700 (PDT)", + "shortText": "quis aliquip aliqua", + "mediumText": "Non ad sit sit veniam officia id officia laborum qui irure eiusmod elit reprehenderit. Voluptate cillum mollit adipisicing mollit esse commodo. Labore exercitation voluptate duis pariatur magna labore ex non cillum incididunt eu esse nostrud.", + "longText": "Anim ut amet laboris culpa velit sunt ea sunt. Do anim nisi minim labore. In cillum pariatur ex non minim sint.\r\n", + "address": "3 Aurelia Court", + "city": "Inkerman", + "state": "Texas", + "zip": 10482, + "country": "Egypt", + "email": "swansonrichardson@scentric.com", + "phone": "(810) 406-3416", + "color": "rgb(230,107,202)" + }, + { + "index": 22, + "name": "Cooley Macdonald", + "first": "Aida", + "last": "Hurley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "boolean": false, + "guid": "466a665b-b7b6-4eae-b404-e9b5a8d1641d", + "integer": 20, + "date": "Sun Jan 05 2014 15:48:57 GMT-0800 (PST)", + "shortText": "incididunt irure", + "mediumText": "Anim incididunt commodo minim voluptate enim proident aute adipisicing dolore reprehenderit commodo reprehenderit ipsum ut.", + "longText": "Id quis elit duis veniam enim cupidatat duis. Dolore proident magna minim reprehenderit Lorem. Velit tempor consequat adipisicing aute cillum exercitation eu sunt dolore.\r\nTempor ex laborum dolore voluptate aliqua in id est non. Eiusmod sunt non in culpa id magna non. Cupidatat voluptate magna aute cupidatat aliqua deserunt ut Lorem duis occaecat magna. Occaecat sit pariatur quis ipsum. Non qui non laboris cupidatat adipisicing.\r\nEst nulla aute veniam deserunt nulla labore reprehenderit reprehenderit sint. Nulla cupidatat laboris tempor labore cillum in excepteur minim laboris quis. Amet voluptate sunt in nostrud excepteur dolor in irure laborum commodo et cupidatat. Aliqua enim incididunt voluptate dolore est exercitation officia labore enim commodo quis veniam aliquip. Esse aliquip do labore eiusmod reprehenderit enim officia officia enim dolore magna dolore. Velit in sit dolore consequat.\r\nAdipisicing ea consequat voluptate proident enim commodo labore. Eu dolore ut amet aute tempor exercitation ad mollit occaecat velit non labore reprehenderit. Aute esse dolore id cillum Lorem eu quis elit exercitation ex esse sint. Sit nostrud non ullamco do esse. Voluptate velit officia eu laboris ut commodo tempor velit. Eiusmod cupidatat nostrud ex veniam sit duis. Proident fugiat laboris quis id dolor reprehenderit.\r\n", + "address": "4 Hall Street", + "city": "Stouchsburg", + "state": "District Of Columbia", + "zip": 32399, + "country": "Chile", + "email": "aidahurley@scentric.com", + "phone": "(975) 451-3272", + "color": "rgb(119,239,85)" + }, + { + "index": 23, + "name": "Snow Blankenship", + "first": "Mccormick", + "last": "Jensen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "boolean": false, + "guid": "961f5da2-2479-4f45-9132-9e89a8bc32e4", + "integer": 70, + "date": "Tue Jan 22 1974 01:18:15 GMT-0700 (PDT)", + "shortText": "aliqua commodo", + "mediumText": "Proident est sunt aliqua cillum ex sit aliquip irure ad. Pariatur dolore cillum nulla qui excepteur deserunt culpa magna consectetur et officia.", + "longText": "Culpa id veniam minim enim nulla ea enim proident. Esse sint ipsum et culpa. Cillum cillum incididunt fugiat occaecat Lorem velit. Quis esse incididunt esse sunt labore nulla. In minim ullamco officia do ad tempor. Sint sunt labore ullamco reprehenderit dolor ullamco ut occaecat.\r\n", + "address": "3 Lewis Place", + "city": "Elizaville", + "state": "Virgin Islands", + "zip": 32784, + "country": "Norfolk Island", + "email": "mccormickjensen@scentric.com", + "phone": "(961) 443-3343", + "color": "rgb(204,198,130)" + }, + { + "index": 24, + "name": "Gabriela Brock", + "first": "Ramona", + "last": "Meyers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "boolean": false, + "guid": "07133f92-9308-420e-ae7b-e5ecd657aa85", + "integer": 76, + "date": "Sat Sep 15 1984 07:22:38 GMT-0700 (PDT)", + "shortText": "ex duis do", + "mediumText": "Aliqua qui dolore laborum aute culpa eiusmod ipsum incididunt. Incididunt cillum nisi culpa ea. Incididunt reprehenderit Lorem veniam occaecat elit anim mollit deserunt.", + "longText": "Magna nostrud laboris cupidatat sint esse pariatur ut irure sint dolore laborum. Ut id aute dolor laboris. Cillum officia id officia ut. Irure incididunt dolor exercitation eiusmod sunt nostrud labore. Ad do deserunt deserunt ad elit culpa commodo pariatur. Pariatur excepteur et nisi aute. Ex amet irure anim pariatur voluptate pariatur adipisicing dolor eiusmod dolore.\r\nVelit eu consectetur sint nulla culpa laboris ex et esse. Nostrud voluptate nostrud esse nisi proident quis consequat sit commodo consectetur ut. Ea ex irure labore ullamco proident ullamco consequat sit. Ipsum sit adipisicing mollit deserunt.\r\nEst quis ea magna aliquip anim. Cupidatat ea commodo amet tempor laboris commodo eu. Duis qui irure sunt aliquip velit elit. Laboris fugiat anim officia eiusmod enim ut aliqua incididunt eiusmod ad nulla aute esse. Sit in velit amet labore non consequat id id enim labore Lorem.\r\n", + "address": "3 Rodney Street", + "city": "Orin", + "state": "Puerto Rico", + "zip": 60446, + "country": "Japan", + "email": "ramonameyers@scentric.com", + "phone": "(839) 591-3993", + "color": "rgb(236,222,59)" + }, + { + "index": 25, + "name": "Graciela Orr", + "first": "Sharp", + "last": "Lindsay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "boolean": true, + "guid": "0ea67b0a-5ea7-4e07-8d06-48b6e2a00c6e", + "integer": 39, + "date": "Mon May 25 1970 21:04:46 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Aliqua sunt commodo occaecat nisi esse aliqua labore exercitation qui in ut officia laborum ad. Tempor nisi ad aliquip ipsum nostrud nostrud et sint commodo cillum labore. Ullamco qui fugiat consectetur minim consequat cupidatat laboris. Eu irure veniam sint esse adipisicing ipsum do aliqua pariatur.", + "longText": "Tempor Lorem reprehenderit quis exercitation sit sunt labore elit. Laborum incididunt quis deserunt fugiat culpa aliquip irure esse sit excepteur. Elit elit ad et do dolore minim enim.\r\n", + "address": "2 Tech Place", + "city": "Kraemer", + "state": "Maryland", + "zip": 24019, + "country": "Saudi Arabia", + "email": "sharplindsay@scentric.com", + "phone": "(852) 538-3232", + "color": "rgb(218,74,95)" + }, + { + "index": 26, + "name": "Ethel Wood", + "first": "Dina", + "last": "Robbins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "boolean": true, + "guid": "342d8ae0-5eea-403c-9922-a85d39738463", + "integer": 22, + "date": "Sat Jun 03 1978 07:31:03 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Excepteur eu laboris magna cupidatat eiusmod nostrud laborum commodo officia sunt fugiat ad. Aliqua reprehenderit duis est consequat incididunt ullamco.", + "longText": "Pariatur velit exercitation aute adipisicing et enim laborum. Laboris anim nostrud consequat Lorem eu irure non aute eiusmod tempor veniam. Aute amet elit tempor irure occaecat esse labore elit veniam anim ea anim. Consequat excepteur esse mollit tempor mollit aute et sit duis. Labore veniam cillum enim nostrud ea laborum.\r\n", + "address": "2 Plymouth Street", + "city": "Bison", + "state": "Massachusetts", + "zip": 64340, + "country": "Micronesia", + "email": "dinarobbins@scentric.com", + "phone": "(967) 410-2522", + "color": "rgb(158,62,57)" + }, + { + "index": 27, + "name": "Tameka Francis", + "first": "Franco", + "last": "Carrillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "boolean": false, + "guid": "d193f8ac-79ea-4201-9a75-c66cbf504ad5", + "integer": 37, + "date": "Mon Jul 14 1986 03:07:27 GMT-0700 (PDT)", + "shortText": "do aliqua laborum", + "mediumText": "Est incididunt exercitation voluptate culpa ut excepteur voluptate velit est minim nulla. Mollit anim ipsum velit excepteur eu occaecat exercitation. Mollit ipsum commodo aliqua voluptate do incididunt ipsum quis.", + "longText": "Anim voluptate cupidatat labore amet. Ex pariatur duis officia commodo excepteur. Quis dolor esse quis veniam. Non veniam et fugiat quis magna. Cillum ad commodo ex cupidatat labore duis aute est cillum. Ad nostrud duis officia ea proident non veniam qui quis.\r\nEx enim duis Lorem sit adipisicing laboris occaecat amet consectetur labore. Pariatur deserunt qui veniam ad exercitation proident commodo dolore aliqua. Aliquip sit Lorem mollit est culpa sint veniam veniam adipisicing elit eiusmod ipsum deserunt. Sint eiusmod consequat occaecat exercitation commodo qui. Labore et consequat dolor voluptate dolor excepteur in anim aliquip ea ullamco labore exercitation ipsum. Mollit occaecat dolor proident ipsum ad esse mollit qui laboris. Anim reprehenderit nulla magna mollit exercitation labore minim.\r\n", + "address": "2 Harkness Avenue", + "city": "Hollins", + "state": "Oklahoma", + "zip": 57691, + "country": "Liberia", + "email": "francocarrillo@scentric.com", + "phone": "(812) 540-2032", + "color": "rgb(89,84,186)" + }, + { + "index": 28, + "name": "Hendricks Levy", + "first": "Guadalupe", + "last": "Odom", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "boolean": false, + "guid": "cb09adfd-ad50-4ada-85f2-9a6da5e61812", + "integer": 51, + "date": "Tue Sep 12 1995 23:12:02 GMT-0700 (PDT)", + "shortText": "laboris non labore elit ea", + "mediumText": "Veniam tempor cillum non deserunt duis aliquip elit velit velit do sunt est ad et. Incididunt anim id dolore reprehenderit Lorem est laborum aliqua. Cupidatat ut irure proident pariatur nulla minim nostrud minim laborum non.", + "longText": "Dolor consectetur eu Lorem ea fugiat culpa dolore magna qui magna mollit. Minim est qui eiusmod incididunt nisi ullamco incididunt irure. Tempor officia amet ea nisi elit sunt nulla dolor non labore officia ipsum sit. Esse tempor duis labore laborum cillum nostrud sunt do quis.\r\nEx quis consequat est laborum eu non consequat exercitation aute proident ea excepteur irure ex. Adipisicing nulla laborum ipsum enim dolore. Reprehenderit labore veniam Lorem qui adipisicing dolore commodo cillum anim reprehenderit cupidatat cupidatat amet.\r\nAliqua est magna incididunt amet sit et ad laboris nostrud. Labore culpa cupidatat aliquip magna tempor elit cillum ad ut irure. Ipsum irure qui ullamco aliqua ex sit do. Ut irure nisi voluptate excepteur nulla deserunt dolor dolore id ut laboris proident pariatur. Consequat est exercitation esse id nulla culpa cupidatat deserunt deserunt nostrud in est nostrud. Incididunt eiusmod non sunt deserunt reprehenderit eiusmod officia cupidatat quis ea cupidatat pariatur dolore.\r\n", + "address": "4 Terrace Place", + "city": "Salunga", + "state": "Ohio", + "zip": 43114, + "country": "Korea (South)", + "email": "guadalupeodom@scentric.com", + "phone": "(902) 544-3976", + "color": "rgb(180,227,238)" + }, + { + "index": 29, + "name": "Porter Mcpherson", + "first": "Mcguire", + "last": "Kerr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "boolean": false, + "guid": "c15b43e1-5b71-49c8-8319-7c6739d3d481", + "integer": 81, + "date": "Tue Jun 05 2012 02:47:02 GMT-0700 (PDT)", + "shortText": "do", + "mediumText": "Qui est labore deserunt velit ut adipisicing quis. Aliquip ex esse enim esse commodo duis non nisi nisi incididunt anim duis sunt magna.", + "longText": "Consequat laborum est irure eiusmod fugiat dolore fugiat do. Consequat occaecat deserunt non consectetur. Do et dolore minim dolore in ex enim.\r\nMinim pariatur tempor sit anim reprehenderit quis laboris elit veniam Lorem ipsum amet. Sunt aute reprehenderit eiusmod sint mollit proident sint veniam. Eu elit amet minim excepteur aliqua esse enim. Dolor nulla magna excepteur id nostrud Lorem magna duis.\r\n", + "address": "4 Myrtle Avenue", + "city": "Waukeenah", + "state": "Nevada", + "zip": 54957, + "country": "Pakistan", + "email": "mcguirekerr@scentric.com", + "phone": "(812) 545-2648", + "color": "rgb(122,207,233)" + }, + { + "index": 30, + "name": "Rosalie Noble", + "first": "Giles", + "last": "Miller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "boolean": false, + "guid": "490401d1-d8e8-4bd1-866c-b9ddd28804a4", + "integer": 45, + "date": "Sun Apr 21 2002 02:16:55 GMT-0700 (PDT)", + "shortText": "proident ad adipisicing duis non", + "mediumText": "Veniam esse officia laborum pariatur. Esse cillum duis sunt minim nisi irure eu in. Occaecat minim culpa adipisicing do amet in amet ipsum velit minim est. Est quis voluptate deserunt id sunt exercitation reprehenderit duis ad dolor et dolor mollit.", + "longText": "Ex dolor culpa fugiat amet esse Lorem dolor ad anim reprehenderit voluptate adipisicing. Nostrud minim laborum mollit labore Lorem officia dolor Lorem. Et voluptate in nulla id ea est duis velit. Aute adipisicing sint commodo et.\r\nNon deserunt nostrud veniam velit occaecat cupidatat adipisicing exercitation. Anim duis enim enim excepteur non voluptate mollit occaecat sunt adipisicing cillum duis. Adipisicing eiusmod nulla ex minim ipsum.\r\nLabore ea dolore fugiat culpa ad aute veniam sint id nulla sit voluptate. Esse magna cupidatat mollit eiusmod. Consectetur dolor incididunt deserunt veniam veniam voluptate elit do aute officia occaecat aliquip aliqua. Ea irure incididunt ut in elit minim et laborum minim enim culpa est do. Nostrud quis ullamco excepteur amet irure ad exercitation voluptate dolore amet pariatur non nisi.\r\n", + "address": "4 Dakota Place", + "city": "Matheny", + "state": "Montana", + "zip": 48981, + "country": "Guyana", + "email": "gilesmiller@scentric.com", + "phone": "(937) 481-3812", + "color": "rgb(117,82,141)" + }, + { + "index": 31, + "name": "Katrina Stuart", + "first": "Norton", + "last": "Carr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "boolean": false, + "guid": "f9c2cf75-a70b-45c5-8a9c-cbceae872250", + "integer": 77, + "date": "Sun May 09 1993 04:38:21 GMT-0700 (PDT)", + "shortText": "labore", + "mediumText": "Adipisicing tempor ad sit ut anim eiusmod exercitation laboris. Velit pariatur occaecat minim consectetur aliquip nostrud anim.", + "longText": "Commodo anim aliquip nostrud occaecat cupidatat quis tempor aliquip consequat dolore. Ea sit ullamco amet consequat elit. Magna magna amet in reprehenderit adipisicing amet cillum tempor qui nisi ad. Eu veniam ad adipisicing aliquip officia ut occaecat exercitation do ad irure do magna veniam. Reprehenderit nisi voluptate consectetur Lorem eu duis incididunt aliquip irure duis sit ea nostrud id. Reprehenderit reprehenderit ipsum in commodo.\r\nAd excepteur adipisicing aliqua eu veniam ullamco velit eu enim nisi reprehenderit non duis nulla. Voluptate aliqua sit sit duis exercitation ad. Incididunt incididunt quis aliqua eu anim esse reprehenderit ut aliqua. Ea id pariatur dolor dolor minim tempor laboris magna non culpa ut non. Officia Lorem proident elit consectetur excepteur dolor velit id velit minim mollit aliqua qui. Aliquip dolor sint aliqua ex tempor.\r\n", + "address": "3 Estate Road", + "city": "Zortman", + "state": "California", + "zip": 33484, + "country": "Poland", + "email": "nortoncarr@scentric.com", + "phone": "(807) 556-3727", + "color": "rgb(189,210,164)" + }, + { + "index": 32, + "name": "Katy Guzman", + "first": "Marcie", + "last": "Rose", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "boolean": false, + "guid": "0b1f8fd2-2acd-402f-aa66-728b60d1d8ba", + "integer": 62, + "date": "Mon Aug 05 1985 19:37:56 GMT-0700 (PDT)", + "shortText": "elit laborum esse", + "mediumText": "Nulla officia ex elit nulla aliqua magna cillum mollit ad sint. Fugiat consequat officia id ullamco ullamco excepteur aliquip. Occaecat esse eu veniam labore laboris laborum sint laborum esse eiusmod Lorem. Aliquip ex quis et adipisicing sunt cillum pariatur exercitation exercitation fugiat. Est velit anim esse consequat id in nisi adipisicing qui ad ex do non velit.", + "longText": "Amet dolor cillum voluptate occaecat quis cupidatat laborum commodo. Ut et quis ut proident qui do aliquip exercitation non. Ipsum ullamco commodo mollit Lorem do consectetur qui ad in cillum tempor irure consequat.\r\nVeniam laboris minim do exercitation eiusmod ut do sint reprehenderit anim irure proident proident. Quis adipisicing duis qui ut quis veniam dolor non velit consectetur eu voluptate. Duis mollit velit fugiat magna eu ullamco magna irure ipsum est tempor labore eu sint. Cupidatat ullamco nulla dolore quis commodo esse cupidatat quis sunt tempor proident. Labore ullamco ullamco ex Lorem laboris veniam mollit in sint eiusmod.\r\n", + "address": "4 Bedford Place", + "city": "Outlook", + "state": "Marshall Islands", + "zip": 74859, + "country": "Canada", + "email": "marcierose@scentric.com", + "phone": "(968) 546-3854", + "color": "rgb(211,242,218)" + }, + { + "index": 33, + "name": "Lindsay Vega", + "first": "Loraine", + "last": "Castro", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "boolean": true, + "guid": "e380ab32-0565-4177-8396-017f4ffea65f", + "integer": 16, + "date": "Thu Aug 30 1984 16:22:17 GMT-0700 (PDT)", + "shortText": "aliquip veniam duis mollit incididunt", + "mediumText": "Ut ea cillum magna nulla eiusmod velit ullamco proident quis quis duis. Culpa aliqua sint excepteur id sint velit. Ex ut consectetur occaecat officia excepteur non sit reprehenderit laboris.", + "longText": "Culpa deserunt adipisicing non anim. Elit do veniam proident incididunt dolore ut et occaecat. Ut reprehenderit commodo irure velit deserunt velit et esse nisi labore officia do nisi quis. Do reprehenderit ex exercitation tempor esse esse cupidatat. Consequat occaecat nisi adipisicing mollit excepteur adipisicing velit nostrud ex do. Et dolor labore exercitation nostrud laboris amet nostrud labore.\r\nAmet aliqua dolore velit sint non. Velit in esse aute esse nulla et quis nulla ut excepteur commodo. Culpa veniam consectetur ut ullamco minim culpa Lorem dolor aute amet qui cillum nulla id.\r\nSint excepteur in culpa occaecat minim deserunt aliquip mollit cupidatat ipsum et mollit ad deserunt. Sunt eu aliquip ut nulla cillum commodo laboris labore nisi ut dolore amet. Magna sunt ipsum ut officia pariatur dolore elit ullamco velit qui Lorem duis. Enim anim quis et incididunt aute sit consectetur. Amet non commodo exercitation quis tempor labore ex do eu et anim voluptate.\r\nIncididunt sit esse fugiat velit incididunt cillum. Est elit do deserunt elit excepteur do. Adipisicing est tempor cillum consequat.\r\nEst consectetur elit ad nisi reprehenderit tempor eiusmod culpa reprehenderit veniam anim. Mollit minim nulla commodo excepteur occaecat nulla ex deserunt irure nisi aliquip. Enim ullamco sunt duis veniam mollit nulla dolor elit nulla.\r\n", + "address": "4 Robert Street", + "city": "Ellerslie", + "state": "Indiana", + "zip": 16816, + "country": "US Minor Outlying Islands", + "email": "lorainecastro@scentric.com", + "phone": "(816) 465-3014", + "color": "rgb(76,135,180)" + }, + { + "index": 34, + "name": "Hughes Flynn", + "first": "Fry", + "last": "Harmon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "boolean": true, + "guid": "bcaa95bc-6077-4332-84f7-c432a0f25269", + "integer": 52, + "date": "Thu Sep 22 1983 12:18:11 GMT-0700 (PDT)", + "shortText": "consectetur voluptate et enim sint", + "mediumText": "Veniam duis ut aute id occaecat nisi officia qui ut anim magna eiusmod quis non. Qui duis ad nostrud et sint eu est consectetur amet ad id velit enim.", + "longText": "Cillum labore in voluptate sit pariatur laborum laboris veniam anim officia tempor. Ad nisi amet enim consequat do est est ut deserunt sunt commodo cupidatat aliqua. Irure ad dolor officia veniam commodo labore incididunt. Ex aliquip ad dolor fugiat exercitation minim cillum exercitation eiusmod velit. Aliqua minim minim exercitation dolore dolor laboris.\r\nEnim cillum do consectetur occaecat dolor nulla. Et officia culpa ad et ea irure culpa laboris ullamco ea enim aliquip proident eiusmod. Irure veniam ipsum fugiat sint exercitation deserunt commodo eu consectetur amet nostrud aute duis ullamco.\r\nAliqua minim veniam dolore exercitation non in ipsum irure et culpa irure labore excepteur exercitation. Ad reprehenderit officia deserunt velit aliqua consectetur commodo magna magna consectetur reprehenderit Lorem. Elit qui officia cillum do duis cillum. Non quis proident cillum et non deserunt elit voluptate commodo minim non. Ad occaecat dolor dolore incididunt voluptate proident.\r\n", + "address": "2 Logan Street", + "city": "Cataract", + "state": "Tennessee", + "zip": 16373, + "country": "East Timor", + "email": "fryharmon@scentric.com", + "phone": "(810) 510-3744", + "color": "rgb(157,152,156)" + }, + { + "index": 35, + "name": "Massey Merritt", + "first": "Cooper", + "last": "Sampson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "boolean": false, + "guid": "b3614dbf-f75d-410c-9a0a-8d805f386b40", + "integer": 75, + "date": "Tue Feb 03 1981 16:12:08 GMT-0800 (PST)", + "shortText": "enim ad ea mollit aute", + "mediumText": "Aute exercitation magna do veniam ea sunt qui id aliquip do eiusmod. Ipsum veniam cillum tempor labore. Est nostrud ut Lorem dolore. Id ad amet fugiat aliquip ea ut veniam nulla aliquip dolor.", + "longText": "Quis culpa quis nulla sunt proident consectetur ex reprehenderit est fugiat duis enim minim. Elit et culpa ex ipsum et amet eu quis exercitation et laborum ullamco commodo do. Tempor in elit veniam deserunt proident fugiat est ea excepteur et ipsum eu magna. Adipisicing ad elit officia ea velit veniam nostrud ullamco. Id nostrud exercitation esse labore dolore do.\r\nOfficia labore nulla amet ipsum. Reprehenderit dolore qui elit labore nisi ullamco dolor aliqua consequat sunt reprehenderit labore. Ad ea dolore anim proident quis reprehenderit quis consectetur ea.\r\n", + "address": "4 Doscher Street", + "city": "Bagtown", + "state": "Palau", + "zip": 32759, + "country": "Denmark", + "email": "coopersampson@scentric.com", + "phone": "(982) 438-3850", + "color": "rgb(248,164,122)" + }, + { + "index": 36, + "name": "Estelle Owen", + "first": "Rosa", + "last": "Velazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "boolean": false, + "guid": "bb33bd2d-a4cd-4bf2-a3f7-d82b5e108068", + "integer": 67, + "date": "Fri Jul 11 2003 11:54:17 GMT-0700 (PDT)", + "shortText": "officia consequat proident", + "mediumText": "Ex velit velit mollit consectetur eiusmod in do minim id esse excepteur nulla est. Reprehenderit incididunt deserunt ea excepteur nostrud voluptate nisi exercitation ea excepteur magna deserunt cillum proident. Exercitation minim velit sit fugiat sint ut cillum consectetur ullamco exercitation enim aliqua in aute. Laborum consequat amet aliquip laborum quis.", + "longText": "Non est irure amet eiusmod Lorem nostrud. Tempor est ut nisi nisi ullamco pariatur mollit proident eu magna sit. Amet tempor sint ut deserunt sint cillum aute anim officia mollit ex exercitation ea laborum.\r\nIn proident magna exercitation ut do. Lorem minim cillum do velit amet deserunt incididunt duis adipisicing laboris dolore officia. Sint ea id culpa labore aute sit cillum. Ut ad nisi ex culpa. Aliqua nostrud do culpa incididunt ut eiusmod nulla irure duis reprehenderit cillum. Cupidatat ea est non id cillum non adipisicing et adipisicing veniam cillum dolor ex.\r\n", + "address": "2 Wakeman Place", + "city": "Morgandale", + "state": "Virginia", + "zip": 43228, + "country": "Yemen", + "email": "rosavelazquez@scentric.com", + "phone": "(887) 500-3974", + "color": "rgb(112,251,244)" + }, + { + "index": 37, + "name": "Jamie Clarke", + "first": "Claire", + "last": "Jefferson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "boolean": true, + "guid": "44d98ab6-0a88-43f9-8c15-02c24bfe5a10", + "integer": 47, + "date": "Mon Aug 31 1992 20:48:08 GMT-0700 (PDT)", + "shortText": "aliqua nisi excepteur dolore", + "mediumText": "Aliqua ullamco labore occaecat laborum culpa anim exercitation. Deserunt cupidatat tempor id eu cupidatat magna veniam amet aute ea mollit.", + "longText": "Amet cupidatat eiusmod occaecat nostrud eu cillum culpa irure pariatur quis sit in. Ea id anim tempor duis sunt cillum veniam laborum culpa occaecat reprehenderit do commodo minim. Dolor aliquip cillum magna Lorem aliqua exercitation officia nisi id voluptate esse. Laborum occaecat velit deserunt tempor laboris sunt duis incididunt tempor dolore. Aliquip magna amet culpa culpa reprehenderit veniam commodo dolor fugiat commodo eu. Adipisicing veniam ipsum irure quis consectetur voluptate enim officia.\r\nNon occaecat proident nostrud do cillum ipsum tempor sit magna qui. Cupidatat Lorem aliqua adipisicing mollit. Consequat sint do pariatur est. Minim laborum duis eiusmod do do do qui Lorem. Labore anim laborum do fugiat tempor ut. Aliqua culpa id aliqua velit Lorem do consectetur consequat sunt aliqua.\r\n", + "address": "2 Jerome Avenue", + "city": "Cliff", + "state": "Wyoming", + "zip": 10308, + "country": "Laos", + "email": "clairejefferson@scentric.com", + "phone": "(897) 481-2359", + "color": "rgb(219,64,230)" + }, + { + "index": 38, + "name": "Louella Vincent", + "first": "Frieda", + "last": "Butler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "boolean": true, + "guid": "8169ff1e-f098-4cf7-9e00-35457f189340", + "integer": 65, + "date": "Mon Sep 09 2013 00:02:00 GMT-0700 (PDT)", + "shortText": "qui cupidatat sit velit", + "mediumText": "Sunt ad et exercitation aliqua consectetur commodo commodo adipisicing magna irure. Duis sint non duis ipsum pariatur ut pariatur dolor cillum anim et mollit laboris minim.", + "longText": "Excepteur enim laborum eiusmod exercitation aute id veniam non et ullamco. Ipsum veniam adipisicing non dolor id ad quis ex. Ipsum aliquip excepteur sunt irure adipisicing enim exercitation irure minim proident nulla ipsum id nulla. Adipisicing est do aliquip esse consectetur ipsum minim exercitation pariatur. Elit irure eiusmod commodo voluptate proident veniam quis do aliquip commodo. Amet labore incididunt exercitation commodo dolore officia ipsum ea non irure occaecat voluptate pariatur. Pariatur dolore do occaecat Lorem enim culpa cillum adipisicing incididunt labore.\r\nFugiat veniam ut culpa adipisicing cupidatat exercitation ea laboris consectetur reprehenderit nulla eiusmod ut. Tempor in non esse labore dolore labore qui duis. Duis esse consequat ex duis ea dolore voluptate id exercitation sunt eiusmod pariatur nisi ut. Excepteur amet et eu magna et.\r\nReprehenderit occaecat sunt elit cupidatat. Nostrud cupidatat id fugiat fugiat veniam mollit nostrud cillum. Laboris est ut esse cillum. Aute tempor ex veniam qui culpa deserunt mollit enim commodo velit eu. Et in adipisicing veniam sint id duis sint nulla. Ad voluptate aliquip consectetur commodo in. Exercitation ea sint non exercitation labore esse cillum.\r\nFugiat deserunt reprehenderit aliquip officia exercitation labore cupidatat pariatur aliqua in Lorem. Amet aliquip excepteur laborum do eiusmod aliqua minim anim dolore elit. Elit aute ex fugiat mollit excepteur.\r\n", + "address": "3 Rockwell Place", + "city": "Grimsley", + "state": "Colorado", + "zip": 38741, + "country": "Sierra Leone", + "email": "friedabutler@scentric.com", + "phone": "(867) 520-2422", + "color": "rgb(159,133,82)" + }, + { + "index": 39, + "name": "Schultz Rosario", + "first": "Juliana", + "last": "Gutierrez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "boolean": true, + "guid": "c238f75a-9f6d-41fe-bfc7-7035f020fdfa", + "integer": 62, + "date": "Tue Sep 13 1988 04:52:35 GMT-0700 (PDT)", + "shortText": "enim", + "mediumText": "Esse mollit anim dolore tempor qui aliqua Lorem. Eu adipisicing culpa nisi est commodo fugiat minim aute deserunt officia sint cillum.", + "longText": "Mollit enim deserunt aliqua nisi officia consectetur. Nostrud et ipsum eiusmod et. Proident nisi magna adipisicing occaecat consequat ut officia ea nisi proident voluptate duis commodo in. Aliquip velit fugiat Lorem ad est quis eiusmod consectetur dolore laborum voluptate minim nisi et. Pariatur non et elit laboris adipisicing reprehenderit laboris nisi. Ut laborum sint consectetur tempor excepteur in velit voluptate dolor ipsum consequat nisi.\r\nNon excepteur incididunt culpa incididunt et pariatur excepteur voluptate commodo esse. Commodo eiusmod duis ut cupidatat sint fugiat nisi ad anim enim. Pariatur qui ad aute deserunt do irure non quis et excepteur ullamco eu laboris. Qui enim velit minim tempor irure duis.\r\nQui id minim ullamco ex est elit Lorem aliqua officia ut cillum. Voluptate aute do qui pariatur nisi deserunt eu. Officia incididunt sit cillum consectetur anim fugiat sit et ad est tempor nulla fugiat mollit.\r\nEx magna ex do aute non esse excepteur. Est excepteur voluptate eiusmod eu esse ad eiusmod nisi ad. Quis irure laboris est fugiat aute culpa deserunt non ut mollit ea nisi occaecat enim.\r\nQuis dolore amet quis exercitation reprehenderit proident nisi excepteur veniam occaecat ipsum. Consectetur ad elit do quis mollit pariatur deserunt. Culpa qui cillum nulla incididunt incididunt ad nostrud duis. Deserunt pariatur non consequat sint occaecat ad dolor in mollit deserunt nulla laboris. Do eiusmod aute proident nulla eiusmod sunt voluptate.\r\n", + "address": "3 Loring Avenue", + "city": "Mulberry", + "state": "Utah", + "zip": 65299, + "country": "Nigeria", + "email": "julianagutierrez@scentric.com", + "phone": "(968) 541-2220", + "color": "rgb(102,250,175)" + }, + { + "index": 40, + "name": "April Mejia", + "first": "Mallory", + "last": "Gross", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "boolean": true, + "guid": "09c07ac9-6428-420c-9244-e97b458cef1c", + "integer": 95, + "date": "Mon Oct 10 1977 19:43:28 GMT-0700 (PDT)", + "shortText": "eiusmod voluptate eiusmod exercitation", + "mediumText": "Esse est laboris sint commodo enim ut fugiat excepteur pariatur eiusmod cillum. Occaecat occaecat cupidatat et occaecat do Lorem. Ad culpa sint magna tempor ex magna. Eu fugiat nisi exercitation sit ex in ad est occaecat officia ullamco pariatur non. Sit esse consequat deserunt enim.", + "longText": "Id pariatur ullamco officia excepteur. Excepteur occaecat nulla magna excepteur Lorem in laboris proident veniam veniam Lorem sint pariatur labore. Anim incididunt sint ea eiusmod tempor magna sit ullamco. Pariatur cillum id ullamco mollit tempor aute pariatur reprehenderit quis nulla quis elit. Irure duis voluptate consectetur ex anim ad. Ipsum do labore mollit commodo et cillum dolore est labore amet amet esse est. Duis et minim anim non magna sit incididunt aute consequat occaecat voluptate esse aliqua in.\r\nSint officia ad occaecat reprehenderit et velit eu consequat et esse. Occaecat et deserunt aute nulla aliqua occaecat eiusmod fugiat irure ut dolore incididunt. Ea magna magna velit consequat commodo id aliqua ad pariatur minim laborum ad.\r\nExercitation id reprehenderit enim consequat ea sunt labore cillum. Lorem tempor eiusmod elit amet velit incididunt occaecat. Amet aute tempor ea eu nostrud est velit. Amet est do duis ut do Lorem sint amet eiusmod.\r\nIrure mollit exercitation eu non. Labore ullamco do amet occaecat aute consectetur voluptate. Quis esse cillum laborum mollit exercitation. Officia quis consectetur cillum fugiat ullamco exercitation non dolore voluptate aute ex id. Ad culpa nisi quis non voluptate amet cillum in. Laborum occaecat ad aliquip aute veniam adipisicing non proident consequat voluptate commodo.\r\nVeniam anim sit officia laboris. Incididunt est ea magna nulla anim magna mollit reprehenderit adipisicing sit. Labore ex et do eu eu. Officia nostrud consectetur proident sint. Cillum dolor dolore consectetur ullamco. Reprehenderit veniam fugiat elit culpa nisi laborum magna. Consequat ea excepteur sint enim exercitation occaecat Lorem nisi culpa deserunt.\r\n", + "address": "2 Crawford Avenue", + "city": "Winchester", + "state": "Idaho", + "zip": 61697, + "country": "Netherlands", + "email": "mallorygross@scentric.com", + "phone": "(822) 493-3031", + "color": "rgb(161,51,155)" + }, + { + "index": 41, + "name": "Vicki Phelps", + "first": "Elsie", + "last": "Hahn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "boolean": false, + "guid": "1dc69b61-c106-4a7b-83c6-e05dfed45668", + "integer": 88, + "date": "Wed Mar 28 2001 03:43:02 GMT-0800 (PST)", + "shortText": "ipsum eiusmod laboris proident", + "mediumText": "Nisi incididunt in commodo duis culpa voluptate sit laborum. Consectetur do exercitation irure nostrud.", + "longText": "Eu culpa eiusmod do sit aliquip consequat. Consectetur aliquip non culpa id reprehenderit labore non dolore in voluptate voluptate. Nisi in exercitation reprehenderit fugiat duis ea consequat nostrud labore enim ut sit.\r\nAdipisicing eiusmod mollit ipsum dolor et nisi irure elit sunt laboris. Proident tempor incididunt et consectetur fugiat nisi excepteur do nisi irure aliqua. Sit aliqua sint aute ut.\r\nFugiat quis ad nisi sunt consectetur ut ullamco laboris. Ut ea laboris ipsum Lorem eiusmod incididunt. Excepteur minim adipisicing nisi exercitation enim consectetur voluptate sunt. Est consequat irure ipsum ex qui laboris tempor. Commodo duis minim ullamco labore proident minim. Aliqua aliquip cillum dolore qui nostrud. Irure adipisicing mollit tempor occaecat excepteur.\r\nCupidatat nisi adipisicing adipisicing officia consectetur et. Laborum deserunt aute non culpa in ea aliqua sit. Sit esse incididunt qui veniam quis do excepteur exercitation nisi ipsum adipisicing quis. Mollit cupidatat occaecat adipisicing nisi irure pariatur exercitation id esse id tempor sunt. Quis deserunt eiusmod dolore ut esse eu consectetur consectetur ea veniam amet adipisicing nisi. Excepteur voluptate consectetur dolor sint nisi laborum aute eiusmod ea.\r\nNon ex eiusmod dolore est ea exercitation et quis deserunt culpa nostrud aliqua. Qui non qui laboris dolor reprehenderit enim deserunt cupidatat consequat dolore ex. In voluptate pariatur ullamco non laborum velit ea minim cillum consequat eu. Est ullamco proident ad fugiat aliqua occaecat est. Nisi dolore irure velit excepteur aliquip incididunt irure non voluptate.\r\n", + "address": "2 Coles Street", + "city": "Stockwell", + "state": "Arkansas", + "zip": 39778, + "country": "Morocco", + "email": "elsiehahn@scentric.com", + "phone": "(821) 517-2066", + "color": "rgb(63,164,79)" + }, + { + "index": 42, + "name": "Faulkner Mcdaniel", + "first": "Hayes", + "last": "Ball", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "boolean": false, + "guid": "731380cb-785a-4aa3-9e6c-281953a83daf", + "integer": 85, + "date": "Fri Jul 25 1980 06:28:07 GMT-0700 (PDT)", + "shortText": "sunt magna aliquip", + "mediumText": "Pariatur ipsum adipisicing ut quis.", + "longText": "Veniam veniam enim Lorem eu mollit consectetur ea qui est pariatur. Magna occaecat sit est exercitation exercitation irure laboris enim commodo consequat tempor mollit. Id ea elit proident exercitation. Dolore reprehenderit nostrud nostrud exercitation eiusmod nulla.\r\nDo amet duis excepteur ullamco cillum velit. Consectetur adipisicing fugiat non dolore fugiat ipsum qui est elit enim consequat Lorem laboris proident. Aliquip reprehenderit ut reprehenderit anim sunt ex. Adipisicing aliquip sint Lorem minim laborum dolor minim tempor laboris. Exercitation ad aute ullamco ea deserunt adipisicing laborum fugiat proident adipisicing veniam ut veniam laborum. Id reprehenderit labore ea esse ea officia cillum. Sit sunt pariatur cupidatat mollit velit qui ut.\r\nElit mollit do non dolor quis Lorem anim aliqua occaecat aute reprehenderit irure. Sit do labore pariatur id. Anim ad veniam ea Lorem reprehenderit ipsum minim. In elit irure nulla elit elit sit in sunt incididunt magna. Pariatur commodo anim magna ut aliquip nulla nostrud commodo aliquip incididunt commodo est. Nulla enim nostrud qui commodo reprehenderit.\r\n", + "address": "2 Cheever Place", + "city": "Interlochen", + "state": "Delaware", + "zip": 14410, + "country": "Czech Republic", + "email": "hayesball@scentric.com", + "phone": "(875) 561-3839", + "color": "rgb(215,92,182)" + }, + { + "index": 43, + "name": "Wilson Booth", + "first": "Baker", + "last": "Slater", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "boolean": false, + "guid": "4357bfc6-3fa0-41e3-8a7b-0ab1f0a2e139", + "integer": 16, + "date": "Tue Aug 18 1998 18:43:53 GMT-0700 (PDT)", + "shortText": "sunt reprehenderit fugiat in est", + "mediumText": "Exercitation nisi ut enim do incididunt eiusmod cupidatat aliquip occaecat sit occaecat elit consequat sunt. Cupidatat fugiat dolor ea proident ipsum officia exercitation reprehenderit dolore elit.", + "longText": "Et in ipsum duis amet aute qui commodo fugiat eiusmod. Enim veniam nisi non sunt ex esse eiusmod. Non amet et ex cupidatat. Veniam laboris do proident et in reprehenderit incididunt ut velit enim aliqua. Quis adipisicing tempor consequat consequat commodo consequat do. Minim laboris nostrud duis tempor aliqua fugiat pariatur incididunt Lorem nostrud velit ad.\r\nAliquip commodo laborum culpa consequat aliquip voluptate irure sit excepteur reprehenderit enim ullamco veniam do. Minim elit quis laborum eiusmod incididunt proident nostrud do laboris. Deserunt non nostrud minim ut qui proident incididunt est elit pariatur nisi. Eiusmod reprehenderit sit deserunt aliqua aliqua. Reprehenderit id pariatur magna sunt fugiat labore veniam velit pariatur minim occaecat. Nostrud duis est magna ad ad consequat proident ut laboris aliquip. Magna duis est non reprehenderit minim nulla est cupidatat ut officia do sit.\r\nPariatur officia culpa ullamco sunt. Adipisicing amet amet culpa excepteur proident officia. In dolor aliqua nostrud tempor tempor elit tempor exercitation enim sint.\r\nQuis aliqua velit magna ad occaecat minim velit eiusmod ex consequat ad nisi adipisicing. Veniam et culpa sunt ex ad non ut ad in qui magna dolor nostrud incididunt. Aliquip minim elit eu exercitation pariatur irure id non occaecat id id commodo. Ea excepteur et excepteur Lorem eiusmod elit ex laborum labore et cillum cillum. Lorem consequat non culpa eu Lorem do amet nulla velit ullamco cillum.\r\nVelit nisi consectetur dolore amet irure tempor voluptate laborum. Id sit incididunt aute nostrud fugiat adipisicing incididunt excepteur anim sunt et id deserunt. Voluptate incididunt sunt anim enim laboris. Laboris id sit aliqua nisi cillum cupidatat ipsum. Laborum veniam adipisicing velit nulla eu commodo quis do.\r\n", + "address": "2 Arlington Avenue", + "city": "Welda", + "state": "Federated States Of Micronesia", + "zip": 13497, + "country": "Cape Verde", + "email": "bakerslater@scentric.com", + "phone": "(980) 527-2867", + "color": "rgb(98,119,186)" + }, + { + "index": 44, + "name": "Galloway Michael", + "first": "Martha", + "last": "Knight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "boolean": false, + "guid": "a12acd83-99f7-4c53-8849-e0c0a8aef81f", + "integer": 41, + "date": "Sun Jan 15 2006 04:41:03 GMT-0800 (PST)", + "shortText": "cillum fugiat cupidatat", + "mediumText": "Cupidatat eiusmod nisi commodo aute deserunt ea labore aute aliquip consequat voluptate aliquip aliqua sunt. Culpa cillum ex quis ad in nisi enim.", + "longText": "Enim ad pariatur esse ea officia ullamco consectetur ut adipisicing culpa voluptate Lorem do. Voluptate mollit enim dolore laboris Lorem id in Lorem aliquip mollit. Enim aliquip occaecat amet cupidatat elit dolor officia magna qui aute sit. In elit tempor pariatur sunt velit ad anim laboris do dolor et nisi anim voluptate. Proident aliquip anim veniam cillum ullamco laborum. Adipisicing occaecat voluptate deserunt ad consequat fugiat laborum aute fugiat deserunt exercitation incididunt. In do tempor amet excepteur non enim tempor excepteur reprehenderit anim sit aute.\r\nAmet ea est dolor adipisicing sit occaecat occaecat incididunt commodo. Veniam officia esse excepteur excepteur nostrud deserunt elit minim amet eu quis non. Quis duis tempor pariatur aute. Anim anim tempor in nisi Lorem do do adipisicing. Exercitation fugiat elit nisi nostrud aliquip id cillum exercitation elit non cupidatat. Irure ea nulla quis aliquip nulla ex exercitation est velit eiusmod.\r\nDeserunt aute nisi exercitation sunt aliquip aute proident incididunt dolor commodo non pariatur mollit laborum. Minim tempor deserunt labore non sit duis culpa. Commodo velit duis quis aliqua fugiat sit sint labore magna officia sunt eiusmod magna. Deserunt est nisi ad fugiat consectetur commodo voluptate amet nulla sit. Incididunt do adipisicing irure minim eiusmod aliqua et pariatur pariatur tempor irure.\r\n", + "address": "4 Willoughby Street", + "city": "Calverton", + "state": "Guam", + "zip": 21650, + "country": "Madagascar", + "email": "marthaknight@scentric.com", + "phone": "(893) 423-2241", + "color": "rgb(87,159,93)" + }, + { + "index": 45, + "name": "Mcintosh Evans", + "first": "Slater", + "last": "Erickson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "boolean": false, + "guid": "1fa2a893-38af-4f5a-8580-a8a20f0edffe", + "integer": 89, + "date": "Wed Sep 03 2003 04:11:03 GMT-0700 (PDT)", + "shortText": "eiusmod in labore id", + "mediumText": "Cillum labore pariatur in occaecat eu. Ipsum reprehenderit occaecat ipsum in id velit pariatur ut duis. Dolor esse dolor eiusmod est duis. Elit nulla commodo cillum proident tempor anim qui nulla laboris cillum occaecat consequat.", + "longText": "Id qui sunt excepteur Lorem in occaecat id. Culpa eu dolore cupidatat cillum labore aute officia. Cupidatat ex dolore excepteur aliqua sunt elit qui excepteur sit amet sint adipisicing dolore.\r\nSint consequat ullamco exercitation anim et commodo. Mollit ad aute dolor in veniam tempor ullamco nisi ex id cupidatat incididunt. Veniam cupidatat et enim aliqua laboris officia. Dolor ipsum excepteur elit enim ipsum enim est labore do amet duis cupidatat aliqua. Officia occaecat in ex enim officia id culpa sint. Aliquip magna duis ut ea aliquip duis non ad.\r\nDolor mollit exercitation reprehenderit commodo sunt aute commodo aliquip. Aute qui culpa aliquip magna in enim occaecat quis. Proident magna sunt do tempor. Minim laboris aliqua esse culpa anim. Eu laborum ut ea nostrud excepteur laboris. Velit veniam nostrud deserunt incididunt sit incididunt Lorem cillum enim ullamco ipsum cupidatat ea laborum.\r\n", + "address": "4 Meeker Avenue", + "city": "Mansfield", + "state": "Pennsylvania", + "zip": 64998, + "country": "Austria", + "email": "slatererickson@scentric.com", + "phone": "(916) 568-2718", + "color": "rgb(61,216,133)" + }, + { + "index": 46, + "name": "Garrison Conway", + "first": "Beck", + "last": "Potts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "boolean": true, + "guid": "f4aa8b8b-f3b1-4a47-9625-0213a3ab6e8d", + "integer": 90, + "date": "Thu Jun 21 1979 14:10:02 GMT-0700 (PDT)", + "shortText": "adipisicing irure", + "mediumText": "Elit do ipsum sint qui non nulla laborum aute.", + "longText": "Sint voluptate ad irure laborum. Aliqua incididunt dolore do irure enim aliquip non officia sunt nisi consectetur. Ex laborum reprehenderit dolore laborum voluptate sit adipisicing consequat adipisicing culpa nisi ipsum anim aliqua. In est fugiat officia ullamco velit ut duis sit sint anim ex minim cupidatat. Commodo incididunt cillum non adipisicing tempor. Pariatur adipisicing dolore ut aliqua magna non amet.\r\nUt ex id enim cillum veniam consectetur ipsum sit cillum. Adipisicing qui cillum mollit consequat nulla quis elit nostrud et. Cillum dolore non voluptate magna qui officia. Lorem in quis incididunt dolore ut. Adipisicing do id fugiat elit ullamco pariatur culpa nisi.\r\nCommodo culpa dolore aliqua ex ex mollit minim. Duis cupidatat ipsum sunt quis amet est minim aute Lorem non proident. Duis cillum Lorem quis velit.\r\nTempor incididunt reprehenderit eiusmod adipisicing amet exercitation. Duis occaecat eu consequat ea officia occaecat enim Lorem ullamco. Non commodo cillum sunt amet nulla ex officia ut duis sunt. Enim minim anim minim anim non minim ad magna tempor Lorem. Enim cupidatat nostrud in sunt officia occaecat esse cupidatat. Sint veniam ullamco qui consectetur duis fugiat pariatur ad proident mollit.\r\nAd consectetur elit aute sit nostrud. Culpa non esse non nostrud id anim nulla aute in laboris id duis magna cillum. Sunt cillum ut id laborum tempor reprehenderit excepteur ut velit aliqua ad ipsum ut incididunt. Eiusmod qui quis ea deserunt excepteur amet culpa eiusmod eiusmod.\r\n", + "address": "3 Troy Avenue", + "city": "Witmer", + "state": "New Hampshire", + "zip": 85501, + "country": "Venezuela", + "email": "beckpotts@scentric.com", + "phone": "(865) 596-2021", + "color": "rgb(156,172,221)" + }, + { + "index": 47, + "name": "Hopper Anthony", + "first": "Pugh", + "last": "Douglas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "boolean": true, + "guid": "d522fa57-486b-4ca9-9ee2-f4bddc8d8db0", + "integer": 32, + "date": "Wed Mar 16 1988 07:04:05 GMT-0800 (PST)", + "shortText": "ullamco sit elit", + "mediumText": "Nisi fugiat irure amet fugiat. Commodo ut nisi dolore cillum officia culpa. Veniam in duis aliquip voluptate do pariatur nostrud cupidatat amet consectetur reprehenderit id dolore. Anim adipisicing mollit ut enim aliqua ex elit aute ea culpa mollit. Sit cillum ut excepteur officia ullamco irure aute culpa elit.", + "longText": "Quis non cillum et sit enim culpa tempor. Veniam velit eu dolor pariatur in aute. Et tempor Lorem ad velit fugiat Lorem sunt aliqua exercitation laboris ad.\r\nExcepteur laboris et magna ea nostrud ut cillum. Exercitation anim cupidatat magna non pariatur id enim esse ullamco adipisicing deserunt anim. Duis sint nisi est voluptate deserunt proident anim nisi consequat labore culpa aliqua. Sit amet consequat ad occaecat cupidatat tempor eiusmod nostrud Lorem magna labore mollit in.\r\nPariatur qui anim culpa ex. In nostrud aliqua non adipisicing. Quis labore magna aliqua magna.\r\nAute commodo consectetur elit minim exercitation eiusmod non commodo. Aute deserunt non quis ullamco culpa ex et mollit nisi dolor. Minim amet eiusmod mollit esse Lorem eu reprehenderit nisi cillum eiusmod fugiat nostrud tempor duis. Officia quis commodo pariatur esse excepteur officia. In non incididunt aliquip mollit dolore ex labore.\r\nExcepteur commodo eu proident fugiat nulla. Minim excepteur consequat officia esse dolore irure qui anim culpa in deserunt consectetur laborum in. Exercitation in esse ad aliquip commodo. Irure duis pariatur eiusmod culpa enim mollit tempor Lorem qui proident ad. Qui exercitation elit culpa ex non dolor do pariatur proident. Anim ut velit minim voluptate labore in commodo excepteur irure proident amet officia cupidatat.\r\n", + "address": "3 Madoc Avenue", + "city": "Norfolk", + "state": "North Dakota", + "zip": 73808, + "country": "Hong Kong", + "email": "pughdouglas@scentric.com", + "phone": "(829) 562-3502", + "color": "rgb(70,112,74)" + }, + { + "index": 48, + "name": "Edwina Wiley", + "first": "Margo", + "last": "Hodges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "boolean": false, + "guid": "363f5f6a-2d42-4e87-845c-7cf7b881d3fa", + "integer": 26, + "date": "Fri Dec 07 2012 11:20:25 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Ex commodo sit quis commodo fugiat Lorem aliquip mollit fugiat mollit veniam.", + "longText": "Ea ea aliquip consectetur in labore eu fugiat voluptate nisi ipsum sunt. Occaecat id sit qui officia culpa laboris. Deserunt aliqua duis est sint.\r\nProident consequat occaecat cillum occaecat occaecat adipisicing laboris exercitation sit ut non dolor culpa consectetur. Ipsum ex reprehenderit veniam aliquip esse. Est commodo tempor fugiat id laborum duis do fugiat magna eiusmod eiusmod. Sit sit est anim officia consequat Lorem commodo qui velit duis. Adipisicing ipsum mollit ipsum in deserunt adipisicing ad culpa dolore. Nisi excepteur consectetur id proident fugiat proident reprehenderit magna.\r\nConsectetur duis ipsum occaecat culpa sit in. Tempor elit amet est Lorem elit consectetur fugiat tempor magna. Nulla ullamco incididunt cillum quis ea. Voluptate officia officia officia sint quis cillum sit est. Aliquip non laborum et laboris in velit dolore mollit ad dolor velit amet ut laboris. Cillum sunt irure in in eu do ullamco.\r\n", + "address": "3 Vernon Avenue", + "city": "Yettem", + "state": "Northern Mariana Islands", + "zip": 84068, + "country": "Sri Lanka", + "email": "margohodges@scentric.com", + "phone": "(852) 558-3074", + "color": "rgb(56,222,148)" + }, + { + "index": 49, + "name": "Salazar Nolan", + "first": "Polly", + "last": "Mitchell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "boolean": true, + "guid": "36295fa8-495e-4763-b920-b8e8d9e90105", + "integer": 28, + "date": "Mon May 08 2006 04:34:39 GMT-0700 (PDT)", + "shortText": "aliquip id commodo pariatur eu", + "mediumText": "Amet fugiat nisi ut eiusmod enim. Et id mollit voluptate dolore laborum cillum qui est laborum duis fugiat.", + "longText": "Qui cillum proident id irure quis sit. Sit nisi et fugiat amet exercitation eiusmod esse enim pariatur cupidatat. Esse proident velit reprehenderit fugiat.\r\nNostrud dolore eiusmod aliquip pariatur labore duis veniam laboris velit duis proident excepteur veniam. Proident fugiat velit nisi aute veniam. Irure pariatur ex eu tempor veniam nisi et eiusmod anim mollit dolore ad ex.\r\nEu quis dolor sit amet ut consequat magna nostrud quis sit. Laboris aliqua consectetur sit tempor consectetur aliqua exercitation officia minim magna duis. Laborum eu ut veniam magna. Nisi enim cillum adipisicing sint ex. Magna proident labore sint aliquip aute. Ut nulla exercitation laboris qui nulla do adipisicing voluptate do. Nulla ullamco nulla dolore cupidatat duis ea aute est ullamco.\r\n", + "address": "4 Pilling Street", + "city": "Rushford", + "state": "South Dakota", + "zip": 48734, + "country": "Turkmenistan", + "email": "pollymitchell@scentric.com", + "phone": "(891) 598-2904", + "color": "rgb(119,240,183)" + }, + { + "index": 50, + "name": "Pat Delgado", + "first": "Brown", + "last": "Perkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "boolean": true, + "guid": "ec3986d2-8262-464b-bb60-352b533f186f", + "integer": 76, + "date": "Thu Jul 17 1975 16:18:22 GMT-0700 (PDT)", + "shortText": "voluptate est labore", + "mediumText": "Duis incididunt velit nulla consectetur ut labore. Ipsum culpa consectetur quis id velit nulla mollit cupidatat magna veniam consequat. Qui elit laboris veniam amet tempor Lorem dolore. Ex voluptate officia magna ipsum nulla eu Lorem.", + "longText": "Aute proident cupidatat laboris qui officia velit amet nostrud. Aliquip cupidatat sit pariatur ut id sint duis proident laborum sint aliquip. Qui cupidatat labore quis et ut magna fugiat laboris commodo proident ad ut. Consequat aute incididunt proident in cupidatat quis nisi exercitation. Et proident qui et occaecat ea minim.\r\nMinim ex do veniam do. Aliqua commodo minim dolore voluptate ullamco ea. Aliquip ad esse aliqua exercitation laboris qui incididunt dolore eu ut.\r\n", + "address": "3 Ash Street", + "city": "Loyalhanna", + "state": "Alaska", + "zip": 49922, + "country": "Burundi", + "email": "brownperkins@scentric.com", + "phone": "(908) 488-3939", + "color": "rgb(100,214,126)" + }, + { + "index": 51, + "name": "York Marks", + "first": "Janette", + "last": "Cherry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "boolean": false, + "guid": "0da3bbca-40ca-4a5d-ab2d-dc983c50ed75", + "integer": 20, + "date": "Sat May 08 2004 23:04:24 GMT-0700 (PDT)", + "shortText": "occaecat velit fugiat dolor", + "mediumText": "Ea non aute incididunt proident sit enim officia. Ad ea eiusmod ex nisi qui duis non consectetur amet minim. Lorem magna tempor consectetur qui reprehenderit nostrud officia incididunt.", + "longText": "Anim dolore minim consequat pariatur non veniam consequat veniam et exercitation mollit eu deserunt. Duis irure duis et cillum nisi sint sit velit. Duis Lorem ut aliqua eu ullamco Lorem proident pariatur aliqua velit amet voluptate.\r\nVeniam dolore velit proident qui sint anim ea. Id ea id Lorem laborum ea aute nulla tempor elit laboris laboris nulla veniam. Laborum duis reprehenderit aute ipsum. Cillum anim nostrud dolore id ex cillum excepteur officia ipsum elit do. Veniam officia duis do consectetur sunt exercitation reprehenderit.\r\nVelit pariatur sunt enim magna elit ex ex excepteur ex id. Aliquip et amet anim non non minim veniam. Ut aliqua non exercitation commodo culpa pariatur sunt do ea.\r\nEu commodo enim pariatur pariatur. Velit anim esse irure ea id qui duis nostrud anim amet. Do enim ut aliquip elit laboris dolor culpa culpa voluptate irure ex. Est labore officia qui est incididunt proident laborum excepteur ullamco cupidatat. Velit dolore aute non dolore voluptate nisi. In id ullamco consectetur incididunt Lorem ullamco.\r\n", + "address": "3 Hubbard Street", + "city": "Beason", + "state": "Louisiana", + "zip": 10084, + "country": "Western Sahara", + "email": "janettecherry@scentric.com", + "phone": "(828) 500-2593", + "color": "rgb(100,221,172)" + }, + { + "index": 52, + "name": "Wilkinson Nelson", + "first": "Florine", + "last": "Hobbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "boolean": false, + "guid": "4fdb5837-9e84-4ee7-8c11-0bba68a3b621", + "integer": 20, + "date": "Sun Feb 26 2012 16:07:03 GMT-0800 (PST)", + "shortText": "veniam nulla incididunt", + "mediumText": "Officia amet incididunt enim duis veniam velit aute incididunt esse qui consequat. Sit nostrud tempor minim nulla excepteur est aliquip dolor esse.", + "longText": "Pariatur commodo tempor laboris nulla minim ut nostrud nostrud in non incididunt exercitation. Pariatur enim deserunt ad dolore ut laborum cupidatat et elit ullamco voluptate eiusmod. Anim labore incididunt voluptate nulla officia dolore ipsum culpa est cupidatat laborum proident.\r\n", + "address": "2 Dodworth Street", + "city": "Hall", + "state": "Missouri", + "zip": 21320, + "country": "Mozambique", + "email": "florinehobbs@scentric.com", + "phone": "(869) 544-3589", + "color": "rgb(208,253,152)" + }, + { + "index": 53, + "name": "Alta Wright", + "first": "Farley", + "last": "Santos", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "boolean": false, + "guid": "19c307c0-cabb-4ab4-8b5e-857bf94a4838", + "integer": 46, + "date": "Tue Nov 27 1973 17:48:13 GMT-0800 (PST)", + "shortText": "do mollit", + "mediumText": "Proident irure in sunt id proident. Incididunt ipsum enim cupidatat nisi qui occaecat qui esse sint mollit nulla. Officia ad eiusmod eu consectetur occaecat mollit culpa deserunt qui exercitation mollit. Duis elit dolore occaecat Lorem sit minim consectetur qui culpa. Aliqua aute irure cupidatat commodo proident labore do aliqua aliquip officia.", + "longText": "Sunt aliqua laborum enim ipsum consequat adipisicing eu consequat labore sit cillum proident veniam proident. Et et sunt commodo aute nostrud mollit labore. Consequat in eu labore in incididunt officia esse mollit in minim minim mollit duis. Enim ea anim do voluptate eiusmod ut qui velit nostrud deserunt mollit.\r\nCommodo amet duis magna deserunt eu nulla eu sunt pariatur aliqua laborum cupidatat esse in. Quis do mollit nulla eiusmod exercitation. Ea eiusmod dolore minim sunt est irure minim non exercitation dolor veniam duis.\r\nIncididunt qui ex aliqua commodo qui aliquip duis. Ea dolore est duis esse sint nisi aliqua exercitation aute aliqua. Enim deserunt laboris eu eu duis nisi eu sint. Mollit est eu cillum excepteur id sit labore occaecat culpa minim adipisicing magna nulla.\r\nAd minim exercitation sunt nostrud quis. Fugiat quis officia officia irure aute eiusmod. Quis in officia do dolore duis duis. Veniam ipsum aute mollit officia pariatur deserunt. Reprehenderit adipisicing ipsum ut qui ex cupidatat sunt id nostrud reprehenderit. Eu incididunt magna duis et nisi minim exercitation laboris nisi. Adipisicing consectetur occaecat enim ad nisi voluptate ut aliquip ea labore do nulla laboris.\r\n", + "address": "3 Hanson Place", + "city": "Madaket", + "state": "Kentucky", + "zip": 95242, + "country": "Grenada", + "email": "farleysantos@scentric.com", + "phone": "(808) 507-2955", + "color": "rgb(143,68,160)" + }, + { + "index": 54, + "name": "Ivy Sparks", + "first": "Gray", + "last": "Paul", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "boolean": false, + "guid": "13f75baf-1bd4-4e7d-b527-a007260fe0bf", + "integer": 12, + "date": "Thu May 18 2000 12:52:37 GMT-0700 (PDT)", + "shortText": "laborum veniam ipsum", + "mediumText": "Consequat sit labore esse culpa ex officia eu enim ad sit. Deserunt consequat magna anim adipisicing eu est ipsum mollit est in. Proident et excepteur consectetur cupidatat eu aute ea magna amet qui ea culpa.", + "longText": "Dolore laborum anim sunt ea. Incididunt velit velit Lorem incididunt reprehenderit ea. Cupidatat esse laborum consectetur minim eiusmod nostrud occaecat. Elit esse cupidatat culpa tempor dolor laboris ad.\r\nIpsum ad veniam laboris eiusmod deserunt esse qui ullamco culpa magna sunt cupidatat ad. In pariatur aliquip voluptate quis voluptate qui. Minim ea velit excepteur eiusmod Lorem id consectetur tempor ex occaecat laboris ut tempor officia. Sunt irure exercitation ipsum sint elit amet duis irure.\r\n", + "address": "2 Conklin Avenue", + "city": "Sardis", + "state": "American Samoa", + "zip": 99662, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "graypaul@scentric.com", + "phone": "(896) 543-3314", + "color": "rgb(180,93,104)" + }, + { + "index": 55, + "name": "Henrietta Riddle", + "first": "Roman", + "last": "Dunlap", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "boolean": false, + "guid": "51bc59d2-dab6-443d-98ea-8171f77ad676", + "integer": 79, + "date": "Mon Oct 22 2007 23:28:02 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Est ex duis aliqua in adipisicing enim eu eiusmod consectetur. Reprehenderit nostrud aliquip sit nulla proident eu reprehenderit et minim do. Eiusmod laborum dolor ipsum exercitation nisi amet labore eu do laboris labore. Ad enim ut sunt anim reprehenderit culpa reprehenderit duis ullamco mollit.", + "longText": "Anim commodo voluptate eu voluptate voluptate sunt ipsum irure ipsum mollit cillum anim anim reprehenderit. Nulla ut reprehenderit enim occaecat consequat. Cupidatat Lorem eu qui id id adipisicing incididunt et cillum. Id enim sit cupidatat nulla ut enim consequat est sit sit culpa. Labore do consectetur pariatur qui labore proident dolor consectetur pariatur sit do tempor Lorem dolore. Et incididunt sint aliquip occaecat non dolor aute ea.\r\n", + "address": "2 Anna Court", + "city": "Stollings", + "state": "Minnesota", + "zip": 49877, + "country": "Philippines", + "email": "romandunlap@scentric.com", + "phone": "(852) 477-2611", + "color": "rgb(73,51,135)" + }, + { + "index": 56, + "name": "Odom Hicks", + "first": "Meyer", + "last": "Blackburn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "boolean": false, + "guid": "5cd1a911-4464-4653-9db3-05e55a0f306b", + "integer": 20, + "date": "Mon Jul 24 1978 17:22:48 GMT-0700 (PDT)", + "shortText": "excepteur ex cupidatat ipsum", + "mediumText": "Proident excepteur nostrud sint voluptate ad sint. Exercitation commodo amet nostrud occaecat sunt officia nulla eu. Adipisicing enim velit officia proident sint minim laboris magna officia laborum do occaecat pariatur laboris. Commodo minim ipsum anim amet esse deserunt in ea ad.", + "longText": "Incididunt est pariatur est culpa dolor duis dolore sunt duis dolor qui laboris. Aliqua dolore nostrud dolor commodo esse ex laborum proident et anim. Ut consectetur in minim minim officia mollit id quis. Tempor aliqua dolore esse culpa.\r\nNostrud duis est minim pariatur reprehenderit in qui do nulla non id. Incididunt magna enim reprehenderit incididunt magna tempor duis esse sunt esse commodo. Nulla ex anim laborum laboris. Culpa officia anim reprehenderit ex laboris labore proident exercitation deserunt deserunt ipsum ea esse et. Laborum laborum eiusmod Lorem consectetur consequat. Aute tempor voluptate laboris pariatur amet esse ut labore dolore sint qui. Occaecat aliqua excepteur sit labore.\r\n", + "address": "3 Bleecker Street", + "city": "Albrightsville", + "state": "Hawaii", + "zip": 67670, + "country": "Bermuda", + "email": "meyerblackburn@scentric.com", + "phone": "(812) 415-2585", + "color": "rgb(132,80,57)" + }, + { + "index": 57, + "name": "Dalton Bishop", + "first": "Schwartz", + "last": "Garcia", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "boolean": true, + "guid": "cb6c4011-ab62-4469-bdd6-120762fbd8dc", + "integer": 31, + "date": "Thu Aug 29 2013 04:23:49 GMT-0700 (PDT)", + "shortText": "irure cupidatat adipisicing", + "mediumText": "Elit esse aute dolor officia cupidatat adipisicing duis fugiat aliqua nisi nisi. Culpa reprehenderit consequat voluptate proident in deserunt tempor sint amet ad pariatur. Mollit incididunt magna ullamco deserunt commodo excepteur esse esse commodo duis elit est duis. Sunt amet nisi dolor id laboris dolor exercitation ex exercitation proident pariatur anim. Duis nisi occaecat fugiat tempor sint est incididunt laboris cillum consectetur non cillum.", + "longText": "Eu esse Lorem veniam et dolor. Ad laboris exercitation adipisicing voluptate culpa ullamco ad non sunt ad veniam sit officia consequat. Est ea fugiat consectetur duis aliquip id in reprehenderit. Tempor officia enim tempor aliqua eu. Ut tempor duis minim ea eu proident. Nisi non eiusmod do tempor proident et commodo nisi nisi occaecat. Ullamco cupidatat eiusmod ex magna cillum nisi est.\r\nNisi consequat qui reprehenderit laboris dolor esse Lorem officia dolore ipsum exercitation do. Nulla nulla eiusmod nostrud incididunt ad elit ea non eiusmod incididunt reprehenderit culpa minim. Sint aliqua magna aliquip et magna. Fugiat ut voluptate irure aliquip consequat ut exercitation minim amet enim culpa.\r\nCulpa est pariatur aliquip non amet eu elit veniam Lorem velit nulla aute. Excepteur do commodo minim eu commodo dolore. Ex dolore ea irure adipisicing Lorem labore. Ipsum sit consequat aliquip tempor est. Labore deserunt incididunt et occaecat dolore est laborum exercitation exercitation dolore. Fugiat ipsum est proident anim ullamco ipsum labore fugiat consequat velit. Anim elit cillum ex laborum ad exercitation voluptate ad magna Lorem voluptate tempor.\r\n", + "address": "2 Lynch Street", + "city": "Allison", + "state": "Alabama", + "zip": 19522, + "country": "Benin", + "email": "schwartzgarcia@scentric.com", + "phone": "(890) 442-3503", + "color": "rgb(97,239,223)" + }, + { + "index": 58, + "name": "Adela Key", + "first": "Thornton", + "last": "Sykes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "boolean": true, + "guid": "8b7914e5-a64e-4c6a-aa82-b62d133a71b4", + "integer": 13, + "date": "Fri Jul 22 1983 16:03:00 GMT-0700 (PDT)", + "shortText": "nisi laboris duis ullamco", + "mediumText": "Aute aliqua adipisicing adipisicing nisi anim veniam adipisicing commodo. Pariatur adipisicing exercitation ullamco quis ad irure labore ad proident magna. Ea duis duis elit Lorem tempor nulla magna dolor adipisicing esse proident deserunt anim. Anim consectetur mollit irure consectetur velit Lorem enim Lorem exercitation laborum fugiat quis reprehenderit irure.", + "longText": "Minim occaecat consequat pariatur pariatur elit amet. Ex nostrud amet in cillum esse id laborum do velit. Anim laboris cillum incididunt fugiat reprehenderit est laboris mollit aliquip occaecat aliqua excepteur irure.\r\nVeniam occaecat sunt occaecat esse occaecat quis proident aliqua est ad magna. Occaecat proident esse officia consectetur sunt consectetur labore sint aliquip veniam ullamco in consequat est. Eiusmod labore amet id nulla tempor ad.\r\nDeserunt anim ea duis eu laborum aliqua exercitation. Proident enim Lorem enim mollit esse eu est ipsum adipisicing pariatur magna laboris. Excepteur exercitation labore ut qui velit do nulla. Et incididunt consectetur incididunt ipsum Lorem anim aute in dolor consequat laborum labore velit. Adipisicing duis voluptate duis deserunt dolore. Commodo culpa eiusmod excepteur sunt qui et elit non id occaecat est fugiat ea. Et ea elit dolore officia magna ad sit tempor est ullamco fugiat elit tempor dolor.\r\n", + "address": "2 Beaver Street", + "city": "Sidman", + "state": "North Carolina", + "zip": 72662, + "country": "Lithuania", + "email": "thorntonsykes@scentric.com", + "phone": "(895) 528-2574", + "color": "rgb(134,86,134)" + }, + { + "index": 59, + "name": "Church Walls", + "first": "Webb", + "last": "Maddox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "boolean": true, + "guid": "446ed374-2f83-4fc6-933b-60892c7e61f6", + "integer": 97, + "date": "Fri Jun 11 1993 04:18:26 GMT-0700 (PDT)", + "shortText": "officia sint amet aute aliquip", + "mediumText": "Consectetur reprehenderit duis dolor duis sint adipisicing elit anim incididunt labore aliquip enim sit adipisicing.", + "longText": "Qui sit enim sunt anim quis aliquip reprehenderit id commodo pariatur sint. Ex aliquip quis voluptate id incididunt. Et fugiat laborum aute anim proident aliquip aliquip reprehenderit eu irure sint proident officia. Ipsum in commodo sint enim consectetur aliqua laboris ea proident ex. Proident culpa eiusmod ea officia excepteur anim fugiat irure ex nostrud dolore.\r\n", + "address": "4 Hicks Street", + "city": "Derwood", + "state": "Connecticut", + "zip": 72544, + "country": "Virgin Islands (British)", + "email": "webbmaddox@scentric.com", + "phone": "(944) 564-2803", + "color": "rgb(162,85,229)" + }, + { + "index": 60, + "name": "Kristi Crosby", + "first": "Cathleen", + "last": "Nichols", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "boolean": true, + "guid": "7a7ad168-8ae8-492d-956e-c2a16f8578e9", + "integer": 92, + "date": "Sun Jan 01 1989 18:01:36 GMT-0800 (PST)", + "shortText": "adipisicing Lorem velit quis", + "mediumText": "Velit esse consequat exercitation eu excepteur officia minim laborum cupidatat officia id ad amet occaecat. Dolor officia qui est ea nisi non.", + "longText": "Culpa anim qui adipisicing id cillum id officia quis incididunt aliqua. Anim excepteur dolore proident amet. Cillum sunt quis pariatur proident esse Lorem eiusmod et eiusmod non. Ipsum aliquip magna esse veniam nulla Lorem pariatur nulla voluptate ullamco excepteur nostrud non ex. Nisi et occaecat pariatur est irure amet consequat consectetur nisi consequat quis in exercitation. Culpa eu amet laborum ullamco do mollit mollit.\r\nIrure aliqua dolore nulla occaecat ipsum minim Lorem dolor Lorem ut. Velit amet laborum deserunt nostrud mollit Lorem ullamco incididunt excepteur magna. Eiusmod tempor pariatur anim do esse laborum sint ea elit excepteur. Commodo cillum cupidatat duis dolor ad laboris occaecat. Occaecat ad nostrud amet exercitation laborum eiusmod.\r\nAliquip ullamco officia ullamco do mollit amet non. Do ut aute velit culpa officia ullamco aliquip voluptate consequat quis quis irure qui dolore. Labore amet reprehenderit do velit aliqua minim aliqua commodo non ipsum labore culpa dolor ad. Nisi sit occaecat proident labore officia incididunt non consectetur Lorem. Consequat anim dolore duis esse ad aliqua ea sit ad ex. Consectetur est id non esse aliqua sit ut adipisicing commodo aliqua. Exercitation nisi consectetur tempor nulla.\r\nLorem in consectetur anim fugiat dolore duis fugiat. Nisi Lorem velit occaecat cillum consectetur ipsum aliqua velit et. Do cupidatat enim sit duis eu labore officia nostrud nisi qui.\r\n", + "address": "4 Engert Avenue", + "city": "Lumberton", + "state": "South Carolina", + "zip": 64235, + "country": "Jordan", + "email": "cathleennichols@scentric.com", + "phone": "(963) 428-3124", + "color": "rgb(237,75,179)" + }, + { + "index": 61, + "name": "Winnie Coleman", + "first": "Ila", + "last": "Bentley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "boolean": false, + "guid": "2d8a81c0-1dd7-4c00-a89f-473446addf54", + "integer": 38, + "date": "Tue Jun 30 1998 19:23:01 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Ex velit voluptate aliquip adipisicing eiusmod. Occaecat aliqua voluptate nisi nostrud est sit sunt qui. Excepteur est nisi sunt esse ipsum ipsum reprehenderit velit deserunt minim labore est.", + "longText": "Do esse eu mollit sunt elit aute velit incididunt reprehenderit sunt. Ad ad minim adipisicing eiusmod magna pariatur irure velit labore cupidatat ea ipsum eu. Ipsum consequat ut in minim aliqua.\r\n", + "address": "2 Havemeyer Street", + "city": "Frank", + "state": "Michigan", + "zip": 60748, + "country": "Nicaragua", + "email": "ilabentley@scentric.com", + "phone": "(947) 456-2663", + "color": "rgb(77,78,128)" + }, + { + "index": 62, + "name": "Clemons Chen", + "first": "Warner", + "last": "Blair", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "boolean": true, + "guid": "1d9dfc0f-0e70-4189-9a2d-d134505173d7", + "integer": 28, + "date": "Sat Sep 12 2009 19:12:02 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Exercitation non labore et duis et Lorem est et irure fugiat dolore officia ex.", + "longText": "Ea aute eiusmod ipsum ipsum eu nostrud. Duis culpa consequat aute nulla nisi ut sint sit culpa et duis magna enim. Nisi sunt dolore minim quis do. Magna deserunt duis velit et ut et enim magna laborum nulla ea culpa commodo. Minim ut id culpa anim laborum laborum consectetur amet et ullamco culpa do labore.\r\nEst magna aliquip ea ullamco. Exercitation deserunt occaecat id in ut sit laborum aute. Ex ut ex anim cupidatat do amet proident mollit. Dolor magna irure id culpa. Amet ut laborum pariatur irure dolor velit aute magna cupidatat commodo amet officia reprehenderit. Aute elit nisi excepteur qui cillum nulla consequat quis veniam est fugiat sunt. Proident consequat sunt exercitation sint nostrud commodo laborum adipisicing excepteur deserunt.\r\nEiusmod sunt consequat enim non irure excepteur adipisicing. Ad id veniam consectetur fugiat excepteur ex non et velit ut Lorem. Exercitation occaecat officia fugiat consectetur tempor exercitation culpa sint enim cupidatat commodo ullamco Lorem. Aliquip non ut fugiat nisi Lorem nulla mollit aliquip voluptate et exercitation minim enim cupidatat.\r\nElit do est amet nulla aliquip proident consectetur aliquip. Lorem nulla incididunt laborum in proident. Lorem veniam enim tempor non consectetur et ea non elit. Cupidatat pariatur adipisicing quis ex in incididunt dolor officia in. Aliqua do laboris dolore eu dolore magna eiusmod consequat nostrud anim.\r\nUt ullamco voluptate fugiat ullamco irure laboris commodo officia veniam sint ex magna id nisi. Qui occaecat sit deserunt aliqua veniam. Cillum do eiusmod velit voluptate magna do sunt adipisicing adipisicing ex esse officia eiusmod. Consectetur minim sint pariatur eiusmod ipsum anim. Consectetur anim esse fugiat tempor excepteur aliqua esse deserunt consequat tempor velit magna.\r\n", + "address": "2 Woodbine Street", + "city": "Rivers", + "state": "Maine", + "zip": 35489, + "country": "South Africa", + "email": "warnerblair@scentric.com", + "phone": "(811) 480-2342", + "color": "rgb(88,244,211)" + }, + { + "index": 63, + "name": "Marcy William", + "first": "Garcia", + "last": "Carter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "boolean": false, + "guid": "bb80a091-a78d-4187-ab75-c5e5a6cb2362", + "integer": 3, + "date": "Wed Mar 20 1974 00:41:43 GMT-0700 (PDT)", + "shortText": "amet", + "mediumText": "Deserunt officia laboris velit enim do cillum enim. Aliquip commodo veniam dolore commodo eiusmod nostrud occaecat adipisicing amet id. Incididunt cillum sunt esse consequat magna eiusmod ex culpa. Aliquip irure excepteur sunt esse incididunt et sint.", + "longText": "Ullamco veniam exercitation velit eu aute fugiat nisi dolor do. Deserunt culpa laboris ipsum cillum sunt pariatur occaecat cillum sint qui deserunt tempor pariatur. Ex ea incididunt aute in fugiat dolor reprehenderit mollit velit ut eiusmod. Veniam sunt sit officia sint Lorem fugiat dolor commodo amet culpa. Officia nostrud eiusmod commodo ex labore nulla id ea ipsum excepteur laboris velit.\r\nFugiat eiusmod laboris pariatur labore. Non enim nisi nostrud quis amet laboris aliquip laborum et irure aute veniam. Anim ullamco in officia commodo aliqua minim. Amet in enim nostrud pariatur id est occaecat ad occaecat. Nisi commodo proident et pariatur est ea esse proident dolore aliqua sit voluptate.\r\nEt est fugiat duis cillum veniam nulla. Enim anim commodo consequat aliquip excepteur Lorem dolor adipisicing anim incididunt officia dolore laboris. Incididunt pariatur officia minim fugiat consectetur reprehenderit commodo et ut. Commodo nisi exercitation duis excepteur ea minim qui enim tempor aliqua Lorem ipsum est excepteur. Ullamco veniam occaecat excepteur et laborum. Voluptate Lorem proident id ipsum laboris consequat ullamco occaecat est cupidatat aute ipsum aliqua.\r\nAnim mollit laboris amet dolor occaecat tempor id. Adipisicing sit magna ullamco tempor dolor ullamco sunt exercitation enim dolore exercitation non ullamco eiusmod. Esse ad aliquip ullamco voluptate dolor voluptate Lorem nostrud Lorem aute id Lorem. Laborum nulla ex pariatur anim irure cillum veniam eiusmod commodo.\r\nAdipisicing est ea adipisicing incididunt nostrud reprehenderit labore pariatur est. Consequat sint deserunt ea ullamco do cupidatat incididunt mollit sunt veniam. Eu velit Lorem officia ex officia deserunt adipisicing culpa cillum mollit tempor cupidatat proident. Qui aliquip labore sunt commodo veniam aliqua est cillum. Ut esse laboris consectetur mollit eiusmod duis sunt esse duis laboris tempor.\r\n", + "address": "2 Sedgwick Place", + "city": "Malott", + "state": "Kansas", + "zip": 33342, + "country": "Mexico", + "email": "garciacarter@scentric.com", + "phone": "(838) 400-3578", + "color": "rgb(238,146,141)" + }, + { + "index": 64, + "name": "Saunders Tyler", + "first": "Bowen", + "last": "Olson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "boolean": false, + "guid": "81275503-dc66-4920-a852-66b9bb420ab7", + "integer": 83, + "date": "Sat Jun 05 2004 18:02:53 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Cillum eiusmod sit aliquip magna excepteur occaecat adipisicing culpa. Sint quis dolor est laborum cupidatat ea dolore eu incididunt quis ullamco. Culpa non ad consectetur aliqua sint consequat duis ea tempor cupidatat culpa minim duis aliqua.", + "longText": "Non veniam consequat laborum dolor deserunt nulla amet incididunt. Velit eu ut adipisicing labore nisi. Aute ea ex esse reprehenderit quis officia do. Labore dolor elit ea aliqua. Ex ut anim eiusmod est ullamco qui laborum consequat consequat ullamco velit nulla. Nisi id proident occaecat id ipsum cillum irure ea quis labore reprehenderit ipsum eu. Ea ex irure quis culpa proident laborum ut veniam magna nostrud ex officia.\r\nTempor ut sint sunt fugiat commodo dolore irure qui enim mollit. Lorem id cillum nulla ullamco amet. Proident anim proident ea ut aliquip in elit. Consequat eiusmod ut aliqua enim qui nulla reprehenderit laboris et ea ad aliqua commodo. Excepteur in proident irure esse.\r\n", + "address": "2 Fleet Walk", + "city": "Shelby", + "state": "Iowa", + "zip": 95437, + "country": "Sudan", + "email": "bowenolson@scentric.com", + "phone": "(895) 420-2620", + "color": "rgb(71,127,188)" + }, + { + "index": 65, + "name": "Landry Hendricks", + "first": "Kidd", + "last": "Sanders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "boolean": true, + "guid": "c1d57dbd-5b06-44aa-bf5b-ffa5bb4cc5ba", + "integer": 15, + "date": "Sat Oct 19 1996 17:52:51 GMT-0700 (PDT)", + "shortText": "elit duis", + "mediumText": "Laboris irure quis ipsum consequat consectetur culpa aliqua in.", + "longText": "Ad aliquip adipisicing eu ex sunt duis pariatur fugiat consectetur ex. Reprehenderit do Lorem velit et tempor. Duis ad ad minim dolore excepteur ex nostrud officia. Elit aute aliqua laboris enim velit esse ullamco. Cupidatat non sunt laborum labore eu aliqua exercitation ea. Mollit ex non consectetur ad ex. Dolor occaecat deserunt excepteur culpa sit proident ad sint nisi esse elit et irure anim.\r\nCupidatat ullamco aliquip in commodo laboris elit minim ad. Sit esse nulla et ipsum officia commodo. Dolore ad proident tempor aliquip occaecat tempor mollit.\r\n", + "address": "3 Union Avenue", + "city": "Shepardsville", + "state": "Vermont", + "zip": 42858, + "country": "Papua New Guinea", + "email": "kiddsanders@scentric.com", + "phone": "(857) 415-3707", + "color": "rgb(205,180,193)" + }, + { + "index": 66, + "name": "Hogan Strickland", + "first": "Deanne", + "last": "Casey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "boolean": false, + "guid": "66bcba0b-2ae4-4fba-9b76-ebf0bacf8b3c", + "integer": 23, + "date": "Tue Mar 24 2009 07:16:09 GMT-0700 (PDT)", + "shortText": "id non labore cupidatat enim", + "mediumText": "Deserunt dolor do cillum ut proident. Ad non proident laborum sint tempor velit. Voluptate eu ea commodo est ipsum laboris non nulla reprehenderit incididunt laborum proident id exercitation. Laboris amet exercitation qui proident veniam laboris.", + "longText": "Ea proident esse nisi eu officia eiusmod laborum. Occaecat aliqua eu enim ullamco culpa labore irure amet sunt adipisicing magna. Culpa enim veniam magna qui anim ad nulla. Lorem fugiat in nostrud sunt do mollit eiusmod ut. Occaecat ipsum esse laboris nostrud reprehenderit velit.\r\nVoluptate eiusmod ullamco sunt cupidatat pariatur ea qui non. Velit commodo sint esse adipisicing pariatur ut id ad Lorem cillum. Nisi ut esse quis deserunt magna eu esse minim.\r\nIncididunt ullamco sunt sunt velit. Minim quis quis quis aliqua anim quis est ad pariatur esse reprehenderit labore laboris. Irure magna dolor in nisi sunt et.\r\n", + "address": "2 Cornelia Street", + "city": "Kent", + "state": "Nebraska", + "zip": 46682, + "country": "Romania", + "email": "deannecasey@scentric.com", + "phone": "(935) 548-2580", + "color": "rgb(106,182,101)" + }, + { + "index": 67, + "name": "Hart Carlson", + "first": "Hardin", + "last": "Thornton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "boolean": true, + "guid": "7601ed4e-21fb-4024-bb7e-36d45c052b7f", + "integer": 68, + "date": "Sat Apr 20 2002 15:29:17 GMT-0700 (PDT)", + "shortText": "ex anim", + "mediumText": "Tempor veniam proident elit proident aliqua nostrud tempor eiusmod. Commodo id dolor sint amet commodo officia. Anim sint ea amet cillum. Esse cupidatat aute veniam ipsum excepteur.", + "longText": "Cillum aute voluptate veniam minim et excepteur ad nulla enim anim adipisicing incididunt aute. Aliqua adipisicing elit minim officia id mollit laborum sunt do. Nostrud do laboris fugiat ad mollit. Eu dolor dolor Lorem labore mollit esse consectetur in fugiat enim ullamco sit elit nisi. Enim eiusmod nostrud enim velit. Lorem commodo laboris excepteur eu occaecat minim.\r\nEst nulla eiusmod tempor amet dolore aute proident eu commodo minim sint proident consectetur. Cupidatat sunt quis laboris adipisicing eiusmod aliqua mollit. Elit qui nostrud commodo irure irure ex esse sunt officia. Tempor cillum nulla anim aliqua. Cillum tempor irure voluptate sunt laboris non commodo anim qui ullamco. Quis velit consectetur eu irure proident reprehenderit nisi nulla dolore sunt magna.\r\nCulpa laborum enim enim proident sit dolore pariatur eiusmod. Excepteur proident mollit in ut do non. Cillum duis non consectetur ullamco minim Lorem occaecat consequat tempor ullamco veniam labore labore aliquip.\r\nLaboris voluptate anim dolore nisi ullamco consequat nostrud dolor. Nulla do do esse aute sint deserunt qui. Ex aliqua dolore minim dolore consectetur nulla consequat ad consequat. Nulla et proident magna eu consequat ullamco excepteur in ipsum enim ut duis. Deserunt et sunt tempor quis amet deserunt cupidatat veniam. Labore reprehenderit magna minim amet nostrud amet. Reprehenderit pariatur dolore ut culpa sint dolore.\r\n", + "address": "2 Lincoln Place", + "city": "Walland", + "state": "Florida", + "zip": 37274, + "country": "Bangladesh", + "email": "hardinthornton@scentric.com", + "phone": "(905) 466-2231", + "color": "rgb(145,123,64)" + }, + { + "index": 68, + "name": "Benita Lester", + "first": "Taylor", + "last": "Irwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "boolean": false, + "guid": "dc96c6e9-9c43-4525-8de4-9a5e504ab886", + "integer": 2, + "date": "Sat Jun 25 1977 03:55:08 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Anim laboris dolore non aliqua proident aliqua et est ad reprehenderit duis ipsum do. Irure Lorem voluptate tempor ipsum exercitation. Sint deserunt adipisicing Lorem sit ea duis ex. Et fugiat anim est non irure proident in commodo sunt pariatur nulla.", + "longText": "Ut aute anim amet minim nulla. Fugiat dolor pariatur quis do aute officia magna in culpa ipsum fugiat. Cupidatat cillum duis aliquip nulla ea quis aliqua. Cillum sunt laboris velit deserunt cupidatat ullamco. Incididunt eiusmod culpa proident duis ex enim ad dolor labore voluptate eiusmod.\r\nLabore culpa commodo amet eu elit magna nisi minim in irure. Dolor adipisicing aliquip laboris irure. Amet et enim fugiat mollit ad laboris sint elit cupidatat deserunt. Ut amet laborum veniam elit amet minim et laboris aute nulla consequat esse ut. Ea dolore sit excepteur eiusmod pariatur sit non non consequat aute.\r\nAute culpa aute ullamco sunt irure quis voluptate est laborum. Duis eu ut do laboris laborum ipsum. Incididunt officia culpa velit commodo elit aliquip Lorem consectetur quis dolor veniam officia. Voluptate cupidatat duis ipsum elit cupidatat.\r\nCillum non ad ad et. Ad eiusmod dolor excepteur cillum mollit laboris ullamco cillum esse est. Aliquip eiusmod cupidatat ex id aute do officia excepteur non.\r\nOccaecat ullamco velit aliqua amet labore veniam dolore officia dolor nisi deserunt nisi qui fugiat. Velit laborum duis reprehenderit reprehenderit laboris occaecat. Aute exercitation magna exercitation magna sit. Fugiat cupidatat tempor eiusmod voluptate enim. Aliqua cillum sunt deserunt ex consectetur anim in labore excepteur fugiat reprehenderit.\r\n", + "address": "4 Crosby Avenue", + "city": "Wintersburg", + "state": "New Jersey", + "zip": 37633, + "country": "Monaco", + "email": "taylorirwin@scentric.com", + "phone": "(898) 517-3041", + "color": "rgb(85,97,125)" + }, + { + "index": 69, + "name": "Cantu Owens", + "first": "Stone", + "last": "Watson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "boolean": false, + "guid": "32abd836-bc46-4a8e-a2c1-7dc92b9e8322", + "integer": 46, + "date": "Mon Nov 17 2003 17:10:32 GMT-0800 (PST)", + "shortText": "cupidatat officia anim ipsum aliquip", + "mediumText": "Elit duis non minim aliqua aliquip irure. Duis ex est ut exercitation laborum excepteur aliqua. Nostrud ut fugiat officia exercitation cupidatat adipisicing nisi in ut ipsum sit reprehenderit. Qui ea Lorem quis velit.", + "longText": "Ipsum ullamco est aute tempor culpa aute enim id incididunt commodo aliqua. Mollit aute sit eu sint cillum ea cupidatat nulla labore anim ut. Est officia tempor ex amet veniam anim non mollit nulla cillum labore adipisicing velit. Et ut nostrud Lorem quis minim laboris mollit sit.\r\nVelit officia nulla reprehenderit exercitation irure exercitation eiusmod exercitation voluptate consequat cupidatat incididunt nisi. Ipsum aliqua quis laborum est sunt. In consectetur eiusmod aute magna. Ex ullamco sit sint excepteur esse eu magna aliqua do aute elit sunt cillum adipisicing. Sunt irure pariatur laboris et fugiat irure. Amet ipsum nostrud est Lorem anim velit. Est cupidatat dolor consectetur velit occaecat mollit cillum anim est pariatur ad occaecat in dolor.\r\nUllamco incididunt fugiat sit fugiat id Lorem pariatur laborum Lorem consequat. Ullamco irure incididunt duis occaecat aliqua pariatur. Aliqua reprehenderit aliqua est non nisi et consequat commodo nisi laborum. Ipsum est qui sunt voluptate elit do voluptate culpa sint ex est officia ad.\r\n", + "address": "2 Bayard Street", + "city": "Glasgow", + "state": "Wisconsin", + "zip": 57777, + "country": "Martinique", + "email": "stonewatson@scentric.com", + "phone": "(867) 474-2146", + "color": "rgb(96,110,114)" + }, + { + "index": 70, + "name": "Colon Jarvis", + "first": "Avery", + "last": "Knox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "boolean": false, + "guid": "9bcf96b4-7ca7-4a59-b7b7-6d6a57293012", + "integer": 28, + "date": "Sun Jan 28 2001 22:12:27 GMT-0800 (PST)", + "shortText": "pariatur officia reprehenderit ut", + "mediumText": "Ut dolore quis eiusmod culpa laboris ad fugiat.", + "longText": "Irure sunt labore commodo ea ex in dolore. Minim reprehenderit sit non et reprehenderit qui esse ex adipisicing. Duis ipsum in culpa est. Non do nisi pariatur dolore elit do qui non pariatur. Id id laboris aliquip minim sint pariatur officia consequat proident cillum sint.\r\nFugiat duis est irure mollit. Cupidatat enim anim adipisicing mollit enim ut nostrud sit. Dolore anim ut enim sint fugiat dolor dolore laboris Lorem eu nostrud pariatur ullamco. Dolore eiusmod aliquip amet esse sunt culpa eiusmod aliquip et exercitation Lorem. Mollit deserunt eiusmod ex ipsum qui consectetur ullamco velit. Reprehenderit proident cupidatat reprehenderit cupidatat. Voluptate eu sit reprehenderit veniam ut.\r\nDo consectetur culpa deserunt dolor. Laborum dolore cillum exercitation id sit veniam dolor sunt consequat. Proident est proident sit ut incididunt tempor ullamco sunt.\r\nIn amet consectetur nulla ullamco ullamco culpa. Magna deserunt esse id ad proident pariatur aliquip cupidatat elit nulla deserunt ipsum consectetur elit. Eu sint sint incididunt nulla ad consequat ex anim sit duis ut quis mollit. Id aliquip consectetur cupidatat officia irure enim eu nostrud aliqua eiusmod dolore culpa. Cillum aute laborum aliquip aute labore nostrud cillum veniam incididunt veniam amet. Sit ad in proident cupidatat elit irure nostrud dolore.\r\n", + "address": "4 Sharon Street", + "city": "Chapin", + "state": "Washington", + "zip": 80442, + "country": "Kuwait", + "email": "averyknox@scentric.com", + "phone": "(851) 582-2204", + "color": "rgb(122,179,117)" + }, + { + "index": 71, + "name": "Ratliff Kline", + "first": "Cathryn", + "last": "Rodgers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "boolean": false, + "guid": "9a177597-6ee1-4784-b217-60ded54d0072", + "integer": 32, + "date": "Fri May 07 1976 11:12:00 GMT-0700 (PDT)", + "shortText": "nostrud enim", + "mediumText": "Officia do enim nisi ullamco enim eiusmod eu enim ex tempor. Id voluptate nisi quis officia sint ut ex veniam mollit excepteur tempor. Et aliqua velit sit fugiat do voluptate ipsum aliquip veniam in sint do. Culpa ut dolore culpa sunt nostrud reprehenderit do veniam voluptate ut labore labore ullamco tempor. Voluptate voluptate veniam laborum deserunt.", + "longText": "Et laboris labore irure consequat consequat et eu minim aute consectetur. Nisi tempor sunt officia ad dolore culpa. Veniam proident minim velit nisi amet id nulla ullamco eiusmod sit ad.\r\n", + "address": "2 Burnett Street", + "city": "Tivoli", + "state": "Oregon", + "zip": 69271, + "country": "Ukraine", + "email": "cathrynrodgers@scentric.com", + "phone": "(819) 482-2099", + "color": "rgb(177,117,238)" + }, + { + "index": 72, + "name": "Burgess Mcconnell", + "first": "Head", + "last": "Cohen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "boolean": false, + "guid": "22894c1b-29ad-4e31-a69e-d724d00cdec3", + "integer": 51, + "date": "Fri Jan 08 1993 09:39:13 GMT-0800 (PST)", + "shortText": "cupidatat ex excepteur tempor", + "mediumText": "Proident eiusmod mollit voluptate culpa incididunt et velit commodo laborum et. Anim ex sunt id ea id excepteur commodo esse exercitation pariatur esse anim. Qui dolore irure eiusmod eu dolore.", + "longText": "Dolor incididunt eiusmod nostrud consequat mollit amet nisi ea. Officia dolore mollit eiusmod ullamco anim incididunt. Laboris sint enim ex mollit consequat consequat.\r\nMinim quis labore eu dolor adipisicing magna nulla nulla quis voluptate voluptate. Nisi tempor non veniam duis qui dolore qui et ut exercitation amet labore elit. Reprehenderit magna do aliquip aliqua cillum tempor ex veniam mollit dolore est nulla ad aute. Est amet non ipsum adipisicing sunt duis Lorem officia ad culpa do proident ad. Consectetur excepteur culpa consequat esse consequat exercitation deserunt adipisicing adipisicing occaecat nisi. Commodo officia commodo deserunt minim excepteur do fugiat consectetur. Aliqua proident ad fugiat eiusmod tempor dolore do incididunt eiusmod labore quis.\r\nLabore fugiat incididunt aliquip deserunt fugiat nostrud. Velit minim aliqua sit incididunt. Velit ad et nulla est consectetur Lorem officia ut eu consequat enim ut. Consequat labore qui magna do aute deserunt consectetur. Minim aliquip in quis minim ad mollit ut non Lorem.\r\nEu laboris culpa magna dolor pariatur anim ea amet fugiat minim. Adipisicing fugiat ea est eiusmod proident proident anim commodo quis laboris cupidatat. Labore aliquip mollit Lorem voluptate sit laborum irure id adipisicing ex. Ad cillum sunt sit magna exercitation mollit eiusmod mollit est elit. Ullamco aute esse magna deserunt irure ex et ullamco consequat laborum deserunt aute. Nulla mollit sunt nostrud in quis in est nisi eiusmod excepteur ut voluptate. Do anim ex cillum eiusmod duis ut sit.\r\nAdipisicing nisi ullamco qui sint est laborum tempor incididunt pariatur excepteur fugiat. Officia sunt proident laborum fugiat quis magna veniam. Nulla do do esse magna. Labore ad sit mollit ullamco nulla aute est sit ipsum ex cupidatat. Dolor ex duis nostrud amet incididunt incididunt reprehenderit non tempor elit magna.\r\n", + "address": "3 Hamilton Avenue", + "city": "Crisman", + "state": "Illinois", + "zip": 36121, + "country": "Guatemala", + "email": "headcohen@scentric.com", + "phone": "(930) 570-3544", + "color": "rgb(151,112,173)" + }, + { + "index": 73, + "name": "Roberta Bond", + "first": "Simone", + "last": "Whitfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "boolean": false, + "guid": "4750f9fa-37f6-41d0-8599-946f9dff2e00", + "integer": 6, + "date": "Thu Sep 06 1984 11:04:11 GMT-0700 (PDT)", + "shortText": "Lorem consectetur", + "mediumText": "Ad anim sint ex in voluptate deserunt ut nulla adipisicing. Elit non velit pariatur nostrud quis do quis cillum ea et sint Lorem. Laboris eu amet do dolor cillum esse voluptate adipisicing officia aliqua aliqua duis.", + "longText": "Commodo cupidatat velit duis elit id duis aliqua. Laboris dolor laboris ad irure laborum. Dolor amet aliqua eu sint. Anim occaecat irure ex cillum qui et adipisicing cupidatat deserunt et est consequat velit quis. Magna ut cillum nostrud ea pariatur occaecat. Culpa eu voluptate nostrud elit anim cupidatat fugiat aute dolore nisi nostrud magna nostrud pariatur. Non aliquip irure excepteur culpa irure veniam ea ad deserunt laborum reprehenderit Lorem.\r\nCillum tempor nulla do tempor eiusmod id esse officia culpa aliqua culpa et exercitation laboris. Sit sit Lorem eu fugiat Lorem. Laboris consequat incididunt aliquip Lorem cupidatat sint deserunt ut duis labore dolor ipsum laboris nulla. Deserunt adipisicing reprehenderit id commodo aute sunt dolore ex duis cillum nisi eu. Anim deserunt et adipisicing fugiat anim in.\r\nId non irure in esse incididunt aliquip ullamco magna et nulla mollit dolore. Velit aliquip excepteur pariatur magna Lorem fugiat. Exercitation nisi nostrud cupidatat elit. Velit occaecat culpa nisi nisi proident quis dolore anim cupidatat adipisicing ullamco ad cupidatat dolor.\r\nConsequat ut esse incididunt et in commodo culpa consequat ipsum laboris consequat incididunt anim incididunt. Ad et nostrud amet non Lorem enim laborum id ad Lorem magna excepteur. Ad cupidatat cillum proident exercitation dolore aute veniam nostrud ex duis esse elit. Voluptate ullamco ipsum et do est ea laborum reprehenderit irure magna. Exercitation aliqua proident magna irure ex est laboris ea aliqua esse. Ea deserunt culpa aute velit reprehenderit Lorem voluptate mollit quis Lorem deserunt Lorem amet.\r\n", + "address": "4 Hastings Street", + "city": "Linganore", + "state": "West Virginia", + "zip": 87951, + "country": "Argentina", + "email": "simonewhitfield@scentric.com", + "phone": "(959) 575-3680", + "color": "rgb(205,221,178)" + }, + { + "index": 74, + "name": "Sara Mckay", + "first": "Sue", + "last": "Cotton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "boolean": false, + "guid": "1da2f858-f774-49c1-9d77-e8a3eb040140", + "integer": 31, + "date": "Fri Nov 25 1994 01:11:26 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Pariatur Lorem veniam ullamco cupidatat sint. Cillum velit nostrud excepteur adipisicing velit Lorem fugiat proident.", + "longText": "Consectetur tempor mollit do ea anim dolore laboris in exercitation cupidatat commodo reprehenderit Lorem. Consequat exercitation sint culpa aute quis nisi. Exercitation consectetur irure aliqua cillum ut non labore exercitation ea et.\r\nUllamco dolor consequat reprehenderit dolore id mollit laborum ad. Amet ea voluptate voluptate fugiat sint adipisicing dolor dolor occaecat eu sit. Ea ea est amet enim tempor occaecat tempor sit exercitation. Ad eu nisi dolore do culpa do anim irure aliquip officia irure. Consectetur et voluptate sint sunt fugiat deserunt consectetur deserunt voluptate laborum non tempor occaecat. Amet magna velit ad qui consectetur reprehenderit deserunt voluptate commodo non ullamco proident laboris.\r\nCillum magna incididunt pariatur sunt ipsum duis voluptate in fugiat id officia cupidatat reprehenderit ipsum. Dolore anim excepteur ea laboris labore minim. Excepteur ex adipisicing eiusmod sit ut reprehenderit. Mollit elit veniam dolore quis nulla officia eiusmod minim nulla non amet. Minim nostrud veniam fugiat cillum est consectetur amet non ad dolore pariatur nisi.\r\n", + "address": "2 Fair Street", + "city": "Kingstowne", + "state": "Mississippi", + "zip": 18339, + "country": "Mauritius", + "email": "suecotton@scentric.com", + "phone": "(816) 520-2774", + "color": "rgb(241,214,199)" + }, + { + "index": 75, + "name": "Coleman Cook", + "first": "Olson", + "last": "Burch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "boolean": true, + "guid": "0788dba4-5fa8-476e-9ba6-8f387bf77e75", + "integer": 13, + "date": "Thu Jun 21 1984 02:52:09 GMT-0700 (PDT)", + "shortText": "anim anim deserunt deserunt anim", + "mediumText": "Esse sunt irure magna amet. Adipisicing aliqua ut dolor nulla non aute tempor eu ex sit id et. Magna dolore aliqua qui velit eu officia. Est sunt magna adipisicing commodo mollit aute duis magna.", + "longText": "Duis fugiat culpa proident mollit nostrud. Dolore incididunt in esse veniam eiusmod voluptate consequat amet. Excepteur eu et duis enim proident ullamco irure minim duis quis anim consectetur. Amet excepteur et do officia fugiat mollit Lorem ut elit. Eiusmod magna tempor duis Lorem nostrud. Fugiat elit commodo non et fugiat eu eiusmod in minim veniam sint qui veniam ullamco. Aliquip sint ad culpa esse laboris elit.\r\nMinim reprehenderit quis ut incididunt incididunt cupidatat. Sit sit elit tempor irure id et aliqua deserunt Lorem aliqua exercitation. Elit nisi dolor enim amet esse incididunt ad. Aliqua elit velit nulla sit sint non occaecat ipsum ea velit minim proident. Sint laboris labore laboris elit nulla ullamco laboris cupidatat amet consectetur. Do eiusmod proident id laborum fugiat nostrud voluptate fugiat. Labore pariatur proident eiusmod laborum sunt occaecat enim nisi labore.\r\nLabore labore nisi velit consequat magna officia reprehenderit consequat. Nulla eu velit laborum voluptate. Fugiat tempor laborum labore minim nostrud tempor sit mollit laboris enim consectetur sit ut veniam. Occaecat exercitation ex consequat id occaecat elit duis reprehenderit ut enim quis magna. Non do ea fugiat quis duis esse amet deserunt eu id duis est enim.\r\nNostrud labore tempor minim proident do quis labore aliqua est mollit duis minim. Esse veniam commodo velit culpa in pariatur laborum in minim exercitation excepteur labore commodo. Mollit cillum ipsum adipisicing in nulla mollit irure. Et laborum minim sit id pariatur ad voluptate nulla ullamco deserunt veniam. Deserunt non aliquip sint amet.\r\nEsse dolor adipisicing ut pariatur pariatur dolore eu mollit reprehenderit consequat. Adipisicing fugiat sunt voluptate magna Lorem est eu anim id commodo eu consectetur. Mollit ad excepteur et do velit dolor adipisicing veniam cupidatat excepteur qui.\r\n", + "address": "2 Hull Street", + "city": "Darbydale", + "state": "Rhode Island", + "zip": 97458, + "country": "St. Helena", + "email": "olsonburch@scentric.com", + "phone": "(995) 590-2366", + "color": "rgb(91,252,80)" + }, + { + "index": 76, + "name": "Walton Wagner", + "first": "Powell", + "last": "Nunez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "boolean": false, + "guid": "6c34053d-b9d3-4a75-a660-83b6fc0925a5", + "integer": 97, + "date": "Wed Nov 27 1996 04:47:04 GMT-0800 (PST)", + "shortText": "sunt voluptate dolor", + "mediumText": "Magna elit cillum enim sunt ut occaecat veniam elit elit laborum. Amet sint labore tempor tempor consectetur commodo aliquip magna duis non et. Aute labore est cupidatat do officia minim consectetur ea exercitation ex nostrud enim tempor veniam. Excepteur amet eiusmod velit exercitation eu cillum et minim sunt adipisicing dolor velit. Duis laboris dolor aliquip minim non laboris do veniam.", + "longText": "Ea esse officia reprehenderit do proident dolore ullamco. Quis officia minim sit anim tempor laborum in tempor dolore officia consectetur. Officia pariatur est commodo veniam in ex duis labore velit irure enim laboris id. Esse irure in adipisicing irure officia et veniam anim mollit. Qui qui tempor proident sunt enim incididunt elit aliqua Lorem dolore est do enim dolor. Deserunt consequat pariatur magna aute enim.\r\nDolor est culpa magna duis reprehenderit Lorem ad dolore tempor aute velit veniam sunt. Labore reprehenderit ea culpa ea reprehenderit sint amet in eiusmod dolore. Anim consequat ex labore qui nulla occaecat laborum. Id voluptate pariatur esse aute consequat et nisi. Proident dolor consequat anim esse eiusmod et veniam proident qui non commodo nulla cupidatat.\r\n", + "address": "2 Vanderveer Place", + "city": "Robinette", + "state": "Georgia", + "zip": 54771, + "country": "Suriname", + "email": "powellnunez@scentric.com", + "phone": "(992) 548-3878", + "color": "rgb(95,253,239)" + }, + { + "index": 77, + "name": "Harris Ewing", + "first": "Orr", + "last": "Buchanan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "boolean": true, + "guid": "387624b1-451d-47c6-978f-aabd0b34e707", + "integer": 69, + "date": "Sun Aug 18 1996 22:19:42 GMT-0700 (PDT)", + "shortText": "duis ea", + "mediumText": "Irure aliquip sit excepteur incididunt nisi excepteur laboris in do proident commodo ad. Culpa dolore Lorem irure magna mollit laboris officia fugiat amet. Ut ipsum est mollit quis. In occaecat mollit officia fugiat magna occaecat.", + "longText": "Magna cillum culpa esse in sint in sit. Sint aute nulla ad pariatur commodo sint aute consectetur magna dolore labore ex Lorem culpa. Officia aute magna cupidatat dolor aliquip minim voluptate mollit aliqua pariatur ullamco. Ullamco labore ex exercitation ad culpa labore laborum deserunt mollit mollit enim ut. Incididunt dolore est id cupidatat eu do aliqua minim occaecat consectetur.\r\n", + "address": "3 Ralph Avenue", + "city": "Martell", + "state": "New Mexico", + "zip": 31746, + "country": "Greece", + "email": "orrbuchanan@scentric.com", + "phone": "(861) 535-2683", + "color": "rgb(162,149,148)" + }, + { + "index": 78, + "name": "Kerr Briggs", + "first": "Helena", + "last": "Lynch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "boolean": false, + "guid": "d16cdb93-caba-40e3-b359-8124309f23fd", + "integer": 83, + "date": "Tue Dec 27 2011 21:18:32 GMT-0800 (PST)", + "shortText": "adipisicing est laboris eiusmod", + "mediumText": "Voluptate ad eiusmod eiusmod sunt minim do et ullamco. Id incididunt do labore consectetur laborum excepteur labore id nostrud cupidatat anim officia et velit. Nostrud sunt commodo aute culpa ea et consequat laborum commodo deserunt. Dolore ad amet reprehenderit incididunt exercitation enim duis deserunt. Ea irure et veniam sunt Lorem tempor.", + "longText": "Commodo enim ullamco cupidatat ex minim et ex fugiat eiusmod exercitation minim eu. Id eu exercitation commodo fugiat elit ex laborum ea. Aute duis adipisicing mollit duis non anim anim deserunt. Nulla adipisicing irure commodo ut nostrud irure ea Lorem in enim laborum laboris laborum.\r\nSunt eiusmod dolor ullamco elit mollit esse consequat culpa non do minim reprehenderit exercitation. Id quis laborum eu id Lorem eu aute elit aliqua aliquip labore. Nisi sit mollit velit anim culpa proident esse ut sunt deserunt quis ad dolor. Incididunt excepteur non est occaecat do Lorem veniam sunt cillum velit ut exercitation et. Minim eiusmod ipsum veniam nisi nostrud anim commodo amet est amet ullamco minim ut. Magna aliquip Lorem dolore do nulla ipsum aute mollit incididunt in adipisicing pariatur ad eiusmod. Est velit Lorem incididunt ex aliquip ut laboris nulla.\r\nAd voluptate ullamco dolor culpa. Occaecat sit anim anim id esse commodo consectetur. Velit aliquip laborum fugiat occaecat consectetur magna amet tempor consequat nisi proident nisi. Aliquip et sit aliquip anim. Labore in culpa elit quis reprehenderit duis anim dolor dolore occaecat sint ad Lorem.\r\nDolore culpa irure cillum enim adipisicing enim sint ut laboris elit cillum veniam eu sit. Magna Lorem dolore sint aute cupidatat incididunt excepteur adipisicing magna ex exercitation. Duis id commodo eu adipisicing. Non labore ut laboris officia id.\r\n", + "address": "2 Wilson Avenue", + "city": "Coral", + "state": "Arizona", + "zip": 32289, + "country": "New Caledonia", + "email": "helenalynch@scentric.com", + "phone": "(880) 590-3786", + "color": "rgb(192,101,57)" + }, + { + "index": 79, + "name": "Genevieve Mooney", + "first": "Beatriz", + "last": "Case", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "boolean": false, + "guid": "f35cbf9b-3c23-45a2-80cc-959e537f5ed8", + "integer": 7, + "date": "Mon Apr 10 1972 22:46:01 GMT-0800 (PST)", + "shortText": "ut commodo excepteur cillum", + "mediumText": "Nulla aute quis minim culpa proident anim ipsum enim. Magna cillum fugiat eu dolor laboris dolore.", + "longText": "Non non eu qui nulla anim officia officia officia labore culpa. In laborum est ad aliqua laborum sit quis. Aliquip voluptate anim excepteur deserunt dolore dolor dolor ipsum.\r\nProident fugiat nisi qui eu exercitation reprehenderit sint. Elit commodo aliqua quis elit dolor eiusmod consectetur. Nostrud qui non voluptate sint sit anim laboris incididunt. Dolor labore nisi aliquip labore. Amet voluptate sunt pariatur excepteur laborum laborum anim dolor. Excepteur exercitation in labore nostrud aliquip anim duis reprehenderit aliqua dolore amet cillum est consectetur.\r\n", + "address": "4 Hoyts Lane", + "city": "Richmond", + "state": "Texas", + "zip": 12769, + "country": "Syria", + "email": "beatrizcase@scentric.com", + "phone": "(868) 586-2207", + "color": "rgb(127,85,140)" + }, + { + "index": 80, + "name": "Heidi Dillon", + "first": "Jenifer", + "last": "Contreras", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "boolean": true, + "guid": "198e5b2c-45aa-4d86-aa99-c9e493b55d5c", + "integer": 57, + "date": "Fri Mar 05 2010 16:32:14 GMT-0800 (PST)", + "shortText": "cillum velit deserunt aute in", + "mediumText": "Mollit quis officia in commodo officia ex. Aliqua commodo incididunt cillum Lorem cillum est commodo do aliqua eiusmod. Laborum labore pariatur aute aute minim.", + "longText": "Deserunt enim nisi esse commodo enim irure ullamco eiusmod fugiat. Eiusmod sint reprehenderit minim deserunt voluptate ut sit consectetur id quis ullamco pariatur ut excepteur. Exercitation consectetur commodo ipsum minim. Culpa id occaecat non commodo amet esse magna mollit. Duis anim qui commodo voluptate aliquip ut exercitation amet ea. Quis labore ullamco irure irure ut amet consequat voluptate laborum. Nulla aliqua mollit deserunt sunt deserunt eu adipisicing ea magna ex occaecat.\r\nDuis cillum laborum et sit laborum exercitation commodo nulla magna proident duis. Nisi do excepteur enim esse minim sunt voluptate tempor dolore dolor fugiat sunt duis. Ipsum id velit mollit labore ut sunt quis aliqua adipisicing ad labore ipsum.\r\nAute cupidatat sint proident magna cupidatat sint est deserunt Lorem nisi sit ut. Duis laborum exercitation incididunt deserunt anim ipsum consectetur. Sit laborum irure commodo laboris eiusmod ut laboris ex excepteur proident labore reprehenderit mollit est. Sunt minim ea quis officia ad.\r\nCillum eiusmod ad consequat aliquip consectetur pariatur. Incididunt qui exercitation labore anim. Sint laboris ad sit est ut laboris. Aliqua sit proident cillum commodo fugiat reprehenderit ad. Est elit id sunt laborum excepteur sit Lorem. Ex anim mollit amet ex nostrud nulla irure nisi amet cupidatat non elit enim adipisicing. Cupidatat occaecat irure est fugiat amet adipisicing eu laboris aliqua quis minim sint.\r\nDolor consequat laborum sint enim qui. Sint eiusmod nostrud excepteur dolore incididunt excepteur labore amet ea non nostrud. Cupidatat nulla exercitation tempor ut adipisicing qui voluptate. Quis voluptate proident reprehenderit labore in cillum et commodo exercitation magna. Irure labore irure amet eu fugiat tempor reprehenderit laborum occaecat consectetur ut.\r\n", + "address": "4 Clove Road", + "city": "Brazos", + "state": "District Of Columbia", + "zip": 94302, + "country": "Rwanda", + "email": "jenifercontreras@scentric.com", + "phone": "(886) 401-2897", + "color": "rgb(103,86,175)" + }, + { + "index": 81, + "name": "Morrow Hendrix", + "first": "Pittman", + "last": "Powers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "boolean": false, + "guid": "3e7a6c19-006a-4533-86eb-5032c524f1b9", + "integer": 87, + "date": "Mon Jun 13 1977 05:06:10 GMT-0700 (PDT)", + "shortText": "culpa dolor proident non occaecat", + "mediumText": "Consectetur commodo nulla cupidatat exercitation id aliquip.", + "longText": "Reprehenderit irure esse esse esse enim aute elit occaecat officia eiusmod nostrud. Minim labore amet veniam quis laboris cupidatat elit non. Magna amet in elit duis amet velit do duis adipisicing ut. Commodo officia dolore veniam laborum laborum pariatur aute nulla magna dolore esse laboris ea. Irure adipisicing officia velit Lorem.\r\nAd officia adipisicing commodo ipsum sunt in commodo adipisicing qui eu. Esse minim anim do officia laborum deserunt aliquip deserunt ea dolor ut eiusmod non fugiat. Dolore commodo laboris ullamco consectetur amet et non occaecat labore velit est. Veniam elit deserunt eu laboris minim esse. Et ad eu eu voluptate non ad aute nostrud in in. Sint qui mollit aliquip laboris dolor elit incididunt cillum. Mollit fugiat minim tempor amet proident et esse do.\r\nDo laborum do sunt pariatur. Cillum nulla ut exercitation consectetur ad sunt qui. Incididunt Lorem voluptate veniam minim deserunt aliqua. Veniam aute reprehenderit irure excepteur ut aute laborum eu. Sit veniam nisi qui officia. Reprehenderit voluptate tempor et cupidatat cupidatat enim aute. Aliquip reprehenderit esse ad commodo dolor deserunt nisi minim duis ut tempor pariatur quis ad.\r\nEa magna non ex laboris adipisicing deserunt. Ea ad voluptate ipsum consectetur magna voluptate amet eu fugiat. Aute do excepteur exercitation esse consequat aute enim Lorem occaecat id Lorem.\r\nAdipisicing cupidatat sunt non ipsum voluptate nulla occaecat. Pariatur magna exercitation aliqua irure ipsum cillum qui nostrud exercitation ullamco anim occaecat reprehenderit qui. Exercitation voluptate enim magna excepteur eu aliquip id enim laboris aute exercitation sint aliqua. Enim officia tempor labore nulla ut veniam ullamco reprehenderit occaecat nulla. Adipisicing officia ullamco cupidatat et dolor ut cillum enim est aliqua. Cillum et laborum nostrud ex irure do aliquip qui amet cillum nisi exercitation.\r\n", + "address": "2 Lawn Court", + "city": "Alleghenyville", + "state": "Virgin Islands", + "zip": 25057, + "country": "Puerto Rico", + "email": "pittmanpowers@scentric.com", + "phone": "(814) 551-2487", + "color": "rgb(194,148,221)" + }, + { + "index": 82, + "name": "Cook Espinoza", + "first": "Kelli", + "last": "Gallagher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "boolean": false, + "guid": "77727f82-a7eb-40af-91dc-dd76a57e5761", + "integer": 4, + "date": "Sat Apr 29 1995 09:21:20 GMT-0700 (PDT)", + "shortText": "est ad non officia", + "mediumText": "Ipsum magna velit cillum cupidatat tempor ad ad amet adipisicing. Aliquip cillum irure id velit. Ullamco occaecat labore dolor sint. Sit dolor consequat in dolor commodo eiusmod anim ullamco consequat laboris non. Esse fugiat cupidatat laboris aliquip non nostrud officia amet.", + "longText": "Do elit consectetur nostrud reprehenderit deserunt culpa deserunt exercitation exercitation. Tempor eiusmod eiusmod incididunt minim mollit exercitation quis do sit amet duis. Culpa in consectetur esse ipsum voluptate sit non qui elit voluptate ea eu tempor excepteur. Enim minim fugiat quis velit dolor adipisicing sunt elit ipsum nulla culpa pariatur sint aliquip.\r\nAd magna enim culpa magna sint pariatur sunt nostrud ad fugiat cupidatat. Sunt non eiusmod nulla cupidatat eu ea eu laborum quis fugiat voluptate nulla laboris. Dolor ad reprehenderit minim commodo dolore commodo aliqua adipisicing dolor laborum pariatur eiusmod laborum irure. Sunt ex adipisicing culpa quis nostrud elit est occaecat ut ut exercitation ullamco ea. In et irure irure tempor est do do qui. Consectetur velit aute enim exercitation ipsum proident officia eiusmod nostrud deserunt nulla cupidatat ullamco.\r\nEsse nisi quis laborum commodo non proident ullamco. Ipsum qui in non adipisicing do incididunt. Magna incididunt amet dolor laboris commodo est voluptate cillum ea amet quis deserunt do. Non in laborum anim mollit sunt irure incididunt ex sit nostrud duis amet. Reprehenderit ipsum anim culpa in. Duis voluptate esse cillum ad eu incididunt.\r\nOccaecat officia in laboris proident aliquip pariatur consectetur consequat commodo enim tempor et. Sit do veniam duis mollit ipsum aliqua et id do do id sint cillum. Ad incididunt minim velit id tempor consequat eiusmod mollit sit do dolor commodo minim quis. Nulla laboris velit excepteur laborum exercitation labore aliqua est enim duis anim sint pariatur duis. Velit elit fugiat mollit ex amet dolor nulla nisi. Laborum ad ut enim ut tempor proident cillum sunt id voluptate et.\r\n", + "address": "2 Bay Avenue", + "city": "Frystown", + "state": "Puerto Rico", + "zip": 13050, + "country": "Korea (North)", + "email": "kelligallagher@scentric.com", + "phone": "(865) 413-3195", + "color": "rgb(105,173,239)" + }, + { + "index": 83, + "name": "Mari Nguyen", + "first": "Moss", + "last": "English", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "boolean": false, + "guid": "1aaee0b4-f194-4e72-8c8b-9eb7aada953a", + "integer": 29, + "date": "Sat Aug 22 1987 08:31:57 GMT-0700 (PDT)", + "shortText": "minim enim voluptate minim", + "mediumText": "Ut est et consequat culpa dolor culpa veniam eiusmod. Commodo adipisicing voluptate laboris nulla esse non reprehenderit pariatur veniam proident reprehenderit.", + "longText": "Pariatur quis sit tempor dolor sit commodo in. Pariatur consectetur sint ea aliquip pariatur dolor commodo et et dolore in esse occaecat. Velit labore nostrud sit deserunt Lorem. Proident labore elit irure consequat sit. Sunt est veniam ullamco pariatur incididunt ad cupidatat. Sit proident tempor anim cupidatat nostrud ullamco do incididunt. Magna in amet anim laboris labore fugiat duis culpa cupidatat enim ipsum ut mollit excepteur.\r\nLorem voluptate officia ut adipisicing occaecat cillum cupidatat. Culpa mollit magna duis pariatur officia officia ad. Reprehenderit reprehenderit reprehenderit proident deserunt. Dolor proident nostrud veniam ea ut. Nisi nisi esse aute adipisicing laborum nulla laboris magna do commodo voluptate sunt ipsum. Occaecat dolor pariatur esse velit eu sint adipisicing cillum magna nulla.\r\nAmet eu et anim nisi mollit ut sit minim. Aute proident non ea consequat do laborum ex consectetur. Cillum commodo minim id veniam duis commodo laboris consequat sunt. Sit ullamco veniam dolor occaecat nostrud dolor incididunt enim minim esse adipisicing id. Adipisicing velit nisi cupidatat velit velit culpa eu reprehenderit duis id aliquip quis tempor fugiat.\r\nAliquip ex elit nulla duis enim aliqua officia. Commodo proident aute labore nostrud nostrud. Et et ad nisi sit ex id eiusmod est Lorem. Enim pariatur velit sunt quis eu fugiat. Consectetur est aute est aliquip elit occaecat quis eiusmod tempor sunt nisi aliqua. Enim ex eu ipsum id sit Lorem excepteur ad voluptate.\r\nAute non est enim ullamco quis proident Lorem Lorem sunt dolor culpa irure. Nostrud quis aliqua ex commodo irure officia mollit Lorem reprehenderit sunt velit. Ut velit cillum velit et ea irure laborum adipisicing amet adipisicing anim. Voluptate exercitation pariatur culpa irure occaecat in reprehenderit ipsum esse. Excepteur quis cillum Lorem do. Tempor est tempor fugiat amet cupidatat nostrud aute cillum.\r\n", + "address": "2 Trucklemans Lane", + "city": "Waiohinu", + "state": "Maryland", + "zip": 78112, + "country": "Bosnia and Herzegovina", + "email": "mossenglish@scentric.com", + "phone": "(823) 570-2457", + "color": "rgb(97,59,63)" + }, + { + "index": 84, + "name": "Bauer Ruiz", + "first": "Marcia", + "last": "Farmer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "boolean": true, + "guid": "0efaa095-a6b2-4f62-9b1d-c965c8aa4407", + "integer": 49, + "date": "Wed Oct 17 1979 09:38:39 GMT-0700 (PDT)", + "shortText": "cillum cillum ipsum pariatur excepteur", + "mediumText": "Irure dolor Lorem cillum enim esse. Consectetur duis elit aute ut tempor do ea non ad velit. Officia voluptate occaecat exercitation exercitation cillum anim. Exercitation anim tempor qui tempor nulla minim eu quis ad minim.", + "longText": "Sit proident eu velit ad do velit nostrud aute consectetur. Lorem et magna non consequat enim ut. Qui duis consectetur fugiat consectetur elit sit Lorem cupidatat. Ipsum tempor dolore sunt duis. Veniam culpa exercitation sint laboris proident exercitation dolor deserunt aute est exercitation ex laboris.\r\nEsse id non veniam ut ad nostrud ex aliquip culpa quis. Cupidatat ad anim irure pariatur. Consectetur sint officia laboris non consequat proident laboris sunt ipsum. Dolor amet culpa enim pariatur proident eu labore pariatur. Do adipisicing tempor pariatur mollit laborum mollit elit mollit laboris dolore. Aute magna reprehenderit nulla magna amet minim nostrud in aute qui eu ut sunt. Exercitation eiusmod reprehenderit sint esse reprehenderit reprehenderit.\r\nTempor est Lorem eu adipisicing adipisicing est ea. Irure nulla officia culpa laboris do tempor aute laboris elit aute pariatur occaecat qui laborum. Minim duis pariatur consectetur laboris aliquip cupidatat aute enim cillum adipisicing voluptate occaecat enim dolor.\r\nAdipisicing ut voluptate et aliquip eu. Duis laborum irure ullamco voluptate labore in non. Nostrud voluptate voluptate consectetur culpa voluptate aute. Esse dolor enim ad dolor. Aliquip sint esse elit eiusmod mollit. Ipsum in est exercitation qui. Id sit amet nulla qui minim fugiat enim.\r\n", + "address": "3 Paerdegat Avenue", + "city": "Hanover", + "state": "Massachusetts", + "zip": 30524, + "country": "France", + "email": "marciafarmer@scentric.com", + "phone": "(836) 524-2616", + "color": "rgb(169,63,64)" + }, + { + "index": 85, + "name": "Ollie Melton", + "first": "Dennis", + "last": "Hill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "boolean": false, + "guid": "fda2534f-880f-4794-999d-d315d49ba7a9", + "integer": 84, + "date": "Fri Mar 14 2003 11:31:33 GMT-0800 (PST)", + "shortText": "in dolore", + "mediumText": "Elit reprehenderit mollit deserunt nisi. Officia ea id minim culpa id enim consectetur laborum enim non esse et fugiat proident. Consequat magna mollit amet ipsum nisi et commodo nulla officia duis amet laboris ex. Ad ad amet nisi fugiat pariatur mollit sit non culpa consectetur eiusmod.", + "longText": "Ea commodo tempor ea culpa ea quis ipsum pariatur occaecat nulla officia. Reprehenderit laboris non eiusmod aute adipisicing esse eiusmod commodo ex exercitation occaecat. Velit est reprehenderit anim adipisicing et cillum. Sit proident ipsum est reprehenderit eiusmod nulla laborum. Laboris consectetur excepteur sunt ex commodo. Aliqua laboris quis dolor cillum tempor sint do occaecat deserunt cillum dolor ea nisi ipsum.\r\nNisi adipisicing commodo et id officia non laborum et laborum eiusmod adipisicing duis. Eiusmod tempor in quis anim do ullamco exercitation est. Consequat ad commodo adipisicing nisi dolor excepteur ex incididunt anim sunt velit reprehenderit magna. Proident eiusmod eu qui officia duis amet mollit velit elit.\r\n", + "address": "4 Pacific Street", + "city": "Osmond", + "state": "Oklahoma", + "zip": 41895, + "country": "Guinea", + "email": "dennishill@scentric.com", + "phone": "(974) 511-2460", + "color": "rgb(208,193,99)" + }, + { + "index": 86, + "name": "Carlson Petty", + "first": "Miranda", + "last": "Garner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "boolean": false, + "guid": "4d705513-68a1-4d45-bf9d-593447e391e2", + "integer": 47, + "date": "Thu Dec 30 1976 16:50:53 GMT-0800 (PST)", + "shortText": "anim in do aliquip", + "mediumText": "Do aute est tempor dolore culpa. Ipsum commodo aute veniam officia aliqua enim laboris irure qui. Cupidatat laborum eu consequat laborum sint officia officia aliquip tempor qui nulla fugiat.", + "longText": "Eu consectetur sint aute fugiat duis consectetur anim nisi culpa ullamco. Duis irure dolore ullamco consectetur reprehenderit anim et proident. Officia consequat cupidatat adipisicing consequat amet sit cillum amet commodo. Duis magna dolore incididunt laborum.\r\nReprehenderit enim pariatur labore irure exercitation consectetur eu eu deserunt. Eiusmod excepteur qui elit qui enim adipisicing dolore aliquip anim enim deserunt aliquip et. Irure eiusmod qui quis consectetur est enim. Culpa Lorem nostrud cupidatat magna sint ad cillum culpa adipisicing dolore commodo in laborum cupidatat. Dolore sint minim cupidatat laboris fugiat est ad quis occaecat adipisicing laborum nisi. Magna labore qui anim non qui elit velit do ex veniam ullamco. Eiusmod minim sit pariatur cillum exercitation non occaecat qui et.\r\nUllamco esse ullamco amet amet fugiat occaecat ex in fugiat nulla. Deserunt magna labore fugiat qui officia qui enim minim. Adipisicing irure proident sunt commodo cillum aliqua velit. Esse est est ipsum est elit duis ipsum exercitation. Ipsum sit deserunt duis eu duis id sunt ipsum aute eiusmod.\r\nOfficia eu deserunt veniam deserunt do exercitation. Amet reprehenderit enim anim exercitation sunt do cillum officia laboris commodo mollit quis laboris irure. Duis nisi nulla nisi enim enim. Ipsum minim sit est culpa nostrud aute elit commodo minim laboris incididunt Lorem nostrud. Ullamco sint deserunt incididunt nisi.\r\nSit cillum occaecat officia laboris do cillum. Irure consectetur occaecat elit nostrud. Nisi commodo nulla culpa fugiat duis in consectetur sint proident Lorem non sunt. Fugiat Lorem deserunt duis mollit do sit id.\r\n", + "address": "2 Laurel Avenue", + "city": "Freetown", + "state": "Ohio", + "zip": 80225, + "country": "Senegal", + "email": "mirandagarner@scentric.com", + "phone": "(989) 558-3766", + "color": "rgb(201,116,189)" + }, + { + "index": 87, + "name": "Randolph Lewis", + "first": "Isabella", + "last": "Fry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "boolean": false, + "guid": "70e8a5f4-7b65-42d2-bdfa-cd58c31f5e45", + "integer": 2, + "date": "Mon Aug 13 1990 16:40:29 GMT-0700 (PDT)", + "shortText": "velit laboris tempor", + "mediumText": "Ullamco in esse consectetur ea tempor adipisicing ad veniam eiusmod proident.", + "longText": "Aliquip in dolore Lorem labore fugiat et ut nulla voluptate nostrud adipisicing irure. Cupidatat culpa ea consequat cillum culpa amet do deserunt amet voluptate tempor reprehenderit. Esse est excepteur incididunt esse elit laborum nulla ad. Adipisicing reprehenderit amet officia occaecat. Nisi Lorem ea duis id ex aute consequat mollit adipisicing id. Eu mollit elit nostrud labore adipisicing. Magna sunt proident duis voluptate enim ut id qui aliquip ea nisi velit.\r\nDolor duis sint tempor ad commodo sit ut minim id. Magna dolor et sunt ut laborum fugiat officia dolore adipisicing reprehenderit et ullamco nisi. Sint dolor ut laborum tempor veniam dolore eiusmod id adipisicing excepteur proident. Laborum magna fugiat pariatur dolore. Ipsum irure consequat nulla velit. Sint duis mollit exercitation enim fugiat voluptate.\r\nExcepteur adipisicing et magna sunt. Officia incididunt reprehenderit et ea culpa nostrud ex minim ad minim. Consequat magna ipsum laborum ut tempor pariatur Lorem magna minim labore cillum ad nulla nulla.\r\nMinim tempor veniam consequat veniam esse adipisicing officia sint id do veniam. Ullamco dolore ad consequat minim veniam deserunt magna sit nulla cupidatat cillum non incididunt veniam. Labore aliqua cupidatat excepteur eu veniam. Sit id id ut minim aute qui aliqua dolore id ex deserunt id ullamco laboris. Fugiat irure irure nisi in mollit ad cillum sit duis exercitation ad sint sit consectetur. Voluptate eu amet consectetur consectetur dolore ex ad.\r\n", + "address": "2 Schenck Street", + "city": "Richford", + "state": "Nevada", + "zip": 27095, + "country": "Yugoslavia", + "email": "isabellafry@scentric.com", + "phone": "(974) 558-2625", + "color": "rgb(220,182,202)" + }, + { + "index": 88, + "name": "Daniel Foley", + "first": "Stephens", + "last": "Bender", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "boolean": false, + "guid": "e3ad719a-545a-47b0-a02a-62dfec32263f", + "integer": 98, + "date": "Thu Jan 28 1982 23:00:55 GMT-0800 (PST)", + "shortText": "anim", + "mediumText": "Dolor consequat aute ea officia non dolor consequat exercitation pariatur.", + "longText": "Sunt cupidatat officia ea officia fugiat sunt cupidatat. Esse ex adipisicing mollit ipsum aute. Consectetur non nisi nostrud eiusmod voluptate cupidatat nulla. Dolor enim nulla laboris enim qui velit tempor. Sunt Lorem do qui minim pariatur sint eu occaecat officia laboris. Pariatur reprehenderit occaecat ad ipsum occaecat ex. Magna qui ullamco laborum sint adipisicing magna velit labore sit excepteur duis ad.\r\nMagna laboris ut eiusmod tempor velit exercitation duis qui exercitation. Do occaecat ea consequat non sit eiusmod dolor aute dolor ea elit eiusmod. Ad ad qui reprehenderit culpa velit.\r\nAdipisicing non laboris magna aute pariatur. Sit irure aliquip aute minim sit velit fugiat minim excepteur. Laborum reprehenderit dolor ea ipsum aute minim Lorem velit.\r\n", + "address": "3 Aster Court", + "city": "Diaperville", + "state": "Montana", + "zip": 59636, + "country": "Uzbekistan", + "email": "stephensbender@scentric.com", + "phone": "(929) 559-3077", + "color": "rgb(214,117,159)" + }, + { + "index": 89, + "name": "Morales Mays", + "first": "Tracie", + "last": "Pate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "boolean": true, + "guid": "f420dfd4-d785-4f2d-ad37-b48a8c5e8c63", + "integer": 42, + "date": "Tue Jun 10 2014 10:24:55 GMT-0700 (PDT)", + "shortText": "elit qui deserunt veniam", + "mediumText": "Sint cupidatat laborum nostrud ullamco pariatur ea consectetur sit irure adipisicing cupidatat commodo nisi ullamco. Esse adipisicing consequat velit consequat cillum exercitation incididunt deserunt est proident. Officia incididunt et tempor esse. Adipisicing fugiat non dolor aute elit elit Lorem consectetur. Irure mollit eu est laboris ea dolor eu irure deserunt sunt nulla mollit culpa.", + "longText": "Dolor anim consequat minim exercitation incididunt voluptate dolor magna. In magna ex veniam duis ad velit commodo tempor ea excepteur. Amet veniam esse aliqua duis. Anim cupidatat voluptate culpa culpa reprehenderit in ullamco aliqua exercitation sit elit.\r\nNulla deserunt minim cupidatat labore id pariatur pariatur minim nostrud. Anim ad eu esse et incididunt labore. Incididunt culpa aliquip sit laboris magna reprehenderit Lorem quis ut commodo aliqua. Cillum velit irure eu nulla fugiat quis nisi laborum reprehenderit duis voluptate ut. Velit ea Lorem dolore ea sint excepteur eiusmod adipisicing minim proident non tempor nisi dolore. Aute dolor consectetur eu ipsum adipisicing ex exercitation consectetur proident adipisicing in.\r\nFugiat minim cupidatat ea sit velit tempor. Dolor laboris minim officia Lorem Lorem eu est ut do nisi veniam nulla adipisicing. Adipisicing veniam occaecat ex sunt id.\r\nVeniam velit ipsum Lorem est ad amet nisi adipisicing. Veniam sint pariatur velit pariatur veniam pariatur deserunt laborum ullamco sit enim et cillum commodo. Nisi incididunt et culpa occaecat aliquip. Ipsum commodo sunt proident esse amet consectetur ullamco nisi nulla voluptate magna. Consequat nostrud labore ipsum dolor mollit ullamco eu cillum occaecat.\r\nNon sit proident deserunt aliquip sunt. Ipsum quis nulla quis elit officia exercitation quis commodo. Ullamco et anim duis do nulla Lorem non commodo do ut tempor ullamco do. Commodo incididunt dolore in laborum excepteur voluptate et tempor nulla sint tempor laborum et. Consectetur amet magna consequat anim duis nisi non in. Tempor deserunt aliqua aute incididunt culpa sunt nostrud cillum laborum dolor.\r\n", + "address": "4 Herbert Street", + "city": "Wescosville", + "state": "California", + "zip": 64034, + "country": "Estonia", + "email": "traciepate@scentric.com", + "phone": "(967) 595-3876", + "color": "rgb(140,217,62)" + }, + { + "index": 90, + "name": "Christie Cobb", + "first": "Georgina", + "last": "Cardenas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "boolean": true, + "guid": "62687023-9614-4076-85b2-5cb8b60263be", + "integer": 0, + "date": "Tue Aug 27 2002 06:22:09 GMT-0700 (PDT)", + "shortText": "aliqua", + "mediumText": "Est quis aliquip tempor est elit sint adipisicing et pariatur labore deserunt ex dolore pariatur.", + "longText": "Proident pariatur ex anim proident. Et adipisicing do amet magna id fugiat mollit. Ipsum aliqua pariatur ad eu. Id officia enim enim aliqua veniam amet commodo in incididunt velit incididunt ipsum. Id adipisicing anim voluptate labore veniam cupidatat dolore quis excepteur in velit consectetur fugiat nisi. Laborum tempor duis veniam esse ut et deserunt consequat occaecat Lorem minim aliquip exercitation.\r\nEx ex id id voluptate aliqua tempor veniam non et. Enim labore ut sit quis ullamco. Et sit ea cupidatat laborum exercitation reprehenderit laborum magna enim reprehenderit commodo ex. Et ad nostrud ea nulla. Officia commodo ea ea commodo sunt pariatur in culpa incididunt voluptate magna.\r\nElit reprehenderit minim nulla officia magna proident esse proident id officia officia ea cupidatat. Pariatur duis consectetur laboris et anim excepteur labore laboris officia voluptate proident nostrud dolor incididunt. Ad laboris laborum qui occaecat do fugiat enim officia dolore sit eu.\r\n", + "address": "2 Clinton Street", + "city": "Townsend", + "state": "Marshall Islands", + "zip": 25271, + "country": "Gambia", + "email": "georginacardenas@scentric.com", + "phone": "(917) 515-3962", + "color": "rgb(108,88,246)" + }, + { + "index": 91, + "name": "Kellie Cummings", + "first": "Carissa", + "last": "Castillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "boolean": true, + "guid": "dbb02d06-2dc9-4b57-84cd-59d4e653047c", + "integer": 58, + "date": "Sun Jul 27 1986 08:30:17 GMT-0700 (PDT)", + "shortText": "incididunt labore aliquip", + "mediumText": "Excepteur quis proident aliquip consectetur.", + "longText": "Exercitation ea anim ex sit nisi excepteur aliqua eu cillum esse nulla deserunt ut. Cillum veniam laboris occaecat commodo est adipisicing proident. Ut deserunt enim irure officia irure deserunt ipsum labore magna. Do sint sint aliquip ullamco laboris commodo magna ea ut nostrud adipisicing et nostrud aliquip. Enim nostrud commodo do laborum fugiat incididunt quis dolore dolor voluptate tempor. Cupidatat deserunt est commodo amet cillum aliqua ullamco.\r\nEnim commodo labore id duis irure commodo eiusmod nostrud magna tempor veniam exercitation velit. Officia incididunt ut et ex anim. Esse ex cillum aliqua adipisicing et Lorem culpa elit. Commodo laborum ut in aute laboris esse exercitation eiusmod eu. Minim nulla laborum minim ad non fugiat consectetur sunt adipisicing occaecat Lorem consequat. Officia ex aliquip labore non do quis amet sit do tempor exercitation.\r\nQui do dolore officia et elit dolor magna sunt laboris nulla. Enim id deserunt ex amet non deserunt quis nisi quis pariatur commodo est excepteur cillum. Cillum commodo reprehenderit nostrud et adipisicing labore ad ex id. Adipisicing velit mollit aute eu non reprehenderit ad mollit commodo irure sit. Adipisicing cillum consequat dolor incididunt occaecat laborum et ipsum ipsum magna ipsum fugiat esse. Velit esse mollit ex nulla incididunt incididunt est sit pariatur minim fugiat.\r\nExercitation non ut id ad mollit in eu et fugiat ullamco sint ullamco consequat. Cupidatat mollit incididunt ea consectetur Lorem velit sint consectetur irure. Eiusmod sunt ipsum eu voluptate sunt. Laborum do nostrud amet commodo mollit aliqua commodo ex fugiat pariatur incididunt ea. Aute voluptate mollit culpa et cillum mollit proident ad ea proident labore. Qui aute labore pariatur ea.\r\nLaboris Lorem laborum reprehenderit sint duis adipisicing consectetur qui adipisicing cupidatat voluptate anim eu. Nostrud ea consequat officia Lorem sint enim sunt aute qui anim nulla. Est anim sit nisi magna anim. Non aliquip eu deserunt fugiat id irure voluptate labore nostrud. Qui qui ad nulla ea.\r\n", + "address": "4 Pierrepont Place", + "city": "Riviera", + "state": "Indiana", + "zip": 10834, + "country": "Nepal", + "email": "carissacastillo@scentric.com", + "phone": "(902) 528-2051", + "color": "rgb(116,122,170)" + }, + { + "index": 92, + "name": "Hooper Acosta", + "first": "Delacruz", + "last": "Hunt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "boolean": true, + "guid": "f3455179-b392-49d5-8f8e-0b570ff95363", + "integer": 63, + "date": "Wed Apr 18 1973 01:53:52 GMT-0800 (PST)", + "shortText": "aute consectetur", + "mediumText": "Non esse non cillum eiusmod. Velit consequat amet eiusmod do laborum est do. Id aliqua cupidatat tempor consectetur do consectetur.", + "longText": "In elit nisi dolore aliquip magna ex. Eu do in enim tempor duis adipisicing eiusmod magna ut velit velit do. Nostrud magna aliquip est exercitation qui elit sit.\r\nLabore Lorem minim id laborum proident in sit ea quis sit. Mollit excepteur voluptate sit qui. Ex in voluptate veniam magna dolor consectetur anim consectetur. Deserunt deserunt elit in id.\r\nAd incididunt aute labore commodo consectetur consectetur commodo magna irure. Duis adipisicing pariatur ea labore consequat ut pariatur labore laboris nulla occaecat. Irure aute id id eiusmod. Aute eiusmod Lorem eiusmod occaecat qui in veniam in laboris. Elit sit sit tempor tempor magna. Elit aliquip cupidatat commodo eiusmod consequat fugiat magna nisi fugiat irure aute dolore quis labore.\r\nOccaecat duis duis ad officia consectetur aute elit excepteur consectetur ullamco. Exercitation pariatur irure ad anim fugiat anim. Elit laborum velit aliquip et aliquip officia elit ad amet mollit nulla.\r\nFugiat minim minim anim labore culpa magna laborum veniam in reprehenderit id. Id sint pariatur excepteur commodo ullamco eu. Eiusmod magna commodo reprehenderit nostrud in culpa laboris occaecat aliqua. Sit pariatur nulla sit exercitation irure pariatur sit cillum occaecat exercitation. Aliqua dolore aliqua magna minim id ut eu veniam.\r\n", + "address": "3 Matthews Place", + "city": "Caron", + "state": "Tennessee", + "zip": 68234, + "country": "Falkland Islands (Malvinas)", + "email": "delacruzhunt@scentric.com", + "phone": "(928) 557-3052", + "color": "rgb(207,106,189)" + }, + { + "index": 93, + "name": "Leonor Rogers", + "first": "Claudette", + "last": "Walters", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "boolean": false, + "guid": "d7ddd425-5e0b-407b-b795-4591ac988f7e", + "integer": 14, + "date": "Fri Sep 10 1982 05:35:18 GMT-0700 (PDT)", + "shortText": "nisi enim velit consequat", + "mediumText": "Velit ea anim fugiat ex esse officia.", + "longText": "Anim voluptate consequat et deserunt. Officia culpa quis consequat et occaecat adipisicing commodo ipsum culpa elit Lorem elit. Proident sunt sint id tempor. Pariatur nulla enim id ut aliqua commodo amet ex. Dolor ad tempor Lorem cupidatat cillum deserunt nisi.\r\nDo ad cillum consequat eu nulla irure eiusmod eu aute est sint tempor. Irure irure in culpa commodo esse occaecat fugiat minim sit est dolor. Do ex dolor non quis adipisicing amet incididunt non eiusmod nisi laborum.\r\nDeserunt anim consequat incididunt pariatur eiusmod. Aute nostrud id ipsum consequat laboris dolore. Aliquip in ullamco est incididunt anim esse magna ea labore in.\r\nAliquip ex nisi sit pariatur nostrud do dolor eiusmod consectetur ad quis consequat fugiat. Culpa enim cillum sint minim deserunt duis officia duis laborum mollit cillum ad aliqua. Sint consectetur proident duis velit ea adipisicing. Amet deserunt ut quis est ipsum velit Lorem tempor velit reprehenderit adipisicing consectetur occaecat sint.\r\nMagna nulla aute qui deserunt nostrud cillum magna fugiat occaecat Lorem ipsum culpa. Est anim aute do nisi dolor sint qui pariatur. Fugiat culpa reprehenderit officia excepteur elit amet excepteur enim tempor sint sit consequat. Consequat enim laboris officia nisi irure irure consequat elit. Dolor minim do velit sit deserunt cillum.\r\n", + "address": "3 Fulton Street", + "city": "Hegins", + "state": "Palau", + "zip": 78135, + "country": "Peru", + "email": "claudettewalters@scentric.com", + "phone": "(942) 474-3822", + "color": "rgb(90,63,99)" + }, + { + "index": 94, + "name": "Cote Guerra", + "first": "Trisha", + "last": "Chavez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "boolean": false, + "guid": "da6e4096-5de2-48f3-a83e-e7e504b7ef50", + "integer": 60, + "date": "Wed Feb 14 1990 21:07:18 GMT-0800 (PST)", + "shortText": "amet officia", + "mediumText": "Pariatur nulla nulla aliqua sunt nulla excepteur id amet consequat. Nostrud eu aliquip enim esse eu non exercitation do nulla labore adipisicing dolor. Est voluptate excepteur aliquip voluptate nulla fugiat ut amet tempor.", + "longText": "Ullamco quis exercitation sunt sunt do aute sit qui duis non. Irure dolore tempor velit velit et eu sint elit. Velit esse deserunt elit minim adipisicing sint est commodo sit aute velit excepteur dolore sunt. Occaecat adipisicing occaecat pariatur do enim culpa proident nostrud labore aute consectetur esse dolor ut. Irure pariatur minim aute labore mollit eu deserunt amet deserunt. Ex velit ad quis ullamco.\r\nOfficia nostrud excepteur nisi id esse cupidatat adipisicing. Veniam ea duis nisi exercitation labore non pariatur velit officia Lorem tempor. Qui ea culpa laborum cillum commodo. Enim eu sit adipisicing voluptate est ex incididunt eu deserunt. Sit irure dolor non culpa anim. Sint ex ullamco culpa est ipsum. Id nostrud id eiusmod ea consequat anim nulla qui aliquip sunt sunt Lorem.\r\n", + "address": "4 Montauk Court", + "city": "Ryderwood", + "state": "Virginia", + "zip": 72564, + "country": "Tonga", + "email": "trishachavez@scentric.com", + "phone": "(986) 580-3064", + "color": "rgb(252,141,100)" + }, + { + "index": 95, + "name": "Stewart Bradley", + "first": "Desiree", + "last": "Sullivan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "boolean": false, + "guid": "09ba747d-fcdd-47ec-b40f-149aad2803bd", + "integer": 14, + "date": "Mon Aug 18 2014 05:24:18 GMT-0700 (PDT)", + "shortText": "veniam officia exercitation", + "mediumText": "Sint dolor aliqua velit eu eiusmod id. Velit pariatur sit labore sit sit elit dolore fugiat veniam excepteur ex. Velit ex elit ullamco ipsum sunt magna aliqua cupidatat veniam Lorem mollit eu sit. Consequat Lorem Lorem sit aute.", + "longText": "Nulla aliquip id sunt ex reprehenderit sit et amet adipisicing pariatur sit non mollit minim. Sint nisi occaecat duis ut amet veniam mollit. Esse ipsum ea in anim. Elit est adipisicing velit cupidatat laboris in laboris eiusmod non aliquip minim. Eu commodo occaecat occaecat cupidatat cillum nulla esse mollit exercitation eu.\r\n", + "address": "4 Douglass Street", + "city": "Hiko", + "state": "Wyoming", + "zip": 58685, + "country": "Tunisia", + "email": "desireesullivan@scentric.com", + "phone": "(955) 561-2349", + "color": "rgb(67,224,233)" + }, + { + "index": 96, + "name": "Corinne Farley", + "first": "Guthrie", + "last": "May", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "boolean": false, + "guid": "5fe813a0-75c4-4214-96b9-9b4d5fcea8bf", + "integer": 79, + "date": "Wed Aug 26 2009 12:40:36 GMT-0700 (PDT)", + "shortText": "eiusmod aliquip mollit aute", + "mediumText": "Ea irure ea pariatur laborum non commodo. Veniam est laboris ex occaecat laboris irure. Aliqua pariatur anim ut eu veniam do ex non veniam nostrud. Occaecat excepteur non est cillum commodo eu ullamco.", + "longText": "In anim esse ea excepteur est. Laboris qui ex ipsum cillum excepteur nisi. Non deserunt qui duis ut eiusmod ad laborum labore Lorem est cupidatat. Nulla eiusmod sint reprehenderit amet fugiat labore laboris.\r\nVoluptate anim minim cillum est aliquip. Occaecat eiusmod eu consectetur id id sit id aliquip minim. Id quis laboris duis dolore id pariatur officia irure ullamco cillum ullamco dolor. Ut pariatur excepteur eiusmod exercitation tempor.\r\nProident amet esse enim fugiat nostrud aute exercitation excepteur ut dolore incididunt. Eiusmod dolore irure ut tempor. Cupidatat id laboris aute nulla deserunt sint. Velit mollit ut eu commodo. Esse adipisicing veniam voluptate dolore laborum laboris qui aliquip fugiat ullamco ea exercitation voluptate. Enim veniam do aliquip aute laboris in elit magna anim. Consequat excepteur eu dolor officia eiusmod incididunt occaecat deserunt commodo nisi Lorem.\r\nMagna culpa dolore deserunt aliquip. Quis officia ut nulla et commodo officia ullamco. Cupidatat ea eiusmod nulla enim sit in.\r\nEst reprehenderit consectetur consectetur eu occaecat nulla nulla laboris est ad nulla exercitation. Amet nostrud nulla minim minim ea incididunt ea et. Exercitation qui qui mollit exercitation. Exercitation excepteur labore cillum laboris ut nulla excepteur pariatur ullamco ex ex consectetur consectetur. Lorem ex laborum in qui velit reprehenderit id pariatur esse enim. Do eu adipisicing culpa elit exercitation ea est occaecat. Et velit cupidatat excepteur sunt officia occaecat et cillum ut voluptate enim.\r\n", + "address": "3 Locust Street", + "city": "Wyano", + "state": "Colorado", + "zip": 24261, + "country": "Guadeloupe", + "email": "guthriemay@scentric.com", + "phone": "(952) 423-2212", + "color": "rgb(207,250,179)" + }, + { + "index": 97, + "name": "Heather Martinez", + "first": "Althea", + "last": "Quinn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "boolean": false, + "guid": "d67d7b7a-2ab1-446e-a591-4f565e74fe3d", + "integer": 13, + "date": "Mon Mar 17 2003 07:02:53 GMT-0800 (PST)", + "shortText": "adipisicing magna", + "mediumText": "Reprehenderit exercitation ut in ex voluptate dolore.", + "longText": "Pariatur pariatur do ipsum exercitation magna. Irure irure officia voluptate amet fugiat sint est proident reprehenderit cupidatat est eu. Esse ea eiusmod nostrud ad quis laborum deserunt nisi. Deserunt ut fugiat aliqua minim. Proident fugiat aliqua nostrud adipisicing Lorem velit et ipsum fugiat fugiat aliquip cupidatat Lorem.\r\nEx quis non excepteur est cillum non aute consequat ipsum aliqua nostrud sunt nisi non. Est aliquip enim aute culpa. Esse enim pariatur id velit nostrud adipisicing voluptate pariatur et sint sunt.\r\nUt quis cillum dolor minim nulla fugiat enim irure officia. Reprehenderit voluptate sint veniam velit tempor deserunt eu adipisicing id anim fugiat. Nostrud dolore esse reprehenderit enim nulla duis exercitation.\r\nCillum proident est dolore sint qui sint laborum enim exercitation aute in pariatur. Ut non eiusmod excepteur exercitation aliquip incididunt cupidatat magna deserunt in est. Excepteur duis incididunt sunt commodo amet nulla ex adipisicing incididunt in exercitation amet et. Ullamco eu nulla ipsum magna voluptate incididunt aliqua id.\r\n", + "address": "4 Arkansas Drive", + "city": "Catherine", + "state": "Utah", + "zip": 68985, + "country": "Australia", + "email": "altheaquinn@scentric.com", + "phone": "(997) 529-2688", + "color": "rgb(175,88,98)" + }, + { + "index": 98, + "name": "Good Mathis", + "first": "Hester", + "last": "Santana", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "boolean": true, + "guid": "8046ed24-325f-4486-9067-34ecfa37746c", + "integer": 67, + "date": "Sat Mar 19 1977 20:48:42 GMT-0800 (PST)", + "shortText": "commodo incididunt officia", + "mediumText": "Velit sint reprehenderit laboris occaecat in reprehenderit dolore adipisicing nisi pariatur enim aute. Cillum velit voluptate sit irure.", + "longText": "Irure labore incididunt nisi labore sint cillum cillum. Pariatur aute dolor duis ad eu nulla veniam enim voluptate. Laborum fugiat veniam occaecat adipisicing voluptate qui pariatur voluptate quis eu. Aliquip aute anim proident excepteur do aute consectetur ipsum exercitation est velit consequat laboris. Amet proident enim aute excepteur cillum. Do occaecat ullamco proident adipisicing ullamco id anim nostrud. Laborum ullamco occaecat aliqua eiusmod culpa quis nulla ad dolore ad ullamco.\r\nEsse ex officia qui qui aute. Ipsum sint irure nostrud nulla culpa cupidatat do. Aute ullamco occaecat aliquip in tempor minim ut nisi aliquip nostrud cillum Lorem. Excepteur dolor cupidatat eiusmod Lorem. Dolore eu ad sint ullamco voluptate.\r\nSit cupidatat id mollit occaecat in officia amet in magna enim sint. Officia deserunt proident quis in ut. Excepteur incididunt amet nulla labore eu incididunt adipisicing laboris nisi. Magna nisi proident deserunt sunt do deserunt eiusmod pariatur.\r\nDo elit quis occaecat anim aliquip aliquip excepteur. Enim laborum proident labore ad nulla duis magna tempor duis. Commodo veniam tempor minim cillum ex dolor.\r\nVelit adipisicing mollit pariatur in ipsum tempor id velit excepteur laborum amet laborum laborum. Excepteur eu exercitation veniam sit veniam incididunt sit. Elit commodo eu aute tempor aliquip esse non minim mollit. Consequat amet deserunt non enim. Nostrud anim Lorem aliquip cupidatat.\r\n", + "address": "3 Fiske Place", + "city": "Klagetoh", + "state": "Idaho", + "zip": 38305, + "country": "Dominican Republic", + "email": "hestersantana@scentric.com", + "phone": "(802) 512-3640", + "color": "rgb(253,247,138)" + }, + { + "index": 99, + "name": "Hurley Eaton", + "first": "Garner", + "last": "Kirk", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "boolean": true, + "guid": "312f254d-5789-4396-a389-10090b30c80a", + "integer": 80, + "date": "Sun Jun 01 2008 17:44:07 GMT-0700 (PDT)", + "shortText": "enim laborum", + "mediumText": "Reprehenderit labore magna est sunt dolore excepteur ea. Duis laboris eiusmod do laboris cupidatat proident in amet quis adipisicing est nisi.", + "longText": "Sunt mollit aliqua nisi irure sit. Minim sit amet duis nisi Lorem veniam. Deserunt anim est sint consequat pariatur elit eu magna incididunt duis aliquip. Do ipsum adipisicing eu quis ut nostrud fugiat ad in nostrud est sint enim. Incididunt exercitation commodo ipsum ut eu. Irure et adipisicing esse dolor eu. Ea consequat cillum eu occaecat in magna cillum anim culpa deserunt.\r\nConsectetur adipisicing velit minim et occaecat laborum minim fugiat eu laboris minim anim id do. Sint cupidatat pariatur sit quis quis elit pariatur. Deserunt proident enim Lorem est minim nisi et laborum nisi exercitation. Mollit qui consequat proident aliqua ad quis dolor. Irure nulla nisi ut Lorem ullamco sint et nulla dolore consectetur. Esse Lorem qui do pariatur mollit in velit amet labore.\r\nAliqua magna eiusmod ea velit sit voluptate in ea ad Lorem laborum aute cillum et. Veniam ea eiusmod dolor Lorem adipisicing deserunt. Do sunt dolore do fugiat et magna id aliquip nulla occaecat mollit.\r\nId veniam voluptate irure est ea irure nostrud ex. Est anim est dolor exercitation reprehenderit minim non est commodo ex est ut Lorem. Nulla aute nulla dolore amet deserunt elit tempor reprehenderit amet. Nulla et magna aliqua laborum ut minim ad in ex mollit dolor officia.\r\n", + "address": "2 Marconi Place", + "city": "Clarktown", + "state": "Arkansas", + "zip": 81655, + "country": "Zaire", + "email": "garnerkirk@scentric.com", + "phone": "(901) 504-3233", + "color": "rgb(141,220,214)" + }, + { + "index": 100, + "name": "Ruby Schroeder", + "first": "Julianne", + "last": "Hurst", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "boolean": false, + "guid": "ae0e0ad1-423d-4e87-9d72-e7957011b3b1", + "integer": 51, + "date": "Tue Jun 14 1977 06:58:41 GMT-0700 (PDT)", + "shortText": "consectetur", + "mediumText": "Ex ea veniam ut velit aute dolore laborum ut. Ex proident elit cillum elit reprehenderit amet fugiat cillum cupidatat fugiat. Elit Lorem aute ad ad sit exercitation aute excepteur ex elit.", + "longText": "Eiusmod in irure exercitation aute aliquip qui sit amet ullamco cillum eiusmod enim. Ut aliquip occaecat nisi aliqua ut esse minim. Tempor deserunt dolore ea fugiat tempor cupidatat fugiat excepteur consectetur velit tempor eiusmod laborum. Adipisicing incididunt ex sit aliqua deserunt in culpa. Veniam ipsum enim duis enim ex proident do anim amet. Ipsum consequat ut labore non quis cupidatat adipisicing eiusmod amet.\r\nQui consectetur pariatur adipisicing aliquip nulla labore nulla in laborum excepteur eiusmod eu esse. Elit duis commodo ex laboris consectetur sunt in ullamco elit aliquip commodo consequat adipisicing. Labore eiusmod dolore ut voluptate proident. Officia fugiat culpa elit consectetur mollit sint ut. Duis magna cillum Lorem adipisicing amet nisi minim laboris nostrud fugiat eu nisi sunt.\r\nEa voluptate anim reprehenderit eu laboris ex ad non ut magna eu esse laborum. Eiusmod non dolor ex adipisicing sunt elit proident in officia pariatur eiusmod minim voluptate ex. Commodo excepteur enim sit dolor magna. Quis velit adipisicing pariatur ad ullamco ullamco eu fugiat consectetur. Est fugiat esse cupidatat velit ea aute laboris occaecat ullamco est velit. Aliqua adipisicing ex duis ipsum.\r\nLaboris mollit est officia in commodo consequat ullamco officia id aute non in ut. Excepteur ad magna sit dolore voluptate irure ut. Occaecat ea duis ipsum excepteur fugiat esse nulla incididunt fugiat adipisicing cupidatat labore. Voluptate eu consectetur tempor qui in quis in ad proident magna ex aliquip ad. Aute laboris consectetur proident ullamco voluptate nulla commodo tempor aliqua magna. Laborum eiusmod nulla occaecat quis elit aliquip aute id irure ut excepteur.\r\n", + "address": "3 Wyckoff Avenue", + "city": "Holcombe", + "state": "Delaware", + "zip": 49315, + "country": "China", + "email": "juliannehurst@scentric.com", + "phone": "(867) 576-3002", + "color": "rgb(191,56,212)" + }, + { + "index": 101, + "name": "Alana Wise", + "first": "Edith", + "last": "Suarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "boolean": true, + "guid": "19280eda-c661-4fde-88e3-e7e705ea0a83", + "integer": 59, + "date": "Wed Jun 25 2003 02:31:03 GMT-0700 (PDT)", + "shortText": "aute", + "mediumText": "Consectetur eu aute tempor mollit do aute nostrud adipisicing ad commodo id.", + "longText": "Incididunt excepteur cupidatat mollit ad tempor esse cupidatat velit ipsum non tempor est incididunt. Duis consequat dolore elit cupidatat mollit est. Exercitation et ex deserunt adipisicing tempor consectetur adipisicing ipsum deserunt amet enim tempor. Excepteur elit sit cupidatat cupidatat sit ea anim ullamco cupidatat nisi consectetur ut. Adipisicing amet duis occaecat excepteur adipisicing et exercitation enim est.\r\nCulpa nulla dolor ullamco occaecat dolor elit irure dolor velit anim id incididunt eiusmod ut. Deserunt dolore fugiat ipsum tempor ut dolore nostrud. Exercitation cillum culpa nostrud est. Quis qui sunt dolor id aliquip culpa anim nisi deserunt.\r\nLaborum eu minim aliqua excepteur ad. Sit tempor ullamco laborum excepteur pariatur deserunt cupidatat. Sint anim eiusmod sint elit. Incididunt consequat officia incididunt cillum. Reprehenderit anim reprehenderit esse officia et ea excepteur nisi magna. Lorem cupidatat in fugiat eu. Exercitation occaecat do eiusmod esse.\r\nAnim ullamco excepteur culpa deserunt enim est dolore duis ea anim exercitation. In et pariatur exercitation occaecat ad id Lorem ullamco consectetur labore ut laboris excepteur magna. Aute exercitation Lorem fugiat esse incididunt. Nulla nostrud ea ipsum eiusmod laboris nulla qui veniam aute officia eiusmod ad. Et anim ut dolor qui commodo occaecat nostrud non ex.\r\nCillum non et laborum cillum ex officia ullamco aliquip ut Lorem. Duis est sit sunt laboris ullamco deserunt dolor labore ut. Cupidatat elit do aute aliquip laborum tempor amet laboris occaecat id exercitation elit. Ullamco quis laboris voluptate amet duis elit incididunt mollit anim proident.\r\n", + "address": "4 Leonard Street", + "city": "Bluetown", + "state": "Federated States Of Micronesia", + "zip": 89344, + "country": "British Indian Ocean Territory", + "email": "edithsuarez@scentric.com", + "phone": "(920) 452-3377", + "color": "rgb(69,58,250)" + }, + { + "index": 102, + "name": "Kristen Wheeler", + "first": "Burke", + "last": "Barnes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "boolean": true, + "guid": "64341244-b22d-415d-8856-27b7c1b9e527", + "integer": 7, + "date": "Wed Jul 20 1994 02:28:58 GMT-0700 (PDT)", + "shortText": "duis dolore non minim est", + "mediumText": "Veniam amet sit nulla labore Lorem exercitation excepteur nostrud nulla velit proident laboris.", + "longText": "Ex incididunt do ad enim eu labore fugiat nulla enim elit. Cupidatat ipsum quis qui labore excepteur ullamco elit minim. Magna minim elit non mollit in consectetur cillum esse cillum ut esse aliquip anim. Reprehenderit ea irure eu consectetur nisi.\r\n", + "address": "2 Crooke Avenue", + "city": "Geyserville", + "state": "Guam", + "zip": 77246, + "country": "Libya", + "email": "burkebarnes@scentric.com", + "phone": "(843) 586-2743", + "color": "rgb(221,72,113)" + }, + { + "index": 103, + "name": "Clark Powell", + "first": "Hahn", + "last": "Lancaster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "boolean": true, + "guid": "d83aada5-7279-4d3c-81fe-360aa4d342af", + "integer": 44, + "date": "Tue Apr 17 2007 17:02:41 GMT-0700 (PDT)", + "shortText": "officia excepteur fugiat", + "mediumText": "Commodo consequat esse amet deserunt duis magna. Cupidatat aliquip consectetur anim incididunt laboris. Reprehenderit Lorem enim cillum pariatur est sint aliqua commodo non tempor.", + "longText": "Nisi tempor irure nulla duis. Cillum aliquip commodo in minim sunt proident exercitation do dolore velit. Nulla sunt sit officia magna ex ea.\r\nEa consequat aute duis quis elit. Sint aute deserunt commodo reprehenderit aliqua consequat commodo minim ut quis incididunt reprehenderit. Nulla elit voluptate laboris laboris dolore labore tempor pariatur deserunt reprehenderit tempor non occaecat pariatur. Elit pariatur irure ex exercitation ut ex dolore dolore consequat consectetur magna. Lorem consectetur est reprehenderit pariatur dolore sit Lorem Lorem ad ea elit.\r\nAd occaecat est ullamco occaecat voluptate. Aute proident in est adipisicing. Anim ipsum est voluptate ipsum cillum eiusmod aliquip. Officia magna irure commodo ut pariatur est eu nostrud laboris excepteur adipisicing deserunt consectetur amet. Qui consequat cupidatat laborum non.\r\nDolore do cupidatat irure quis culpa aliquip elit laboris consequat qui magna dolore. Magna esse qui exercitation dolore tempor tempor ex irure veniam cupidatat commodo qui officia fugiat. Fugiat aliqua eiusmod deserunt esse elit nisi. Reprehenderit pariatur duis excepteur eiusmod esse. Velit nulla nisi reprehenderit Lorem minim ut tempor nulla aliqua in incididunt aute esse aliquip. Duis laborum quis non commodo officia commodo. Officia nostrud do qui velit occaecat aute ex adipisicing officia et excepteur velit irure officia.\r\n", + "address": "3 Polhemus Place", + "city": "Franklin", + "state": "Pennsylvania", + "zip": 30447, + "country": "Cook Islands", + "email": "hahnlancaster@scentric.com", + "phone": "(901) 537-3991", + "color": "rgb(225,104,190)" + }, + { + "index": 104, + "name": "Tamra Cox", + "first": "Acevedo", + "last": "Bell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "boolean": true, + "guid": "2d002e10-253b-41d7-bca7-add74579f9d5", + "integer": 0, + "date": "Thu Nov 04 1982 13:05:17 GMT-0800 (PST)", + "shortText": "ullamco in aliqua", + "mediumText": "Irure eiusmod ullamco occaecat deserunt. Ullamco nisi veniam nulla ea labore irure incididunt sit nulla ut commodo.", + "longText": "Culpa elit est velit laborum do eu cillum. Adipisicing sit incididunt ea exercitation anim irure laboris quis reprehenderit adipisicing exercitation adipisicing eu aliquip. Irure aliqua minim irure labore magna cillum fugiat sit occaecat sint. Eiusmod velit dolore est nisi do dolor id quis nisi sunt id anim ex proident. Laborum consectetur deserunt amet anim non commodo occaecat proident et.\r\nDo in magna deserunt dolor aute ad occaecat consectetur qui. Dolore in eiusmod id mollit tempor pariatur sunt reprehenderit incididunt ipsum aliquip dolor qui commodo. Eiusmod in mollit fugiat qui. Nulla nostrud officia aute minim. Officia id proident excepteur sunt amet occaecat nisi anim amet reprehenderit. Tempor duis mollit nostrud enim reprehenderit fugiat nostrud ea proident magna. Sint magna labore aliqua tempor officia do nisi ex in cillum nisi.\r\nNulla tempor in cillum et eiusmod ad qui dolor consequat do deserunt. Mollit ex anim consequat aliqua commodo. Adipisicing cillum ut nostrud ad aliquip. Ipsum occaecat reprehenderit ipsum in veniam tempor deserunt ut adipisicing dolore dolore cupidatat. Consequat velit officia quis labore mollit reprehenderit duis consectetur excepteur nisi tempor.\r\n", + "address": "4 Grand Street", + "city": "Iola", + "state": "New Hampshire", + "zip": 44737, + "country": "Iran", + "email": "acevedobell@scentric.com", + "phone": "(813) 503-2649", + "color": "rgb(84,124,140)" + }, + { + "index": 105, + "name": "Barr Higgins", + "first": "Tonia", + "last": "Walton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "boolean": true, + "guid": "b381e41b-6b9b-4f51-85f1-661eade44d9d", + "integer": 93, + "date": "Tue Dec 24 1985 18:32:45 GMT-0800 (PST)", + "shortText": "sunt nisi laborum", + "mediumText": "Aliqua esse in cillum nostrud exercitation duis cupidatat cillum non deserunt culpa.", + "longText": "Exercitation ad do aliqua nostrud magna consequat. Ex ea commodo fugiat labore ipsum officia minim do velit proident sit. Voluptate eiusmod consequat voluptate dolor consectetur eu sunt eiusmod veniam. Exercitation eiusmod fugiat reprehenderit laboris.\r\nMollit aliqua est laboris proident non esse culpa cupidatat laborum qui nulla deserunt occaecat elit. Lorem esse quis labore dolor dolore labore nostrud ea labore veniam tempor. Anim elit nostrud ut velit pariatur sint laborum velit. Et esse culpa voluptate dolor commodo aliquip est ut. Laboris ullamco enim exercitation ea velit excepteur enim veniam in mollit irure. Qui nisi sit ad consequat veniam proident proident reprehenderit ipsum dolore proident. Nostrud occaecat quis laboris magna labore ut tempor consectetur labore cupidatat ea irure pariatur.\r\nAd consectetur commodo do excepteur. Velit fugiat qui pariatur velit nostrud enim. Et in ea enim non exercitation aliqua anim commodo cillum ullamco in nulla nostrud. Eu ex enim ut enim magna duis aliquip ullamco enim. Aute anim ex incididunt cillum eiusmod minim ut nostrud excepteur dolore. Reprehenderit nisi nisi consequat consequat mollit dolor excepteur ipsum aute est tempor. Occaecat in aute ea Lorem ex consectetur.\r\nCupidatat nulla ullamco mollit id consequat. Dolore aute sit est voluptate cillum adipisicing laboris ex non adipisicing. Minim proident labore nisi eu proident irure et et. Dolor deserunt deserunt in et qui consectetur ullamco occaecat. Magna ut tempor fugiat velit. Magna elit id Lorem quis occaecat dolor irure amet nulla. Proident ex ullamco consectetur consequat consequat eiusmod dolor proident aliquip ut.\r\nExcepteur ea aliqua elit incididunt deserunt commodo nisi. Exercitation nostrud in officia anim ea non anim laborum ullamco incididunt. Do aliqua excepteur officia reprehenderit reprehenderit cillum. Duis nostrud veniam occaecat quis exercitation magna mollit est fugiat ullamco in consectetur culpa cillum. Minim consequat elit ipsum in occaecat sit dolor sint laborum.\r\n", + "address": "4 Banker Street", + "city": "Silkworth", + "state": "North Dakota", + "zip": 14286, + "country": "Aruba", + "email": "toniawalton@scentric.com", + "phone": "(889) 461-2741", + "color": "rgb(116,194,59)" + }, + { + "index": 106, + "name": "Hickman Copeland", + "first": "Ross", + "last": "Ratliff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "boolean": true, + "guid": "2f265cef-ebfa-484a-b328-63fa19eed885", + "integer": 91, + "date": "Tue Mar 20 1979 12:59:39 GMT-0800 (PST)", + "shortText": "eiusmod", + "mediumText": "Culpa dolor sunt culpa magna.", + "longText": "Aute amet velit labore labore culpa. Minim eiusmod eiusmod eiusmod nostrud et quis in et culpa ex sit incididunt Lorem. Cupidatat adipisicing Lorem dolore consequat elit.\r\n", + "address": "2 Euclid Avenue", + "city": "Rosewood", + "state": "Northern Mariana Islands", + "zip": 23138, + "country": "Faroe Islands", + "email": "rossratliff@scentric.com", + "phone": "(917) 466-2566", + "color": "rgb(245,137,240)" + }, + { + "index": 107, + "name": "Cervantes Mckee", + "first": "Vasquez", + "last": "Knapp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "boolean": false, + "guid": "3658528d-3180-47bd-9c2e-d4f53947e409", + "integer": 27, + "date": "Sat Jan 23 1971 05:21:04 GMT-0800 (PST)", + "shortText": "eiusmod ullamco", + "mediumText": "Nulla tempor cupidatat consequat fugiat consequat irure non in. Ea eiusmod exercitation dolor labore laborum irure anim tempor exercitation.", + "longText": "Incididunt sit fugiat nulla ipsum. Veniam ex nostrud eu reprehenderit cillum. Fugiat nostrud esse eiusmod cupidatat consectetur ipsum sit duis consectetur cupidatat duis ullamco incididunt. Ea cupidatat esse sint adipisicing magna enim irure. Irure amet officia elit ullamco est cupidatat. Voluptate ut Lorem commodo occaecat nisi non id in ullamco occaecat est. Officia ea ea tempor irure commodo aute laborum et enim quis magna occaecat.\r\nAdipisicing ullamco aute duis labore duis est id Lorem ea commodo do nulla laboris. Et magna aliquip Lorem in in consectetur enim nulla do ad. Ea aute Lorem dolore eiusmod qui aliqua in cupidatat velit labore aliquip. Est esse velit sit consectetur anim nostrud ullamco commodo magna mollit in ut tempor. Lorem velit irure eiusmod duis amet et consectetur est quis non nulla incididunt et. Incididunt tempor ex minim amet reprehenderit. Anim nisi dolor ad tempor officia.\r\nEa ex esse amet excepteur tempor officia cupidatat eu cupidatat sit irure. Lorem minim quis ut non sit ullamco id tempor minim aliquip deserunt. Voluptate consectetur qui velit occaecat ullamco ea cupidatat tempor in anim ad magna. Ut velit dolore eiusmod reprehenderit incididunt irure anim laboris voluptate mollit incididunt minim ad duis.\r\n", + "address": "4 Crown Street", + "city": "Lowgap", + "state": "South Dakota", + "zip": 17680, + "country": "Zambia", + "email": "vasquezknapp@scentric.com", + "phone": "(889) 408-3991", + "color": "rgb(212,58,71)" + }, + { + "index": 108, + "name": "Juana Melendez", + "first": "Ford", + "last": "Greer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "boolean": false, + "guid": "b9726558-94a5-4533-9213-cc6b11fa2b5d", + "integer": 94, + "date": "Mon Jul 17 1972 18:15:51 GMT-0700 (PDT)", + "shortText": "laboris velit esse", + "mediumText": "Aute ad non aute ipsum sint commodo cupidatat elit adipisicing fugiat.", + "longText": "Veniam ex consectetur id pariatur ipsum pariatur non officia sint. Exercitation quis eiusmod nisi officia aliquip. Laborum commodo occaecat ex ipsum aliqua. Et incididunt sunt deserunt Lorem eiusmod anim. Cillum consequat nulla ipsum eiusmod nulla velit pariatur aliqua. Reprehenderit est fugiat minim adipisicing ex esse adipisicing irure eu pariatur cupidatat.\r\nIn cupidatat elit reprehenderit deserunt sint mollit laborum consectetur enim anim. Consequat fugiat velit ut ipsum et duis consectetur. Aliqua velit nisi consequat mollit anim id quis cillum anim laboris exercitation adipisicing. Aliqua commodo cillum ut tempor incididunt sint ipsum incididunt nisi proident.\r\nEst qui incididunt dolore id. Culpa enim proident consectetur sunt. Ad laborum amet eiusmod mollit velit. Amet exercitation tempor nulla ullamco dolor fugiat non nostrud magna nisi veniam mollit laborum non.\r\nDuis ipsum voluptate ut laborum veniam. Commodo adipisicing sit nostrud mollit sint consequat ullamco sint amet ut enim. Anim pariatur magna reprehenderit elit fugiat culpa incididunt elit. Est irure tempor aliquip aliqua elit consequat pariatur est proident mollit tempor magna velit. Id nisi est cillum ut officia mollit deserunt nostrud ullamco.\r\nSit anim quis fugiat ullamco ipsum nulla proident sunt. Culpa est laborum veniam labore sit in mollit minim voluptate cupidatat. Elit qui sit amet qui eiusmod dolor. Irure sunt et minim culpa cillum. Minim consequat culpa ullamco excepteur duis nostrud consectetur proident dolor mollit veniam pariatur quis. Deserunt in reprehenderit eu velit ipsum excepteur pariatur deserunt officia fugiat qui exercitation magna dolor. Eiusmod cupidatat irure nisi dolor veniam aute ea quis nostrud eu esse excepteur aliquip.\r\n", + "address": "2 Crescent Street", + "city": "Valle", + "state": "Alaska", + "zip": 40517, + "country": "Albania", + "email": "fordgreer@scentric.com", + "phone": "(816) 454-3618", + "color": "rgb(249,251,66)" + }, + { + "index": 109, + "name": "Morin Franks", + "first": "Olive", + "last": "Bernard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "boolean": false, + "guid": "9c1e0cc3-71ab-4f1f-a061-864215df9f71", + "integer": 74, + "date": "Tue Aug 17 1976 13:06:23 GMT-0700 (PDT)", + "shortText": "reprehenderit voluptate occaecat tempor", + "mediumText": "Excepteur proident officia commodo ad aute et exercitation aliqua. Consequat exercitation proident ut sit cupidatat nulla dolor occaecat sit ad fugiat. Lorem cupidatat labore tempor fugiat consequat labore. Laborum consectetur amet mollit ullamco deserunt amet cupidatat qui. Est nulla est nostrud duis proident culpa laborum ipsum mollit cupidatat proident irure nisi officia.", + "longText": "Nulla consectetur velit cupidatat dolor ex dolore pariatur ea occaecat eu quis ut non elit. Magna esse consequat eu sit laboris dolor ullamco elit dolor. Eiusmod laboris irure consequat cillum. Nisi incididunt dolor velit aliquip labore culpa voluptate proident laborum adipisicing veniam aute. Aliquip exercitation ad culpa excepteur nisi minim non quis excepteur commodo esse nostrud laborum. Enim anim do duis deserunt mollit esse laborum anim. Aliqua eiusmod sunt aliqua officia quis in voluptate deserunt magna labore enim sit laborum.\r\nVelit dolor aute est sit aliqua. Occaecat occaecat officia pariatur esse do aute aliqua. Magna nostrud consectetur amet consequat veniam magna duis non. Est eu elit pariatur minim ut sit laborum proident. Do adipisicing et est ex id dolore. Amet magna minim do dolor duis veniam ipsum ex commodo anim culpa sint.\r\n", + "address": "2 Banner Avenue", + "city": "Forbestown", + "state": "Louisiana", + "zip": 26490, + "country": "Panama", + "email": "olivebernard@scentric.com", + "phone": "(980) 446-2496", + "color": "rgb(250,59,84)" + }, + { + "index": 110, + "name": "Le Frank", + "first": "Ada", + "last": "Love", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "boolean": false, + "guid": "6d7f1953-73e2-4cf5-904a-467d37de4108", + "integer": 28, + "date": "Mon Aug 03 1970 01:48:44 GMT-0700 (PDT)", + "shortText": "do officia", + "mediumText": "Ad elit labore sit culpa reprehenderit non elit sunt. Officia occaecat aliquip aliqua minim eu. Lorem aute consequat sunt sint excepteur do laborum consequat do. Occaecat eu enim irure laborum occaecat elit duis. Occaecat aute ad non Lorem voluptate magna.", + "longText": "Dolore sint proident ea culpa proident ut eu ipsum pariatur culpa fugiat est nisi sunt. Voluptate ut excepteur aliquip enim adipisicing deserunt. Commodo irure irure id non officia elit do eiusmod. Voluptate ipsum dolor sint aliquip laboris fugiat cupidatat et ea proident nostrud cillum duis.\r\nAliqua eiusmod sit laboris non tempor proident ea. Ut excepteur tempor non nisi. Do id velit do non anim laborum ad est laborum consequat. Ea sunt velit do incididunt duis amet velit adipisicing exercitation anim. Duis eiusmod exercitation officia dolor aliqua officia fugiat ad fugiat dolor elit qui. Sunt reprehenderit est esse enim exercitation eiusmod et quis ea et dolore. Enim occaecat sunt sit do velit nulla cillum laboris.\r\nMinim cupidatat ex minim excepteur. Quis est enim officia proident voluptate tempor anim duis. Magna anim voluptate ullamco dolore dolore aute ipsum nulla ea est nulla exercitation eiusmod. Ex Lorem nulla et do consequat nulla ipsum enim ad amet excepteur ipsum incididunt veniam. Occaecat enim eu aliquip consectetur fugiat anim. Cillum pariatur quis ullamco minim nisi proident dolor occaecat ad ipsum commodo deserunt eu nostrud. Sunt reprehenderit et ipsum exercitation est veniam aute ut ex.\r\nAd aliquip ad et aliquip. Officia ex est qui nisi dolore velit sint. Et enim voluptate irure culpa eiusmod id incididunt minim voluptate ut eiusmod incididunt. Non occaecat cillum exercitation duis eiusmod id laboris veniam. Nisi id ut veniam excepteur.\r\n", + "address": "4 Rochester Avenue", + "city": "Chesapeake", + "state": "Missouri", + "zip": 58919, + "country": "Turks and Caicos Islands", + "email": "adalove@scentric.com", + "phone": "(895) 541-3397", + "color": "rgb(133,191,68)" + }, + { + "index": 111, + "name": "Joseph Hooper", + "first": "Sally", + "last": "Blackwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "boolean": false, + "guid": "e86e14ac-2f06-4abd-93f2-552b79ec5e01", + "integer": 95, + "date": "Tue Jul 21 1987 11:15:23 GMT-0700 (PDT)", + "shortText": "anim duis", + "mediumText": "Amet ut occaecat do non nulla aute aliquip qui. Dolore sint sit ipsum ea minim reprehenderit irure quis magna elit exercitation mollit. Aute ullamco minim ut cupidatat incididunt aute occaecat aute ea consequat sint.", + "longText": "Officia commodo aute culpa sit ea in qui mollit laborum sunt aute eiusmod aliquip cillum. Velit commodo nisi qui consectetur eiusmod ad Lorem cupidatat irure adipisicing do adipisicing commodo. Laborum mollit cillum ad tempor. Anim proident culpa aliqua amet anim pariatur consequat aliquip anim cupidatat ut reprehenderit. Dolor reprehenderit magna enim dolore eu laborum consectetur do commodo proident. Duis voluptate dolor magna occaecat officia adipisicing duis voluptate adipisicing ex cupidatat. Ex aute adipisicing ullamco consectetur aute minim occaecat sit commodo Lorem duis.\r\nFugiat officia do do cillum ut adipisicing nisi nostrud culpa cupidatat. Magna velit ad excepteur et sunt sunt esse commodo velit consequat occaecat officia ea magna. Cillum culpa id aliqua in. Fugiat dolore elit do ea aliqua duis id eiusmod cillum amet ut. Dolor id magna id dolor aliqua veniam elit adipisicing qui nulla. Ex mollit consectetur adipisicing elit id eiusmod sunt deserunt veniam qui quis ut.\r\nProident exercitation aliqua occaecat anim tempor ullamco non laborum reprehenderit. Ullamco consectetur eiusmod ut quis cillum. Nulla officia in quis est sit consectetur eu ipsum sunt. Sunt cupidatat velit cillum non proident excepteur qui non aliquip.\r\nAd amet sit sint adipisicing dolore eu enim dolore velit sit deserunt. Esse labore non proident magna ut aliquip in id ex deserunt. Reprehenderit magna consequat irure ad ullamco pariatur magna consectetur pariatur magna voluptate non sunt.\r\nIpsum sint deserunt enim labore ea deserunt sint pariatur. Amet sit sint id minim esse quis magna fugiat dolore. Ullamco et magna ex dolor do commodo amet nostrud commodo adipisicing cillum. Dolor culpa mollit elit sit et enim ullamco fugiat proident occaecat.\r\n", + "address": "3 Congress Street", + "city": "Tedrow", + "state": "Kentucky", + "zip": 17527, + "country": "Christmas Island", + "email": "sallyblackwell@scentric.com", + "phone": "(883) 597-2036", + "color": "rgb(213,146,224)" + }, + { + "index": 112, + "name": "Shepherd Burt", + "first": "Pansy", + "last": "Young", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "boolean": false, + "guid": "e82c95af-0ea1-4299-9f4e-131f39c1c537", + "integer": 49, + "date": "Sat May 24 2014 22:33:36 GMT-0700 (PDT)", + "shortText": "labore fugiat", + "mediumText": "Culpa eiusmod culpa nostrud voluptate eiusmod ea voluptate voluptate ex ut. Cillum consectetur voluptate tempor irure commodo id excepteur tempor laborum nisi. Proident eiusmod exercitation mollit sunt in est aliqua mollit non deserunt fugiat excepteur quis.", + "longText": "Sunt quis nisi cillum aute est reprehenderit non. Ullamco pariatur in est officia nisi laborum ad ut pariatur qui elit. Ipsum voluptate labore in et laboris amet quis esse occaecat dolore veniam cupidatat voluptate. In sint aute aliqua ea dolor Lorem quis sunt.\r\n", + "address": "2 Remsen Street", + "city": "Abrams", + "state": "American Samoa", + "zip": 37068, + "country": "Botswana", + "email": "pansyyoung@scentric.com", + "phone": "(938) 478-3164", + "color": "rgb(190,139,243)" + }, + { + "index": 113, + "name": "Brianna Peterson", + "first": "Carla", + "last": "Davidson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "boolean": true, + "guid": "e7c8b790-5171-41b9-8926-16f6ba35a268", + "integer": 74, + "date": "Sun Aug 06 1989 02:58:01 GMT-0700 (PDT)", + "shortText": "sunt ex laboris cupidatat culpa", + "mediumText": "Ut duis eu quis nostrud irure excepteur quis. Cillum quis aute occaecat eu laborum non incididunt.", + "longText": "Tempor aute incididunt exercitation pariatur eu sunt magna excepteur. Do ex officia proident laborum ullamco cillum. In elit consequat anim velit commodo pariatur ad enim est nostrud anim proident amet nostrud. Proident duis incididunt ad deserunt nisi cupidatat irure eu cupidatat magna qui quis sunt.\r\nConsectetur occaecat sunt sint nostrud est dolor officia dolor occaecat ipsum labore consequat. Consequat eu ipsum voluptate et exercitation ex dolor commodo pariatur elit eu amet. In consectetur Lorem veniam est minim consectetur excepteur irure cillum. Ut Lorem incididunt laboris minim proident sit mollit tempor ad culpa amet amet. Quis duis velit ut dolor proident dolore proident ex sit adipisicing do.\r\nEsse elit occaecat pariatur nulla sint non elit aliquip est voluptate laboris. Consequat culpa fugiat ea eu. Et minim culpa voluptate amet. Sint qui cillum consequat quis velit et aliqua occaecat duis quis. Aute sunt aute in exercitation id exercitation cupidatat irure. Anim et minim cillum dolore irure enim eiusmod pariatur ad deserunt ea.\r\nIrure esse reprehenderit proident tempor non cupidatat incididunt laboris culpa eiusmod elit culpa velit non. Sit ullamco incididunt exercitation enim quis commodo id Lorem minim duis. Duis nulla sunt sit reprehenderit duis excepteur laborum in ut dolore consequat. Aliqua esse culpa nulla et amet ex fugiat sit non sunt. Elit nostrud commodo sunt veniam anim ut duis ullamco labore ex aliqua laboris.\r\n", + "address": "4 Oriental Court", + "city": "Valmy", + "state": "Minnesota", + "zip": 13895, + "country": "Algeria", + "email": "carladavidson@scentric.com", + "phone": "(995) 595-3974", + "color": "rgb(179,161,85)" + }, + { + "index": 114, + "name": "Erica Campbell", + "first": "Emilia", + "last": "Hernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "boolean": false, + "guid": "a14b1c62-e553-458d-ab78-cd9e278ac859", + "integer": 59, + "date": "Tue Aug 21 2012 17:43:47 GMT-0700 (PDT)", + "shortText": "ut id sit ea est", + "mediumText": "Aliquip occaecat voluptate ea dolor pariatur. Dolor amet velit adipisicing duis elit nisi aute incididunt veniam minim.", + "longText": "Id eu commodo in anim proident sit aliquip sit. Mollit dolor exercitation laborum veniam reprehenderit tempor reprehenderit. Culpa in cillum nisi occaecat elit aute duis est. Laborum quis laborum nostrud amet nulla quis exercitation non officia cupidatat culpa deserunt incididunt nulla. Exercitation exercitation ex velit ipsum excepteur esse dolor ipsum et anim non proident Lorem. Nostrud laboris consectetur et eiusmod sint. Amet adipisicing dolore Lorem deserunt ad cupidatat labore.\r\nNisi ipsum anim aliquip id sit proident reprehenderit aute. Esse duis incididunt minim nisi velit do incididunt anim nostrud. In mollit aliquip duis proident dolor. Sunt ipsum amet esse laborum.\r\nCupidatat anim enim do ut. Nostrud ipsum consectetur non ipsum officia. Aliqua commodo eiusmod eu labore laborum. Magna aliqua in est amet eu anim reprehenderit qui ullamco est anim sit et. Est deserunt tempor commodo occaecat dolore sint esse aliquip culpa sint cupidatat non cupidatat. Est reprehenderit irure esse fugiat ad pariatur fugiat. Labore non consectetur nisi aliquip adipisicing culpa incididunt ad consectetur consequat ipsum.\r\n", + "address": "2 Legion Street", + "city": "Cuylerville", + "state": "Hawaii", + "zip": 84971, + "country": "Switzerland", + "email": "emiliahernandez@scentric.com", + "phone": "(922) 599-3995", + "color": "rgb(101,247,162)" + }, + { + "index": 115, + "name": "Sheryl Waller", + "first": "Martina", + "last": "Hebert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "boolean": false, + "guid": "ab359e49-0653-4622-a683-fa6bb4a5e4eb", + "integer": 39, + "date": "Mon Nov 17 2008 06:44:36 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Nisi dolor ad enim nostrud id proident nisi elit cupidatat nisi nostrud laborum. Ea deserunt labore est in sunt id consectetur nisi.", + "longText": "Aliqua sunt enim Lorem amet enim. Nisi laboris elit veniam irure culpa nisi non aliquip. Anim dolor duis enim tempor culpa dolor reprehenderit elit. Non sunt veniam aliqua ea occaecat do pariatur occaecat ea. Exercitation nostrud cillum mollit ipsum laboris sunt est aute nostrud velit officia esse.\r\nLabore commodo ipsum proident est et sint sint deserunt. Proident qui elit eu duis et veniam excepteur eu ipsum ea consectetur consectetur fugiat sit. Aliqua aliqua laboris aute ut sit id nisi sunt reprehenderit qui deserunt. Labore laborum et ex enim dolore ullamco est excepteur dolore labore adipisicing. Commodo cupidatat non velit qui.\r\nQui exercitation esse ullamco nulla nisi labore ex ea voluptate eu consectetur et occaecat. Ullamco laborum esse labore et ullamco sunt proident eu esse proident excepteur. Qui incididunt occaecat minim elit irure ea aliquip in fugiat. Do cupidatat aliqua veniam cupidatat magna exercitation irure mollit fugiat consectetur. Sunt fugiat esse dolor mollit in fugiat reprehenderit qui tempor laborum Lorem incididunt. Exercitation do occaecat adipisicing velit aute enim enim occaecat nisi laboris quis ex minim eu. In incididunt consequat esse dolor officia eiusmod amet aliqua ad quis.\r\n", + "address": "3 Gelston Avenue", + "city": "Leeper", + "state": "Alabama", + "zip": 86800, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "martinahebert@scentric.com", + "phone": "(814) 523-3612", + "color": "rgb(240,55,85)" + }, + { + "index": 116, + "name": "Frances Dalton", + "first": "Virgie", + "last": "Fuller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "boolean": false, + "guid": "1ca31b96-9723-4249-bb9a-7062701a66b0", + "integer": 81, + "date": "Tue Oct 01 1974 14:29:16 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Aliquip nisi proident id sint velit enim cillum reprehenderit ipsum nisi dolore laboris Lorem. Velit Lorem irure irure consectetur. Aliquip veniam culpa qui Lorem cupidatat non incididunt velit irure magna in do consequat do.", + "longText": "Nostrud adipisicing aute esse ipsum anim. Nisi pariatur excepteur est minim pariatur consectetur aliquip adipisicing. Adipisicing fugiat consequat proident deserunt exercitation exercitation irure sit qui deserunt. Dolor eu cillum eiusmod id incididunt consectetur nisi ullamco mollit labore. Aliqua ullamco proident adipisicing duis minim. Lorem ut fugiat cillum aliqua sit in mollit labore sunt reprehenderit.\r\nQui aliqua pariatur voluptate fugiat fugiat duis consequat occaecat laboris cillum sit. Sit officia fugiat esse ut eiusmod eu labore nostrud est incididunt fugiat. Voluptate velit laboris veniam sunt laborum ad nulla ad. Dolor deserunt ut ut culpa laboris qui elit est non cillum eu cillum anim laborum. Mollit consequat cillum id consequat sint voluptate pariatur nisi nostrud duis ipsum mollit.\r\nIncididunt dolor laborum adipisicing mollit voluptate ad labore ad do minim occaecat proident amet anim. Commodo anim pariatur dolor officia ipsum adipisicing irure excepteur irure eiusmod deserunt. Commodo veniam exercitation ex ad. Ut aliquip aliqua laboris ipsum quis duis. Amet in dolor minim veniam mollit dolore deserunt sit exercitation sint dolore consequat. Mollit anim qui dolor enim ea irure sint consectetur. Eiusmod eu exercitation incididunt Lorem dolore non cupidatat tempor do labore duis.\r\nMinim exercitation ut cupidatat est minim enim magna eiusmod aliquip ipsum incididunt in officia. Aliquip in fugiat dolor elit quis ad. Ipsum laboris sit non amet eu dolor aute velit ullamco eu proident. Consequat commodo consectetur Lorem esse duis esse exercitation adipisicing anim.\r\n", + "address": "2 Bokee Court", + "city": "Reinerton", + "state": "North Carolina", + "zip": 90734, + "country": "Brazil", + "email": "virgiefuller@scentric.com", + "phone": "(958) 511-3488", + "color": "rgb(151,135,52)" + }, + { + "index": 117, + "name": "Charity Hall", + "first": "Mitchell", + "last": "Williamson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "boolean": true, + "guid": "60b57acd-e17f-4c69-85e5-5df345c25c6f", + "integer": 22, + "date": "Wed Jan 19 2005 08:59:18 GMT-0800 (PST)", + "shortText": "eu nisi elit nostrud", + "mediumText": "Nisi id voluptate velit tempor voluptate laboris. Excepteur consectetur labore id ipsum anim proident ad adipisicing dolor. Magna aute excepteur veniam nulla laborum culpa et incididunt enim velit officia. Ipsum est qui minim consequat Lorem.", + "longText": "Enim consectetur quis tempor eu laboris veniam ea eu est. Ullamco commodo commodo dolor ad mollit ex in nulla. Ipsum dolor excepteur ut in sit est nulla ad nulla in tempor laboris ipsum laborum. Lorem incididunt fugiat eu laboris laborum eiusmod dolor tempor aliquip. Minim in do deserunt pariatur adipisicing id duis consectetur nostrud proident.\r\n", + "address": "4 Dover Street", + "city": "Fannett", + "state": "Connecticut", + "zip": 11138, + "country": "Anguilla", + "email": "mitchellwilliamson@scentric.com", + "phone": "(871) 435-3743", + "color": "rgb(243,134,198)" + }, + { + "index": 118, + "name": "Rodriquez Ferguson", + "first": "Shannon", + "last": "Morrow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "boolean": false, + "guid": "6c85f6cb-e2c6-46e0-a68a-2ebc38f0035b", + "integer": 50, + "date": "Sat Feb 10 1973 15:31:21 GMT-0800 (PST)", + "shortText": "incididunt aute aliquip laborum labore", + "mediumText": "Minim ipsum sint consequat cillum aute ipsum et ipsum sint cillum qui eiusmod.", + "longText": "Reprehenderit est consequat incididunt nostrud do eiusmod adipisicing. Nulla voluptate ullamco consectetur eu sit. Est dolore cupidatat amet culpa occaecat ullamco nisi non veniam do est ullamco aliqua. Qui irure nisi laboris labore duis nulla magna. Culpa velit dolor exercitation elit sint irure velit eu veniam exercitation Lorem. Pariatur ipsum veniam consectetur nulla laborum.\r\nAdipisicing eu amet duis nulla. Anim dolore magna eu culpa voluptate sunt aute proident. Elit veniam adipisicing commodo aliqua eiusmod velit mollit nisi quis veniam excepteur mollit laborum. Esse ipsum commodo cupidatat sint quis mollit veniam consequat do laborum nulla. Aliquip consequat proident et aliqua ea proident proident dolore laboris consequat ut reprehenderit quis duis. Enim cupidatat reprehenderit reprehenderit esse irure officia irure laboris. Consequat esse qui pariatur elit cillum culpa deserunt culpa veniam qui excepteur laborum.\r\n", + "address": "4 Newel Street", + "city": "Dubois", + "state": "South Carolina", + "zip": 52970, + "country": "Mayotte", + "email": "shannonmorrow@scentric.com", + "phone": "(926) 593-2505", + "color": "rgb(161,59,65)" + }, + { + "index": 119, + "name": "Lee Dejesus", + "first": "Yang", + "last": "Walter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "boolean": false, + "guid": "bf814de3-e21d-41e7-9db1-2d541665fd2c", + "integer": 40, + "date": "Mon Feb 18 2002 15:18:34 GMT-0800 (PST)", + "shortText": "pariatur nisi", + "mediumText": "Esse dolore nulla aliqua id cupidatat ullamco commodo incididunt.", + "longText": "Ipsum cupidatat amet Lorem excepteur magna quis officia tempor enim voluptate consequat id ex. Ad labore aliqua exercitation nulla et esse nostrud pariatur. Nisi minim velit consequat dolore aliquip est labore sint.\r\nAnim non irure proident cillum eiusmod. Id anim non adipisicing consectetur qui duis. Sit culpa exercitation non nostrud.\r\nOccaecat aliquip elit anim ex nulla ut in. Aliqua ut cupidatat elit dolor id occaecat. Sit consectetur consequat eiusmod veniam tempor minim non voluptate labore ullamco esse velit proident.\r\n", + "address": "2 Krier Place", + "city": "Columbus", + "state": "Michigan", + "zip": 62839, + "country": "Northern Mariana Islands", + "email": "yangwalter@scentric.com", + "phone": "(821) 518-2276", + "color": "rgb(56,241,182)" + }, + { + "index": 120, + "name": "Wise Cannon", + "first": "Cobb", + "last": "Figueroa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "boolean": false, + "guid": "e5754bf6-f162-4fd2-a3e9-e3834bad0fed", + "integer": 61, + "date": "Sun Nov 22 1970 00:54:52 GMT-0800 (PST)", + "shortText": "Lorem dolor pariatur proident", + "mediumText": "Dolor tempor veniam ad do et. Mollit enim et id veniam in irure mollit duis deserunt commodo.", + "longText": "Ex pariatur eiusmod cupidatat nisi elit ullamco Lorem. Reprehenderit minim velit laboris et incididunt tempor anim elit ad aute duis ullamco. Amet est magna consectetur in cillum duis. Sunt id Lorem laboris cupidatat aute. Cillum est ea mollit exercitation ullamco pariatur exercitation anim Lorem dolore exercitation velit ipsum.\r\nExcepteur excepteur est pariatur eiusmod quis consectetur qui aute nulla ex Lorem sunt irure. Tempor excepteur proident esse excepteur consectetur minim consequat non. Mollit nulla ea veniam excepteur eu velit.\r\n", + "address": "4 Pulaski Street", + "city": "Glenville", + "state": "Maine", + "zip": 69282, + "country": "Pitcairn", + "email": "cobbfigueroa@scentric.com", + "phone": "(901) 579-2803", + "color": "rgb(243,138,133)" + }, + { + "index": 121, + "name": "Albert Benjamin", + "first": "French", + "last": "Hays", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "boolean": false, + "guid": "4bcb4883-f717-4bc7-b0ff-91b548b5ae5a", + "integer": 11, + "date": "Fri Jun 27 1980 15:54:19 GMT-0700 (PDT)", + "shortText": "Lorem do", + "mediumText": "Ipsum irure amet aliquip deserunt irure nisi duis fugiat et officia voluptate aliquip labore consectetur. Reprehenderit aute cupidatat tempor enim aliquip non qui consequat do qui proident id. Aliquip labore in ex consequat commodo qui adipisicing proident. Tempor veniam non laborum aute velit Lorem sunt. Fugiat anim nulla veniam anim pariatur nulla irure incididunt occaecat.", + "longText": "Enim irure eiusmod magna non tempor eu mollit nostrud anim elit. Fugiat eu officia aliqua dolore non tempor aute ipsum occaecat. Amet velit fugiat aliqua Lorem officia excepteur sunt nostrud magna est. In pariatur irure quis ea ut et esse nisi do mollit excepteur laborum minim. Nostrud sunt est duis est. In in enim Lorem tempor aliquip enim ea irure deserunt.\r\nCillum est magna fugiat dolor nostrud adipisicing mollit qui enim. Nostrud consequat amet reprehenderit commodo ut amet est aute nisi exercitation aute. Eiusmod enim reprehenderit ut ut exercitation irure proident minim commodo nostrud. Consequat ex magna aliquip cupidatat culpa excepteur non.\r\nVeniam esse esse sunt reprehenderit veniam commodo irure fugiat qui. Consequat qui dolor veniam ipsum laboris enim labore. Mollit cupidatat sit non esse voluptate in qui cupidatat qui eu. Duis incididunt ad mollit ad nisi culpa irure anim ullamco commodo tempor consectetur. Cillum pariatur labore do quis commodo non eu proident et.\r\nAmet cupidatat amet et culpa proident labore esse ipsum. Labore fugiat ea laboris irure mollit cupidatat minim exercitation occaecat velit ullamco quis. Labore esse cupidatat nulla amet et. Duis est cupidatat eu ea excepteur nulla cupidatat dolor enim ipsum sit nostrud laborum sit. Voluptate cupidatat cillum nulla reprehenderit laboris incididunt eu nostrud amet ad dolore do. Non ea eu cillum duis consectetur in. Anim consequat in adipisicing fugiat sit do anim anim aute veniam eu consectetur aliquip.\r\nMollit aliquip cillum adipisicing ipsum non laboris. Consequat mollit in incididunt mollit deserunt eiusmod nulla dolor ea fugiat. Proident reprehenderit nisi tempor nulla excepteur dolor excepteur voluptate laboris tempor consequat. Dolor et minim enim ut laboris. Ipsum ex veniam consequat cillum nisi amet nostrud. Mollit labore in consequat irure enim. Qui tempor aliquip esse enim commodo culpa mollit.\r\n", + "address": "4 Pooles Lane", + "city": "Bellfountain", + "state": "Kansas", + "zip": 98526, + "country": "Saint Vincent and The Grenadines", + "email": "frenchhays@scentric.com", + "phone": "(819) 408-2182", + "color": "rgb(238,191,114)" + }, + { + "index": 122, + "name": "Nona Salinas", + "first": "Lacey", + "last": "Donaldson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "boolean": true, + "guid": "bd1bbab7-51f1-45a4-a0c8-ad85a536c9ec", + "integer": 9, + "date": "Thu May 01 1986 06:09:47 GMT-0700 (PDT)", + "shortText": "proident ea qui culpa", + "mediumText": "Eiusmod labore in laboris eu pariatur amet. Et nulla aliqua consectetur nulla quis ad non. Aute ut sint reprehenderit et eu et sunt labore dolor.", + "longText": "Exercitation mollit commodo ad ipsum ipsum minim quis culpa cillum ut mollit labore commodo. Anim dolor eu in deserunt occaecat enim do proident mollit exercitation laborum consequat. Irure proident exercitation voluptate in. Magna officia sint occaecat pariatur irure elit cupidatat deserunt nulla ad cillum incididunt velit. Quis veniam est est id labore enim duis culpa deserunt aliquip mollit qui. Deserunt laboris proident incididunt esse velit minim sint ex excepteur. Cillum do sint commodo qui laborum occaecat dolore sint.\r\nDeserunt culpa pariatur dolore mollit dolor velit id labore incididunt eiusmod consectetur. Sunt eu duis ut eu sint sint non aliqua ullamco sunt est id irure eiusmod. Eiusmod ex cupidatat quis ut cillum elit. Lorem tempor proident elit adipisicing. Minim sunt minim esse do amet Lorem officia occaecat sit ut. In id ullamco ipsum ex sit adipisicing mollit irure non magna ad commodo proident aute. Mollit sunt mollit eiusmod voluptate consectetur magna ex ullamco.\r\n", + "address": "4 Freeman Street", + "city": "Wollochet", + "state": "Iowa", + "zip": 21774, + "country": "Iceland", + "email": "laceydonaldson@scentric.com", + "phone": "(977) 552-3200", + "color": "rgb(51,183,113)" + }, + { + "index": 123, + "name": "Karla Downs", + "first": "Cruz", + "last": "Colon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "boolean": true, + "guid": "2f9877c1-7121-400a-a476-36dfbedde48b", + "integer": 0, + "date": "Thu Feb 27 1992 08:28:41 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Reprehenderit deserunt eiusmod sint laboris deserunt qui eiusmod ex aliqua et laborum duis magna deserunt. Officia tempor ullamco aute occaecat velit. Aliqua consectetur nulla eiusmod elit. Culpa enim reprehenderit labore incididunt id nostrud deserunt quis ad est irure laboris.", + "longText": "Ut qui adipisicing qui veniam irure fugiat. Cillum occaecat fugiat proident velit anim nostrud duis reprehenderit nostrud tempor aliquip veniam. Nostrud ipsum laboris eu enim id do. Adipisicing ea consequat enim et anim in fugiat amet ipsum.\r\nVoluptate tempor ut ut laborum et ad. Ea laboris duis ad pariatur commodo do et aute. Sit aliqua sint proident do consequat anim sit. Officia elit dolore exercitation elit anim ullamco excepteur deserunt quis quis proident esse fugiat voluptate. Culpa officia amet eu enim culpa sit et. Culpa incididunt adipisicing non eu in minim.\r\nDuis laborum laborum voluptate aliquip. Aliqua eu elit labore ipsum aliqua. Nulla reprehenderit aute labore aliqua est consectetur deserunt pariatur ut. Aute laboris voluptate ipsum nostrud enim proident amet ad.\r\nCulpa minim velit aliquip enim deserunt dolor. Commodo sit commodo enim adipisicing ea non aute consectetur proident eu do. Consequat elit irure minim dolor voluptate excepteur sunt eu et quis. Occaecat exercitation voluptate sunt ullamco reprehenderit ea amet magna. Cillum laborum commodo irure ad in sunt occaecat veniam non proident incididunt pariatur.\r\n", + "address": "3 Elm Place", + "city": "Richville", + "state": "Vermont", + "zip": 65904, + "country": "Andorra", + "email": "cruzcolon@scentric.com", + "phone": "(900) 475-3785", + "color": "rgb(165,150,188)" + }, + { + "index": 124, + "name": "Candace Gonzalez", + "first": "Debbie", + "last": "Moody", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "boolean": false, + "guid": "9d3734d9-4693-4ac0-9dba-85eb63a89032", + "integer": 1, + "date": "Fri May 06 2005 19:01:26 GMT-0700 (PDT)", + "shortText": "exercitation do mollit mollit proident", + "mediumText": "Ullamco ad quis laboris ea consectetur commodo anim ut irure. Sit id elit mollit eiusmod officia amet reprehenderit. Ea incididunt commodo officia qui eu ad exercitation occaecat ipsum ad aute laboris ea. Proident irure velit magna culpa proident qui amet.", + "longText": "Minim voluptate culpa mollit ad voluptate est mollit nisi cillum proident. Cillum ut aliqua esse ad esse qui magna anim mollit. Ipsum pariatur labore culpa velit ipsum mollit fugiat id velit in cillum sint. Voluptate aliquip irure reprehenderit incididunt ipsum magna duis proident commodo consequat. Eiusmod commodo labore ex commodo tempor veniam. Occaecat duis tempor cillum aute qui do officia excepteur et sunt eiusmod fugiat.\r\nConsectetur amet nulla sit commodo aute labore id commodo reprehenderit deserunt occaecat incididunt. Esse consectetur minim occaecat duis deserunt est magna aute aliqua veniam aute sunt nulla eu. Exercitation officia proident dolore ex aliqua officia laboris ullamco anim.\r\nReprehenderit exercitation veniam eu eu aute ullamco irure ex tempor. Irure tempor Lorem anim eu nulla proident nulla est sunt. Voluptate id dolor excepteur id ut quis duis.\r\nPariatur tempor aliquip consectetur reprehenderit qui dolore excepteur veniam. In aliqua aute veniam aliqua in officia aute nisi Lorem. Ea duis labore labore voluptate. Voluptate esse cillum excepteur reprehenderit.\r\n", + "address": "2 Duryea Court", + "city": "Bentonville", + "state": "Nebraska", + "zip": 43783, + "country": "Myanmar", + "email": "debbiemoody@scentric.com", + "phone": "(816) 429-3615", + "color": "rgb(209,130,75)" + }, + { + "index": 125, + "name": "Ayers Finley", + "first": "Janna", + "last": "Donovan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "boolean": false, + "guid": "9910153e-54e3-4464-ab3b-2f87ff4a6574", + "integer": 29, + "date": "Wed Jun 03 1987 11:23:05 GMT-0700 (PDT)", + "shortText": "occaecat dolore sunt", + "mediumText": "Esse voluptate quis laborum voluptate ut labore tempor consequat sit. Adipisicing proident ex Lorem voluptate eu esse laborum ex laborum officia veniam aliquip enim id. Incididunt eu nisi proident pariatur ut non.", + "longText": "Incididunt do qui veniam Lorem quis. Aute culpa ut dolor incididunt deserunt consequat mollit non nulla dolore. Deserunt veniam velit tempor pariatur aliquip veniam. Duis aliquip nulla sunt ullamco esse aliqua Lorem esse aliquip veniam adipisicing. Cillum et do enim commodo aliqua ullamco exercitation exercitation. Mollit magna Lorem fugiat irure excepteur adipisicing id veniam. Sit tempor aute in minim dolore aliquip minim nisi magna.\r\nVelit aliqua ullamco ea amet culpa id. Magna velit voluptate culpa fugiat fugiat amet veniam ad labore eu in. Eu deserunt quis ipsum aliqua nulla pariatur commodo. Elit nostrud id irure eu reprehenderit est dolore sunt Lorem. Esse anim quis elit elit irure consectetur irure ut non ad ullamco magna et. Ex Lorem labore deserunt consequat consectetur officia veniam non commodo magna ut non eu in.\r\nVoluptate aliqua velit magna dolor in anim dolore ad quis. Ullamco magna officia labore ex adipisicing veniam magna adipisicing in id anim ea adipisicing mollit. Irure pariatur ea incididunt culpa ex veniam pariatur eiusmod duis ea. Ut exercitation duis aliqua quis elit reprehenderit magna veniam voluptate nostrud. Id proident nostrud consectetur occaecat nostrud nostrud nisi eu labore occaecat minim. Sint ut consequat ullamco dolor duis exercitation sint eiusmod nostrud et esse labore. Anim elit ipsum occaecat sint laborum esse.\r\nAd velit aliqua irure dolor aliquip eiusmod occaecat incididunt sunt dolore elit quis sunt. Sunt veniam quis eu anim et ut laborum. Nisi duis anim non sunt consequat labore duis sit minim velit dolor adipisicing pariatur. Qui fugiat elit non amet ad nostrud voluptate veniam proident.\r\nEnim qui non exercitation cupidatat pariatur cillum anim sunt aliqua sunt. Lorem ut excepteur consectetur ipsum dolore enim sint labore sunt. Anim dolore consectetur mollit ex consectetur ex enim eiusmod.\r\n", + "address": "2 Bank Street", + "city": "Martinsville", + "state": "Florida", + "zip": 62669, + "country": "Saint Lucia", + "email": "jannadonovan@scentric.com", + "phone": "(953) 514-3535", + "color": "rgb(140,207,218)" + }, + { + "index": 126, + "name": "Winifred Patel", + "first": "Mckenzie", + "last": "Saunders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "boolean": true, + "guid": "0232aa09-2751-4a44-938d-2450be7353c5", + "integer": 47, + "date": "Tue May 04 2010 11:32:34 GMT-0700 (PDT)", + "shortText": "cillum culpa aliqua", + "mediumText": "Et ex ea sunt velit. Veniam amet incididunt labore consectetur incididunt do. Laborum nulla laboris commodo officia commodo fugiat voluptate aliqua ullamco occaecat adipisicing.", + "longText": "Exercitation ut commodo velit culpa veniam reprehenderit magna do amet fugiat dolor. Velit ad esse incididunt cillum eu aliquip aute in velit. Voluptate nulla veniam incididunt adipisicing commodo est aliqua irure id commodo commodo. Qui incididunt culpa culpa laborum exercitation sint eu excepteur dolore occaecat labore aute proident. Eiusmod est occaecat quis duis aliqua. Ad sit incididunt nostrud dolore velit mollit pariatur nostrud.\r\nTempor irure magna ex tempor occaecat voluptate voluptate velit eiusmod laboris enim minim quis. Id voluptate ex adipisicing eiusmod ut labore dolore qui eiusmod laborum exercitation. Irure labore laboris elit ea. Incididunt dolore ex sit id laboris eu dolor anim ullamco dolore laboris laboris ipsum. Est nulla excepteur proident enim labore. Pariatur aliquip voluptate qui amet commodo officia non.\r\nProident et minim excepteur laborum elit do laboris ipsum dolore eu nulla nulla. Id ad aliqua pariatur aliquip magna ea adipisicing occaecat. Exercitation quis Lorem consectetur eiusmod. Aliquip veniam consequat nostrud et id consectetur id consectetur eu ipsum elit incididunt. Aliquip do nostrud occaecat esse consectetur est irure nulla magna.\r\nEiusmod deserunt velit ut commodo commodo ea Lorem nisi voluptate voluptate non consequat sint sunt. Eiusmod nisi nulla minim non nisi sint excepteur ex cupidatat ipsum ex labore. Adipisicing dolore ut tempor exercitation cupidatat.\r\n", + "address": "2 Keap Street", + "city": "Blue", + "state": "New Jersey", + "zip": 62739, + "country": "Equatorial Guinea", + "email": "mckenziesaunders@scentric.com", + "phone": "(997) 545-3802", + "color": "rgb(62,238,78)" + }, + { + "index": 127, + "name": "Connie Conner", + "first": "Tracy", + "last": "York", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "boolean": true, + "guid": "8996bac9-5e0b-418e-a12c-710a15bdb763", + "integer": 8, + "date": "Thu Oct 05 2000 01:32:28 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod aliqua", + "mediumText": "Irure est aliquip magna excepteur velit cillum dolore eu veniam occaecat ex. Consequat proident nulla anim culpa ullamco sint.", + "longText": "Ipsum labore enim aliquip sit id qui elit ut ex laboris. Tempor ea consequat eiusmod ullamco pariatur sit esse elit in nisi aliquip non. Velit incididunt ea reprehenderit anim anim.\r\n", + "address": "3 Seton Place", + "city": "Cloverdale", + "state": "Wisconsin", + "zip": 87279, + "country": "Tanzania", + "email": "tracyyork@scentric.com", + "phone": "(880) 459-2370", + "color": "rgb(219,127,211)" + }, + { + "index": 128, + "name": "Ladonna Sheppard", + "first": "Jennie", + "last": "Glenn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "boolean": false, + "guid": "5590b6a2-bb72-4d3e-8088-4af6a3a81dcb", + "integer": 4, + "date": "Mon Jun 04 1979 05:10:17 GMT-0700 (PDT)", + "shortText": "irure ea culpa", + "mediumText": "Est irure minim amet reprehenderit non minim et minim consequat cillum.", + "longText": "Minim laboris sint enim ea. Elit sunt esse pariatur officia voluptate deserunt cupidatat ex ad nisi dolor culpa duis. Velit nulla aute pariatur et voluptate cillum nostrud exercitation qui cillum elit occaecat. Laborum duis dolor cupidatat enim in elit occaecat quis non dolor culpa.\r\nIncididunt excepteur consequat consequat laborum. Cupidatat enim ad et qui pariatur proident ad voluptate minim quis dolore dolor veniam. Nisi sunt voluptate ut est aliqua. Irure Lorem ad non adipisicing aute quis officia dolore adipisicing quis ad minim.\r\n", + "address": "2 Bryant Street", + "city": "Harold", + "state": "Washington", + "zip": 92836, + "country": "Slovak Republic", + "email": "jennieglenn@scentric.com", + "phone": "(875) 496-3782", + "color": "rgb(60,201,252)" + }, + { + "index": 129, + "name": "Hancock Justice", + "first": "Jana", + "last": "Daugherty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "boolean": false, + "guid": "ac903149-dee1-4dbc-b0b4-01e15797af97", + "integer": 23, + "date": "Sun Dec 26 1976 01:33:58 GMT-0800 (PST)", + "shortText": "amet deserunt excepteur adipisicing", + "mediumText": "Mollit eu fugiat minim irure eu aliquip eiusmod do nisi elit minim anim commodo nisi. Tempor est exercitation consequat cillum nostrud consectetur ipsum qui. Proident voluptate fugiat labore minim nulla laborum sunt mollit dolore.", + "longText": "Commodo eiusmod nulla consequat Lorem ut ipsum esse cillum. Nostrud dolore proident proident ipsum sunt mollit esse amet. Et in adipisicing esse mollit consequat esse ipsum incididunt. Lorem est do id do qui non sit. Amet minim quis elit minim adipisicing et nisi nisi. Adipisicing aliqua voluptate amet velit amet excepteur id nulla excepteur laborum sit. Anim deserunt aute laboris duis deserunt aute quis veniam.\r\nAd elit fugiat id nisi nostrud esse aliquip. Ipsum esse labore laborum velit velit esse sit consequat non aliquip. Proident consequat est excepteur mollit.\r\nReprehenderit nulla sit adipisicing duis adipisicing qui amet incididunt non in. Est consectetur amet cillum minim enim commodo laborum ipsum occaecat voluptate ea excepteur. Duis mollit anim anim minim magna elit sunt.\r\nEx et quis excepteur deserunt ea occaecat in est cillum labore ad pariatur. Commodo ea anim ipsum qui laboris duis reprehenderit. Non commodo magna voluptate deserunt do. In officia excepteur exercitation qui. Cillum eu aute laboris culpa laborum eu eiusmod.\r\nLorem irure voluptate magna velit reprehenderit sint. Sint ea exercitation officia occaecat. Cillum veniam proident voluptate ullamco in nisi eu. Irure laboris voluptate veniam ea. Reprehenderit adipisicing incididunt enim aliquip ex. Dolore amet ullamco ullamco ad pariatur.\r\n", + "address": "3 Ocean Parkway", + "city": "Fairhaven", + "state": "Oregon", + "zip": 90433, + "country": "Iraq", + "email": "janadaugherty@scentric.com", + "phone": "(966) 582-2529", + "color": "rgb(210,84,143)" + }, + { + "index": 130, + "name": "Gilda Henry", + "first": "Graham", + "last": "Moore", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "boolean": true, + "guid": "25728c02-6a0c-45e4-8ed5-f0b169379f13", + "integer": 39, + "date": "Thu Aug 02 2001 00:17:50 GMT-0700 (PDT)", + "shortText": "irure incididunt magna", + "mediumText": "Ea do ad culpa adipisicing culpa. Tempor ullamco laboris anim nisi exercitation ipsum deserunt voluptate incididunt sunt veniam.", + "longText": "Laborum ex ut culpa occaecat. Ex ad qui amet minim. Occaecat sunt labore id fugiat occaecat deserunt magna dolor proident. Proident eu qui ut incididunt id. Id reprehenderit labore dolore do exercitation. Commodo exercitation sint nulla ullamco. Occaecat mollit velit elit aliquip ad ex.\r\nIrure deserunt mollit deserunt id elit. Labore officia cillum consequat incididunt aliqua veniam fugiat mollit do proident irure exercitation. Exercitation duis irure sunt sit ad proident mollit elit dolore sunt. Ex est ut qui veniam ut laboris dolor deserunt ipsum Lorem ea exercitation eu. Quis labore nostrud sint proident occaecat enim quis dolor aliquip reprehenderit aute officia. Magna aute irure ullamco voluptate nisi ipsum labore.\r\nIrure sit aliquip quis eiusmod nisi occaecat amet cillum minim ex. Ipsum eiusmod ut nostrud eiusmod cillum est fugiat irure qui. Enim minim consequat ullamco minim. Cupidatat culpa mollit ut et.\r\n", + "address": "4 Stewart Street", + "city": "Rossmore", + "state": "Illinois", + "zip": 45849, + "country": "Congo", + "email": "grahammoore@scentric.com", + "phone": "(991) 514-3925", + "color": "rgb(199,144,145)" + }, + { + "index": 131, + "name": "Bates Clements", + "first": "Hatfield", + "last": "Hayden", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "boolean": false, + "guid": "afe8d372-90a6-404f-85c7-16fd49fb9612", + "integer": 80, + "date": "Wed Feb 14 1990 23:57:58 GMT-0800 (PST)", + "shortText": "excepteur culpa voluptate consectetur", + "mediumText": "Aliqua sunt irure commodo veniam proident. Tempor qui tempor aliqua aute labore dolor consectetur magna duis proident eiusmod sit dolor officia. Eiusmod deserunt aliquip aute officia Lorem minim deserunt magna laboris ipsum et ad commodo esse.", + "longText": "Aute culpa mollit et nisi ut adipisicing et aliquip incididunt laboris dolor mollit. Deserunt elit in sit dolore ut enim eu. Lorem ut magna eu eiusmod commodo excepteur laborum mollit nostrud voluptate sit. Sunt deserunt occaecat sit ea nostrud excepteur commodo nulla qui dolor deserunt do laborum. Pariatur do qui culpa laborum velit cillum.\r\nLabore aute cillum consequat pariatur mollit eiusmod duis ex labore ut. Occaecat dolore irure excepteur mollit tempor tempor ut. Velit qui pariatur pariatur voluptate nostrud. Duis magna sint irure et labore ipsum deserunt non veniam.\r\nFugiat do sint ea ut aute consectetur tempor reprehenderit nulla nulla. Laborum cupidatat excepteur nulla dolor cupidatat duis laboris. Amet in ipsum proident deserunt consectetur in proident incididunt. Elit consectetur occaecat dolore duis aute pariatur.\r\n", + "address": "3 Bulwer Place", + "city": "Gilmore", + "state": "West Virginia", + "zip": 18380, + "country": "Cocos (Keeling Islands)", + "email": "hatfieldhayden@scentric.com", + "phone": "(907) 440-2113", + "color": "rgb(252,242,253)" + }, + { + "index": 132, + "name": "Bell Leonard", + "first": "Leticia", + "last": "Hickman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "boolean": true, + "guid": "ed4df7d0-7592-4c76-b54b-edc925ddb79d", + "integer": 77, + "date": "Tue May 03 1983 09:44:10 GMT-0700 (PDT)", + "shortText": "enim consequat ad elit sit", + "mediumText": "Aute reprehenderit officia dolor sit ullamco consectetur nostrud. Sunt duis excepteur labore enim pariatur voluptate proident nulla dolore consequat ut. Commodo aliqua anim ut Lorem. Irure nostrud ad non eiusmod duis.", + "longText": "Reprehenderit esse laboris consequat aliqua nulla. Dolore do ipsum sunt incididunt. Incididunt ipsum labore eiusmod amet dolor minim sunt velit cupidatat. Sint laboris qui occaecat dolor duis ad mollit esse dolore minim. Et nostrud deserunt magna ad adipisicing nisi deserunt mollit tempor.\r\nDeserunt exercitation consequat labore veniam. Proident aliqua Lorem pariatur anim aliqua eu elit aliqua. Pariatur anim laboris reprehenderit eu nulla consequat eu tempor sint exercitation eiusmod sint excepteur voluptate. Sunt cillum ex ex occaecat aliquip ut labore voluptate cupidatat velit incididunt consectetur reprehenderit sunt.\r\nProident ex sunt eu velit magna quis quis ea nulla. Reprehenderit id eu ullamco deserunt aliqua pariatur do nisi eu anim. Enim exercitation aute culpa aute excepteur pariatur veniam. Esse labore labore anim cupidatat exercitation aliqua Lorem consequat fugiat tempor magna. Mollit ipsum irure proident adipisicing nisi eu mollit culpa aliquip id esse occaecat. Commodo amet esse nisi velit ipsum amet id cupidatat veniam. Id veniam fugiat anim fugiat nisi non in do labore esse labore est exercitation amet.\r\n", + "address": "4 Baughman Place", + "city": "Hessville", + "state": "Mississippi", + "zip": 48135, + "country": "Saint Kitts and Nevis", + "email": "leticiahickman@scentric.com", + "phone": "(986) 415-3367", + "color": "rgb(161,161,217)" + }, + { + "index": 133, + "name": "Logan Wyatt", + "first": "Bray", + "last": "Mathews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "boolean": false, + "guid": "50c374de-c1b2-4bef-8dc9-9b47e6caf127", + "integer": 3, + "date": "Thu Jan 23 2014 19:45:54 GMT-0800 (PST)", + "shortText": "aliquip cupidatat sint ut", + "mediumText": "Esse elit anim consectetur reprehenderit ad excepteur eiusmod aute. Veniam in ullamco reprehenderit commodo consectetur tempor quis. Nisi enim tempor tempor est est amet esse mollit mollit sint officia et amet duis. Sint sit in sit et enim et eu aliquip nostrud proident.", + "longText": "Amet aliqua eiusmod enim occaecat tempor do adipisicing labore mollit culpa adipisicing dolor nisi id. Elit consequat mollit commodo minim labore excepteur nisi est consectetur. Ad ut laborum enim fugiat cillum eu labore.\r\nReprehenderit pariatur aliqua anim aliquip. Aliqua tempor labore Lorem nulla ut velit aliquip ea amet labore qui exercitation incididunt. Velit pariatur eu sunt mollit velit deserunt mollit ad veniam aute. Cupidatat laboris qui proident eu mollit do qui. Lorem id aliqua occaecat irure proident. Commodo dolor commodo laborum excepteur nisi consequat esse culpa aute laboris do in.\r\nLaborum ex excepteur incididunt sint ipsum. Aliquip cillum nulla sit labore Lorem ut do mollit Lorem. Reprehenderit commodo dolore sint mollit. Laboris et culpa sunt ut ipsum deserunt eiusmod exercitation dolore. Do Lorem deserunt voluptate reprehenderit ex deserunt labore nulla excepteur qui nisi voluptate. Amet ipsum excepteur amet qui nostrud adipisicing elit fugiat veniam nostrud deserunt id sunt laborum. Incididunt eu dolore dolore qui quis qui pariatur pariatur ad nostrud.\r\n", + "address": "2 Cherry Street", + "city": "Kieler", + "state": "Rhode Island", + "zip": 44229, + "country": "Spain", + "email": "braymathews@scentric.com", + "phone": "(945) 538-3851", + "color": "rgb(223,145,248)" + }, + { + "index": 134, + "name": "Elva Beard", + "first": "Riley", + "last": "Wallace", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "boolean": true, + "guid": "7c00ca0a-94ea-41ec-babd-533d61c3c1db", + "integer": 26, + "date": "Tue Sep 20 2005 17:05:43 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Tempor reprehenderit ullamco labore irure velit Lorem nulla excepteur sunt nostrud ea exercitation. Exercitation nisi reprehenderit consequat enim voluptate est aute qui dolor aliqua amet quis cupidatat. Elit non aliquip esse in officia enim tempor pariatur aliquip est. Reprehenderit ipsum ea voluptate commodo qui deserunt. Cupidatat nostrud magna eu nisi mollit voluptate sint qui.", + "longText": "Reprehenderit mollit eu est adipisicing amet quis id ipsum est nisi occaecat. Veniam aute aute adipisicing aliquip et ea dolor commodo cillum esse Lorem. Dolore cillum cillum ex consectetur nostrud velit elit voluptate adipisicing deserunt dolore consectetur. Amet proident aliquip enim pariatur occaecat in aliquip deserunt in occaecat qui mollit eu. Deserunt laboris dolor quis do.\r\nVelit ea voluptate culpa veniam mollit excepteur culpa laboris. Dolor est qui sint irure cillum proident labore nulla adipisicing cillum. Incididunt aliquip dolor est consectetur nulla ad aliqua esse sit elit. Eiusmod et fugiat dolore aliquip excepteur ullamco sunt sit enim do fugiat in excepteur cupidatat. Lorem nostrud irure velit quis consectetur.\r\nNulla amet do excepteur in esse reprehenderit nulla aliqua reprehenderit ipsum dolore Lorem sunt. Quis aliqua ex esse voluptate aliquip do incididunt proident exercitation commodo. Commodo enim mollit dolor laboris dolore ex fugiat sit commodo Lorem. Lorem sint mollit reprehenderit ipsum elit qui exercitation incididunt. Non excepteur non duis nulla sunt dolor in qui proident. Proident pariatur adipisicing eu sunt laboris voluptate cillum ut adipisicing. Labore ut esse consectetur in consequat velit cupidatat esse nisi.\r\nVelit Lorem ad sunt labore irure enim ut aliqua officia velit dolor. Sint tempor sunt et amet nostrud. Sint laboris eiusmod elit excepteur.\r\n", + "address": "4 Herkimer Court", + "city": "Jacumba", + "state": "Georgia", + "zip": 87900, + "country": "Guinea-Bissau", + "email": "rileywallace@scentric.com", + "phone": "(908) 527-2510", + "color": "rgb(150,183,57)" + }, + { + "index": 135, + "name": "Jeanne Walker", + "first": "Noemi", + "last": "Castaneda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "boolean": false, + "guid": "954a476d-62d8-4190-94a1-ba084f44049d", + "integer": 52, + "date": "Thu Jul 28 1977 23:23:02 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Aliqua nostrud excepteur est veniam cillum et aute ut. Sint ex nostrud incididunt deserunt duis. Velit laborum occaecat mollit culpa aliquip nisi aliquip ad. Laboris eu adipisicing nostrud aliquip elit consectetur ea nulla quis minim non proident laboris. Laboris exercitation laboris ut exercitation deserunt quis irure irure officia sunt sit cillum ad.", + "longText": "Ipsum occaecat veniam cupidatat enim tempor irure ea reprehenderit esse commodo non. Aliquip est sit ipsum ipsum officia aliquip mollit quis sint adipisicing nisi sint tempor esse. Occaecat fugiat minim tempor excepteur ut minim dolor non voluptate.\r\nAdipisicing sunt excepteur amet aliquip duis anim excepteur ipsum nostrud occaecat non aliquip nulla Lorem. Labore ut sint mollit anim aliquip elit. Incididunt excepteur et deserunt anim laborum voluptate quis nulla ut. Aliqua qui culpa et culpa magna consequat irure culpa Lorem veniam. Qui sit qui labore cillum sunt elit consectetur officia qui Lorem sint elit dolor veniam. Ex labore ullamco quis ut elit Lorem in excepteur officia dolore tempor aute irure. Sunt ut eu deserunt aliquip aliqua sint elit elit.\r\nDolore ex cupidatat cupidatat elit adipisicing exercitation mollit eu officia et ullamco incididunt dolor. Qui incididunt voluptate aliquip fugiat proident ea. Officia minim laboris tempor est aliqua ipsum velit aliqua et culpa voluptate quis. Sint amet commodo dolor ad excepteur veniam cillum amet ut officia commodo velit.\r\nIpsum exercitation laboris occaecat duis non nisi cupidatat ad incididunt voluptate et. Duis ea enim nostrud non reprehenderit laborum culpa sint. Ullamco dolor non in excepteur culpa amet. Consectetur occaecat eiusmod tempor ad tempor veniam dolore aliqua ad id. Exercitation in amet fugiat ea mollit ut in officia velit dolore nostrud est amet anim. Eu do dolore eu ut adipisicing qui aute aute occaecat labore esse.\r\nDo quis laborum minim aliqua non dolor cupidatat labore velit dolor eiusmod. Minim labore sint ipsum duis nisi. Nostrud duis deserunt consectetur magna laborum mollit ea laboris. Consectetur exercitation dolor eu exercitation reprehenderit non ipsum.\r\n", + "address": "4 Montague Street", + "city": "Why", + "state": "New Mexico", + "zip": 97706, + "country": "Cameroon", + "email": "noemicastaneda@scentric.com", + "phone": "(867) 475-2648", + "color": "rgb(130,190,155)" + }, + { + "index": 136, + "name": "Jasmine Talley", + "first": "Debra", + "last": "Dunn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "boolean": false, + "guid": "d0121c9c-7074-450a-9234-7d97fd437785", + "integer": 91, + "date": "Mon Feb 01 1988 23:12:40 GMT-0800 (PST)", + "shortText": "non", + "mediumText": "Veniam in voluptate laboris exercitation labore velit enim occaecat eiusmod officia cupidatat ex non mollit. Irure occaecat adipisicing dolore labore officia aliquip in. Elit et consequat adipisicing aliquip irure qui sunt amet Lorem eiusmod fugiat tempor sint fugiat. Consectetur esse eu pariatur et cupidatat sint. Nulla enim Lorem exercitation eu id cillum sint qui est deserunt culpa.", + "longText": "Eiusmod aliquip pariatur minim commodo qui labore aliquip sint non officia consequat. Aliquip culpa anim amet id labore nulla enim cupidatat consectetur eiusmod. Dolor nulla pariatur sunt pariatur est labore excepteur velit dolore nisi.\r\nQuis amet fugiat occaecat anim. Elit aliqua non veniam commodo. Lorem enim ut laboris dolore ad esse est culpa aute aliqua aliqua. Elit deserunt ea cillum ad. Laboris ipsum cupidatat laborum veniam officia quis aute sit pariatur commodo reprehenderit in velit.\r\nEnim aliqua culpa do voluptate et deserunt velit est. Nisi elit voluptate ipsum officia mollit nulla anim labore magna laboris dolor proident. Ea excepteur laborum aute excepteur officia qui proident. Nisi ad ipsum et cupidatat sint cupidatat veniam eiusmod eu id eiusmod pariatur cupidatat. Mollit eiusmod culpa labore reprehenderit minim dolore et veniam non labore tempor sunt Lorem ex. Laborum officia Lorem duis enim magna exercitation ullamco elit ut veniam reprehenderit magna quis adipisicing. Dolor est amet commodo nulla deserunt Lorem reprehenderit consectetur.\r\n", + "address": "2 Woodpoint Road", + "city": "Shaft", + "state": "Arizona", + "zip": 57801, + "country": "Niger", + "email": "debradunn@scentric.com", + "phone": "(815) 574-3583", + "color": "rgb(79,212,186)" + }, + { + "index": 137, + "name": "Marquez Stark", + "first": "Gallegos", + "last": "Harris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "boolean": true, + "guid": "2dc3bab6-4120-4941-8c99-3f350a894c8f", + "integer": 76, + "date": "Tue Jul 05 2005 22:08:38 GMT-0700 (PDT)", + "shortText": "id officia", + "mediumText": "Mollit dolor quis quis velit elit id ex esse sit cillum sit aliquip.", + "longText": "Est laboris reprehenderit nisi duis eu qui elit ipsum excepteur cillum officia. Qui dolor eiusmod nulla elit enim pariatur tempor. Sunt aliquip voluptate mollit magna nisi eu sit do adipisicing laboris. Officia fugiat id quis eu consequat nulla anim irure quis exercitation adipisicing deserunt elit.\r\nAnim minim nostrud reprehenderit aute labore irure voluptate. Laborum incididunt ipsum culpa nulla qui esse mollit veniam. Dolor commodo ad aliqua aliquip ea consequat occaecat culpa veniam consequat. Incididunt reprehenderit enim veniam deserunt laboris cillum sint occaecat labore eiusmod ullamco veniam. Dolor culpa culpa laboris id cillum. Exercitation qui id laboris minim fugiat ea do aute duis. Do velit laborum adipisicing ad amet consequat laboris Lorem pariatur.\r\nConsequat dolor amet cillum minim exercitation sit in velit fugiat id anim. Fugiat tempor laborum nostrud ea eiusmod esse laborum. Labore aliquip ullamco ipsum aliqua consectetur ipsum ad. Et voluptate incididunt id cillum labore fugiat aliquip veniam sunt sunt nisi adipisicing. Cillum nisi qui reprehenderit qui nostrud sunt.\r\n", + "address": "2 Franklin Street", + "city": "Orovada", + "state": "Texas", + "zip": 68862, + "country": "Malta", + "email": "gallegosharris@scentric.com", + "phone": "(994) 597-2534", + "color": "rgb(67,106,191)" + }, + { + "index": 138, + "name": "James Gregory", + "first": "Davis", + "last": "Burton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "boolean": false, + "guid": "7ff8b299-328d-46dc-ab4f-b59c0d6e3ad8", + "integer": 32, + "date": "Sat Jan 08 1994 09:01:56 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id nisi nulla non culpa laborum dolor adipisicing aute in. Cillum consectetur sit occaecat officia. Nulla Lorem aliqua nulla velit nisi dolore magna sint in sint incididunt sunt sit nostrud. Pariatur sunt labore Lorem est nulla minim culpa velit tempor elit ipsum in eiusmod. Ad fugiat anim incididunt sint consectetur.", + "longText": "Esse reprehenderit laborum commodo aute nostrud incididunt. Voluptate do consectetur excepteur minim laboris ea et ut cupidatat. Magna qui aute sint minim do nostrud laborum magna labore. Lorem sunt veniam ullamco cupidatat.\r\nEt ullamco aute ex cupidatat cillum laboris aliqua laborum irure. Laboris ex laboris dolore non Lorem. Reprehenderit excepteur occaecat laborum laboris voluptate exercitation eu est consectetur tempor est nisi. Cillum fugiat do deserunt non dolor eiusmod Lorem dolore voluptate. Nisi minim enim Lorem minim quis exercitation reprehenderit eu nulla qui aute.\r\nIrure anim eiusmod id adipisicing aliqua. Nulla minim laboris nulla esse do elit aliqua eiusmod aute cillum elit. Ex consequat laboris aliquip dolor dolore pariatur consequat ut reprehenderit.\r\nFugiat minim eiusmod tempor commodo amet deserunt consectetur elit aliquip ex labore laborum veniam eu. Cillum aliquip aliquip non culpa eiusmod elit non dolore. Eiusmod ullamco cillum dolor ea voluptate et adipisicing ut enim. Sunt duis ea fugiat aute qui reprehenderit ut. Ullamco minim cillum aliqua nulla amet excepteur reprehenderit ut reprehenderit. Duis eu aliqua ad dolore consectetur labore quis occaecat cillum qui sint commodo deserunt est. Duis sunt deserunt enim duis est anim commodo elit id ad magna occaecat in.\r\n", + "address": "4 Macdougal Street", + "city": "Limestone", + "state": "District Of Columbia", + "zip": 74514, + "country": "Antigua and Barbuda", + "email": "davisburton@scentric.com", + "phone": "(916) 551-3269", + "color": "rgb(215,141,197)" + }, + { + "index": 139, + "name": "Thomas Lowery", + "first": "Hutchinson", + "last": "Weeks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "boolean": false, + "guid": "6ae3a7b3-9d8c-46bc-9d8c-af55345a1168", + "integer": 68, + "date": "Sat May 27 1978 05:40:06 GMT-0700 (PDT)", + "shortText": "irure sit", + "mediumText": "Officia proident tempor do et aliquip in cupidatat labore anim esse.", + "longText": "Labore elit laboris dolor fugiat ut sit minim aliquip adipisicing culpa nostrud. Id do adipisicing nisi adipisicing proident. Cupidatat tempor aliquip anim consequat fugiat eiusmod laborum adipisicing. Et sunt velit magna cupidatat commodo et consequat. Exercitation voluptate ex aliquip laboris. Aliqua qui voluptate anim deserunt reprehenderit.\r\nPariatur dolore pariatur laborum excepteur duis. Dolore consequat veniam fugiat sint cillum quis sit deserunt laborum eiusmod culpa id. Eiusmod incididunt magna cupidatat irure. Ex eu ad non non non consectetur sit non cillum sit anim cupidatat. Ea minim ut exercitation sint ullamco culpa cupidatat ipsum eu sit.\r\nEnim aliquip officia occaecat esse exercitation nulla esse. Commodo magna et sint sint consequat velit excepteur occaecat ex ea tempor proident. Officia laboris proident commodo eu laboris consectetur sunt pariatur aliqua pariatur. Fugiat reprehenderit reprehenderit cillum exercitation consequat duis ullamco in quis exercitation est est excepteur.\r\nEsse duis in elit cupidatat non cillum non aute sunt nulla mollit ipsum enim. Sit deserunt do nostrud quis dolor qui aliqua qui exercitation ex minim velit esse. Aliqua irure do ex eiusmod cupidatat non veniam est exercitation. Ea culpa eu Lorem id aute dolore.\r\n", + "address": "4 Hazel Court", + "city": "Lafferty", + "state": "Virgin Islands", + "zip": 50828, + "country": "Kazakhstan", + "email": "hutchinsonweeks@scentric.com", + "phone": "(930) 418-3265", + "color": "rgb(120,254,136)" + }, + { + "index": 140, + "name": "Adkins Hanson", + "first": "Gibson", + "last": "Chaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "boolean": false, + "guid": "9f6901ec-fedc-4d3c-963a-46d2245a15d6", + "integer": 63, + "date": "Thu Dec 30 1971 20:07:08 GMT-0800 (PST)", + "shortText": "elit tempor labore labore", + "mediumText": "Esse duis dolore officia voluptate velit culpa incididunt reprehenderit nisi. Eiusmod dolor ut non ea ut consequat dolor veniam aliqua ut cupidatat pariatur sunt.", + "longText": "Culpa tempor sint ullamco minim aute ad. Mollit laboris minim amet incididunt proident proident magna elit qui fugiat non velit irure. Nostrud incididunt non sunt ex veniam minim proident exercitation aliqua veniam laboris dolor est.\r\nPariatur aute adipisicing tempor occaecat. Laborum sit quis irure commodo sit. Incididunt do enim sit ad. Voluptate dolore fugiat ipsum id. Lorem Lorem laborum excepteur nostrud ut.\r\nCulpa tempor velit esse commodo eiusmod excepteur in aliqua. Quis culpa Lorem non et sunt elit. Incididunt ullamco ipsum duis laboris minim do mollit quis non minim laboris adipisicing sit Lorem. Culpa consectetur Lorem aute amet culpa deserunt fugiat. Deserunt amet officia cupidatat ea cupidatat nisi enim cupidatat reprehenderit dolore et reprehenderit nulla cupidatat. Velit ipsum ea ad exercitation eu sunt nisi nostrud ullamco nisi commodo aliqua.\r\nAdipisicing aute reprehenderit in enim do ipsum pariatur et cupidatat deserunt consectetur mollit sunt laboris. Exercitation voluptate dolor quis quis commodo. Laboris sunt consectetur veniam id fugiat magna ipsum ad cillum officia in sunt. Sunt ut magna culpa ad proident id sit in. Sint laborum commodo culpa deserunt et aliquip dolor laborum. Laboris adipisicing exercitation aliqua qui labore irure Lorem culpa aute minim Lorem aliquip. Sint nostrud et ut irure nisi non.\r\n", + "address": "4 Croton Loop", + "city": "Cresaptown", + "state": "Puerto Rico", + "zip": 63679, + "country": "Bahrain", + "email": "gibsonchaney@scentric.com", + "phone": "(973) 550-3569", + "color": "rgb(147,126,185)" + }, + { + "index": 141, + "name": "Catalina Rojas", + "first": "Angie", + "last": "Mcknight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "boolean": true, + "guid": "2a7b1f3c-602a-4977-b1d0-b2e1f3101dbd", + "integer": 61, + "date": "Sun Jan 31 1982 15:49:23 GMT-0800 (PST)", + "shortText": "in adipisicing reprehenderit cillum officia", + "mediumText": "Commodo voluptate est elit aliquip irure qui. Ullamco labore et non irure. Ea sunt excepteur ea in. Consequat deserunt sint id et aliquip officia et nisi esse amet reprehenderit quis. Ut enim quis et culpa.", + "longText": "Labore ullamco ea ipsum aute veniam adipisicing irure culpa adipisicing mollit. Qui aute velit labore veniam enim exercitation reprehenderit tempor nisi ullamco cillum tempor ea fugiat. Nulla incididunt dolore exercitation irure ut. Fugiat dolor duis ad deserunt in proident. Est elit nisi magna do culpa aliquip proident elit cupidatat. Adipisicing fugiat commodo ullamco eiusmod mollit veniam. Nisi cupidatat ullamco cillum velit qui Lorem sint ad non esse eu.\r\n", + "address": "4 Thomas Street", + "city": "Marenisco", + "state": "Maryland", + "zip": 83481, + "country": "India", + "email": "angiemcknight@scentric.com", + "phone": "(852) 571-3576", + "color": "rgb(180,187,55)" + }, + { + "index": 142, + "name": "Waller Rios", + "first": "Sherri", + "last": "Jones", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "boolean": true, + "guid": "33336c68-2dc7-4da4-83df-770c5d0ac6a1", + "integer": 23, + "date": "Thu Aug 06 2009 20:38:56 GMT-0700 (PDT)", + "shortText": "cillum ullamco deserunt", + "mediumText": "In voluptate sit consequat ex eu consectetur labore et qui in. Nostrud do enim ut non dolore cupidatat duis sint. Est laboris aute veniam mollit ea dolore occaecat pariatur. Fugiat adipisicing amet cupidatat cillum sit reprehenderit velit cillum ex anim velit tempor. Ullamco do aliquip est Lorem duis nulla ipsum.", + "longText": "Enim aliqua ut eu excepteur cupidatat nostrud dolore. Anim in ut est laboris. Id sunt ex labore commodo pariatur laborum sint labore fugiat nostrud.\r\nVelit commodo voluptate irure eu officia aute veniam et quis laboris. Nisi excepteur excepteur deserunt dolor. Sunt ex enim do eiusmod aliqua consequat aute cupidatat incididunt sint eiusmod ex ea Lorem. Fugiat nisi adipisicing ullamco anim enim quis eu fugiat.\r\nTempor aliqua consequat nisi deserunt cillum. Nulla eu fugiat nostrud aliquip ut consequat consectetur dolor labore duis ut deserunt eu. Mollit ut irure irure dolore ad occaecat cillum. Consectetur Lorem nostrud veniam fugiat. Qui mollit pariatur tempor consequat. Ut consequat veniam consequat exercitation non cillum ullamco sit velit Lorem qui aliqua anim.\r\nIrure ad minim consectetur mollit consectetur. Ex est laborum fugiat non. Aute consequat aliquip qui ex proident. Ad occaecat deserunt aliqua non sint consectetur voluptate in enim quis do mollit velit. Reprehenderit quis dolor laborum dolor mollit.\r\nIrure Lorem aliquip elit id minim sit. Exercitation laborum deserunt irure incididunt deserunt veniam ullamco dolor. Aliqua excepteur quis culpa labore in elit reprehenderit voluptate duis consectetur. Irure occaecat consequat commodo enim ex enim deserunt.\r\n", + "address": "2 Etna Street", + "city": "Gorham", + "state": "Massachusetts", + "zip": 76332, + "country": "Qatar", + "email": "sherrijones@scentric.com", + "phone": "(905) 514-2725", + "color": "rgb(167,172,139)" + }, + { + "index": 143, + "name": "Fulton Richmond", + "first": "Nannie", + "last": "Preston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "boolean": false, + "guid": "d342e219-1ba1-46ae-aaea-371e1c50562a", + "integer": 14, + "date": "Thu Aug 06 1987 21:37:44 GMT-0700 (PDT)", + "shortText": "proident sunt tempor", + "mediumText": "Fugiat aliquip nisi eiusmod et. Adipisicing eiusmod quis magna aliquip ut ullamco nulla veniam dolor irure exercitation dolore. Lorem nostrud do non do cupidatat eiusmod ea ipsum aliqua pariatur aute Lorem voluptate.", + "longText": "Commodo adipisicing est ea do nostrud Lorem in adipisicing magna dolor pariatur consectetur. Esse adipisicing Lorem qui nostrud occaecat ipsum aute deserunt esse minim elit amet. Ad sint dolore minim consectetur enim. Cupidatat culpa amet mollit ut dolore aliqua laborum nulla voluptate voluptate eu sint voluptate Lorem. Irure et laboris tempor aute qui veniam id nulla sint nostrud eu officia ea commodo.\r\nAliquip et magna exercitation velit quis incididunt velit. Nostrud fugiat in nulla Lorem qui tempor nulla adipisicing anim eiusmod duis sunt ad ex. Nulla Lorem aliqua do esse commodo. Ea ullamco anim non magna reprehenderit id ad ut aliquip magna velit tempor est. Consequat laboris tempor cupidatat velit nulla ea reprehenderit aute excepteur commodo eu qui nisi amet. Commodo excepteur enim sint dolor tempor eu nulla elit non dolor.\r\nDo id incididunt aute consequat cillum. Voluptate sunt in ut id enim fugiat occaecat. Consectetur cillum sint tempor commodo duis veniam ad anim laboris deserunt consequat. Nisi duis aliqua consectetur ullamco nisi culpa ea aliqua.\r\n", + "address": "2 Lott Street", + "city": "Lydia", + "state": "Oklahoma", + "zip": 37848, + "country": "Vatican City State (Holy See)", + "email": "nanniepreston@scentric.com", + "phone": "(801) 531-2586", + "color": "rgb(58,230,86)" + }, + { + "index": 144, + "name": "Juanita Mcfadden", + "first": "Preston", + "last": "Koch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "boolean": false, + "guid": "d10bde3c-7451-4455-bcab-d6a9467128b3", + "integer": 35, + "date": "Sat Dec 29 2007 19:47:26 GMT-0800 (PST)", + "shortText": "fugiat", + "mediumText": "Deserunt mollit proident mollit pariatur aliquip amet sit sunt ea aliquip non ad irure voluptate. Mollit eu veniam do veniam esse laboris velit dolor velit aliqua Lorem sint dolore cupidatat. Ea est irure incididunt deserunt officia Lorem culpa proident non do cillum.", + "longText": "Reprehenderit sint est consequat do. Qui irure ad voluptate proident nulla nulla quis nisi minim quis ullamco eiusmod sint. Nulla exercitation tempor incididunt qui. Adipisicing velit sit ad exercitation cillum esse exercitation sit laboris. Nostrud commodo aliquip esse quis in irure exercitation.\r\nEnim nisi in dolor cillum nulla ipsum. Qui velit cupidatat esse sit quis ullamco consequat deserunt irure exercitation. Culpa tempor ut ex id id aliqua ipsum cillum est proident ullamco nulla reprehenderit. Amet proident duis sunt proident consectetur non pariatur officia in. Voluptate enim anim eiusmod fugiat occaecat ut sunt sit nulla proident. Elit dolore consectetur velit occaecat.\r\n", + "address": "4 Jewel Street", + "city": "Washington", + "state": "Ohio", + "zip": 55293, + "country": "Malaysia", + "email": "prestonkoch@scentric.com", + "phone": "(824) 598-3313", + "color": "rgb(188,204,126)" + }, + { + "index": 145, + "name": "Hunter Morin", + "first": "Aguilar", + "last": "Willis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "boolean": false, + "guid": "b6d849a7-e16f-4caf-8ddf-0232c5ccb47c", + "integer": 14, + "date": "Fri Oct 11 2013 10:09:38 GMT-0700 (PDT)", + "shortText": "mollit elit incididunt exercitation esse", + "mediumText": "Nisi tempor cupidatat do sint in nostrud nulla magna labore tempor amet. Qui ut anim adipisicing veniam veniam voluptate cupidatat culpa duis minim adipisicing veniam excepteur proident. Tempor eiusmod sint et nulla voluptate irure et quis sunt. Sit exercitation ex adipisicing consectetur sit veniam velit et laboris minim Lorem excepteur in.", + "longText": "Elit dolore dolore mollit deserunt fugiat Lorem ad nostrud occaecat magna. Sint deserunt sunt incididunt ad qui. Cupidatat nostrud ea sunt officia non sunt ea aliqua ipsum cillum adipisicing. Esse eiusmod minim magna culpa culpa.\r\n", + "address": "2 Cox Place", + "city": "Escondida", + "state": "Nevada", + "zip": 76788, + "country": "Belize", + "email": "aguilarwillis@scentric.com", + "phone": "(878) 446-2425", + "color": "rgb(137,240,219)" + }, + { + "index": 146, + "name": "Kathy Sutton", + "first": "Kendra", + "last": "Blevins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "boolean": false, + "guid": "4ad8c3c8-a316-4762-a596-e9477c0fa2cd", + "integer": 31, + "date": "Thu Dec 09 2004 16:04:29 GMT-0800 (PST)", + "shortText": "nisi", + "mediumText": "Minim incididunt amet sint velit officia eiusmod cillum velit duis adipisicing magna laborum deserunt eiusmod.", + "longText": "Sunt culpa tempor deserunt ea ea labore. Occaecat consectetur anim anim ipsum dolor. Consectetur nulla commodo non velit reprehenderit cillum tempor aliquip aliqua consequat dolore.\r\nAnim minim ipsum velit consectetur sit incididunt magna cillum. Commodo deserunt consectetur esse aliqua ullamco dolor pariatur. Mollit sint voluptate aute dolor fugiat minim veniam anim ad aute. In aliquip anim ullamco dolore proident proident ipsum sunt sunt. Sint dolor pariatur aute excepteur sunt laborum magna qui.\r\nIn eu excepteur commodo eiusmod aliqua ad amet. Fugiat eu adipisicing et eu commodo nostrud elit consectetur incididunt deserunt. Non velit qui do pariatur. Lorem pariatur ullamco voluptate cillum do duis.\r\nEnim ut velit tempor nulla nostrud duis non ex amet. Fugiat cillum cillum dolore aliquip aliqua duis proident sit eu deserunt culpa esse ad. Laboris dolore nulla in ullamco ullamco ut ad. Veniam amet ea Lorem consequat officia ut consectetur ea Lorem duis cupidatat id. Irure non cupidatat ipsum do incididunt duis minim elit dolor deserunt velit. Deserunt laboris fugiat ea incididunt qui excepteur ad non irure incididunt aliquip fugiat occaecat non.\r\nElit proident exercitation quis in labore et sint ea cillum ex occaecat deserunt. Ex laboris fugiat non et excepteur. Labore non nisi exercitation do minim incididunt commodo culpa est dolor. Mollit minim proident ea id. Aliquip est nulla aliquip sint culpa eu amet magna exercitation reprehenderit culpa. Ex commodo aliqua mollit veniam fugiat officia sint duis ad sit.\r\n", + "address": "3 Prince Street", + "city": "Urbana", + "state": "Montana", + "zip": 58650, + "country": "Singapore", + "email": "kendrablevins@scentric.com", + "phone": "(956) 553-2050", + "color": "rgb(224,79,174)" + }, + { + "index": 147, + "name": "Noel Morrison", + "first": "Puckett", + "last": "Shannon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "boolean": false, + "guid": "3257d65a-9945-47b8-8159-7e2304b15eef", + "integer": 32, + "date": "Wed Oct 31 1973 14:26:42 GMT-0800 (PST)", + "shortText": "sit enim nisi dolor occaecat", + "mediumText": "Deserunt deserunt excepteur aliquip proident aliquip sunt voluptate qui. Incididunt Lorem laboris dolore cillum incididunt. Qui magna excepteur ad id fugiat nostrud ea sunt mollit.", + "longText": "Eiusmod irure est incididunt cillum id sit enim quis. Eiusmod consequat deserunt proident fugiat velit ut pariatur mollit eiusmod tempor reprehenderit nisi. Nulla id ea occaecat culpa sit aute pariatur sit ullamco sint. Reprehenderit minim irure ut laborum irure nisi consectetur. Velit laborum aliquip eu ea quis veniam dolore nulla in mollit labore. Dolor velit est eiusmod est ullamco magna excepteur culpa deserunt aliqua culpa Lorem ea.\r\nTempor adipisicing sit elit ea commodo dolore dolore incididunt anim cillum nulla. In exercitation excepteur cupidatat nisi do. Id et aliqua incididunt officia pariatur dolor officia in eu ea. Eiusmod duis sint Lorem in officia velit sit qui labore aliqua fugiat quis magna ea. Laborum reprehenderit exercitation reprehenderit veniam anim nisi qui est. Ad velit incididunt ut labore consequat culpa nisi do voluptate aliquip.\r\nDo dolore occaecat amet aliquip excepteur aute nisi non. Cillum incididunt nostrud excepteur eiusmod consequat mollit voluptate dolor aliquip non. Veniam pariatur ad dolor commodo velit. Sunt dolore sunt dolore adipisicing pariatur sit nulla magna exercitation dolor proident amet dolore. Lorem adipisicing cillum laboris anim ex pariatur minim proident cillum deserunt incididunt est nostrud.\r\nEiusmod dolore eiusmod ad irure. Id nulla voluptate ad cillum duis aute veniam est mollit do. Dolore adipisicing cupidatat officia magna mollit incididunt ea. Ipsum commodo aute eu consequat ea sit. Pariatur cupidatat veniam voluptate est ex. Officia sint laboris voluptate anim laborum occaecat in ad. Consequat amet occaecat commodo deserunt duis.\r\nEnim minim dolor in anim enim. Sint ad adipisicing ullamco dolor cillum aute proident ea sint quis laboris sit. Dolor voluptate qui duis do ut labore magna incididunt occaecat tempor esse reprehenderit. Proident fugiat nulla tempor magna sit ut aliquip proident voluptate esse.\r\n", + "address": "2 Vanderbilt Avenue", + "city": "Nanafalia", + "state": "California", + "zip": 57562, + "country": "Trinidad and Tobago", + "email": "puckettshannon@scentric.com", + "phone": "(963) 414-2787", + "color": "rgb(74,128,154)" + }, + { + "index": 148, + "name": "Reeves Combs", + "first": "Trudy", + "last": "Newton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "boolean": false, + "guid": "53ffc997-22cc-4acc-94b5-13907ae8737f", + "integer": 12, + "date": "Sun Feb 19 1984 10:56:10 GMT-0800 (PST)", + "shortText": "consequat quis ea laboris", + "mediumText": "Commodo minim culpa cillum proident dolor occaecat mollit.", + "longText": "Proident consectetur officia consectetur laborum eiusmod sunt. Et magna labore nostrud culpa ullamco cillum duis pariatur laboris irure. Anim laborum enim laboris velit pariatur cupidatat. Aliqua minim eu labore est ex excepteur ullamco laboris deserunt ex id tempor. Laboris dolor elit officia anim incididunt nostrud incididunt nostrud officia voluptate. Voluptate nostrud fugiat consectetur cillum adipisicing elit sint sit duis. Dolor labore do pariatur do officia ullamco.\r\nQui nulla occaecat dolore ad labore excepteur reprehenderit magna sint irure culpa est. In mollit cupidatat laborum duis ipsum mollit. Eiusmod excepteur aliquip do anim occaecat quis mollit id laborum Lorem consectetur commodo. Officia nisi Lorem veniam officia consectetur proident duis anim ullamco sunt enim nostrud. Laboris ad eu et esse sit nisi.\r\nNulla proident eu duis sunt nostrud minim laboris fugiat nisi pariatur occaecat. Et cupidatat mollit laborum ipsum sint ea amet enim aliqua. Exercitation eiusmod eu labore tempor mollit id commodo amet magna.\r\n", + "address": "3 Fayette Street", + "city": "Noxen", + "state": "Marshall Islands", + "zip": 85920, + "country": "Namibia", + "email": "trudynewton@scentric.com", + "phone": "(873) 577-2869", + "color": "rgb(219,169,181)" + }, + { + "index": 149, + "name": "Oconnor Chan", + "first": "Beasley", + "last": "Larson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "boolean": true, + "guid": "1f90bd42-2c77-42fe-aa6b-fa4cd66676e6", + "integer": 10, + "date": "Fri Dec 30 1983 09:19:48 GMT-0800 (PST)", + "shortText": "adipisicing magna dolore", + "mediumText": "Commodo fugiat enim est minim. Amet quis amet mollit ipsum. Ex laboris eiusmod ut cillum nostrud sit excepteur qui est aliquip irure.", + "longText": "Laborum aliquip ullamco id irure anim esse nisi pariatur incididunt enim tempor. Sit voluptate aliquip non duis commodo. Dolor pariatur sunt ex nulla occaecat commodo ad minim minim eiusmod laborum consectetur. Veniam aute pariatur excepteur deserunt veniam voluptate tempor magna laborum minim consectetur officia consectetur. Enim aliquip incididunt dolor qui labore.\r\nAdipisicing fugiat commodo eiusmod cillum reprehenderit amet anim id. Aute laboris irure culpa est officia eiusmod esse minim ut irure ut. Nulla eu tempor nulla est eiusmod exercitation deserunt est. Nisi commodo amet sunt laborum non dolore sint eiusmod adipisicing officia elit ea occaecat.\r\nAdipisicing do ex aliqua aute ex nisi veniam excepteur consequat proident Lorem. Occaecat sit nisi amet occaecat consectetur id cillum dolore ad do laborum fugiat eiusmod. Cillum officia mollit qui non ad occaecat ea. Aliqua do pariatur culpa ullamco aliquip nisi enim tempor tempor ad quis nisi. Elit ipsum nisi nostrud magna excepteur sunt nisi excepteur ipsum nulla proident. Adipisicing mollit anim dolore eu mollit amet tempor.\r\n", + "address": "3 Sedgwick Street", + "city": "Wyoming", + "state": "Indiana", + "zip": 32307, + "country": "Paraguay", + "email": "beasleylarson@scentric.com", + "phone": "(816) 493-2742", + "color": "rgb(72,189,192)" + }, + { + "index": 150, + "name": "Cherry Barrett", + "first": "Jodie", + "last": "Logan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "boolean": false, + "guid": "cf368c96-a982-4646-9b54-5fac8d17760e", + "integer": 86, + "date": "Tue Jun 30 2009 10:25:53 GMT-0700 (PDT)", + "shortText": "minim aliqua deserunt officia reprehenderit", + "mediumText": "Sunt ea eu occaecat aliqua.", + "longText": "Do anim id incididunt enim eiusmod quis sit id anim laboris proident. Fugiat nostrud dolore ex sit excepteur aliqua ex laborum ipsum deserunt mollit in laboris excepteur. Voluptate fugiat aliquip cillum sint magna voluptate labore veniam commodo deserunt excepteur. Nisi laborum commodo magna laborum ullamco ullamco est incididunt. Fugiat ex do pariatur reprehenderit velit pariatur proident. Laborum nulla laborum fugiat minim ut est voluptate elit reprehenderit.\r\nVelit enim enim ex eiusmod quis quis. Est minim adipisicing eu labore et dolor. Occaecat non laborum sint officia aliquip. Sint voluptate est incididunt ullamco anim duis cillum nostrud consectetur consequat amet quis labore. Ullamco eu amet eu est esse. Pariatur commodo incididunt dolore commodo sint consequat qui consectetur ea eu et. Amet quis non fugiat sint nostrud magna eiusmod incididunt ullamco.\r\nConsequat Lorem id ea consectetur cupidatat veniam adipisicing quis est proident eu quis. Labore magna ut esse amet qui non commodo exercitation. Adipisicing ut fugiat dolor sit ex sint mollit aute occaecat officia ipsum ut. Dolore consectetur laboris sint ex consectetur. Labore proident Lorem sunt sunt amet. Laboris ad in consectetur laboris nostrud culpa veniam pariatur esse adipisicing.\r\nIrure qui nostrud magna elit nulla velit consequat magna aliqua. Esse in consectetur velit laborum nostrud Lorem quis. Ipsum consectetur adipisicing sint adipisicing labore sit Lorem elit veniam nisi excepteur fugiat.\r\nAliqua ut qui enim sit nulla nulla nulla labore aliqua Lorem Lorem do. Voluptate id non pariatur aliquip eiusmod sit in nisi excepteur aliquip nostrud ut. Non id sunt Lorem nostrud cillum ad incididunt. Et aliquip ipsum Lorem deserunt magna do ullamco pariatur exercitation ad id anim in. Anim fugiat nostrud eu commodo velit. Aute labore est anim duis et minim qui non voluptate velit incididunt.\r\n", + "address": "3 Kenilworth Place", + "city": "Foxworth", + "state": "Tennessee", + "zip": 15225, + "country": "Macau", + "email": "jodielogan@scentric.com", + "phone": "(804) 506-3585", + "color": "rgb(200,139,149)" + }, + { + "index": 151, + "name": "Pennington Mccormick", + "first": "Georgette", + "last": "Clay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "boolean": false, + "guid": "c449450f-7ccb-4b65-9f9d-2b392e612960", + "integer": 15, + "date": "Tue Nov 10 1992 06:22:21 GMT-0800 (PST)", + "shortText": "adipisicing non officia", + "mediumText": "Dolore tempor qui cupidatat et velit ipsum ut officia.", + "longText": "Laboris nostrud cillum esse velit veniam non occaecat. Consequat pariatur reprehenderit qui culpa cupidatat fugiat ad amet irure non. Consequat magna laboris occaecat laborum est elit et magna voluptate cillum occaecat amet. Sit elit proident duis tempor nulla ullamco est qui nostrud. Duis non aliqua ea duis labore elit pariatur elit. Aliquip amet id ea aliqua.\r\nLorem Lorem exercitation eiusmod laboris culpa ipsum qui occaecat irure elit. Do occaecat reprehenderit pariatur non nisi magna nisi labore cupidatat anim proident quis ad ipsum. Non qui aute cupidatat irure dolor excepteur excepteur. Veniam eiusmod non nulla ex amet in minim non dolore excepteur anim. Ipsum non magna minim ea consequat officia et eu velit do. Aliqua veniam dolor officia incididunt occaecat. Ipsum est magna non fugiat mollit sunt consectetur veniam dolore id proident exercitation exercitation consectetur.\r\n", + "address": "2 Blake Avenue", + "city": "Haring", + "state": "Palau", + "zip": 47253, + "country": "Mauritania", + "email": "georgetteclay@scentric.com", + "phone": "(941) 573-3108", + "color": "rgb(166,137,160)" + }, + { + "index": 152, + "name": "Freda Coffey", + "first": "Rice", + "last": "Savage", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "boolean": true, + "guid": "0645d81f-1761-4eb4-b3ec-5c83f1d37a29", + "integer": 84, + "date": "Sun May 07 1978 23:30:05 GMT-0700 (PDT)", + "shortText": "deserunt voluptate officia consequat magna", + "mediumText": "Adipisicing esse tempor proident irure dolore eu sit.", + "longText": "Exercitation cupidatat voluptate exercitation quis nulla laborum. Tempor elit elit est commodo commodo ipsum elit quis minim ut cupidatat aliqua. Elit officia enim occaecat nisi fugiat nulla qui quis. Nisi cillum ullamco eu proident mollit velit.\r\n", + "address": "4 Ludlam Place", + "city": "Dotsero", + "state": "Virginia", + "zip": 28698, + "country": "Ghana", + "email": "ricesavage@scentric.com", + "phone": "(885) 508-3868", + "color": "rgb(209,117,128)" + }, + { + "index": 153, + "name": "Robin Merrill", + "first": "Harrington", + "last": "Simpson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "boolean": false, + "guid": "13382562-593b-4d3d-8633-025dec9ff8d2", + "integer": 71, + "date": "Sun Jul 15 1973 12:02:34 GMT-0700 (PDT)", + "shortText": "ad", + "mediumText": "Incididunt est minim non mollit amet est. Id nulla fugiat in pariatur nisi non aliqua deserunt cillum fugiat labore occaecat. Laborum Lorem laborum sit esse amet veniam. Occaecat exercitation anim consectetur nisi.", + "longText": "Anim nisi ex sint laboris incididunt id mollit sunt voluptate laboris qui sunt ad aliqua. Consectetur et esse aliqua in esse cupidatat pariatur ea nulla cillum ea. Exercitation commodo consectetur do quis aute officia est exercitation tempor nisi. Ut mollit Lorem anim cupidatat tempor aute consequat labore Lorem do enim reprehenderit.\r\nLorem magna tempor incididunt aliqua in magna Lorem. Fugiat qui minim est excepteur dolore laboris non consequat. Ullamco consequat eiusmod et sint aliquip et in anim.\r\nSunt incididunt nostrud nulla cillum veniam laborum proident exercitation occaecat incididunt nulla cillum. Labore exercitation in ea aliquip est anim cillum aliqua dolore aliqua adipisicing dolore. Ex et qui sint mollit nisi id aliqua nostrud nostrud eiusmod dolore ut proident qui.\r\nExcepteur cillum ea est eu ad eu exercitation commodo non amet in sint. Amet esse proident consequat elit consequat in laboris ea quis. Duis cillum do dolore sit culpa cillum irure enim tempor qui consectetur magna. Anim cillum esse cillum labore mollit reprehenderit. Sint consequat aliqua in id labore in adipisicing est non sit. Laborum esse voluptate proident excepteur occaecat.\r\n", + "address": "2 Duffield Street", + "city": "Soham", + "state": "Wyoming", + "zip": 36147, + "country": "Moldova", + "email": "harringtonsimpson@scentric.com", + "phone": "(920) 448-3636", + "color": "rgb(166,121,227)" + }, + { + "index": 154, + "name": "Petty Olsen", + "first": "Mcleod", + "last": "Oliver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "boolean": true, + "guid": "f4ae116d-6e1a-45dc-a540-636907772467", + "integer": 43, + "date": "Tue May 07 1991 17:32:07 GMT-0700 (PDT)", + "shortText": "proident laborum irure", + "mediumText": "Culpa laborum laboris adipisicing irure commodo.", + "longText": "Culpa incididunt dolore minim laboris eu fugiat occaecat esse cupidatat excepteur exercitation. Est quis Lorem mollit deserunt quis dolore sunt. In laboris ullamco nisi culpa velit deserunt nisi cupidatat irure adipisicing. Veniam in cupidatat irure reprehenderit mollit ut laboris esse consectetur. Ipsum dolore aliquip mollit nulla magna officia. Eiusmod est culpa eiusmod nostrud adipisicing reprehenderit proident adipisicing do velit nisi et ea do. Ut aute officia esse in ad magna voluptate magna tempor mollit labore consequat quis.\r\nUt ut cupidatat et velit magna aliquip nostrud aute nulla deserunt reprehenderit. Ex consequat labore mollit est officia sint esse labore. Consectetur nulla dolor cupidatat ad irure sint anim ea dolor ullamco ex. Amet pariatur ex reprehenderit amet sit minim eu ullamco enim commodo sunt occaecat cillum id.\r\nEnim elit nostrud exercitation qui. Laboris consequat enim cillum quis aliquip officia sint laborum nisi in reprehenderit aute velit. Duis nisi excepteur mollit nisi duis. Aliquip elit laboris anim fugiat minim. Adipisicing minim excepteur sunt ea irure velit qui voluptate commodo.\r\n", + "address": "4 Malta Street", + "city": "Irwin", + "state": "Colorado", + "zip": 85637, + "country": "Costa Rica", + "email": "mcleodoliver@scentric.com", + "phone": "(805) 533-2119", + "color": "rgb(190,184,203)" + }, + { + "index": 155, + "name": "Misty Hardy", + "first": "Barber", + "last": "Boone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "boolean": true, + "guid": "9c45bc8a-25cf-4c5b-8b71-30364fcf1924", + "integer": 43, + "date": "Sun Oct 16 1994 17:51:06 GMT-0700 (PDT)", + "shortText": "magna", + "mediumText": "Exercitation nulla aliquip deserunt dolore nisi.", + "longText": "Minim exercitation sint laborum nulla. Amet sunt aliquip veniam pariatur est ex qui proident mollit est. Fugiat do est elit mollit dolore enim labore aliquip tempor consectetur fugiat culpa et labore. Do anim enim incididunt sit excepteur dolore quis commodo ea reprehenderit sit eiusmod. Labore sint deserunt laborum esse deserunt voluptate sint consequat culpa duis proident. Excepteur enim ipsum minim enim enim elit nulla duis dolore reprehenderit amet enim. Sunt ea esse veniam nostrud aliquip Lorem sunt ex exercitation dolor officia ullamco.\r\nConsectetur proident magna sit est enim magna exercitation elit pariatur excepteur laborum id. Mollit nostrud est excepteur consequat aliqua ea irure. Deserunt velit dolore incididunt exercitation.\r\nLabore anim minim dolor excepteur officia est est in magna minim. Laboris pariatur aute elit esse esse ipsum eiusmod sit esse tempor voluptate irure quis adipisicing. Ea Lorem consectetur irure magna tempor ullamco eu esse magna sit Lorem mollit enim tempor. Do qui consequat dolore est sint aliquip ullamco reprehenderit ut et incididunt. Fugiat non est proident aute.\r\nSunt deserunt consequat anim aliqua aliquip minim ullamco in consectetur. Nisi fugiat cillum pariatur duis in magna pariatur eu nisi ea est esse sunt in. Occaecat proident tempor excepteur cillum.\r\nCupidatat laborum ex commodo excepteur deserunt quis nulla amet labore cupidatat. Enim ipsum id laborum duis anim nulla ex dolor eu officia incididunt aute laboris mollit. Dolore laboris do laborum magna amet minim ea eu eiusmod. Deserunt duis laboris nostrud qui.\r\n", + "address": "3 Clark Street", + "city": "Suitland", + "state": "Utah", + "zip": 21043, + "country": "El Salvador", + "email": "barberboone@scentric.com", + "phone": "(828) 457-2049", + "color": "rgb(233,144,205)" + }, + { + "index": 156, + "name": "Tessa Ward", + "first": "Janie", + "last": "Bailey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "boolean": false, + "guid": "fa4f8583-7893-484e-a2fa-3daeb6c18ffc", + "integer": 38, + "date": "Thu Jun 19 1975 01:08:42 GMT-0700 (PDT)", + "shortText": "ex proident", + "mediumText": "Esse cupidatat duis non ullamco dolor aliquip aute tempor voluptate. Dolore cillum voluptate nulla eiusmod sint dolor minim consectetur.", + "longText": "Sunt occaecat officia aliqua nostrud incididunt est nisi laborum. Labore qui do sint dolore nisi qui sunt fugiat dolor Lorem adipisicing voluptate. Aliqua culpa dolor dolore nulla culpa labore duis sint ex.\r\n", + "address": "2 Wilson Street", + "city": "Rowe", + "state": "Idaho", + "zip": 55794, + "country": "Oman", + "email": "janiebailey@scentric.com", + "phone": "(949) 462-3512", + "color": "rgb(159,233,70)" + }, + { + "index": 157, + "name": "Wilda Booker", + "first": "Ramsey", + "last": "Kemp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "boolean": false, + "guid": "53cfead6-8964-4112-84a9-ab158fff3aef", + "integer": 66, + "date": "Sun Jun 03 2007 03:34:39 GMT-0700 (PDT)", + "shortText": "ex id", + "mediumText": "Esse veniam laborum enim exercitation nisi ut duis elit incididunt consequat. Amet anim non proident commodo. Voluptate ex irure ex occaecat veniam velit.", + "longText": "Nisi aliqua id ad et sunt esse ad sunt. Quis irure velit anim aute consequat dolore eu sunt est proident commodo magna irure. Minim ullamco ex duis sint nisi nulla occaecat quis. Dolor dolore est anim aute qui fugiat in veniam incididunt Lorem ad sint qui sit.\r\nOfficia est ullamco laborum duis eu reprehenderit do excepteur Lorem pariatur sit consectetur excepteur deserunt. Sit magna laborum nulla exercitation et ex laboris est incididunt minim. Ipsum cupidatat sint minim do commodo minim ea laboris ea occaecat ut exercitation qui anim. Reprehenderit voluptate sit voluptate occaecat commodo. Adipisicing nisi ipsum eiusmod exercitation non. Nostrud ad incididunt laboris fugiat veniam esse ex laboris enim.\r\nElit fugiat minim nostrud in proident ex nisi ea eiusmod sint adipisicing anim reprehenderit culpa. Exercitation anim do id ad. Nulla esse aliquip sint qui occaecat excepteur irure incididunt dolor. Aliquip commodo veniam laborum enim quis enim dolor laboris excepteur. Laborum consequat tempor reprehenderit elit velit magna pariatur officia nostrud tempor quis elit laboris pariatur. Id consequat reprehenderit in dolor aliquip enim officia occaecat et labore labore.\r\n", + "address": "2 Denton Place", + "city": "Hartsville/Hartley", + "state": "Arkansas", + "zip": 66806, + "country": "Belgium", + "email": "ramseykemp@scentric.com", + "phone": "(856) 582-2727", + "color": "rgb(83,54,244)" + }, + { + "index": 158, + "name": "Owens Bowman", + "first": "Tyson", + "last": "Bowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "boolean": true, + "guid": "77abfb3a-ed05-4caf-bf96-82e827a650f0", + "integer": 14, + "date": "Wed Mar 28 1990 07:53:40 GMT-0800 (PST)", + "shortText": "qui ullamco pariatur incididunt", + "mediumText": "Laborum pariatur sit pariatur veniam aliqua sint exercitation esse.", + "longText": "Occaecat nostrud sint nisi reprehenderit. Irure est enim esse irure dolor eu pariatur aute ea dolor id nulla. Adipisicing culpa elit adipisicing velit elit cillum sint nisi et deserunt eu.\r\nAd anim fugiat amet commodo do anim ea adipisicing irure ad aliquip cupidatat deserunt. Nulla consequat ut sit consectetur ea non ut aliqua. Nulla nisi sit anim incididunt cillum laborum. Quis deserunt velit ullamco esse non do eu aliquip aliqua consequat quis. Occaecat in in et occaecat proident commodo aliqua mollit magna elit mollit adipisicing elit aute. Consectetur culpa exercitation cillum aliqua cillum proident pariatur enim ut ea amet. Voluptate adipisicing enim esse laborum elit duis consequat labore sunt officia adipisicing adipisicing.\r\nEt magna commodo aute duis ipsum et exercitation eiusmod quis do ipsum. Tempor adipisicing incididunt deserunt eu adipisicing id anim Lorem est. Elit proident esse sunt tempor eiusmod dolor Lorem irure mollit. Qui sit proident duis quis magna qui. Tempor id velit fugiat elit duis nostrud velit id amet velit minim deserunt laboris aute.\r\nAliqua voluptate minim elit consectetur laborum ex proident. Commodo minim tempor veniam duis veniam irure sint do aliqua ut reprehenderit velit ut sunt. Ea nostrud irure Lorem est officia ea esse ad. Ipsum fugiat voluptate irure consequat veniam quis commodo fugiat.\r\nPariatur commodo ex anim nostrud consectetur tempor. Ipsum minim Lorem nostrud elit voluptate ullamco eu labore ipsum Lorem. Excepteur magna ea tempor deserunt eu aliquip pariatur excepteur. Minim fugiat proident quis incididunt laboris. Est nisi esse consectetur pariatur.\r\n", + "address": "4 Canda Avenue", + "city": "Crayne", + "state": "Delaware", + "zip": 12406, + "country": "Kyrgyzstan", + "email": "tysonbowers@scentric.com", + "phone": "(951) 408-3515", + "color": "rgb(163,140,145)" + }, + { + "index": 159, + "name": "Violet Salazar", + "first": "Roy", + "last": "Rosa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "boolean": true, + "guid": "dd706aa0-2c9a-4b30-8ada-4c21111ff80c", + "integer": 60, + "date": "Wed Jun 24 1998 10:59:00 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Amet aute amet occaecat enim cupidatat excepteur mollit et aute fugiat. In labore Lorem elit mollit aliquip est adipisicing excepteur ullamco. Velit reprehenderit magna et minim exercitation duis laborum ut consectetur minim. Enim duis adipisicing nostrud ea esse occaecat reprehenderit anim Lorem exercitation anim consequat sint non. Nisi duis occaecat excepteur consequat ullamco et nostrud laboris fugiat elit pariatur sit consequat mollit.", + "longText": "Est veniam irure excepteur aliquip excepteur aliqua fugiat. Labore aliquip anim fugiat est mollit dolor aute incididunt duis. Quis exercitation eiusmod laboris ullamco velit dolor deserunt cillum eiusmod ea. Excepteur velit ullamco reprehenderit fugiat laborum quis velit.\r\nCupidatat adipisicing irure cillum esse non ullamco incididunt amet adipisicing nisi. Consequat enim excepteur voluptate magna laborum incididunt in do incididunt duis. Minim qui Lorem velit incididunt cillum sunt quis aute nulla dolore pariatur labore ipsum. Amet in non amet et cillum duis exercitation aliqua et. Velit et voluptate excepteur amet anim deserunt mollit eu. Lorem commodo proident labore elit mollit cillum ad et et quis. Magna sint ut proident nisi duis.\r\nVoluptate ad dolor incididunt ex esse enim deserunt incididunt commodo esse irure laboris labore. Occaecat ad deserunt do et. Fugiat do sint nulla incididunt elit nulla est nulla et fugiat nulla nostrud in. Consectetur aute et nulla excepteur tempor do ut Lorem. Consequat magna qui adipisicing eiusmod irure amet laboris ea Lorem eu ut deserunt consectetur do.\r\nConsequat sunt incididunt sit voluptate proident minim anim. Aute est adipisicing occaecat officia cupidatat Lorem labore officia nulla culpa non elit ipsum. Commodo amet amet id enim cupidatat amet. Anim minim duis deserunt veniam sit sint sint ullamco magna.\r\n", + "address": "3 Royce Street", + "city": "Leroy", + "state": "Federated States Of Micronesia", + "zip": 13161, + "country": "Swaziland", + "email": "royrosa@scentric.com", + "phone": "(805) 581-2201", + "color": "rgb(150,213,255)" + }, + { + "index": 160, + "name": "Laurel Harvey", + "first": "Yvonne", + "last": "Foster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "boolean": true, + "guid": "1fb04afe-2620-4b3d-bf7d-c0ae6504d91a", + "integer": 27, + "date": "Sun May 20 1973 10:47:10 GMT-0700 (PDT)", + "shortText": "sit officia", + "mediumText": "Lorem laboris sit dolore nulla est enim eu eu. Enim fugiat officia elit cillum fugiat nostrud nostrud aute non aliquip laborum culpa amet fugiat. Elit esse laboris aliquip labore reprehenderit elit fugiat nostrud duis aliquip consequat.", + "longText": "Commodo elit amet sit irure id. Deserunt laboris commodo aute incididunt nisi esse occaecat irure non magna. Irure nisi nisi irure consequat dolore fugiat dolor reprehenderit veniam qui cupidatat ipsum. Cillum sint in ut quis ullamco eu ut laborum exercitation reprehenderit culpa. Consectetur dolor duis exercitation irure et eiusmod.\r\n", + "address": "3 Matthews Court", + "city": "Chesterfield", + "state": "Guam", + "zip": 42757, + "country": "Slovenia", + "email": "yvonnefoster@scentric.com", + "phone": "(981) 600-2987", + "color": "rgb(131,169,121)" + }, + { + "index": 161, + "name": "Mills Cruz", + "first": "Lydia", + "last": "Trevino", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "boolean": false, + "guid": "cd0f0296-ec14-4221-a846-ca3bf425bbbc", + "integer": 86, + "date": "Sun Feb 10 2002 20:01:40 GMT-0800 (PST)", + "shortText": "est dolore pariatur", + "mediumText": "Duis non quis tempor enim non sunt mollit esse. Irure ipsum ea elit commodo aute dolore ad sint reprehenderit. Velit aute ad commodo sint nisi ipsum. Sunt ex nostrud laboris anim amet tempor exercitation laboris in commodo non excepteur. Ea duis cupidatat eu enim est veniam.", + "longText": "Amet anim eu fugiat amet. Non cillum veniam consectetur nulla proident eu minim enim irure et. Proident exercitation est laboris ullamco anim. Commodo consectetur nostrud labore irure.\r\nDolore sunt id mollit aliquip. Nulla ullamco sint eu et reprehenderit nulla nostrud officia sint. Culpa consequat qui nulla dolore aliquip ipsum aliqua occaecat. Et ea ad magna ipsum magna tempor. Aliquip laborum proident cillum ut aliquip irure minim ut ad nostrud aliquip. Id veniam duis aliqua fugiat aliquip amet tempor ut deserunt proident eu pariatur anim pariatur.\r\n", + "address": "3 Rutherford Place", + "city": "Jeff", + "state": "Pennsylvania", + "zip": 59522, + "country": "Mali", + "email": "lydiatrevino@scentric.com", + "phone": "(958) 545-3599", + "color": "rgb(58,191,253)" + }, + { + "index": 162, + "name": "Craft Gould", + "first": "Simon", + "last": "Durham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "boolean": true, + "guid": "fddbf917-d75d-4698-8f07-cad884331664", + "integer": 58, + "date": "Sat Apr 02 1983 08:39:43 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Magna tempor do quis est pariatur culpa aliqua tempor ipsum. Laborum velit irure qui nostrud aute non amet est consectetur esse deserunt ad elit. Eiusmod velit proident culpa labore anim velit ex.", + "longText": "Ad tempor excepteur id incididunt. Elit culpa dolor ullamco exercitation non minim proident ex ipsum. Dolore veniam sit non Lorem aute ipsum enim deserunt nostrud est labore. Amet minim ut magna pariatur. Velit qui ipsum irure excepteur eiusmod sint. Irure sit dolor deserunt do proident ex aliquip anim enim. Ipsum nulla sunt ex magna sunt et enim exercitation.\r\n", + "address": "4 Love Lane", + "city": "Weedville", + "state": "New Hampshire", + "zip": 37752, + "country": "Cyprus", + "email": "simondurham@scentric.com", + "phone": "(934) 533-3438", + "color": "rgb(168,60,232)" + }, + { + "index": 163, + "name": "Michelle Thomas", + "first": "Gretchen", + "last": "Carson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "boolean": true, + "guid": "f7385e18-ca3a-4a01-b518-4de10115efad", + "integer": 17, + "date": "Sun Mar 23 1980 04:08:07 GMT-0800 (PST)", + "shortText": "eiusmod officia ex", + "mediumText": "Officia ipsum in tempor amet fugiat sunt ex id ullamco anim pariatur. Sint eu ad consequat tempor mollit dolor est minim duis. Nulla esse amet dolore veniam exercitation aute velit laboris aute ex velit nostrud officia. Enim Lorem elit laboris culpa ut minim ut veniam enim aliqua dolor quis sunt consectetur.", + "longText": "Id esse dolor laborum magna reprehenderit ut culpa enim. Sit dolore aute culpa nisi. Nulla qui quis culpa nostrud duis sint proident mollit velit pariatur.\r\nIrure commodo consequat anim in sunt. Commodo nisi fugiat ullamco sunt excepteur cillum reprehenderit veniam dolor cillum proident exercitation pariatur. Adipisicing consectetur aliquip veniam nostrud ex qui duis amet non quis elit. Ad non consectetur pariatur occaecat occaecat tempor magna.\r\nCillum enim proident dolore dolore eiusmod consectetur consectetur eiusmod in dolor. Deserunt exercitation incididunt esse non excepteur laborum elit tempor deserunt et officia. Ut magna mollit occaecat anim irure nulla aliqua consequat minim. Officia qui mollit veniam do cillum non non. Enim fugiat nostrud fugiat velit exercitation ea. Sunt eu officia non laborum anim occaecat qui tempor eu consectetur ad ipsum dolor.\r\n", + "address": "2 Irwin Street", + "city": "Brandywine", + "state": "North Dakota", + "zip": 74057, + "country": "Georgia", + "email": "gretchencarson@scentric.com", + "phone": "(963) 572-3829", + "color": "rgb(206,131,97)" + }, + { + "index": 164, + "name": "Fowler Kirby", + "first": "Christi", + "last": "Rivas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "boolean": true, + "guid": "1a236923-53b2-47df-88a0-9304e14dcc9c", + "integer": 4, + "date": "Tue Jul 06 1971 07:33:44 GMT-0700 (PDT)", + "shortText": "ut sunt incididunt ea", + "mediumText": "Enim ea excepteur nostrud id commodo do pariatur ipsum dolore excepteur incididunt. Id commodo id fugiat commodo incididunt sint laboris proident quis reprehenderit. Fugiat labore magna do in consequat cillum commodo sint laborum. Ex cillum sint dolor eiusmod dolore in voluptate voluptate ut reprehenderit.", + "longText": "Excepteur elit ad esse incididunt nulla in duis. Ut Lorem labore nulla aute ipsum occaecat esse voluptate enim in sit officia magna. Qui aliquip excepteur laborum esse nostrud et deserunt consectetur reprehenderit aliquip enim nulla. Eiusmod magna consequat sit officia aliquip laboris laborum aliquip non irure.\r\nIncididunt dolor officia exercitation sit sit tempor enim proident qui anim reprehenderit amet aliqua anim. Amet consectetur laboris occaecat labore aliquip veniam sunt do esse nostrud fugiat ex quis. Ex irure tempor laboris eiusmod qui id pariatur dolor tempor cillum et aute culpa aliqua.\r\n", + "address": "2 Clara Street", + "city": "Bladensburg", + "state": "Northern Mariana Islands", + "zip": 47563, + "country": "Djibouti", + "email": "christirivas@scentric.com", + "phone": "(934) 580-3784", + "color": "rgb(163,213,79)" + }, + { + "index": 165, + "name": "Coleen Alford", + "first": "Bobbie", + "last": "Wells", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "boolean": false, + "guid": "a38427b2-d0ac-4dae-aae3-2c4504338bf7", + "integer": 72, + "date": "Fri Aug 23 1985 16:39:58 GMT-0700 (PDT)", + "shortText": "sit labore cupidatat nulla", + "mediumText": "Magna ullamco in nulla officia dolor in mollit labore proident nulla do officia dolor.", + "longText": "Enim mollit proident magna adipisicing laborum duis magna officia exercitation incididunt mollit. Id Lorem in nostrud sit ut est culpa. Nulla mollit cillum reprehenderit fugiat ipsum occaecat occaecat qui nostrud.\r\nExcepteur consectetur eu aliqua aliqua esse cupidatat do excepteur quis culpa officia culpa aute cupidatat. Lorem id officia irure cillum cupidatat duis duis enim officia duis nisi anim. Elit ipsum nulla aliqua magna dolore eiusmod veniam est laborum. Veniam laboris deserunt duis voluptate. Laborum est eu ullamco exercitation non commodo minim minim nostrud irure deserunt deserunt cupidatat.\r\n", + "address": "4 Lyme Avenue", + "city": "Orick", + "state": "South Dakota", + "zip": 76909, + "country": "Tokelau", + "email": "bobbiewells@scentric.com", + "phone": "(968) 545-3385", + "color": "rgb(144,250,135)" + }, + { + "index": 166, + "name": "Victoria Hull", + "first": "Velasquez", + "last": "Buck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "boolean": false, + "guid": "f0102b51-dc32-496c-984f-1df5f9e71231", + "integer": 19, + "date": "Fri Jul 04 2003 19:23:27 GMT-0700 (PDT)", + "shortText": "occaecat reprehenderit nostrud cupidatat ullamco", + "mediumText": "Aute proident minim amet amet.", + "longText": "Dolor deserunt nulla ex occaecat. Pariatur consequat culpa ex nostrud. Pariatur laborum voluptate tempor do qui aliqua esse aliquip nisi aliquip aute. Deserunt sit ex cupidatat mollit mollit ipsum eiusmod.\r\nAliquip do ullamco pariatur elit. Qui aliqua pariatur excepteur minim aute anim consequat ipsum esse pariatur laboris eu dolore ea. Adipisicing velit cillum est deserunt ea magna laboris irure. Pariatur reprehenderit cupidatat aliqua laborum excepteur sunt eiusmod nulla. Consequat ex Lorem consequat eu laboris est cupidatat.\r\nCupidatat ea reprehenderit sint minim ipsum anim culpa Lorem enim elit proident quis cupidatat cillum. Elit est et cupidatat irure labore minim est. Dolor veniam consectetur commodo id in anim. Fugiat et qui ex aliquip magna fugiat excepteur id. Qui mollit non veniam excepteur. Lorem adipisicing anim ullamco excepteur officia proident ea.\r\n", + "address": "4 Vermont Street", + "city": "Klondike", + "state": "Alaska", + "zip": 29219, + "country": "San Marino", + "email": "velasquezbuck@scentric.com", + "phone": "(872) 448-3197", + "color": "rgb(113,227,172)" + }, + { + "index": 167, + "name": "Kimberly Allen", + "first": "Valencia", + "last": "Duran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "boolean": true, + "guid": "8bfa6dca-8fd4-4050-b184-2e523d1bdc9e", + "integer": 59, + "date": "Thu Nov 29 2012 14:27:53 GMT-0800 (PST)", + "shortText": "non adipisicing aliqua aliquip", + "mediumText": "Dolor dolor ea sit id elit aute dolore. Commodo amet ut fugiat tempor in aliquip.", + "longText": "Sunt fugiat duis nulla laborum excepteur. Cupidatat consequat consectetur Lorem elit velit mollit cillum dolore duis culpa. Commodo elit adipisicing ut tempor proident reprehenderit. Excepteur laboris occaecat labore dolor enim in. Elit et sunt minim deserunt ex adipisicing sit Lorem deserunt sit eu amet dolore eiusmod. Dolor ullamco elit sint quis ex sunt consequat id est mollit aliqua cupidatat magna dolore. Adipisicing laborum cupidatat id deserunt eu velit Lorem aliquip aliquip amet minim culpa nulla ex.\r\nLaboris ipsum Lorem tempor labore anim fugiat quis velit. Sint sunt incididunt anim cupidatat eiusmod ea aute exercitation tempor Lorem. Nulla amet eu voluptate eu in ut veniam dolor elit ullamco. Labore elit eu id tempor esse. Incididunt cupidatat cillum do non amet ullamco cillum nulla Lorem. Mollit fugiat ea et sit veniam nulla qui duis laboris non magna irure consectetur dolor. Id eu officia mollit est dolore voluptate anim ex.\r\nIrure ipsum commodo reprehenderit labore et nulla. Sunt et nulla id commodo quis laboris ipsum irure elit ad officia. Aute Lorem anim dolore non est occaecat in esse quis duis.\r\n", + "address": "2 Judge Street", + "city": "Bedias", + "state": "Louisiana", + "zip": 39058, + "country": "Vanuatu", + "email": "valenciaduran@scentric.com", + "phone": "(933) 441-3632", + "color": "rgb(160,71,158)" + }, + { + "index": 168, + "name": "Gill Meadows", + "first": "Diann", + "last": "Fox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "boolean": true, + "guid": "a9cbf409-9e60-457a-a048-b16302e1615a", + "integer": 88, + "date": "Sat Oct 13 2001 11:08:26 GMT-0700 (PDT)", + "shortText": "quis ea et amet sint", + "mediumText": "Dolor reprehenderit duis nulla ea cupidatat sit cupidatat Lorem fugiat. Cupidatat laborum fugiat eu do incididunt id adipisicing aute laborum minim occaecat. Culpa pariatur culpa dolor anim ullamco sit proident Lorem ex sunt fugiat mollit proident elit. Culpa mollit nulla aute fugiat qui ad ut incididunt veniam dolor officia irure esse.", + "longText": "Occaecat do proident enim et. Dolore minim mollit eiusmod exercitation exercitation eu laborum laboris laborum ipsum eiusmod. Reprehenderit pariatur sint dolor consequat.\r\nElit consectetur enim aute sit culpa. Nostrud irure do et voluptate nostrud. Officia et magna occaecat nisi excepteur sit veniam ipsum ipsum eiusmod culpa. Id sunt excepteur culpa et. Eu sunt aute aliquip excepteur labore incididunt laborum cupidatat. Eu deserunt occaecat culpa Lorem aliquip excepteur cillum et esse est.\r\nAdipisicing non est voluptate anim proident tempor. Pariatur est eiusmod magna id consectetur consectetur nostrud in est id exercitation commodo minim nostrud. Aute esse veniam tempor sint sunt. Ut elit exercitation laborum voluptate voluptate. Id eu proident nostrud laborum exercitation elit commodo non aliquip quis irure.\r\nAnim quis eu sit qui esse deserunt ut. Officia voluptate deserunt cupidatat sint nostrud anim. Ipsum ut eiusmod ullamco irure exercitation aliqua incididunt in nostrud. Eu fugiat nulla esse deserunt et laboris consequat. Ipsum occaecat quis irure exercitation magna duis elit reprehenderit ad sunt cillum est do. Id qui ipsum dolor laboris commodo voluptate exercitation commodo. Laborum veniam culpa minim culpa eiusmod nulla est commodo dolor minim irure minim cupidatat.\r\nEx eu duis sit velit. Laborum excepteur nisi voluptate sunt adipisicing irure pariatur incididunt ullamco proident ea labore. Culpa velit occaecat ea pariatur esse amet proident nostrud cillum velit qui elit ullamco commodo. Pariatur ad qui ad in qui in est laborum enim incididunt qui. Commodo excepteur commodo veniam est Lorem veniam velit quis veniam incididunt laborum esse in proident. Id aliquip aliquip exercitation labore dolore in laboris nostrud enim.\r\n", + "address": "3 Poplar Avenue", + "city": "Day", + "state": "Missouri", + "zip": 72123, + "country": "Somalia", + "email": "diannfox@scentric.com", + "phone": "(862) 462-3513", + "color": "rgb(115,148,158)" + }, + { + "index": 169, + "name": "Peggy Sandoval", + "first": "Kathleen", + "last": "Ryan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "boolean": false, + "guid": "5c6b1295-b453-4328-a4f4-e137d434c520", + "integer": 52, + "date": "Sat Feb 04 1978 00:31:29 GMT-0800 (PST)", + "shortText": "esse laborum duis fugiat dolore", + "mediumText": "Reprehenderit quis ut incididunt laborum sint non culpa tempor. Sint irure voluptate consectetur irure amet.", + "longText": "Ipsum mollit nostrud tempor amet nostrud aliqua ea eiusmod. Consequat exercitation consectetur mollit qui reprehenderit. Incididunt irure deserunt deserunt eu ullamco non proident et velit. Adipisicing ea ad dolore aliquip sint qui ut. Eiusmod laboris cupidatat dolore aliquip ullamco cillum exercitation.\r\nEsse non fugiat ex culpa. Veniam aliquip amet elit qui culpa commodo duis. Ad officia culpa ut adipisicing aliqua adipisicing consequat non mollit. Quis exercitation aute exercitation esse duis do. Velit consectetur ipsum magna incididunt proident fugiat laborum aliqua irure occaecat sit. Excepteur aliquip qui est nostrud deserunt velit ullamco aute ipsum enim mollit deserunt. Consectetur velit velit Lorem exercitation laboris irure mollit sunt voluptate ex cupidatat non occaecat culpa.\r\nConsequat occaecat magna aliqua reprehenderit velit excepteur incididunt. Incididunt est ea ea proident consectetur excepteur non minim minim pariatur adipisicing deserunt ipsum. Reprehenderit amet non quis esse reprehenderit. Enim et elit Lorem id sit in culpa eiusmod aliquip ipsum.\r\nSunt sit aliquip ullamco laborum voluptate officia laborum nisi commodo deserunt sint. Sit nostrud sit eu nisi dolor sit voluptate duis exercitation. Eiusmod mollit nulla labore ea labore et labore tempor ad magna in sunt.\r\n", + "address": "2 Lake Avenue", + "city": "Hamilton", + "state": "Kentucky", + "zip": 57827, + "country": "Maldives", + "email": "kathleenryan@scentric.com", + "phone": "(868) 529-3500", + "color": "rgb(213,148,139)" + }, + { + "index": 170, + "name": "Julia Palmer", + "first": "Harrell", + "last": "Galloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "boolean": true, + "guid": "8de12a66-7b83-4add-91a8-87d6b817555b", + "integer": 3, + "date": "Sat Oct 15 1994 03:18:04 GMT-0700 (PDT)", + "shortText": "elit occaecat", + "mediumText": "Veniam sunt elit id ad amet ut. Quis in reprehenderit qui amet mollit exercitation sint esse anim. Reprehenderit anim ex sint adipisicing dolor dolore quis.", + "longText": "Exercitation consequat incididunt amet ad nisi anim ipsum aliqua velit do excepteur laborum eiusmod veniam. Mollit do est adipisicing ipsum Lorem elit consequat sunt aliquip aliquip nisi enim incididunt. Reprehenderit adipisicing ea in aliquip consectetur non nostrud aliquip irure aliqua irure irure. Ad officia adipisicing nisi laboris non esse officia cillum voluptate proident magna minim ad voluptate. Eu aute dolore sit elit proident est id in. Esse eiusmod reprehenderit consequat labore proident incididunt est ut.\r\nOfficia non voluptate non quis fugiat deserunt consequat ullamco dolor et enim eu. Ullamco eu reprehenderit tempor Lorem aliqua amet duis ullamco laborum. Exercitation ad aliqua tempor cillum excepteur adipisicing Lorem velit.\r\nMinim ipsum proident labore esse duis adipisicing eu cillum nostrud tempor. Esse commodo enim officia amet dolore esse. Incididunt tempor labore sit culpa aliqua est ut do anim.\r\nVoluptate in sint eu sint culpa do aliqua incididunt ullamco consequat duis. Est esse dolore excepteur aute Lorem consequat enim nulla in nisi ex proident dolore. Ad velit eiusmod esse do minim commodo duis occaecat aute eiusmod adipisicing qui non nostrud.\r\nDolor do sit culpa amet irure occaecat nisi aliquip est ad. Dolor ullamco officia anim amet occaecat elit minim. Anim exercitation elit ipsum magna sit ut sunt aliqua. Do quis occaecat culpa mollit aute qui. Irure officia dolor cillum veniam esse. Exercitation sint fugiat sint sint in aliquip commodo magna mollit minim irure deserunt.\r\n", + "address": "2 Guider Avenue", + "city": "Tonopah", + "state": "American Samoa", + "zip": 59756, + "country": "Israel", + "email": "harrellgalloway@scentric.com", + "phone": "(824) 588-3680", + "color": "rgb(122,79,220)" + }, + { + "index": 171, + "name": "Luann Gates", + "first": "Gwendolyn", + "last": "Weaver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "boolean": false, + "guid": "f87dd269-a351-4ca6-864e-d1262763c0ed", + "integer": 35, + "date": "Wed Feb 26 1992 22:47:04 GMT-0800 (PST)", + "shortText": "nulla esse do consequat", + "mediumText": "Veniam cupidatat ut tempor amet. Cillum amet irure aliquip non.", + "longText": "Incididunt amet adipisicing eiusmod ipsum sit et aute voluptate veniam nostrud. Ea ex ullamco sint minim. Proident minim quis aute nulla minim nisi sunt. Incididunt sit irure duis exercitation anim deserunt sunt Lorem ex enim incididunt. Non et sint amet minim culpa fugiat ut esse. Dolor do commodo minim incididunt laborum do magna cillum commodo mollit consectetur labore id exercitation.\r\nNon fugiat Lorem enim cillum duis voluptate. Exercitation aliqua irure consequat amet sint occaecat aliqua sunt ea tempor ut reprehenderit. Occaecat pariatur duis adipisicing consequat. Amet sunt qui veniam mollit officia ea magna.\r\nEnim esse amet cillum mollit fugiat laborum Lorem. Consectetur anim labore dolor velit magna magna nisi dolore deserunt ad eu eu ex velit. Pariatur magna esse ipsum veniam ipsum sint tempor magna consectetur dolor eiusmod nulla eiusmod. Eiusmod veniam et ex incididunt ea sunt quis dolor ex. Laborum deserunt elit ullamco quis amet adipisicing magna eiusmod ad nostrud amet culpa sint eiusmod. Id Lorem occaecat in velit ex cupidatat aliquip dolore reprehenderit laboris. Consequat nostrud magna non occaecat ut laboris aliqua amet anim.\r\nNisi veniam id anim minim elit elit veniam. Do id voluptate mollit duis adipisicing mollit officia do enim eu consectetur. Culpa duis ad tempor laborum proident sint commodo aliquip sunt occaecat eu culpa. Eu ullamco exercitation excepteur aute voluptate mollit ex.\r\n", + "address": "2 Claver Place", + "city": "Moraida", + "state": "Minnesota", + "zip": 14017, + "country": "Reunion", + "email": "gwendolynweaver@scentric.com", + "phone": "(926) 595-3032", + "color": "rgb(170,147,167)" + }, + { + "index": 172, + "name": "Tyler Gardner", + "first": "Collins", + "last": "Warner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "boolean": false, + "guid": "e9934a5e-c84e-4920-979e-2c6496359125", + "integer": 41, + "date": "Sat Jun 23 1990 16:08:31 GMT-0700 (PDT)", + "shortText": "esse velit commodo", + "mediumText": "Est consequat velit elit exercitation irure laboris commodo do cillum proident commodo. Laborum fugiat aute Lorem reprehenderit exercitation.", + "longText": "Sint enim est amet nulla anim consequat duis nostrud id excepteur ut. Dolor cillum sit do duis nostrud laborum. Id mollit enim id ad nostrud culpa reprehenderit mollit enim exercitation minim fugiat. Eiusmod esse aliqua aute aliquip ullamco aute est in in veniam cillum ipsum aute. Laboris tempor mollit non veniam officia velit ea. Laboris cillum fugiat id consectetur labore proident est. Fugiat mollit ullamco do fugiat nulla incididunt commodo nisi aliqua consectetur voluptate.\r\nIncididunt velit quis mollit laborum esse occaecat id. Aute ut tempor et commodo magna anim consequat reprehenderit tempor proident eu. Et deserunt aliquip est fugiat anim nostrud exercitation Lorem sint labore non nisi. Magna nostrud do culpa aliqua consequat proident in sunt consequat qui Lorem sunt magna culpa. Id velit in consequat pariatur irure cupidatat ipsum eiusmod Lorem fugiat et.\r\nEiusmod proident amet cupidatat ea et. Veniam minim consectetur dolor officia aliquip exercitation culpa. Sunt et tempor magna laboris sunt aliquip excepteur ea nostrud aliqua. Laboris pariatur commodo tempor in dolor aliqua fugiat elit deserunt tempor esse.\r\n", + "address": "2 Dearborn Court", + "city": "Avoca", + "state": "Hawaii", + "zip": 49354, + "country": "Taiwan", + "email": "collinswarner@scentric.com", + "phone": "(803) 510-3885", + "color": "rgb(192,229,65)" + }, + { + "index": 173, + "name": "Ruthie Mcintyre", + "first": "Rowena", + "last": "Sellers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "boolean": true, + "guid": "e7f9037c-1145-4e46-a079-2b461a550ad8", + "integer": 21, + "date": "Mon Aug 25 2014 19:53:08 GMT-0700 (PDT)", + "shortText": "occaecat velit", + "mediumText": "Lorem ut adipisicing deserunt quis fugiat aute.", + "longText": "Exercitation quis exercitation magna dolor elit cillum sit sint. Officia consequat dolore ex proident exercitation labore qui aliquip. Exercitation adipisicing sit culpa ullamco laborum.\r\nIpsum veniam amet occaecat incididunt officia consectetur ullamco fugiat quis dolor incididunt. Ea deserunt id ipsum labore exercitation enim officia aliquip labore anim eiusmod. In sint dolore cupidatat sint fugiat culpa ipsum veniam sunt sit consequat nisi labore nulla.\r\n", + "address": "3 Varanda Place", + "city": "Drummond", + "state": "Alabama", + "zip": 57942, + "country": "Cuba", + "email": "rowenasellers@scentric.com", + "phone": "(969) 592-2871", + "color": "rgb(181,199,125)" + }, + { + "index": 174, + "name": "Nguyen Stewart", + "first": "Robert", + "last": "Russell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "boolean": false, + "guid": "28ef7fb5-18c4-4dd2-927c-3ddc4d9199c4", + "integer": 75, + "date": "Wed Sep 06 1972 12:28:29 GMT-0700 (PDT)", + "shortText": "in minim qui veniam nulla", + "mediumText": "Esse laboris aliquip ex est deserunt ut minim Lorem Lorem non proident minim. Est et ad Lorem laborum laboris nostrud tempor eu magna. Incididunt sint mollit ullamco sint sunt fugiat voluptate ut nostrud.", + "longText": "Irure est cillum duis pariatur et ut. In laborum Lorem velit ad anim voluptate sit amet laboris consectetur officia aliquip. Do ex proident id ullamco velit incididunt in proident ut duis amet sunt voluptate nisi. Et nostrud eiusmod laboris ipsum ad. Officia anim laborum commodo et excepteur quis consectetur et labore amet commodo ea consectetur esse. Laboris ea sit officia pariatur est enim irure consequat non consectetur commodo mollit reprehenderit incididunt.\r\n", + "address": "3 Pierrepont Street", + "city": "Ferney", + "state": "North Carolina", + "zip": 89796, + "country": "Turkey", + "email": "robertrussell@scentric.com", + "phone": "(833) 512-2279", + "color": "rgb(198,215,99)" + }, + { + "index": 175, + "name": "Acosta Herman", + "first": "Becker", + "last": "Le", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "boolean": false, + "guid": "fc0ce1b2-66dd-4e0a-8a4d-192b563ab3af", + "integer": 17, + "date": "Mon Jul 25 2011 16:50:08 GMT-0700 (PDT)", + "shortText": "veniam officia ipsum ad do", + "mediumText": "Mollit do laborum aliquip elit occaecat qui do. Ullamco mollit velit pariatur amet exercitation.", + "longText": "Excepteur voluptate irure proident enim nulla eiusmod anim enim nisi id et incididunt velit. Id anim excepteur excepteur aliquip elit ex. Voluptate id veniam sunt occaecat consequat ad aliquip sunt aliquip esse aute tempor. Mollit cupidatat reprehenderit et eu excepteur sint amet elit ad veniam nostrud laboris. Voluptate sint amet anim cupidatat velit ut incididunt ex laborum ea. Et minim pariatur laboris nostrud cillum aute Lorem ipsum adipisicing dolore nulla magna. Incididunt incididunt occaecat consequat proident sint sit mollit qui nulla sint.\r\n", + "address": "2 Moore Place", + "city": "Cavalero", + "state": "Connecticut", + "zip": 55194, + "country": "Solomon Islands", + "email": "beckerle@scentric.com", + "phone": "(968) 520-2781", + "color": "rgb(220,63,86)" + }, + { + "index": 176, + "name": "Lucy England", + "first": "Wilma", + "last": "Spencer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "boolean": false, + "guid": "912d4bf7-1356-4736-9560-45d3c9f56f54", + "integer": 99, + "date": "Fri Jun 24 1977 07:55:22 GMT-0700 (PDT)", + "shortText": "qui exercitation reprehenderit", + "mediumText": "Ipsum voluptate ex cupidatat sunt sit fugiat amet quis irure ex. Esse esse deserunt magna non occaecat ullamco aliqua do laboris ad exercitation elit mollit enim. Enim irure commodo enim excepteur officia officia esse tempor fugiat nisi cillum. Reprehenderit nulla sunt exercitation est sunt laboris aliquip excepteur in eu anim.", + "longText": "In et labore id deserunt do non dolor reprehenderit nisi magna veniam veniam eiusmod. Deserunt Lorem non adipisicing non pariatur. Est cillum sint proident sint proident eu aliqua commodo. Pariatur qui laboris eiusmod amet mollit ullamco amet. Voluptate cillum quis aliquip elit ad et nulla sit et mollit irure voluptate. Et in ullamco in adipisicing deserunt. Tempor consectetur exercitation mollit incididunt et sunt minim.\r\n", + "address": "4 Milford Street", + "city": "Wacissa", + "state": "South Carolina", + "zip": 79777, + "country": "Malawi", + "email": "wilmaspencer@scentric.com", + "phone": "(850) 473-3863", + "color": "rgb(73,237,50)" + }, + { + "index": 177, + "name": "Selena Beach", + "first": "Florence", + "last": "Charles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "boolean": false, + "guid": "ed115112-8db3-4cae-a08d-983100a10c85", + "integer": 88, + "date": "Wed Jun 19 1996 04:58:57 GMT-0700 (PDT)", + "shortText": "quis nulla", + "mediumText": "Duis dolor id et elit nostrud eiusmod labore eiusmod incididunt eu ex enim magna exercitation. Velit do elit pariatur proident.", + "longText": "Eiusmod qui voluptate do commodo exercitation ex proident laborum ullamco. Laboris ad officia dolore duis minim. In proident ullamco et duis qui ullamco exercitation. Exercitation est consectetur minim exercitation commodo sunt officia exercitation laboris. Laborum elit in incididunt quis et pariatur adipisicing.\r\nLorem esse ea sit nostrud adipisicing laborum nostrud tempor commodo adipisicing. Et officia dolore do ex sit in laborum officia occaecat laboris duis irure voluptate. Labore mollit reprehenderit ullamco ut velit voluptate. Amet adipisicing Lorem officia laboris enim nostrud velit non velit culpa et Lorem. Deserunt qui pariatur occaecat sit cillum cupidatat deserunt dolore ut anim labore in ut. Minim velit do dolor deserunt duis. Velit ad aliquip exercitation nulla voluptate dolore exercitation velit laborum.\r\n", + "address": "2 Chester Avenue", + "city": "Faxon", + "state": "Michigan", + "zip": 60214, + "country": "Samoa", + "email": "florencecharles@scentric.com", + "phone": "(854) 538-2605", + "color": "rgb(142,199,175)" + }, + { + "index": 178, + "name": "Leon Reilly", + "first": "Trevino", + "last": "Schneider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "boolean": false, + "guid": "f0c018ba-4648-46ab-bd0f-3d92f2370954", + "integer": 92, + "date": "Fri May 13 1983 05:44:49 GMT-0700 (PDT)", + "shortText": "sunt", + "mediumText": "Mollit velit id proident ex pariatur ea.", + "longText": "Enim ex tempor ad esse cupidatat officia aute. Ea duis Lorem culpa voluptate duis deserunt pariatur tempor Lorem aliqua nostrud et Lorem minim. Et consequat adipisicing esse labore. Sunt consequat cupidatat proident magna dolore. Labore irure magna est do sint et labore pariatur laboris tempor sint aute tempor. Quis nulla non qui eiusmod Lorem nulla.\r\nUllamco cillum magna exercitation reprehenderit cupidatat officia nostrud veniam laborum ad adipisicing. Sint laborum sit enim nostrud sint proident consectetur. Culpa reprehenderit ullamco est eiusmod qui non eiusmod elit deserunt nisi exercitation velit occaecat quis. Commodo est qui velit irure eiusmod officia.\r\nDolor Lorem officia qui sint duis nostrud esse qui magna qui. Duis ullamco irure labore ut mollit. Deserunt in laboris proident culpa sit eu.\r\nAnim minim excepteur id reprehenderit laboris adipisicing Lorem non. Aliqua anim anim cillum aliqua excepteur elit ut. Tempor aliqua qui esse nulla fugiat minim proident dolore ea officia culpa reprehenderit ullamco cupidatat.\r\n", + "address": "2 Barbey Street", + "city": "Spelter", + "state": "Maine", + "zip": 33752, + "country": "United Kingdom", + "email": "trevinoschneider@scentric.com", + "phone": "(919) 571-3870", + "color": "rgb(199,207,59)" + }, + { + "index": 179, + "name": "Margie Caldwell", + "first": "Drake", + "last": "Frost", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "boolean": false, + "guid": "1c2ba2bb-24b8-4fa7-8755-0fd72201985e", + "integer": 26, + "date": "Thu Oct 27 1977 23:39:23 GMT-0700 (PDT)", + "shortText": "aliqua labore id excepteur", + "mediumText": "Sit in irure voluptate ex sint cillum sint duis cillum.", + "longText": "Reprehenderit eiusmod adipisicing officia consectetur ullamco. Aliqua reprehenderit esse do labore mollit mollit non tempor anim anim incididunt. Id reprehenderit amet laborum do.\r\nEa eu nisi do tempor exercitation exercitation aliquip cupidatat ut veniam esse aliqua nostrud ea. Laboris in laborum nostrud proident duis elit fugiat in labore. Cupidatat exercitation culpa elit sit do fugiat. Id eiusmod est ut deserunt tempor quis. Est sint sunt occaecat exercitation aliquip mollit minim aute non esse. Ex officia Lorem qui eu adipisicing occaecat do. Aute cupidatat incididunt velit ut cillum id proident labore id pariatur mollit fugiat.\r\nIncididunt deserunt cillum officia eiusmod enim elit laboris. Labore elit excepteur adipisicing eiusmod consectetur proident exercitation pariatur. Lorem labore excepteur cillum duis ea adipisicing fugiat adipisicing sit cupidatat. Culpa proident proident aute nostrud ad occaecat velit in. Labore non ad cillum adipisicing quis sit. Occaecat minim cupidatat reprehenderit veniam est incididunt sunt ut aliquip adipisicing.\r\nQui sunt exercitation aute sint pariatur. Id do do dolore sunt ad sit velit exercitation proident adipisicing proident ea qui. In quis excepteur incididunt in. Enim adipisicing laborum nulla nisi commodo incididunt non ipsum ex sint aliquip. Elit labore ex ullamco veniam id.\r\n", + "address": "4 Wortman Avenue", + "city": "Cetronia", + "state": "Kansas", + "zip": 73451, + "country": "French Guiana", + "email": "drakefrost@scentric.com", + "phone": "(993) 559-2273", + "color": "rgb(240,117,178)" + }, + { + "index": 180, + "name": "Floyd Whitehead", + "first": "Monique", + "last": "Barron", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "boolean": true, + "guid": "5505bea5-acce-4d67-b22e-850228beae52", + "integer": 30, + "date": "Wed Jul 15 2009 01:03:18 GMT-0700 (PDT)", + "shortText": "id eu", + "mediumText": "Quis et sit amet reprehenderit esse ex velit. Id Lorem ea irure consectetur deserunt excepteur. Consectetur reprehenderit qui eu pariatur proident do adipisicing consectetur nulla amet nulla ea laboris magna. Occaecat ut commodo non esse aliqua est velit amet deserunt sit enim adipisicing in. Mollit aliquip nostrud nisi esse.", + "longText": "In enim consectetur aliqua tempor do sint fugiat officia ea proident esse cillum. Lorem magna ipsum amet aute deserunt. Pariatur aliqua dolor veniam in. Consequat dolore et cillum ea mollit esse dolor. Ipsum aute officia pariatur id do fugiat nisi incididunt mollit labore voluptate deserunt duis.\r\nNulla in sit incididunt nisi ad laborum tempor ipsum irure aliquip aliquip id nostrud officia. Pariatur fugiat consequat excepteur aliqua enim. Sunt minim dolore elit esse nostrud. Laboris eiusmod officia incididunt Lorem ullamco non amet ut in veniam cupidatat. Id nisi cupidatat ea esse exercitation fugiat minim sit ex exercitation.\r\nExercitation non reprehenderit ipsum aliqua quis. Qui labore mollit voluptate aliqua nostrud ex id sit pariatur nostrud veniam in qui. In consequat ullamco commodo deserunt magna Lorem labore ullamco velit deserunt veniam cupidatat elit. Dolor fugiat ea in magna dolor occaecat aliquip cillum id. Ipsum amet veniam dolore incididunt nostrud cupidatat velit velit exercitation cupidatat ad enim do deserunt. Mollit officia sit anim elit. Veniam ipsum nulla culpa occaecat non mollit.\r\nAute ex quis est et laborum dolore duis velit. Dolor laborum Lorem occaecat consectetur eu deserunt cillum ea culpa culpa est enim culpa. Ut veniam do anim consectetur sit id. Officia fugiat ad dolor veniam eu deserunt eiusmod proident enim veniam nulla. Exercitation proident aute esse fugiat veniam cupidatat. Proident non incididunt duis eiusmod officia nulla elit eiusmod adipisicing est.\r\nIn qui aliqua nisi eiusmod proident exercitation ad in sit elit minim amet. Culpa est Lorem Lorem irure exercitation et dolore. Qui sit dolor velit do laborum voluptate excepteur qui nostrud.\r\n", + "address": "4 Pershing Loop", + "city": "Floriston", + "state": "Iowa", + "zip": 14548, + "country": "Latvia", + "email": "moniquebarron@scentric.com", + "phone": "(944) 573-3509", + "color": "rgb(215,200,175)" + }, + { + "index": 181, + "name": "Langley Kidd", + "first": "Lowe", + "last": "Luna", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "boolean": false, + "guid": "5934f42f-1f3e-41a3-8465-8453fbd97653", + "integer": 87, + "date": "Sat Jul 27 2002 15:35:16 GMT-0700 (PDT)", + "shortText": "ex laborum", + "mediumText": "Proident excepteur duis dolor nostrud aute in aliquip excepteur exercitation laboris fugiat consectetur amet.", + "longText": "Elit ea pariatur aliqua minim enim voluptate est voluptate dolore eiusmod mollit dolor voluptate nisi. Qui et ex fugiat irure velit voluptate. Deserunt sunt enim et dolor dolor occaecat magna est aliquip officia tempor minim et. Ex aliquip duis labore nisi amet deserunt et quis non elit consequat et fugiat.\r\nAd est irure veniam aliqua sint ad. Cillum quis ex tempor ex irure proident duis id pariatur ipsum irure. Id ea ad excepteur enim voluptate consectetur id. Non cupidatat do in tempor aute commodo in magna. Non irure minim Lorem sunt ex nulla cillum.\r\nEx commodo proident tempor incididunt velit velit mollit sint excepteur quis adipisicing nostrud laboris irure. Commodo proident nisi enim ipsum nostrud ullamco elit aliquip velit fugiat eiusmod. Ipsum do qui nostrud amet ullamco et adipisicing aliquip voluptate voluptate laborum. Laborum ex aute tempor esse velit ut.\r\nVeniam esse cillum ut cupidatat reprehenderit minim eu elit minim velit aute consequat tempor tempor. Nisi et aute ea elit veniam sit dolore proident minim. Ut tempor aute dolor aliquip. Do consequat tempor nulla tempor labore duis eu commodo aliquip commodo id fugiat tempor enim.\r\n", + "address": "3 Caton Place", + "city": "Stevens", + "state": "Vermont", + "zip": 87533, + "country": "Netherlands Antilles", + "email": "loweluna@scentric.com", + "phone": "(996) 562-3285", + "color": "rgb(206,231,90)" + }, + { + "index": 182, + "name": "Eunice Pace", + "first": "Margaret", + "last": "Mueller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "boolean": true, + "guid": "3f9b897f-6674-476f-9dd8-31c86f3401c7", + "integer": 98, + "date": "Mon Jan 19 1970 12:04:31 GMT-0800 (PST)", + "shortText": "exercitation eu ipsum ipsum cillum", + "mediumText": "Ullamco ullamco velit sit et elit et excepteur laboris reprehenderit.", + "longText": "Officia cupidatat consectetur tempor amet. Excepteur aute elit do eiusmod aute voluptate quis est voluptate occaecat ut pariatur. Aliqua incididunt cillum proident aute quis deserunt. Voluptate do magna nulla reprehenderit ea eiusmod minim aliquip do est laboris. Velit consequat ut veniam ut cillum dolore tempor nostrud eu. Non Lorem Lorem non nostrud minim commodo minim qui non. Velit aliqua duis occaecat dolor laborum sint est culpa nulla elit occaecat reprehenderit consectetur culpa.\r\nSunt non id labore Lorem do Lorem enim. Adipisicing deserunt excepteur est ipsum nulla deserunt in. Proident tempor dolore sint ullamco proident velit. Nisi Lorem enim ullamco elit culpa occaecat labore officia consequat enim. Eu consectetur ad anim incididunt sit excepteur exercitation cupidatat enim proident irure sunt non cupidatat. Id aute cupidatat irure pariatur laboris nostrud. Est enim commodo quis anim incididunt nostrud proident occaecat anim.\r\n", + "address": "4 Erasmus Street", + "city": "Watrous", + "state": "Nebraska", + "zip": 91145, + "country": "Colombia", + "email": "margaretmueller@scentric.com", + "phone": "(881) 442-3317", + "color": "rgb(248,53,68)" + }, + { + "index": 183, + "name": "Hess Ross", + "first": "Knowles", + "last": "Drake", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "boolean": false, + "guid": "b34d191e-f646-4fd0-8e89-ed523ceb5127", + "integer": 73, + "date": "Tue Jul 11 2006 08:13:58 GMT-0700 (PDT)", + "shortText": "quis reprehenderit amet", + "mediumText": "Id ut laboris aliquip dolor aliqua incididunt cillum dolore qui aliqua. Tempor officia esse aliquip irure cillum ipsum esse ea ea. Aliqua pariatur laboris cillum do ad ea pariatur nostrud amet amet do.", + "longText": "Tempor mollit exercitation sit elit duis magna et veniam nisi ex. Sit amet veniam velit commodo ad proident duis exercitation consequat eiusmod officia pariatur. Tempor occaecat consequat aliquip cupidatat veniam ad qui enim pariatur.\r\nIpsum dolor occaecat in minim sint eu. Non duis anim quis pariatur qui adipisicing sunt laborum sunt cillum exercitation sit. Reprehenderit amet elit labore ad culpa excepteur. Cillum commodo eu dolore dolor ea velit id. Eu Lorem nostrud esse elit aliqua in deserunt elit exercitation sunt sunt aliquip eu amet. Cupidatat incididunt aliquip anim proident magna velit in veniam tempor.\r\nEx non ex irure exercitation sint ad commodo commodo. Exercitation eiusmod qui est labore non velit velit velit voluptate id. Nisi est velit ut do velit quis ipsum voluptate. In consequat esse tempor cillum fugiat ex. Ut est mollit consequat duis esse non magna incididunt eu laboris velit incididunt ullamco. Adipisicing enim sint amet velit do irure. Exercitation labore deserunt pariatur est exercitation veniam laborum ad.\r\n", + "address": "2 Indiana Place", + "city": "Lawrence", + "state": "Florida", + "zip": 64631, + "country": "Wallis and Futuna Islands", + "email": "knowlesdrake@scentric.com", + "phone": "(995) 490-2638", + "color": "rgb(50,148,194)" + }, + { + "index": 184, + "name": "Terri Mayo", + "first": "Rachael", + "last": "Sharp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "boolean": false, + "guid": "c14b363a-8dae-4656-908d-6fe410ad32e5", + "integer": 98, + "date": "Sat Mar 10 1973 06:27:24 GMT-0800 (PST)", + "shortText": "occaecat consequat minim enim aute", + "mediumText": "Officia ex pariatur velit sint officia sunt deserunt nisi. Exercitation sit commodo sit quis dolor esse pariatur.", + "longText": "Eiusmod culpa voluptate eiusmod excepteur pariatur mollit enim irure ad commodo. Irure reprehenderit ea officia eu ullamco occaecat ad exercitation aute reprehenderit est adipisicing adipisicing est. Exercitation pariatur cillum exercitation laborum sint pariatur do mollit ipsum cillum exercitation. Non duis aliquip veniam occaecat fugiat cupidatat Lorem eu.\r\n", + "address": "3 Jamison Lane", + "city": "Hayden", + "state": "New Jersey", + "zip": 21158, + "country": "Bouvet Island", + "email": "rachaelsharp@scentric.com", + "phone": "(920) 458-2923", + "color": "rgb(224,219,109)" + }, + { + "index": 185, + "name": "Lorie Stephenson", + "first": "Vaughan", + "last": "Hardin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "boolean": true, + "guid": "3277febc-0447-4b3c-ac7a-f98c0a22432d", + "integer": 43, + "date": "Sat Mar 30 1974 11:23:57 GMT-0700 (PDT)", + "shortText": "qui pariatur voluptate eiusmod elit", + "mediumText": "Tempor mollit fugiat ex quis excepteur.", + "longText": "Elit eiusmod eu irure nostrud labore enim. Incididunt esse aliquip amet in nulla mollit amet nostrud est mollit. Eiusmod cupidatat et esse ea quis sunt ex. Ut duis fugiat laboris eiusmod excepteur. Occaecat do incididunt mollit officia. Enim ea sunt ad amet labore enim esse nulla occaecat eiusmod.\r\n", + "address": "2 Truxton Street", + "city": "Caroleen", + "state": "Wisconsin", + "zip": 98807, + "country": "Niue", + "email": "vaughanhardin@scentric.com", + "phone": "(954) 576-2820", + "color": "rgb(76,217,135)" + }, + { + "index": 186, + "name": "Jacqueline Estes", + "first": "Gale", + "last": "Hutchinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "boolean": false, + "guid": "07994b68-513f-4c9d-a92d-edfc3ade4825", + "integer": 17, + "date": "Sun Jul 16 2000 16:12:37 GMT-0700 (PDT)", + "shortText": "sunt laboris tempor ut do", + "mediumText": "Nulla consequat dolore enim velit excepteur. Qui ipsum elit occaecat ea in. Laborum irure ipsum consectetur ullamco quis consectetur enim. Dolore laboris nisi excepteur nostrud. Aliqua ipsum nostrud velit labore tempor nisi eu.", + "longText": "Adipisicing ipsum exercitation culpa consectetur voluptate aliqua proident fugiat ut laborum ex deserunt. Et ullamco non sint tempor do officia cillum ex quis enim dolor aliqua. Cupidatat id incididunt irure ad quis commodo ut laborum labore. Dolore cillum reprehenderit adipisicing nulla qui in ea cillum enim excepteur quis sit sint non. Duis reprehenderit consequat eu eiusmod id.\r\nQui velit aliquip fugiat reprehenderit eiusmod mollit ex commodo mollit anim occaecat excepteur duis. Eiusmod nisi et in ex laborum. Nulla officia nulla nostrud ullamco proident ut ipsum excepteur. Occaecat et quis est eu aliqua. Labore enim esse ullamco est laborum nulla incididunt fugiat cillum pariatur sit et. Sunt irure duis laborum id ea Lorem sint.\r\nExercitation anim duis ad minim eiusmod eiusmod dolor mollit enim qui laborum ad aliquip magna. Reprehenderit veniam exercitation minim incididunt excepteur exercitation tempor. Pariatur do esse consequat do. Voluptate do pariatur qui aliqua laboris aute consequat eu reprehenderit dolore. Laborum amet in veniam sit. Adipisicing sint labore officia deserunt nulla do cillum aliquip ipsum minim anim.\r\nDolore sit pariatur dolore proident est minim irure do qui laborum laboris. Sunt quis nisi consequat tempor est ullamco amet sunt dolor. Minim voluptate cupidatat eu pariatur aliquip esse minim voluptate commodo esse. Nulla non minim eu sunt nostrud aliquip. Elit ullamco do sunt mollit labore officia quis proident fugiat amet labore. Culpa elit nisi incididunt ipsum anim non. Cupidatat exercitation laboris pariatur reprehenderit culpa.\r\n", + "address": "3 Columbia Street", + "city": "Clayville", + "state": "Washington", + "zip": 55909, + "country": "Sweden", + "email": "galehutchinson@scentric.com", + "phone": "(853) 433-2272", + "color": "rgb(234,208,240)" + }, + { + "index": 187, + "name": "Linda Steele", + "first": "Weber", + "last": "Barlow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "boolean": false, + "guid": "39847382-b9bd-4f9d-823a-9a8ff0b6a952", + "integer": 57, + "date": "Sun May 24 1992 04:47:58 GMT-0700 (PDT)", + "shortText": "aliqua ut", + "mediumText": "Ea excepteur consequat Lorem aute. Id nisi est ad ipsum enim. Consequat elit do mollit cillum. Ea voluptate tempor laborum sit. Culpa ex officia mollit et in ullamco.", + "longText": "Culpa deserunt velit enim amet excepteur. Labore anim laboris aliquip nisi amet ad. Irure duis cillum exercitation labore do deserunt ullamco nulla ea do mollit. Et ut dolor cillum laboris ex dolor.\r\n", + "address": "2 Bragg Court", + "city": "Rehrersburg", + "state": "Oregon", + "zip": 16492, + "country": "Bolivia", + "email": "weberbarlow@scentric.com", + "phone": "(816) 478-3071", + "color": "rgb(253,113,243)" + }, + { + "index": 188, + "name": "Humphrey Rocha", + "first": "Watson", + "last": "Martin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluehaus/73.jpg", + "boolean": true, + "guid": "bf36a00a-c264-4e8c-b2cf-37b558a6331d", + "integer": 56, + "date": "Wed Feb 18 1981 11:26:50 GMT-0800 (PST)", + "shortText": "ad sint", + "mediumText": "In ea ea aute est aute. Ex fugiat ullamco duis deserunt quis eiusmod non do quis enim officia ea consequat. Lorem cupidatat nisi officia irure veniam consectetur commodo cupidatat et laborum exercitation exercitation veniam proident. Enim minim non velit dolore esse aute ullamco officia cillum ea deserunt magna ut.", + "longText": "Aliqua laborum non officia aute deserunt deserunt voluptate sunt sint do do culpa. Adipisicing anim qui id elit consectetur ad veniam nostrud magna. Culpa dolor culpa irure minim elit occaecat eiusmod.\r\nDo dolore cillum incididunt reprehenderit laboris proident mollit occaecat laborum eu. Tempor aute aliqua aute Lorem velit sunt sint ad ad. Eu minim adipisicing duis nulla nulla et excepteur occaecat. Consectetur aliqua excepteur reprehenderit eu reprehenderit mollit veniam adipisicing ut culpa consectetur enim. Nisi consequat sit fugiat anim ut anim. Culpa et occaecat consectetur reprehenderit. Id sunt mollit labore ipsum eiusmod est adipisicing dolor esse.\r\n", + "address": "3 Main Street", + "city": "Chumuckla", + "state": "Illinois", + "zip": 25127, + "country": "Barbados", + "email": "watsonmartin@scentric.com", + "phone": "(870) 511-2367", + "color": "rgb(180,100,61)" + }, + { + "index": 189, + "name": "Carter Berry", + "first": "Copeland", + "last": "Fernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angeloffonline/73.jpg", + "boolean": true, + "guid": "c95f429b-45ba-4d2e-9fb0-990a65f0f1ed", + "integer": 94, + "date": "Mon Sep 10 1973 19:09:26 GMT-0700 (PDT)", + "shortText": "nostrud elit", + "mediumText": "Sint ullamco ipsum commodo nisi duis exercitation reprehenderit minim id elit ipsum incididunt id minim.", + "longText": "Ea et officia cillum labore consectetur proident fugiat veniam. Adipisicing proident quis nulla duis consectetur culpa deserunt. Aliquip ea non incididunt nisi. Culpa irure adipisicing est aute excepteur sunt laboris minim officia. Minim dolor incididunt deserunt aliqua qui velit laborum. Sint eu sunt ut ea ut cillum tempor excepteur sit voluptate.\r\nLorem nostrud sit dolor dolor consectetur labore anim ad excepteur ipsum eu sunt consequat dolore. Velit irure officia esse mollit voluptate aliquip fugiat enim ipsum minim occaecat. Consectetur tempor irure sint quis irure anim. Nulla esse adipisicing nulla eiusmod dolor eu id dolor ipsum qui nostrud. In excepteur eiusmod ipsum commodo eu labore duis irure adipisicing in deserunt commodo.\r\nExcepteur ullamco ex est occaecat sit Lorem eu. Amet pariatur dolor reprehenderit irure dolor et culpa. Laboris cupidatat est esse veniam qui consectetur eu eu irure. Exercitation eiusmod ipsum ipsum non esse consectetur nostrud enim nostrud eu adipisicing culpa. Lorem aliquip duis tempor proident do aliqua cillum. Esse aliquip fugiat veniam aliquip magna pariatur.\r\n", + "address": "3 Cooke Court", + "city": "Brethren", + "state": "West Virginia", + "zip": 48527, + "country": "Haiti", + "email": "copelandfernandez@scentric.com", + "phone": "(916) 428-2390", + "color": "rgb(225,220,78)" + }, + { + "index": 190, + "name": "Mcgee Price", + "first": "Christian", + "last": "Brown", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/yalozhkin/73.jpg", + "boolean": true, + "guid": "25386af0-7fef-4915-afcb-e29e3996bfc1", + "integer": 99, + "date": "Fri Jun 10 1977 22:37:49 GMT-0700 (PDT)", + "shortText": "velit aliqua qui", + "mediumText": "Proident velit et consequat qui veniam et eiusmod officia sint laborum Lorem sit exercitation. Voluptate dolore qui excepteur eu tempor et irure ea id consectetur. Nostrud ullamco quis nulla laboris labore qui ullamco occaecat veniam. Ut excepteur tempor in non cillum deserunt dolor velit magna excepteur est ullamco. Officia quis adipisicing aliquip Lorem consectetur veniam labore non exercitation.", + "longText": "Anim officia fugiat aliquip deserunt enim culpa commodo. Amet mollit labore tempor adipisicing cupidatat aute sunt incididunt sit duis cupidatat fugiat nisi labore. Eiusmod non sunt commodo laborum ex cillum anim eu mollit. Duis in duis cillum commodo officia qui Lorem duis do exercitation amet occaecat.\r\nNisi culpa magna dolore ut tempor amet commodo. Nisi ut mollit et sint id aliquip Lorem quis ipsum non sunt. Ad adipisicing qui ad nulla cillum id culpa. Occaecat duis magna deserunt dolor adipisicing ex in Lorem dolor occaecat enim laboris cupidatat eiusmod.\r\nDo velit occaecat cupidatat labore ut qui et ipsum pariatur excepteur aliqua sunt ad. Ut eu eu consectetur ut laborum aute culpa. Consequat qui irure ad magna qui exercitation nostrud ex ullamco Lorem consequat. Esse sunt do sunt consectetur tempor.\r\n", + "address": "4 Withers Street", + "city": "Aberdeen", + "state": "Mississippi", + "zip": 14870, + "country": "Heard and McDonald Islands", + "email": "christianbrown@scentric.com", + "phone": "(981) 586-2200", + "color": "rgb(211,68,198)" + }, + { + "index": 191, + "name": "Browning Harrison", + "first": "Wanda", + "last": "Dorsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/solid_color/73.jpg", + "boolean": false, + "guid": "18e2fdcf-33bc-447e-9d9e-95cd992f3b01", + "integer": 99, + "date": "Fri Apr 12 1996 19:22:55 GMT-0700 (PDT)", + "shortText": "nostrud", + "mediumText": "Minim velit ex mollit officia deserunt mollit.", + "longText": "In enim culpa ea quis occaecat Lorem voluptate voluptate. Ad occaecat dolore cillum exercitation laborum. Amet ex labore in sint dolor Lorem eiusmod elit voluptate magna. Dolore quis dolore ullamco velit. Occaecat incididunt ex laboris nulla sit amet sit. Proident nisi elit exercitation sunt incididunt ipsum ex laboris aliquip elit id fugiat id. Sint nulla irure labore mollit reprehenderit irure cupidatat exercitation.\r\nProident aliqua aliquip irure reprehenderit aliquip et nulla in ea do cillum. Anim esse culpa adipisicing do reprehenderit aliquip elit sunt fugiat velit aliqua excepteur. Irure nulla nulla elit esse qui magna qui adipisicing eu consectetur ea. Sint magna labore esse occaecat ad est. Voluptate ex sit anim ipsum consequat est aliquip quis. Quis eu anim officia reprehenderit dolore veniam labore.\r\nEiusmod quis cillum nisi officia. Consequat laborum amet enim deserunt occaecat cillum. Labore cupidatat eu sit officia ea.\r\nCillum mollit occaecat dolor labore dolore sint laborum irure commodo magna id officia. Ullamco minim reprehenderit nulla ea non commodo. Amet eu fugiat officia quis labore pariatur. Duis anim ad eiusmod magna ad voluptate dolore anim anim exercitation reprehenderit cillum labore. Nulla esse nisi ipsum cillum. Nulla incididunt consequat ut elit aute et Lorem ea enim do sint id proident. Voluptate et magna dolor deserunt sint laborum eu.\r\nAliquip laborum labore exercitation culpa duis sunt magna consequat excepteur. Sunt incididunt ad consectetur ullamco sit esse et fugiat mollit irure adipisicing. Ipsum enim enim sunt est. Ipsum officia incididunt dolore aute elit elit fugiat est commodo esse. Sunt minim et cillum excepteur deserunt. In id mollit quis et occaecat cupidatat irure velit dolor reprehenderit in commodo ad velit. Excepteur est et magna elit fugiat amet cupidatat ea anim.\r\n", + "address": "4 Irving Street", + "city": "Winesburg", + "state": "Rhode Island", + "zip": 33983, + "country": "United States", + "email": "wandadorsey@scentric.com", + "phone": "(857) 473-2997", + "color": "rgb(188,149,116)" + }, + { + "index": 192, + "name": "Beth Clark", + "first": "Stuart", + "last": "Potter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/panghal0/73.jpg", + "boolean": false, + "guid": "885c3d9f-8acb-4fa6-82d0-3b1f8066fa8e", + "integer": 90, + "date": "Fri Sep 25 1998 20:49:56 GMT-0700 (PDT)", + "shortText": "ipsum voluptate qui est", + "mediumText": "Elit proident mollit qui reprehenderit labore minim aliquip ut ea dolore aliquip qui. Commodo sint non minim pariatur veniam.", + "longText": "Aliqua deserunt officia pariatur fugiat dolore magna pariatur exercitation elit esse elit. Ad enim consectetur nisi est amet irure aliqua nulla labore consequat cillum. In cupidatat laborum deserunt aliqua veniam mollit veniam nulla ex.\r\nEiusmod sint nostrud duis ad minim magna sit consequat commodo nostrud do laborum mollit id. Consequat exercitation dolore mollit exercitation aute id. Veniam minim laboris Lorem enim aliqua nulla et. Aliquip dolor officia duis cupidatat enim ad velit ad. Fugiat irure Lorem sunt deserunt consectetur id cillum elit. Nulla officia commodo enim labore sit dolore ipsum ad sint nisi consectetur esse.\r\n", + "address": "4 Dewitt Avenue", + "city": "Somerset", + "state": "Georgia", + "zip": 62165, + "country": "Jamaica", + "email": "stuartpotter@scentric.com", + "phone": "(868) 542-3034", + "color": "rgb(93,172,196)" + }, + { + "index": 193, + "name": "Neal Mcgee", + "first": "Daisy", + "last": "Lucas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/renettarenula/73.jpg", + "boolean": true, + "guid": "a86f246d-1555-4d68-b633-713d56a7357a", + "integer": 66, + "date": "Wed Jan 22 1975 14:12:25 GMT-0800 (PST)", + "shortText": "aliquip quis", + "mediumText": "Pariatur nostrud irure dolor ad et. Commodo tempor mollit nisi consequat officia ex exercitation.", + "longText": "Velit deserunt ipsum Lorem id laboris et laborum in. Aute ea consequat elit magna sit ad voluptate nostrud dolor pariatur labore ipsum mollit consectetur. Fugiat velit ipsum et aute elit. Aliqua Lorem ullamco ad mollit ex. Sint cupidatat esse minim exercitation. Laborum ipsum quis ut commodo proident elit et et. Duis excepteur ut sit duis cupidatat mollit mollit.\r\nVeniam pariatur minim duis esse est mollit exercitation esse enim. Esse aliqua labore velit minim qui cillum excepteur qui occaecat excepteur quis Lorem sint. Culpa sint do commodo pariatur reprehenderit et adipisicing. Dolore Lorem minim in pariatur nulla incididunt magna amet qui. Excepteur velit adipisicing cupidatat aliquip cupidatat consectetur adipisicing consequat fugiat eiusmod consectetur consequat. Ea laborum occaecat voluptate do.\r\nCommodo minim adipisicing cupidatat labore velit. Commodo eu officia sunt ea sit exercitation nisi quis fugiat non Lorem duis. Culpa adipisicing mollit aliqua dolore aute mollit veniam non qui occaecat sunt.\r\n", + "address": "3 Cadman Plaza", + "city": "Kula", + "state": "New Mexico", + "zip": 50567, + "country": "Sao Tome and Principe", + "email": "daisylucas@scentric.com", + "phone": "(922) 417-2649", + "color": "rgb(242,147,241)" + }, + { + "index": 194, + "name": "Wall Vasquez", + "first": "Kara", + "last": "Avery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_granger/73.jpg", + "boolean": true, + "guid": "4ca5b46e-7470-4364-8a00-55922d238841", + "integer": 2, + "date": "Sun Oct 27 2002 02:24:06 GMT-0800 (PST)", + "shortText": "consequat ut", + "mediumText": "Culpa id occaecat pariatur eu id adipisicing est non adipisicing nisi et nostrud eu voluptate. Reprehenderit sit adipisicing eiusmod ex excepteur occaecat Lorem consectetur. Mollit exercitation ex adipisicing culpa non ullamco aute aliqua laborum anim deserunt id. Est magna do Lorem Lorem Lorem officia ullamco in eiusmod ut.", + "longText": "Nostrud eu elit voluptate consequat nisi. Dolor qui consequat minim ea sit eiusmod duis aliquip ex. Labore aliquip culpa quis velit id fugiat. Veniam exercitation exercitation aliquip magna eiusmod ad cupidatat sint ullamco consequat pariatur est consequat deserunt. Dolore qui nostrud velit labore magna proident enim in aliquip velit. Mollit ullamco sunt ut do do reprehenderit nostrud do.\r\nConsequat eiusmod adipisicing qui exercitation do minim consequat deserunt non elit sint. Elit dolore ullamco nostrud duis fugiat minim mollit Lorem. Occaecat incididunt officia do tempor dolor velit excepteur laborum. Occaecat cillum aliquip cupidatat anim. Laborum nostrud occaecat irure qui. Id tempor nulla enim irure cillum non culpa non ea enim ad tempor.\r\nQui qui laborum aliquip irure ipsum excepteur do tempor est pariatur nisi. Enim tempor et cupidatat tempor pariatur officia excepteur aliqua. Culpa incididunt laborum ea cupidatat culpa reprehenderit occaecat. Qui do dolor officia aliqua fugiat quis est ex irure. Proident dolor proident dolore proident amet duis labore sunt enim.\r\nSit incididunt deserunt veniam et velit. Eu voluptate esse dolor ullamco nisi sint reprehenderit. Excepteur pariatur est eiusmod eiusmod irure nostrud aliqua aliqua anim. Elit nisi aliqua incididunt tempor dolor commodo eiusmod sit sit ea nostrud eiusmod adipisicing ad. Et occaecat non enim proident nostrud voluptate reprehenderit veniam do exercitation pariatur ut quis. Minim labore ea deserunt deserunt eiusmod anim irure aliquip irure qui sit tempor ad.\r\nSunt sint nulla duis cupidatat. Culpa Lorem eu Lorem eu enim veniam voluptate irure nostrud est ullamco proident non. Aliqua tempor adipisicing proident aliquip cillum do esse laboris. Voluptate eu sint pariatur velit nisi dolore.\r\n", + "address": "2 Clinton Avenue", + "city": "Konterra", + "state": "Arizona", + "zip": 98633, + "country": "Belarus", + "email": "karaavery@scentric.com", + "phone": "(870) 572-3252", + "color": "rgb(192,119,159)" + }, + { + "index": 195, + "name": "Booker Mcgowan", + "first": "Olga", + "last": "Tucker", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maxsmeagol/73.jpg", + "boolean": true, + "guid": "06e837ae-b847-48ce-8b91-832435eb8867", + "integer": 72, + "date": "Sat May 02 2009 00:56:50 GMT-0700 (PDT)", + "shortText": "anim commodo exercitation", + "mediumText": "Elit id enim esse ad Lorem irure laboris in laborum dolore aliquip.", + "longText": "Deserunt eu aute cillum excepteur dolore do do enim fugiat veniam ad. Dolore dolor eu aliquip et. Culpa excepteur aliqua excepteur nisi id eiusmod Lorem eiusmod duis est proident dolor occaecat anim. Aliqua laboris in incididunt sint labore. Incididunt eiusmod quis nostrud occaecat fugiat do cupidatat eu ex reprehenderit nostrud ea proident. Ad reprehenderit consequat laborum eu elit qui occaecat. Quis non magna duis minim amet consequat sunt.\r\nEa consequat do ex qui laboris amet mollit amet nulla. Veniam in sit nisi ad pariatur nulla cillum et ea ad eiusmod. Tempor aliqua eu amet esse dolore nisi pariatur cillum in.\r\nLaborum in ipsum dolor fugiat. Nostrud consectetur nostrud proident aliqua veniam et esse. Occaecat culpa et adipisicing magna ea sint sit fugiat consectetur.\r\nUllamco amet pariatur ipsum duis incididunt laborum ad commodo. Voluptate laborum ea culpa esse nulla dolor reprehenderit duis ut laboris ullamco minim adipisicing aute. Commodo id ad dolor nulla non aliquip eiusmod sint tempor cillum enim.\r\n", + "address": "4 Monroe Place", + "city": "Waterloo", + "state": "Texas", + "zip": 94273, + "country": "Russian Federation", + "email": "olgatucker@scentric.com", + "phone": "(902) 400-3059", + "color": "rgb(136,215,127)" + }, + { + "index": 196, + "name": "Blankenship Henson", + "first": "Staci", + "last": "King", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jvhleb/73.jpg", + "boolean": false, + "guid": "c0bdad68-d176-4514-8d66-d4ae0ae03bdf", + "integer": 41, + "date": "Wed Jan 10 1990 09:56:54 GMT-0800 (PST)", + "shortText": "elit velit exercitation deserunt", + "mediumText": "Labore exercitation excepteur non incididunt. Et reprehenderit anim exercitation ipsum id eu eu irure magna et adipisicing occaecat quis.", + "longText": "Officia nulla cillum duis nostrud labore mollit eiusmod labore ut aliqua elit incididunt. Minim exercitation consequat non eiusmod sint magna voluptate incididunt ex consectetur labore sunt nulla anim. Commodo ipsum aute ipsum mollit veniam reprehenderit reprehenderit irure amet. Nisi voluptate esse consectetur cillum. In eu in duis culpa deserunt ea tempor elit. Nisi tempor fugiat pariatur irure.\r\nQuis ex sunt cupidatat anim aliqua aliquip tempor minim incididunt fugiat officia. Et sunt eiusmod eu culpa incididunt aute culpa. Excepteur Lorem ipsum dolore labore amet occaecat elit fugiat. Eiusmod velit aute occaecat sunt qui ad irure in do id consequat sunt amet cupidatat. Non dolor sunt elit velit excepteur anim deserunt ut occaecat culpa aute aute.\r\n", + "address": "2 Beach Place", + "city": "Slovan", + "state": "District Of Columbia", + "zip": 43413, + "country": "Croatia (Hrvatska)", + "email": "staciking@scentric.com", + "phone": "(964) 422-3068", + "color": "rgb(123,169,84)" + }, + { + "index": 197, + "name": "Essie Hoover", + "first": "Lourdes", + "last": "Mayer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nbirckel/73.jpg", + "boolean": true, + "guid": "d4eca4a8-9d42-4800-9776-b3f2f858b3e5", + "integer": 7, + "date": "Wed Jul 02 1986 21:56:11 GMT-0700 (PDT)", + "shortText": "incididunt nisi minim id officia", + "mediumText": "Ex sint esse labore sit cillum cupidatat cupidatat consequat dolor aliquip elit sunt fugiat quis.", + "longText": "Minim veniam dolor tempor cupidatat nostrud dolore quis sint Lorem duis eiusmod consectetur. Incididunt irure consequat ipsum id cillum culpa qui ad magna nisi. Consequat quis adipisicing dolor consequat reprehenderit incididunt ipsum enim laborum duis. Dolor sit do ex magna do culpa dolor anim incididunt tempor nisi ipsum ex voluptate. Quis exercitation dolore voluptate veniam amet nostrud dolore consequat nulla quis anim amet. Veniam ut do incididunt culpa eiusmod proident in sint nostrud voluptate.\r\nVeniam sint excepteur laboris duis nostrud. Eiusmod commodo mollit est ex incididunt fugiat labore proident. Ea enim commodo non tempor non aliquip culpa non laborum. Anim veniam sit sunt adipisicing adipisicing ea cillum duis incididunt excepteur ut ad non ad. Ex in nulla exercitation laborum Lorem ex deserunt commodo esse dolore nostrud.\r\nOccaecat reprehenderit Lorem culpa tempor dolor et dolore nulla nostrud eiusmod dolor magna voluptate aliquip. Dolore consectetur exercitation proident aliquip cupidatat veniam ea ad anim nostrud enim nulla labore. Incididunt duis deserunt laborum mollit veniam irure est ad enim commodo eiusmod.\r\nCulpa consequat duis deserunt magna laborum magna amet eiusmod. Ut ipsum id aute duis reprehenderit. Nulla nisi sint mollit amet ex esse laborum nulla ullamco cupidatat nostrud. Enim consequat aute tempor veniam adipisicing aliqua laborum irure duis mollit Lorem eu ipsum quis. Dolor culpa est et reprehenderit occaecat. Amet ex ad do mollit sint mollit non culpa nisi laborum qui aliquip sit. Laborum officia ullamco pariatur non sit esse est sint duis reprehenderit laborum aute qui.\r\nLabore dolor occaecat anim deserunt anim duis Lorem incididunt anim amet amet ut eu dolore. Consequat commodo laborum ipsum id magna non occaecat adipisicing et non. Deserunt cupidatat culpa in reprehenderit mollit aliqua aute amet.\r\n", + "address": "2 Merit Court", + "city": "Curtice", + "state": "Virgin Islands", + "zip": 27446, + "country": "Indonesia", + "email": "lourdesmayer@scentric.com", + "phone": "(844) 447-3638", + "color": "rgb(56,235,218)" + }, + { + "index": 198, + "name": "Bridget Wilcox", + "first": "Danielle", + "last": "Delacruz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/irida168/73.jpg", + "boolean": false, + "guid": "4072c5a4-5842-4c17-85c4-d9c472e32f5d", + "integer": 1, + "date": "Thu Mar 18 1993 10:26:24 GMT-0800 (PST)", + "shortText": "quis", + "mediumText": "Lorem in aliquip ullamco labore consequat elit nisi ex tempor. Enim exercitation cupidatat in laborum nulla.", + "longText": "Veniam ea qui pariatur laborum minim. Duis tempor commodo ad qui tempor est. Do enim incididunt Lorem elit proident ex nulla elit exercitation voluptate ex laborum ullamco deserunt. Ad voluptate mollit dolore sint exercitation anim laborum voluptate Lorem deserunt. Anim ullamco minim commodo non consequat est qui nostrud ullamco laboris mollit. Ipsum laborum anim ex labore laboris cillum cupidatat elit ex enim quis.\r\nAliquip anim ea fugiat aute nostrud occaecat culpa magna ut nisi ea tempor ex. Quis dolore aute cupidatat officia esse anim occaecat. Anim occaecat incididunt sit ea enim mollit consectetur aute anim. Voluptate sint et occaecat adipisicing eiusmod excepteur aliquip eu. Cillum enim et aliquip non cupidatat eu consequat voluptate culpa veniam esse. Commodo officia enim excepteur id cupidatat.\r\nSunt reprehenderit id voluptate deserunt irure veniam fugiat elit ipsum exercitation excepteur ut. Elit ut eu in Lorem reprehenderit reprehenderit aliqua duis dolor. Velit voluptate aute magna voluptate id do mollit enim nisi consequat veniam elit cupidatat et.\r\nEt sint adipisicing officia ipsum commodo do ea sunt anim. Laborum ullamco elit aute occaecat adipisicing exercitation labore nulla ipsum. Cupidatat sit eiusmod aliqua esse eu ullamco in. Laborum eiusmod excepteur ad magna exercitation occaecat amet ad sint ullamco aliquip excepteur. Nisi sit consequat laboris nulla consequat dolore fugiat. Lorem cupidatat adipisicing do esse nisi fugiat eu culpa fugiat ullamco quis elit in.\r\nMagna in cupidatat duis dolor quis cillum occaecat. Pariatur minim ipsum irure qui officia veniam incididunt adipisicing consectetur Lorem. Ex esse cillum ut sint minim. Esse ex excepteur id do culpa laboris nisi nisi non. Exercitation minim consectetur dolor aliqua culpa commodo dolor. Ut tempor sint mollit Lorem incididunt laborum laboris sit cupidatat ex esse. Enim amet sunt sit anim veniam fugiat ea mollit.\r\n", + "address": "4 Leonora Court", + "city": "Bradenville", + "state": "Puerto Rico", + "zip": 59719, + "country": "Nauru", + "email": "danielledelacruz@scentric.com", + "phone": "(952) 548-3787", + "color": "rgb(168,148,116)" + }, + { + "index": 199, + "name": "Mccarthy Fletcher", + "first": "Janis", + "last": "Fischer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_py/73.jpg", + "boolean": true, + "guid": "010c3410-51e3-409d-ae76-1ef43f546c53", + "integer": 21, + "date": "Thu Feb 27 2014 18:02:21 GMT-0800 (PST)", + "shortText": "non ullamco exercitation voluptate", + "mediumText": "Ea velit ullamco ullamco excepteur culpa est in nisi cillum amet deserunt quis laborum. Tempor in duis cupidatat proident.", + "longText": "Labore reprehenderit deserunt sint reprehenderit officia et culpa sunt exercitation velit ipsum cupidatat veniam. Cupidatat ut elit cillum cupidatat qui sit tempor veniam consequat labore dolor minim. Ad duis laboris ad voluptate ea non velit elit excepteur sint elit consectetur non. Velit tempor officia quis cillum duis et culpa voluptate ipsum.\r\nMinim labore nostrud deserunt ipsum est qui aliqua Lorem ullamco non nostrud. Reprehenderit cillum consectetur ex aute est dolor laboris minim aliqua aliqua elit aliqua. Sint pariatur nostrud enim qui do exercitation occaecat mollit anim mollit.\r\nUllamco ea adipisicing duis est consectetur enim. Cillum esse et enim duis qui quis est elit. Occaecat sunt cupidatat voluptate consectetur anim ut non deserunt veniam ullamco laboris cupidatat incididunt pariatur. Id consequat nisi non aliquip voluptate esse. Cupidatat fugiat anim anim id quis aliquip sint nisi fugiat sit. Ipsum voluptate do officia quis culpa nulla et.\r\nEt commodo ea irure aliquip consectetur dolore. Eu nostrud non ad tempor commodo. Est tempor aliquip nisi mollit tempor excepteur. Enim consectetur cillum laborum do anim labore deserunt culpa exercitation commodo dolore commodo dolore nulla. Laboris ex officia officia incididunt fugiat reprehenderit officia proident laborum qui consectetur eiusmod et. Aute adipisicing eiusmod do cupidatat id commodo. Deserunt nostrud officia nulla exercitation nostrud occaecat tempor mollit duis.\r\n", + "address": "2 Colin Place", + "city": "Greensburg", + "state": "Maryland", + "zip": 26126, + "country": "Ireland", + "email": "janisfischer@scentric.com", + "phone": "(860) 405-3588", + "color": "rgb(113,69,223)" + }, + { + "index": 200, + "name": "Judy Whitley", + "first": "Webster", + "last": "Doyle", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ratbus/73.jpg", + "boolean": false, + "guid": "f4ccb739-8e28-42fd-b1a0-4051b77a60b3", + "integer": 57, + "date": "Tue Jan 29 2002 02:38:20 GMT-0800 (PST)", + "shortText": "cillum", + "mediumText": "Eiusmod nisi excepteur labore Lorem incididunt laborum cillum sit nisi id id sint minim. Proident reprehenderit excepteur cupidatat culpa dolor labore. Irure labore aute amet nostrud ad voluptate non.", + "longText": "Eiusmod do tempor aliquip adipisicing nisi sit amet sunt amet commodo aute pariatur occaecat. Labore incididunt qui incididunt duis non dolore eu voluptate. Veniam minim esse ipsum non do. Laboris non culpa adipisicing do dolore pariatur eiusmod aute incididunt mollit Lorem labore ad ad.\r\nEt fugiat ad deserunt exercitation pariatur. Elit eiusmod ut pariatur ut adipisicing officia proident Lorem nisi id dolore sit tempor occaecat. Et minim fugiat incididunt ad ullamco Lorem.\r\nElit ea cupidatat elit adipisicing magna ex culpa aliqua enim. Enim deserunt eiusmod dolore incididunt ex veniam dolor ipsum pariatur. Ipsum elit tempor eiusmod occaecat qui fugiat quis elit non nisi anim. Fugiat ut sit cillum ad dolore duis qui. Deserunt amet et sunt nulla duis nisi ea. In elit consectetur exercitation cupidatat sit nostrud reprehenderit adipisicing aliquip.\r\n", + "address": "3 Gerry Street", + "city": "Lookingglass", + "state": "Massachusetts", + "zip": 73514, + "country": "Luxembourg", + "email": "websterdoyle@scentric.com", + "phone": "(891) 436-2016", + "color": "rgb(129,172,59)" + }, + { + "index": 201, + "name": "Ware Harding", + "first": "Phyllis", + "last": "Holcomb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sprayaga/73.jpg", + "boolean": true, + "guid": "87934fda-9cd1-4e95-9faa-53102d8ce1f2", + "integer": 3, + "date": "Fri May 19 1972 15:51:24 GMT-0700 (PDT)", + "shortText": "deserunt laboris excepteur pariatur nostrud", + "mediumText": "Tempor Lorem occaecat magna aute aliqua eu qui commodo.", + "longText": "Laboris deserunt anim excepteur magna et. Eu ullamco laborum enim id ut excepteur nulla est quis deserunt exercitation veniam irure. Sint officia anim cupidatat nostrud culpa aute ut. Amet id elit incididunt do excepteur. Qui aute voluptate tempor non ad fugiat commodo voluptate culpa eiusmod sit enim dolor. Minim est proident anim consequat adipisicing ea reprehenderit magna labore fugiat ea anim. Velit aute incididunt aute commodo aliquip veniam do fugiat ut anim.\r\nNulla aliquip aliqua est cupidatat ex laboris id velit ullamco labore qui. Commodo labore mollit esse laboris deserunt duis. Sunt velit ex excepteur cillum officia sint ad id commodo. Irure amet est laboris officia occaecat anim id ut irure sunt aute. Deserunt quis deserunt et ad mollit nulla. Velit eu Lorem deserunt ipsum sit aute amet exercitation aliquip nulla. Nulla sunt commodo adipisicing minim reprehenderit consequat minim elit qui do Lorem sit.\r\nIn et mollit minim proident eu qui anim magna Lorem consequat minim duis. Esse culpa eu commodo sit. Nostrud laborum magna id elit proident. Laboris commodo ipsum culpa laboris esse non enim id id mollit elit. Pariatur id in sunt et est tempor duis eu Lorem dolor tempor non veniam non. Ipsum officia aliquip anim id. Ex culpa aute et et consequat in qui.\r\nDeserunt nisi elit aliquip dolor culpa dolore mollit ullamco in cupidatat aliqua. Fugiat minim veniam labore ad minim in aliquip labore nulla quis pariatur. Est nisi pariatur duis culpa cupidatat labore in. Nisi tempor Lorem ea in laboris adipisicing do nisi consectetur laboris sunt culpa.\r\nDolore dolore veniam irure aute elit fugiat magna in. Irure enim fugiat ad ad aliqua exercitation proident duis officia dolor minim consequat reprehenderit. Occaecat ullamco esse cillum deserunt velit adipisicing laboris proident occaecat commodo occaecat tempor fugiat. Sint voluptate sunt anim sint do amet sint eiusmod ea enim Lorem. Aliqua consequat commodo sunt amet fugiat excepteur dolor dolor aliquip nostrud culpa. Fugiat elit adipisicing sit minim fugiat exercitation commodo anim duis. Ex voluptate excepteur occaecat nulla nostrud elit minim laborum fugiat.\r\n", + "address": "2 Brigham Street", + "city": "Chalfant", + "state": "Oklahoma", + "zip": 57590, + "country": "Afghanistan", + "email": "phyllisholcomb@scentric.com", + "phone": "(874) 534-3124", + "color": "rgb(210,230,76)" + }, + { + "index": 202, + "name": "Blanche Sears", + "first": "Peck", + "last": "Dean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hai_ninh_nguyen/73.jpg", + "boolean": true, + "guid": "b362bf52-df9f-45bb-a64c-4f699bfd2cdb", + "integer": 64, + "date": "Thu May 23 2013 08:13:12 GMT-0700 (PDT)", + "shortText": "nisi tempor", + "mediumText": "Culpa id pariatur velit ut non adipisicing reprehenderit minim est pariatur excepteur nisi qui consectetur.", + "longText": "Voluptate minim deserunt reprehenderit anim ullamco. Consectetur laborum dolor ullamco laboris sunt elit nisi commodo esse sit. Voluptate dolor labore minim consectetur.\r\nQuis magna dolore incididunt deserunt qui dolor aute est culpa voluptate esse. Cillum quis exercitation dolore quis enim aliquip dolore dolor est adipisicing pariatur dolore deserunt. Consectetur sunt proident pariatur aute cupidatat voluptate fugiat pariatur sint.\r\nPariatur eiusmod consequat velit mollit ut reprehenderit irure. Voluptate nisi reprehenderit nisi adipisicing consectetur consequat in culpa laboris veniam laborum velit. Incididunt laboris cupidatat commodo sit commodo esse. Adipisicing proident cupidatat pariatur aute.\r\nEsse reprehenderit do id non occaecat dolore laborum dolore nostrud reprehenderit culpa voluptate voluptate nostrud. Laboris nostrud officia id consequat ullamco. Nisi est sunt ipsum excepteur nostrud dolore irure quis quis labore esse laboris. Adipisicing velit dolore ullamco voluptate reprehenderit ad duis reprehenderit. Commodo do laboris elit eu in nisi deserunt sint ipsum in duis sint excepteur. Culpa est est Lorem sint labore. Et qui ad anim ad.\r\nDo adipisicing amet cupidatat dolor dolore culpa incididunt culpa ad qui consequat ea reprehenderit proident. Irure qui ad adipisicing veniam irure nostrud esse id. Culpa do proident ex id eu Lorem veniam. Veniam commodo sit exercitation deserunt minim sint enim occaecat amet eu irure voluptate culpa eu. Deserunt ad laborum fugiat ex eu incididunt dolore adipisicing. Labore commodo aliquip deserunt aute eiusmod nisi. Est commodo duis excepteur nulla sunt laboris.\r\n", + "address": "4 Garden Place", + "city": "Ironton", + "state": "Ohio", + "zip": 89350, + "country": "St. Pierre and Miquelon", + "email": "peckdean@scentric.com", + "phone": "(994) 522-3068", + "color": "rgb(199,252,214)" + }, + { + "index": 203, + "name": "Conway Kelley", + "first": "Virginia", + "last": "Pollard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gaborenton/73.jpg", + "boolean": false, + "guid": "afd59da0-9b9b-4b60-9da3-0ef8fc1e6349", + "integer": 14, + "date": "Sun Jul 17 1988 07:37:09 GMT-0700 (PDT)", + "shortText": "Lorem pariatur velit duis tempor", + "mediumText": "Incididunt dolore sint proident irure. Cillum minim veniam dolor ipsum ut cupidatat non proident tempor deserunt. Incididunt exercitation ut proident dolor do adipisicing sit Lorem aliqua enim nulla nostrud. Consectetur duis veniam elit laboris eiusmod ullamco labore exercitation fugiat sint reprehenderit eu nostrud dolor. Occaecat id laboris est tempor deserunt anim in fugiat proident enim cupidatat elit officia fugiat.", + "longText": "Veniam enim ad adipisicing cupidatat velit cillum anim et exercitation esse aliquip sit sunt. Irure mollit est sint minim consectetur labore sunt. Deserunt veniam sunt ut sunt tempor minim ipsum Lorem cupidatat laborum. Proident ipsum veniam quis nisi in consectetur sint labore laboris quis adipisicing velit. Dolore laboris exercitation quis sit. Laboris voluptate non consectetur incididunt laborum veniam pariatur exercitation sint.\r\nSint aute mollit eiusmod ea id cupidatat ad in sunt Lorem proident eiusmod ad. Proident ex occaecat pariatur excepteur labore consectetur laboris. Ut pariatur in adipisicing sit ipsum minim. Ut est elit eiusmod fugiat deserunt mollit fugiat incididunt laboris. Aute officia amet cupidatat in.\r\nVelit id enim ut ea veniam laborum eu duis adipisicing fugiat amet ullamco irure. Dolor et ad culpa esse in. Ea pariatur adipisicing minim sunt consequat sunt minim anim aute qui quis.\r\n", + "address": "3 Monaco Place", + "city": "Lopezo", + "state": "Nevada", + "zip": 45051, + "country": "Montserrat", + "email": "virginiapollard@scentric.com", + "phone": "(911) 563-3668", + "color": "rgb(120,253,100)" + }, + { + "index": 204, + "name": "Little Griffin", + "first": "Murray", + "last": "David", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/uralozden/73.jpg", + "boolean": false, + "guid": "9028904c-ab1e-4968-b7c4-20453df8469b", + "integer": 84, + "date": "Sun Dec 20 1987 15:41:10 GMT-0800 (PST)", + "shortText": "adipisicing ea pariatur enim", + "mediumText": "Commodo nostrud et irure amet pariatur proident eiusmod. Proident mollit eu fugiat irure voluptate proident laboris cillum proident voluptate.", + "longText": "Nisi et consectetur aute in tempor. Occaecat ad sint incididunt ullamco reprehenderit dolore. Nisi adipisicing in velit sint aliquip. Deserunt ut pariatur aute et voluptate fugiat id esse do sunt deserunt aute in. Excepteur adipisicing excepteur irure tempor sit culpa culpa mollit. Fugiat est culpa nostrud pariatur labore et in esse ullamco cillum et amet consequat cillum. Sint laboris cillum ea labore occaecat sunt enim.\r\n", + "address": "2 Gallatin Place", + "city": "Topaz", + "state": "Montana", + "zip": 18846, + "country": "Norway", + "email": "murraydavid@scentric.com", + "phone": "(994) 477-3415", + "color": "rgb(185,246,198)" + }, + { + "index": 205, + "name": "Goff Benton", + "first": "Mclean", + "last": "Pennington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/attacks/73.jpg", + "boolean": false, + "guid": "70d6883d-2c03-4256-b2b8-d09f035e6d58", + "integer": 51, + "date": "Sun Feb 25 1979 17:08:08 GMT-0800 (PST)", + "shortText": "ipsum aute Lorem", + "mediumText": "Qui est officia sit nulla sunt reprehenderit incididunt aute.", + "longText": "Lorem eu proident exercitation do veniam. Sunt reprehenderit officia cupidatat est do ipsum sunt elit anim quis reprehenderit laborum quis non. Et aliqua excepteur culpa qui enim nulla id qui eiusmod dolor Lorem non mollit consectetur.\r\nLorem amet velit esse magna Lorem voluptate nostrud labore. Dolor Lorem cupidatat mollit laboris deserunt quis occaecat excepteur pariatur deserunt minim consectetur sint. Ad quis veniam dolore quis nostrud laboris ex anim quis eu nisi tempor. Consectetur voluptate id officia culpa anim enim eiusmod in amet amet. Velit anim deserunt officia eiusmod qui incididunt minim consequat ut sunt mollit. Ex enim aliquip enim quis enim irure sunt mollit laborum nisi.\r\nMagna sit ea deserunt excepteur aliqua esse nulla deserunt exercitation officia nulla id tempor cillum. Occaecat nulla sit tempor aute fugiat commodo. Laboris fugiat enim exercitation voluptate quis consequat consectetur aliquip fugiat voluptate ut occaecat reprehenderit irure. Esse sit laboris quis commodo ea in velit ad labore veniam. Aliquip dolor laborum commodo ad elit aliqua velit qui.\r\nElit exercitation culpa officia adipisicing amet in dolor eiusmod. Nostrud proident exercitation aliquip labore ad cupidatat velit incididunt. Officia ex veniam cillum deserunt id dolore excepteur pariatur mollit nulla laboris veniam veniam eu. Labore duis est ex reprehenderit fugiat commodo ut aute officia culpa irure amet id.\r\n", + "address": "4 Story Court", + "city": "Snowville", + "state": "California", + "zip": 33234, + "country": "Guam", + "email": "mcleanpennington@scentric.com", + "phone": "(882) 499-2242", + "color": "rgb(107,133,242)" + }, + { + "index": 206, + "name": "Hale Wilkinson", + "first": "Franks", + "last": "Howard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mymyboy/73.jpg", + "boolean": false, + "guid": "974617cc-7395-4b74-aa1b-f5ea163bbb48", + "integer": 40, + "date": "Mon Jul 17 1972 11:03:48 GMT-0700 (PDT)", + "shortText": "dolor nulla culpa id", + "mediumText": "Veniam ipsum sit ea velit et magna exercitation exercitation occaecat voluptate aliqua. Deserunt nisi qui dolor mollit in anim labore. Dolore id quis occaecat aliqua pariatur cillum enim aliquip pariatur voluptate magna. Excepteur magna officia excepteur voluptate excepteur laboris.", + "longText": "Sit elit quis laborum do magna culpa Lorem magna incididunt. Consectetur non do non ea fugiat Lorem sint fugiat deserunt magna id ut aliquip. In Lorem ut voluptate magna consectetur exercitation cupidatat elit anim excepteur ipsum tempor amet. Velit commodo magna incididunt pariatur fugiat adipisicing cillum fugiat incididunt in sint velit ipsum. Sint non eiusmod quis minim anim. Irure reprehenderit adipisicing non nulla Lorem officia excepteur voluptate esse.\r\nOfficia dolore do aute culpa enim et quis laboris occaecat elit eiusmod mollit. Est non irure amet ad pariatur exercitation pariatur ad ex quis. Sunt ea minim id exercitation laborum dolore nulla et incididunt do. Aliqua amet Lorem eiusmod pariatur ipsum amet reprehenderit elit sit. Eu quis cillum voluptate magna ullamco.\r\nEa proident sit laborum commodo fugiat in elit amet. Non esse do exercitation culpa consectetur non magna voluptate velit ea culpa anim nulla. Eiusmod labore Lorem aute occaecat nulla fugiat.\r\nEst excepteur laborum ut amet Lorem ad veniam elit reprehenderit. Officia laboris id et consectetur sunt adipisicing nulla nostrud esse Lorem. Duis laboris veniam amet deserunt in deserunt laborum sit pariatur cillum nostrud.\r\n", + "address": "2 Hoyt Street", + "city": "Wolcott", + "state": "Marshall Islands", + "zip": 13071, + "country": "Gibraltar", + "email": "frankshoward@scentric.com", + "phone": "(893) 417-2654", + "color": "rgb(186,174,80)" + }, + { + "index": 207, + "name": "Betty Huff", + "first": "Mona", + "last": "Fulton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tristanlegros/73.jpg", + "boolean": false, + "guid": "c11ff2c4-c704-4729-88f9-b9932549a64a", + "integer": 26, + "date": "Thu Nov 04 1976 19:21:20 GMT-0800 (PST)", + "shortText": "sit nulla", + "mediumText": "Adipisicing minim nostrud magna amet tempor sunt duis officia cupidatat do incididunt dolore consectetur elit. Duis proident deserunt proident eu elit aliquip sint. Qui officia commodo voluptate deserunt amet ipsum magna dolore. Dolore labore eiusmod fugiat ad.", + "longText": "Aliquip in consequat nulla Lorem velit in cupidatat ut ut. Minim dolore cillum ut esse dolore ex. Eu occaecat officia tempor Lorem duis mollit magna Lorem eu deserunt aute et nisi reprehenderit. Eu magna qui enim officia nostrud proident officia sint elit ipsum quis duis velit Lorem.\r\n", + "address": "4 Ocean Avenue", + "city": "Finderne", + "state": "Indiana", + "zip": 46746, + "country": "Hungary", + "email": "monafulton@scentric.com", + "phone": "(946) 414-3557", + "color": "rgb(128,193,66)" + }, + { + "index": 208, + "name": "Emily Davis", + "first": "Sharon", + "last": "Green", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/allfordesign/73.jpg", + "boolean": true, + "guid": "e94e16a5-2c94-4436-8610-86a6f5f66355", + "integer": 99, + "date": "Mon Sep 28 2009 14:40:31 GMT-0700 (PDT)", + "shortText": "cillum dolor ex cupidatat deserunt", + "mediumText": "Cupidatat nulla anim reprehenderit laboris aute magna aliquip ea in sit. Reprehenderit reprehenderit amet id et ad ea. Deserunt veniam cillum dolor ullamco Lorem non cillum amet.", + "longText": "Quis voluptate ex cillum incididunt incididunt nisi. Dolor aliqua culpa dolor cillum eiusmod cillum tempor cillum. Est laboris esse exercitation nulla nisi anim et do cupidatat fugiat pariatur. Laborum duis eu fugiat anim duis.\r\nVeniam reprehenderit cupidatat ullamco Lorem ex officia mollit aliqua. Exercitation exercitation cillum irure officia deserunt velit laboris est irure irure minim veniam aliquip laborum. Ipsum ipsum sit ipsum ex veniam voluptate. Adipisicing do ex occaecat do. Laboris reprehenderit ad velit deserunt. Sint consectetur minim eiusmod excepteur eu cupidatat non mollit aliquip ad eu cupidatat.\r\nFugiat mollit ut ullamco veniam sint proident occaecat ad. Est exercitation laborum nisi laboris anim laborum magna. Labore ut adipisicing consectetur velit voluptate fugiat laborum adipisicing veniam reprehenderit. Adipisicing aliquip consectetur id occaecat labore exercitation ullamco.\r\nVoluptate reprehenderit occaecat eiusmod pariatur ipsum est eu. Id dolor laborum elit commodo duis et Lorem laboris. Sit officia do elit amet adipisicing. Exercitation commodo est do eu. In amet ad reprehenderit commodo.\r\nMinim nisi nostrud Lorem nostrud ea incididunt est in labore amet elit officia. Quis nostrud fugiat consequat culpa. Nisi ullamco irure sunt esse elit sunt nisi enim ullamco cupidatat dolore adipisicing. Ullamco sint laboris ullamco id magna qui et eiusmod laborum do enim minim amet aute. Ad fugiat elit velit amet officia nisi aliquip qui. Ut quis amet tempor ea ex id quis Lorem. Amet tempor incididunt esse sunt dolore non veniam esse nisi sint labore ut in.\r\n", + "address": "3 Colonial Court", + "city": "Trona", + "state": "Tennessee", + "zip": 67912, + "country": "Kenya", + "email": "sharongreen@scentric.com", + "phone": "(832) 403-3692", + "color": "rgb(208,118,108)" + }, + { + "index": 209, + "name": "Shelly Payne", + "first": "Doyle", + "last": "Vazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/serk002/73.jpg", + "boolean": true, + "guid": "1fbca6f1-d8c8-48ca-94be-6bfb87526c7d", + "integer": 58, + "date": "Sat May 15 1993 07:23:07 GMT-0700 (PDT)", + "shortText": "do amet aliqua duis ea", + "mediumText": "Minim adipisicing sint aliquip in do mollit labore occaecat in. Est commodo et deserunt aute. Ut consectetur exercitation et voluptate qui quis ex.", + "longText": "Ea consequat exercitation incididunt non veniam occaecat amet occaecat occaecat ex ex ullamco incididunt. Enim consequat nisi sit pariatur aliqua elit ipsum elit aliqua incididunt et. Cupidatat occaecat velit nostrud id consequat cupidatat. Nulla anim ipsum enim ad incididunt nostrud nulla et esse incididunt elit. Culpa commodo ad non sint anim. Ad deserunt aute eiusmod officia fugiat proident minim nostrud commodo voluptate velit mollit duis.\r\nEiusmod veniam adipisicing exercitation proident do voluptate ut culpa consequat Lorem. Deserunt ea voluptate anim quis duis deserunt mollit minim sit minim reprehenderit amet. Nisi labore dolore reprehenderit minim laborum fugiat Lorem incididunt sint. Enim aliquip voluptate ea nulla consectetur sit reprehenderit sunt in officia aute id. Pariatur sint sint eiusmod ea do est sint.\r\n", + "address": "3 Auburn Place", + "city": "Blairstown", + "state": "Palau", + "zip": 22120, + "country": "Honduras", + "email": "doylevazquez@scentric.com", + "phone": "(946) 513-2799", + "color": "rgb(255,190,226)" + }, + { + "index": 210, + "name": "Angela Mcmahon", + "first": "Rosalyn", + "last": "Bridges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/keremk/73.jpg", + "boolean": true, + "guid": "92811c3f-0e5f-4f04-9543-6d026e4b26c4", + "integer": 16, + "date": "Fri Jan 16 1998 10:02:55 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Lorem cupidatat dolor voluptate magna excepteur eiusmod est in.", + "longText": "Aliqua culpa aliqua aute labore nulla do pariatur consectetur sit sunt quis reprehenderit duis cupidatat. Pariatur eu voluptate cupidatat reprehenderit sit mollit proident ullamco proident ipsum nulla. Nulla qui ullamco sint eiusmod dolore. Minim esse et sit cupidatat dolore esse. Dolor reprehenderit aliquip magna commodo irure nulla culpa ipsum enim incididunt. Cillum velit minim incididunt qui velit nulla.\r\nConsectetur amet ex elit eu commodo sint enim. Proident et labore ipsum consequat pariatur irure. Fugiat non occaecat ipsum ullamco commodo. Nisi exercitation cupidatat nisi pariatur non culpa. Non do deserunt labore non amet excepteur ea sint. Pariatur quis ullamco laboris fugiat proident est irure magna commodo occaecat officia qui.\r\nPariatur et commodo officia ullamco do qui est nisi in. Laborum sint do minim aute aute dolore est consequat officia id. Nostrud velit ex ut eu dolore occaecat magna minim. Culpa amet sunt duis aliquip Lorem voluptate. Commodo occaecat reprehenderit nostrud magna ex proident incididunt est ut ad do.\r\n", + "address": "4 Fane Court", + "city": "Elrama", + "state": "Virginia", + "zip": 45107, + "country": "Eritrea", + "email": "rosalynbridges@scentric.com", + "phone": "(813) 440-3063", + "color": "rgb(184,249,205)" + }, + { + "index": 211, + "name": "Maryellen Ramos", + "first": "Rogers", + "last": "Silva", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/surjithctly/73.jpg", + "boolean": true, + "guid": "a833fdf1-9865-4e5c-91f8-8d1aaa2d2fba", + "integer": 75, + "date": "Sun Oct 24 2004 10:12:53 GMT-0700 (PDT)", + "shortText": "nisi duis", + "mediumText": "Magna elit fugiat occaecat incididunt elit tempor exercitation occaecat fugiat eiusmod incididunt dolore. Ad quis ea commodo reprehenderit sint sit esse quis quis. Minim esse anim aute eiusmod fugiat.", + "longText": "Voluptate id ullamco do aliqua ad deserunt commodo ex. Et aute excepteur elit adipisicing. Labore consequat consequat consequat qui aute non et ad deserunt. Ex adipisicing sunt sunt mollit do nulla eiusmod esse aute dolor. Elit veniam culpa labore proident cillum duis minim id sint sint eiusmod. Est deserunt in ut laboris fugiat ut sint consequat. Ullamco ex incididunt reprehenderit adipisicing occaecat.\r\nNisi officia excepteur enim aliquip aliqua occaecat aliqua mollit velit reprehenderit amet id cillum. Nulla fugiat ad id in velit consectetur sint id commodo pariatur velit reprehenderit est nisi. Reprehenderit exercitation voluptate ea cillum ea ut nisi deserunt laborum eiusmod ea. Voluptate velit consectetur aliquip aliquip Lorem consectetur dolore in qui laboris voluptate labore duis. In enim eiusmod minim minim non ea labore excepteur tempor officia ullamco.\r\nUt pariatur tempor aliquip eu quis cupidatat esse ad. Sint occaecat mollit eu consectetur dolore nostrud incididunt nostrud enim quis dolor elit adipisicing excepteur. Pariatur cupidatat consequat cillum deserunt sit eu in et veniam aliqua. Proident nostrud nostrud incididunt tempor ad nisi amet. Cupidatat ad ea mollit cupidatat est dolor eu laboris ex velit duis amet consectetur velit.\r\nCillum occaecat ex voluptate cupidatat est cillum qui. Et do incididunt nulla veniam sint eu consectetur et non minim officia excepteur velit. Anim labore mollit cillum sit nisi ex sunt mollit culpa enim ipsum sit laboris in. Quis ullamco et ullamco consequat mollit ex commodo laboris voluptate. Magna qui aute aliqua sit adipisicing id. Veniam mollit proident eu occaecat veniam sint sint laboris sit laborum.\r\n", + "address": "3 Brightwater Court", + "city": "Brandermill", + "state": "Wyoming", + "zip": 20996, + "country": "Tajikistan", + "email": "rogerssilva@scentric.com", + "phone": "(944) 540-3499", + "color": "rgb(88,243,243)" + }, + { + "index": 212, + "name": "Alvarado Abbott", + "first": "Jordan", + "last": "Hyde", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dimitris_d_/73.jpg", + "boolean": false, + "guid": "9b8ecabd-ca6e-4ee1-bd6a-08635f7312a6", + "integer": 97, + "date": "Fri Oct 21 1983 23:56:38 GMT-0700 (PDT)", + "shortText": "elit exercitation pariatur aliqua duis", + "mediumText": "Cupidatat consequat esse duis ex consequat consequat.", + "longText": "Anim aute nisi non adipisicing dolor incididunt non est esse culpa. Proident eiusmod et voluptate sint. Anim ex incididunt do ipsum dolor Lorem Lorem ut. Quis eiusmod esse anim aliqua ullamco. Non in ad qui excepteur minim adipisicing Lorem tempor elit. Nostrud cillum incididunt labore magna duis consectetur irure ut consectetur. Veniam eu officia qui sint pariatur culpa.\r\nSunt ea amet tempor minim labore consequat duis qui. Aliqua non nisi sint incididunt et veniam minim Lorem. Id fugiat consequat in labore velit proident est incididunt nisi non Lorem. Exercitation ipsum duis labore sunt officia proident labore labore ad. Sunt enim culpa adipisicing aute cillum. Officia in adipisicing tempor minim eiusmod dolor. Ea sunt ut elit cillum laboris nisi ipsum reprehenderit labore laborum culpa in.\r\nFugiat est eiusmod amet incididunt minim adipisicing voluptate. Ex eiusmod consequat consectetur occaecat laborum culpa in cupidatat voluptate ipsum reprehenderit elit consequat. Ut fugiat commodo qui aute consequat. Nostrud dolor duis magna minim do.\r\nId non fugiat pariatur pariatur Lorem nostrud irure. Tempor laboris voluptate velit magna. Ut ea ea sunt mollit aliqua. Ullamco dolore nostrud ex non non non culpa Lorem ullamco do do dolore quis. Id sunt magna laboris laboris enim. Sint aliquip elit ullamco ut nisi officia enim dolore nulla cupidatat duis. Cillum magna minim quis nulla nulla anim amet non nostrud sit nostrud exercitation magna ex.\r\n", + "address": "4 Bainbridge Street", + "city": "Chical", + "state": "Colorado", + "zip": 18544, + "country": "Brunei Darussalam", + "email": "jordanhyde@scentric.com", + "phone": "(822) 530-2413", + "color": "rgb(163,61,149)" + }, + { + "index": 213, + "name": "Caldwell Mckinney", + "first": "Melody", + "last": "Fisher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bogdanroberta/73.jpg", + "boolean": true, + "guid": "7e4dcc0a-5507-4cee-948f-06e4315a2af8", + "integer": 41, + "date": "Wed May 03 1972 14:18:30 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Aliqua laboris enim proident cillum ut id aute nulla ea.", + "longText": "Consequat excepteur non amet ipsum labore dolore consequat duis cillum. Enim occaecat nisi aute aliqua occaecat enim nulla. Eiusmod est adipisicing et in. Sint fugiat ullamco officia commodo minim ut velit voluptate non eiusmod. Est quis sunt nisi exercitation in nostrud laboris.\r\nIrure pariatur velit ad minim occaecat labore ad dolor eiusmod occaecat laboris. Et culpa voluptate minim aliquip. Sit commodo nostrud veniam in dolore magna officia eu ea nisi ex velit.\r\nQuis esse do anim ullamco deserunt consectetur cupidatat tempor cillum ex id. Aute velit non est amet officia laboris labore duis velit Lorem consectetur cupidatat tempor. Cupidatat eiusmod anim et elit ipsum esse minim. Irure eiusmod nisi duis velit id.\r\n", + "address": "2 Abbey Court", + "city": "Salvo", + "state": "Utah", + "zip": 63926, + "country": "Macedonia", + "email": "melodyfisher@scentric.com", + "phone": "(979) 487-2773", + "color": "rgb(71,205,213)" + }, + { + "index": 214, + "name": "Eloise Avila", + "first": "Gay", + "last": "Yang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shammellee/73.jpg", + "boolean": true, + "guid": "d615ea19-d16e-48f6-8ddb-02091a9fa272", + "integer": 25, + "date": "Tue Sep 03 1991 06:44:54 GMT-0700 (PDT)", + "shortText": "aliquip enim eu proident sunt", + "mediumText": "Ex deserunt reprehenderit qui ea adipisicing labore in ipsum.", + "longText": "Eiusmod anim ut occaecat veniam est quis labore consectetur elit. Sint minim nostrud non ad aliqua do. Dolor et ullamco aliqua cillum consectetur sunt. Tempor aliquip id labore anim voluptate aute cupidatat consequat. Et nostrud eu cillum sunt nisi excepteur laborum sint labore amet.\r\n", + "address": "3 Wogan Terrace", + "city": "Canby", + "state": "Idaho", + "zip": 49943, + "country": "French Polynesia", + "email": "gayyang@scentric.com", + "phone": "(951) 538-3316", + "color": "rgb(75,210,111)" + }, + { + "index": 215, + "name": "Christine Strong", + "first": "Sofia", + "last": "Alvarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donjain/73.jpg", + "boolean": true, + "guid": "7f27c6f9-a6f0-49b2-b6d4-0824fb02c1ba", + "integer": 2, + "date": "Fri Feb 27 1976 21:08:15 GMT-0800 (PST)", + "shortText": "incididunt mollit", + "mediumText": "Labore labore consectetur aliquip pariatur sit eu voluptate minim enim eu cillum proident.", + "longText": "Sint sit deserunt proident nulla culpa in reprehenderit veniam commodo consequat aliquip dolor. Eu mollit cillum et nulla nulla culpa voluptate proident irure mollit non ipsum nisi. Reprehenderit laboris eiusmod magna exercitation consectetur nulla sit do cupidatat est ad dolore culpa. Eiusmod commodo eiusmod dolore est ad reprehenderit occaecat irure. Adipisicing quis aliqua qui non labore consectetur ullamco aliquip.\r\nLorem fugiat excepteur do cupidatat labore elit tempor fugiat et. Commodo laborum nisi consectetur laboris culpa veniam ea minim fugiat dolor qui et pariatur occaecat. Culpa est ullamco in esse. Ut aliquip id dolore aute ullamco et velit veniam et est aute sunt. Sint Lorem consectetur elit occaecat ea enim proident sunt cupidatat cillum officia. Quis eu veniam deserunt occaecat aliqua est exercitation consequat ipsum officia sit Lorem aliqua.\r\nAmet mollit in ad sit. Adipisicing occaecat laboris qui enim ut aute deserunt proident. Ipsum labore laboris sunt nulla amet ad. Duis voluptate ut veniam est quis amet et occaecat.\r\nDuis pariatur voluptate ut veniam aliquip commodo ipsum commodo do. Pariatur deserunt laboris veniam duis ipsum dolore et duis laboris quis officia ad reprehenderit deserunt. Deserunt Lorem esse ad duis veniam ad proident dolore culpa enim commodo sunt est ex.\r\nExcepteur deserunt deserunt ea dolor nulla. Laborum irure elit ut fugiat deserunt amet nisi. Magna do elit est esse pariatur qui mollit proident esse. Id laborum amet fugiat ipsum tempor reprehenderit.\r\n", + "address": "3 Celeste Court", + "city": "Herbster", + "state": "Arkansas", + "zip": 97896, + "country": "Bahamas", + "email": "sofiaalvarez@scentric.com", + "phone": "(990) 470-3077", + "color": "rgb(250,51,175)" + }, + { + "index": 216, + "name": "Love Baldwin", + "first": "Rivers", + "last": "Rosales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/21lab/73.jpg", + "boolean": true, + "guid": "b67fea0d-b75f-4344-8a9f-fe87e3c61b52", + "integer": 84, + "date": "Wed Jan 15 1975 15:08:56 GMT-0800 (PST)", + "shortText": "do elit sint excepteur", + "mediumText": "Veniam eiusmod sit duis fugiat mollit et dolore in ad nulla culpa. Proident labore eu dolore commodo sint deserunt dolore amet ullamco nulla eiusmod excepteur. Excepteur nisi duis consectetur qui. Exercitation laborum est aliquip deserunt.", + "longText": "Quis ea et cillum aliqua culpa commodo velit cupidatat ut ea. Nisi non qui esse labore veniam veniam sit. Excepteur aliquip sit anim minim incididunt consectetur consectetur laboris minim nisi labore in labore magna. Incididunt tempor eiusmod dolor elit et duis ex mollit.\r\nId excepteur do adipisicing laboris labore aliquip eu do enim incididunt esse nulla exercitation. Anim consequat culpa non incididunt dolore ad qui proident magna voluptate do occaecat fugiat occaecat. Velit pariatur amet ullamco quis sint.\r\n", + "address": "2 Ingraham Street", + "city": "Hendersonville", + "state": "Delaware", + "zip": 71466, + "country": "Palau", + "email": "riversrosales@scentric.com", + "phone": "(929) 466-3166", + "color": "rgb(255,204,95)" + }, + { + "index": 217, + "name": "Louisa Lang", + "first": "Jenna", + "last": "Roberson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionuss/73.jpg", + "boolean": false, + "guid": "1fb6ce5a-06bc-4d09-93bb-4da1b2003f10", + "integer": 47, + "date": "Wed Aug 26 1981 07:54:13 GMT-0700 (PDT)", + "shortText": "sint nostrud commodo exercitation", + "mediumText": "Nulla culpa incididunt et veniam nisi officia. Et non fugiat incididunt in fugiat ad ullamco dolor cillum duis irure officia veniam dolor. Pariatur qui veniam cillum sunt consequat eiusmod ipsum.", + "longText": "Quis consequat ea velit ea labore do dolore. Aute in dolore occaecat sint dolor labore. Sunt consectetur laborum qui nostrud dolore reprehenderit sint sunt eu reprehenderit. Ullamco proident labore occaecat nostrud. Sint velit in do ut duis laborum ut ullamco. Tempor sunt consectetur officia veniam. Et cillum occaecat mollit tempor proident sunt mollit.\r\nOccaecat incididunt esse occaecat et non culpa culpa aliqua ex. Aute cillum magna nostrud ea. Anim consequat aliquip enim veniam culpa velit ea irure quis id ipsum deserunt ad. Elit dolor proident laboris nostrud id pariatur aute ut deserunt. Mollit consequat occaecat eiusmod ad voluptate laboris duis. Quis nulla culpa occaecat ea ullamco voluptate cupidatat irure. Incididunt amet ipsum cupidatat sint officia reprehenderit consequat velit non reprehenderit commodo ut amet.\r\nAliqua commodo ipsum ex officia esse veniam elit ullamco. Laborum adipisicing Lorem sint nisi commodo sunt aute commodo cupidatat reprehenderit ut exercitation. Eu ea magna anim in fugiat mollit proident exercitation ullamco amet. Ex ullamco et nulla non deserunt ullamco occaecat officia enim. Officia ea ullamco cillum dolor et aliqua elit consectetur nulla ex dolor nostrud aute velit. Exercitation mollit consequat consectetur veniam pariatur ullamco sit sunt dolore sint deserunt ut esse. Sint ullamco voluptate est veniam ullamco sit.\r\n", + "address": "4 Miller Place", + "city": "Sims", + "state": "Federated States Of Micronesia", + "zip": 93413, + "country": "Tuvalu", + "email": "jennaroberson@scentric.com", + "phone": "(943) 474-3085", + "color": "rgb(143,132,181)" + }, + { + "index": 218, + "name": "Snyder Cortez", + "first": "Ronda", + "last": "Nielsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bameyrick/73.jpg", + "boolean": false, + "guid": "633a4429-d43e-452c-9b6c-b53f2ee2e347", + "integer": 85, + "date": "Tue Jan 06 1981 00:45:11 GMT-0800 (PST)", + "shortText": "ullamco deserunt adipisicing sint esse", + "mediumText": "Nostrud mollit exercitation culpa ipsum adipisicing fugiat aliquip ex.", + "longText": "Cupidatat veniam officia quis fugiat proident eu. Lorem voluptate enim do aute ut veniam ut. Ullamco exercitation cupidatat ipsum culpa aliqua duis veniam ullamco proident in fugiat dolore ullamco. Quis in irure adipisicing occaecat.\r\nVeniam consectetur labore consectetur consequat enim irure sunt. Enim nulla pariatur aliquip aute proident aute deserunt fugiat nisi irure ipsum irure proident. Ad laboris do aute ullamco et reprehenderit velit commodo ipsum magna sunt duis.\r\nOfficia excepteur sunt ut tempor Lorem in mollit ipsum et tempor cupidatat veniam. Aliqua id dolore Lorem officia quis velit. Ut tempor elit fugiat incididunt quis ad eiusmod in.\r\nExercitation Lorem aliquip laboris laboris incididunt qui laboris adipisicing irure laboris qui non deserunt qui. Voluptate sit aliquip ullamco anim. Dolore nulla ea culpa fugiat adipisicing qui proident do elit proident fugiat magna dolore quis.\r\nExcepteur elit laboris proident adipisicing ipsum aute ipsum magna voluptate officia officia consequat amet ullamco. Amet nostrud elit do culpa consectetur occaecat sint culpa id labore sit qui pariatur. Sunt esse nisi in proident labore excepteur deserunt elit cupidatat non. Labore sunt commodo nisi eu incididunt qui cillum tempor anim voluptate. Adipisicing dolor consequat pariatur id enim laboris incididunt duis magna enim velit fugiat esse.\r\n", + "address": "3 Quentin Road", + "city": "Islandia", + "state": "Guam", + "zip": 18417, + "country": "Liechtenstein", + "email": "rondanielsen@scentric.com", + "phone": "(819) 547-2703", + "color": "rgb(69,55,248)" + }, + { + "index": 219, + "name": "Michael Nixon", + "first": "Paul", + "last": "Huber", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/p_cherkashin/73.jpg", + "boolean": false, + "guid": "77b470a6-85b9-4d08-9bda-af2cf7b97919", + "integer": 86, + "date": "Mon Aug 24 1987 23:29:34 GMT-0700 (PDT)", + "shortText": "et", + "mediumText": "Adipisicing dolore magna sunt duis quis cillum incididunt sit commodo minim nisi irure culpa.", + "longText": "Sit qui excepteur consequat veniam. Qui deserunt nostrud esse velit nulla culpa ex. Enim esse nostrud quis consectetur ea ex. Veniam reprehenderit deserunt dolore ipsum Lorem reprehenderit ipsum laborum adipisicing adipisicing qui.\r\n", + "address": "3 Baltic Street", + "city": "Marienthal", + "state": "Pennsylvania", + "zip": 77950, + "country": "Virgin Islands (US)", + "email": "paulhuber@scentric.com", + "phone": "(822) 531-2515", + "color": "rgb(213,114,213)" + }, + { + "index": 220, + "name": "Erna Collier", + "first": "Brady", + "last": "Haney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tube_man/73.jpg", + "boolean": true, + "guid": "2b70bd78-953b-4f78-b980-0443e7865502", + "integer": 89, + "date": "Thu Apr 09 1981 13:14:33 GMT-0800 (PST)", + "shortText": "labore consectetur qui", + "mediumText": "Eiusmod eiusmod sit consectetur dolor adipisicing adipisicing ipsum laborum. Nostrud est non sunt est Lorem aliquip non incididunt. Ad consequat incididunt labore adipisicing eiusmod magna ad pariatur quis.", + "longText": "Nostrud ullamco quis aliqua veniam officia est commodo anim commodo est exercitation. Dolor reprehenderit dolore occaecat anim cillum deserunt. Nostrud laboris esse quis voluptate magna esse. Et mollit mollit ad consectetur adipisicing do ullamco Lorem mollit cillum cillum pariatur ipsum duis. In exercitation esse nisi nostrud aliquip non velit magna incididunt anim. Dolor mollit eu quis laborum quis duis esse nisi exercitation duis duis quis adipisicing.\r\nFugiat nisi do reprehenderit dolor amet velit fugiat incididunt quis et aute eu cillum consequat. Occaecat laborum cupidatat occaecat voluptate proident irure anim proident sit in. In culpa ex pariatur deserunt sint in consectetur eiusmod. Aliqua cupidatat aute ullamco eiusmod fugiat.\r\nEx officia ut Lorem ex nisi pariatur incididunt qui. Fugiat pariatur ut tempor excepteur anim enim qui sint occaecat eiusmod veniam ad enim amet. Anim magna nulla magna pariatur. Mollit excepteur minim cillum irure nisi quis irure quis velit consectetur. Laboris sint aliquip minim aliqua incididunt eiusmod dolor amet. Velit sint cillum consectetur commodo culpa do exercitation amet laboris est laborum magna officia sit.\r\n", + "address": "3 Lawrence Street", + "city": "Summerset", + "state": "New Hampshire", + "zip": 76548, + "country": "Svalbard and Jan Mayen Islands", + "email": "bradyhaney@scentric.com", + "phone": "(933) 464-2281", + "color": "rgb(61,84,220)" + }, + { + "index": 221, + "name": "Serena Holden", + "first": "Dorsey", + "last": "James", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolaseek/73.jpg", + "boolean": true, + "guid": "e34b73b6-5bae-4d6e-8d76-8b030ff4d104", + "integer": 49, + "date": "Mon May 27 1985 00:38:05 GMT-0700 (PDT)", + "shortText": "occaecat Lorem", + "mediumText": "Sunt minim duis et reprehenderit commodo aute dolore. Elit veniam occaecat adipisicing officia ex.", + "longText": "Consectetur ipsum quis in veniam ipsum voluptate velit deserunt minim aute. Consectetur in commodo aliquip voluptate anim. Culpa veniam enim in voluptate do nulla culpa deserunt. Mollit in sit exercitation dolore id eu duis nulla consectetur laborum sit ex eu et.\r\nLaborum id occaecat labore voluptate officia labore in id cillum occaecat. Nisi et amet elit excepteur irure adipisicing est cillum sit est velit cillum. Irure Lorem qui qui Lorem qui id. Est velit adipisicing voluptate Lorem consectetur ut exercitation occaecat amet adipisicing sit adipisicing. Cillum sint quis incididunt sint anim et. Adipisicing veniam pariatur id laboris amet est cillum. Eiusmod in mollit in velit culpa Lorem consequat ad mollit amet laboris qui.\r\nIn nisi exercitation irure pariatur consequat consequat labore ipsum anim commodo fugiat id. Aute est sit reprehenderit cupidatat cupidatat pariatur laborum nulla culpa minim sunt. Consectetur ipsum duis dolor velit labore nisi magna enim voluptate laborum exercitation et.\r\n", + "address": "3 Green Street", + "city": "Allensworth", + "state": "North Dakota", + "zip": 77281, + "country": "Ethiopia", + "email": "dorseyjames@scentric.com", + "phone": "(856) 447-3354", + "color": "rgb(81,131,93)" + }, + { + "index": 222, + "name": "Tabitha Alvarado", + "first": "Grant", + "last": "Bauer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/joshjoshmatson/73.jpg", + "boolean": true, + "guid": "f0707477-7ccf-4f35-b9d8-ecdcea4b5444", + "integer": 59, + "date": "Sat Mar 13 1971 23:17:16 GMT-0800 (PST)", + "shortText": "cupidatat exercitation pariatur commodo anim", + "mediumText": "Nisi nulla est ipsum laboris. Ut et ea pariatur aute. Fugiat dolore esse laborum sunt.", + "longText": "Cupidatat pariatur nostrud cillum fugiat sint culpa officia adipisicing ipsum occaecat. Sunt id tempor tempor consectetur sint eu esse ullamco deserunt proident Lorem sit. Exercitation et ex dolor exercitation elit labore aute veniam consectetur. Duis mollit ut eiusmod reprehenderit duis anim qui.\r\nIpsum anim veniam nostrud occaecat et proident qui cupidatat voluptate eu enim esse Lorem nulla. Nulla voluptate ex irure ex excepteur minim duis ut ipsum aliqua ullamco. Excepteur ipsum proident ea duis Lorem ad incididunt esse non officia amet excepteur exercitation. Sit amet sint velit velit officia fugiat. Laboris aliqua irure incididunt nulla aliqua exercitation labore nostrud incididunt. Labore eu amet magna deserunt.\r\nAliqua adipisicing et aute ut occaecat laboris nulla. Excepteur non Lorem fugiat incididunt officia minim sunt tempor dolore magna ullamco ad veniam enim. Sunt labore adipisicing consequat non proident excepteur ullamco cupidatat eiusmod nulla culpa elit aliquip minim. Fugiat qui sint Lorem velit ea.\r\n", + "address": "3 Oak Street", + "city": "Kapowsin", + "state": "Northern Mariana Islands", + "zip": 57454, + "country": "Togo", + "email": "grantbauer@scentric.com", + "phone": "(985) 414-2281", + "color": "rgb(61,94,134)" + }, + { + "index": 223, + "name": "Tami Berger", + "first": "Rocha", + "last": "Ayers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jacopobassan/73.jpg", + "boolean": false, + "guid": "e0993984-2847-4494-bcec-273869d52b83", + "integer": 68, + "date": "Sun Nov 14 1971 20:32:38 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Sit pariatur pariatur commodo magna fugiat aliquip proident qui. In tempor eu commodo id elit qui. Dolore do irure Lorem officia minim sit nostrud ad qui enim enim. Ut est nisi voluptate qui quis anim dolor sunt ad duis commodo. Fugiat nostrud minim pariatur do occaecat aliqua id proident veniam dolor nisi dolor.", + "longText": "Ad culpa eu proident mollit est duis eu ad et tempor dolore. Amet exercitation nostrud dolore nulla fugiat veniam dolor. Velit sit tempor aliquip ut officia. Excepteur commodo anim veniam esse amet tempor ipsum magna ut cillum eiusmod. Aute eiusmod in aliqua Lorem do aliqua ut id aliquip consectetur ut. Deserunt irure veniam voluptate eu esse in ea eiusmod.\r\nOfficia ipsum laboris proident mollit deserunt esse tempor laborum. Fugiat sit aliqua occaecat est dolore amet incididunt ullamco exercitation qui sit dolore ullamco. Dolore est cupidatat commodo veniam pariatur aliqua cillum cillum sunt et enim exercitation. Ut eu consequat culpa anim. Adipisicing enim et deserunt ullamco adipisicing dolor eu. Laboris velit labore labore consectetur ea pariatur quis.\r\nCulpa anim consectetur ad sint tempor aliquip. Ad magna cillum ut Lorem exercitation esse id labore sint nulla enim. Pariatur in reprehenderit consectetur mollit ullamco irure Lorem Lorem anim fugiat. Aliquip est elit sunt nisi labore. Voluptate reprehenderit excepteur ullamco tempor id ut excepteur laborum tempor. Proident dolore voluptate sunt ullamco qui sint culpa consectetur anim velit.\r\nPariatur consectetur excepteur anim elit do consectetur sint aute veniam duis quis. Ut ipsum mollit amet culpa laborum. Dolor nostrud commodo commodo deserunt dolore quis voluptate occaecat voluptate deserunt. Anim ipsum proident non eu eu ea nulla aliqua aliqua amet sit officia ut. Proident tempor ullamco elit cillum occaecat reprehenderit fugiat minim pariatur laborum anim ipsum. Velit Lorem Lorem do mollit occaecat ullamco adipisicing ut officia. Exercitation culpa magna duis proident magna velit culpa laboris eiusmod cupidatat sunt cillum.\r\n", + "address": "3 Benson Avenue", + "city": "Alfarata", + "state": "South Dakota", + "zip": 99292, + "country": "Zimbabwe", + "email": "rochaayers@scentric.com", + "phone": "(912) 557-3383", + "color": "rgb(237,77,56)" + }, + { + "index": 224, + "name": "Toni Hubbard", + "first": "Manuela", + "last": "Matthews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benhalllondon/73.jpg", + "boolean": false, + "guid": "6a196cdc-9694-4c30-a010-23fe19d05ccf", + "integer": 64, + "date": "Wed Mar 30 1994 01:18:27 GMT-0800 (PST)", + "shortText": "amet laboris do pariatur", + "mediumText": "Quis quis ex anim ea officia anim aute. Duis nostrud adipisicing consectetur dolor aute laboris deserunt eu. Tempor reprehenderit occaecat dolor Lorem minim laboris adipisicing cupidatat veniam eu laborum amet qui. Do Lorem anim do cupidatat.", + "longText": "Sit cupidatat ullamco esse sit Lorem laboris. Nisi culpa excepteur aute ad consectetur. Ad mollit dolor incididunt nostrud elit laboris nostrud nulla officia. Exercitation cillum proident deserunt aute minim proident.\r\n", + "address": "2 Autumn Avenue", + "city": "Hebron", + "state": "Alaska", + "zip": 68123, + "country": "Azerbaijan", + "email": "manuelamatthews@scentric.com", + "phone": "(802) 454-3368", + "color": "rgb(190,58,156)" + }, + { + "index": 225, + "name": "Mcmillan Burris", + "first": "Tisha", + "last": "Reese", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umurgdk/73.jpg", + "boolean": false, + "guid": "4c6aa7ad-4530-4d0d-a5d2-bc8d25596090", + "integer": 19, + "date": "Tue Mar 08 2005 12:31:16 GMT-0800 (PST)", + "shortText": "deserunt elit occaecat", + "mediumText": "Duis veniam voluptate sint nulla adipisicing ea eiusmod qui eiusmod sunt sunt amet labore.", + "longText": "Dolor sint nostrud velit sit deserunt dolore. Duis velit commodo do tempor enim. Ex non occaecat ea commodo sint id officia aute. Eu eiusmod irure cupidatat reprehenderit ea duis qui velit nulla quis duis. Adipisicing fugiat consequat officia quis commodo reprehenderit cillum consectetur consectetur ut. Labore elit elit proident et aute voluptate ex sit quis voluptate commodo voluptate cupidatat commodo. Nulla deserunt elit in non cillum fugiat laborum pariatur esse in.\r\nQui aliqua quis eu enim cillum occaecat labore. Qui cupidatat nisi cillum commodo. Lorem nisi eu sint esse excepteur do.\r\nIncididunt quis deserunt in dolor dolore in mollit commodo sint tempor. Ullamco pariatur magna ad amet voluptate mollit aliquip. Ad ad irure magna anim id esse exercitation ipsum velit fugiat voluptate culpa ipsum. Officia ullamco fugiat minim dolor aliqua nulla amet eu nulla commodo. Duis ea et sunt laborum.\r\nLabore excepteur non aliquip sunt ad anim. Consectetur ipsum officia amet consectetur est. Fugiat duis exercitation nulla aliqua esse tempor aliquip et sunt qui.\r\nDeserunt nostrud sunt elit enim id id pariatur proident enim duis. Duis aute cillum sunt id commodo sint aute ipsum Lorem sint magna commodo. Dolor cillum cupidatat laboris incididunt amet excepteur voluptate occaecat excepteur. Veniam et nulla non tempor.\r\n", + "address": "3 Graham Avenue", + "city": "Brenton", + "state": "Louisiana", + "zip": 80517, + "country": "French Southern Territories", + "email": "tishareese@scentric.com", + "phone": "(886) 572-2143", + "color": "rgb(148,208,184)" + }, + { + "index": 226, + "name": "Conrad Holder", + "first": "Rebecca", + "last": "Cole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_vectorhugo/73.jpg", + "boolean": false, + "guid": "2db95cdc-541c-4e6c-bb8a-9afb329188a9", + "integer": 96, + "date": "Thu Sep 30 1971 17:22:25 GMT-0700 (PDT)", + "shortText": "cillum minim aute laboris", + "mediumText": "Anim ullamco labore do labore nisi id cillum.", + "longText": "Ipsum enim minim fugiat voluptate quis consequat eiusmod aliquip exercitation ad sit labore nostrud. Dolore qui enim irure dolore anim enim amet et cupidatat. Id nisi fugiat proident Lorem sunt sunt voluptate mollit mollit sit elit veniam sint Lorem. Consectetur pariatur commodo ullamco duis nostrud. Reprehenderit elit labore consectetur incididunt veniam quis adipisicing enim ea ut do enim.\r\nTempor in pariatur reprehenderit occaecat anim labore aliqua elit irure. Duis fugiat deserunt commodo occaecat pariatur sint. Dolore aliqua aute ut aliqua qui.\r\n", + "address": "2 Butler Place", + "city": "Grazierville", + "state": "Missouri", + "zip": 37800, + "country": "Finland", + "email": "rebeccacole@scentric.com", + "phone": "(863) 438-3293", + "color": "rgb(252,113,153)" + }, + { + "index": 227, + "name": "Finley Norman", + "first": "Kemp", + "last": "Ramsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traicyer/73.jpg", + "boolean": true, + "guid": "8d123ac2-6255-4f83-a056-c073a8853e3c", + "integer": 94, + "date": "Mon Nov 19 1979 06:35:50 GMT-0800 (PST)", + "shortText": "dolor id consequat occaecat", + "mediumText": "Magna cupidatat incididunt non excepteur deserunt eiusmod reprehenderit aliquip aute et. Culpa mollit laboris qui et veniam reprehenderit do eu sit id.", + "longText": "Mollit minim culpa ipsum aute ullamco. Tempor esse dolor exercitation in enim culpa ipsum sint eu laborum. Ea enim laboris veniam non duis quis. Laboris tempor culpa aliquip eiusmod tempor est ea mollit anim aute voluptate ea. Adipisicing incididunt irure cillum nisi sunt enim duis. Fugiat nostrud officia enim ea.\r\nNisi ullamco Lorem minim deserunt cillum esse officia labore anim commodo incididunt. Eu veniam consectetur ea commodo esse deserunt Lorem ex voluptate ad ad fugiat quis. Velit magna mollit eiusmod fugiat nulla ipsum cupidatat anim non eu nisi. Sint esse est ullamco eiusmod dolore et velit mollit pariatur fugiat sunt ipsum occaecat. Proident quis magna in occaecat aliqua nisi exercitation ea in.\r\n", + "address": "4 Fay Court", + "city": "Libertytown", + "state": "Kentucky", + "zip": 74614, + "country": "United Arab Emirates", + "email": "kempramsey@scentric.com", + "phone": "(983) 496-2931", + "color": "rgb(56,255,141)" + }, + { + "index": 228, + "name": "Tara Campos", + "first": "Roach", + "last": "Dodson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brunodesign1206/73.jpg", + "boolean": true, + "guid": "777f0227-f8c4-47a4-b0d6-5b0b0703a74d", + "integer": 47, + "date": "Mon Aug 12 1974 17:16:53 GMT-0700 (PDT)", + "shortText": "aliquip nostrud", + "mediumText": "Culpa aute ut ea nisi excepteur reprehenderit consectetur veniam proident deserunt adipisicing excepteur tempor. Laboris adipisicing elit eu proident amet aliquip tempor elit in ut eiusmod proident ea. Aliquip sint quis sit nulla esse ut ullamco qui nostrud nisi sit. Velit cupidatat tempor sit esse. Anim ad officia dolore do mollit et excepteur cupidatat veniam.", + "longText": "Exercitation mollit et Lorem qui aliqua ex pariatur aliquip. Quis elit amet esse eiusmod labore. Excepteur sint sunt aute qui eiusmod ullamco commodo dolore duis ea eiusmod.\r\nConsequat irure minim mollit id amet pariatur qui. Exercitation aute nostrud veniam minim Lorem commodo velit. Nostrud sunt officia dolor aliquip veniam veniam cupidatat. Nisi ut nostrud occaecat cupidatat laborum amet ad reprehenderit voluptate nulla quis nostrud in. Mollit reprehenderit qui sit esse duis laboris sunt fugiat aute qui ex eiusmod non nisi. Dolore veniam ad anim veniam cillum nulla incididunt exercitation velit.\r\nNostrud tempor deserunt est minim aute anim dolore. Minim enim cillum voluptate officia tempor tempor excepteur duis non est elit velit do. Excepteur eiusmod cillum sunt deserunt reprehenderit labore eu aliquip commodo fugiat. Consequat minim exercitation eu fugiat occaecat aliquip elit elit dolore aliquip ea ea. Aliqua ex irure cillum labore ut mollit esse veniam sit.\r\nAliqua nisi non eu ad est enim reprehenderit culpa laborum. Mollit aute esse velit est labore quis irure. Nostrud tempor labore labore aliquip laboris excepteur ad. Lorem incididunt proident pariatur laboris do. Officia magna nostrud eiusmod velit commodo incididunt magna reprehenderit ullamco. Dolore culpa culpa cillum minim voluptate in.\r\n", + "address": "2 Agate Court", + "city": "Genoa", + "state": "American Samoa", + "zip": 48715, + "country": "Portugal", + "email": "roachdodson@scentric.com", + "phone": "(878) 581-2211", + "color": "rgb(224,94,95)" + }, + { + "index": 229, + "name": "Glass Navarro", + "first": "Potter", + "last": "Lowe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michalhron/73.jpg", + "boolean": false, + "guid": "181d7287-30f7-4285-bfa9-e21d28869bd0", + "integer": 86, + "date": "Wed Aug 11 1971 11:38:44 GMT-0700 (PDT)", + "shortText": "eu mollit sit", + "mediumText": "Aliquip nulla excepteur elit fugiat. Aliqua do enim eu dolor ipsum nostrud exercitation et veniam ad dolor. Culpa cillum labore aliquip sint do aliqua occaecat culpa ad officia eiusmod irure qui. Occaecat nostrud ad ullamco consequat.", + "longText": "Labore adipisicing pariatur nostrud in irure quis culpa culpa proident. Nulla et est exercitation id Lorem quis in. Culpa non veniam velit do dolore culpa commodo sunt consectetur ullamco laboris. Aliqua est fugiat reprehenderit occaecat qui. Et do Lorem veniam anim cillum do ullamco tempor elit amet.\r\nAliqua exercitation in aute excepteur aute elit nisi ex minim. Proident ex quis eiusmod cupidatat laboris esse consectetur dolor Lorem reprehenderit commodo labore nostrud consectetur. Ea duis tempor proident ad ea mollit adipisicing nisi exercitation voluptate irure ipsum irure velit. Tempor anim eiusmod sint aliquip cillum consectetur deserunt.\r\nAdipisicing laboris ex eiusmod elit ipsum cupidatat anim qui dolor fugiat quis nisi culpa. Sint consequat irure laborum in enim elit irure incididunt sit. Magna consequat quis deserunt ad mollit deserunt. Non id anim consectetur culpa ut do anim do sint veniam. Est amet ea minim minim labore Lorem.\r\n", + "address": "2 Allen Avenue", + "city": "Kilbourne", + "state": "Minnesota", + "zip": 75102, + "country": "Comoros", + "email": "potterlowe@scentric.com", + "phone": "(987) 576-3068", + "color": "rgb(171,255,82)" + }, + { + "index": 230, + "name": "Amparo Pope", + "first": "Maribel", + "last": "Burks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/itskylemacey/73.jpg", + "boolean": true, + "guid": "f12a9fbc-2a4f-4fa5-8a07-f9241aa3cab1", + "integer": 91, + "date": "Sat Jun 12 2010 19:41:10 GMT-0700 (PDT)", + "shortText": "qui laborum ipsum est", + "mediumText": "Reprehenderit esse occaecat et incididunt ut eu cillum exercitation ut veniam irure. Sunt eu ullamco enim exercitation amet pariatur adipisicing nulla cillum.", + "longText": "Ipsum aliqua eu anim cupidatat tempor cillum tempor in officia anim. Culpa tempor adipisicing qui elit culpa eiusmod aliquip commodo. Dolore commodo consequat mollit ex nostrud aute incididunt officia anim incididunt reprehenderit. Labore Lorem labore minim et consectetur quis laboris incididunt pariatur esse nostrud. Dolore aute mollit esse esse.\r\nIncididunt sunt cillum nisi ea. Fugiat culpa excepteur id est magna sit proident labore commodo. Nostrud cupidatat consectetur nisi ipsum reprehenderit minim sint Lorem consequat cillum eiusmod aliqua pariatur Lorem. Proident magna est sit elit est eiusmod aliquip occaecat ullamco ea officia occaecat ut esse. Sunt tempor cupidatat enim ad reprehenderit incididunt voluptate aute dolor occaecat pariatur dolor.\r\n", + "address": "2 Gerritsen Avenue", + "city": "Westerville", + "state": "Hawaii", + "zip": 56057, + "country": "Central African Republic", + "email": "maribelburks@scentric.com", + "phone": "(843) 435-2675", + "color": "rgb(79,131,175)" + }, + { + "index": 231, + "name": "Dillard Johns", + "first": "Viola", + "last": "Pruitt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mikaeljorhult/73.jpg", + "boolean": true, + "guid": "9b589ef4-79b4-4bc1-89ea-0b50bf8f5dad", + "integer": 74, + "date": "Thu Aug 21 1980 02:27:46 GMT-0700 (PDT)", + "shortText": "id nisi", + "mediumText": "Magna excepteur laboris enim magna quis ea sint. Velit ex nisi elit reprehenderit nostrud amet quis eu cillum exercitation. Ex elit adipisicing exercitation esse.", + "longText": "Sint nisi cillum ipsum laboris. Reprehenderit irure occaecat reprehenderit excepteur adipisicing exercitation incididunt sunt dolore. Deserunt elit reprehenderit tempor elit ex ea consequat eiusmod incididunt velit et consectetur officia quis. Id sunt enim quis ex nulla in ullamco voluptate anim esse nulla. Eu excepteur dolore deserunt consectetur esse et esse do cupidatat deserunt pariatur irure deserunt sunt.\r\nNon ut tempor Lorem fugiat cupidatat nostrud pariatur veniam fugiat sunt incididunt ut. Exercitation anim officia incididunt irure nulla sunt commodo eu non. Consectetur amet est laboris amet ipsum reprehenderit non exercitation non exercitation duis ut.\r\nEu laborum dolor amet sint deserunt mollit officia est. Velit minim id et deserunt ullamco sint elit tempor dolore consectetur. Cillum aute ut consequat aliqua laboris. Fugiat aute aliqua id ipsum laboris labore labore tempor mollit sunt sint. Sunt consectetur exercitation pariatur commodo occaecat voluptate velit dolore. Exercitation consectetur dolore reprehenderit aliqua eu consequat minim dolore ullamco nisi amet deserunt amet. Occaecat amet nulla incididunt ut cupidatat.\r\nPariatur irure sunt duis Lorem ad veniam ea duis. Anim irure amet commodo proident incididunt laborum elit in voluptate occaecat minim occaecat consequat. Dolore Lorem ex ipsum nulla deserunt dolore aute. Voluptate consectetur irure ea reprehenderit mollit eiusmod occaecat sunt ea adipisicing cupidatat. Proident laboris magna duis aliquip fugiat pariatur exercitation mollit laboris amet sint ea. Sit ex ex consequat sit.\r\nExcepteur amet in id pariatur ullamco excepteur excepteur proident in. Veniam non labore nostrud culpa excepteur sit enim ad duis non commodo nulla. Minim incididunt in ad reprehenderit. Culpa esse magna duis exercitation laboris. Adipisicing eiusmod consectetur culpa cupidatat nostrud sint veniam adipisicing.\r\n", + "address": "2 Grove Street", + "city": "Matthews", + "state": "Alabama", + "zip": 12918, + "country": "Gabon", + "email": "violapruitt@scentric.com", + "phone": "(908) 451-2708", + "color": "rgb(144,170,102)" + }, + { + "index": 232, + "name": "Jeanie Huffman", + "first": "Karyn", + "last": "Edwards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ryoseptiian/73.jpg", + "boolean": true, + "guid": "7e4ee6b2-7816-43c3-9885-e74857955244", + "integer": 20, + "date": "Sat Apr 12 1975 06:27:04 GMT-0700 (PDT)", + "shortText": "ut sint consectetur", + "mediumText": "Cillum id mollit deserunt officia sint aliquip. Do duis reprehenderit voluptate cupidatat cupidatat Lorem quis fugiat incididunt ut occaecat mollit.", + "longText": "Fugiat sunt proident consequat culpa eiusmod consequat reprehenderit enim sunt. Sit ea ex ex qui labore in. Laborum sint occaecat proident eiusmod ex sit sint commodo officia aliqua culpa. Aliqua reprehenderit exercitation labore Lorem mollit fugiat.\r\nOfficia laborum reprehenderit amet laboris ex. Ullamco qui adipisicing ex laboris do minim proident veniam. Quis voluptate deserunt elit in culpa. Lorem id sint ut exercitation non qui.\r\nEu officia do irure veniam proident in veniam irure. Dolore sint do ad amet proident velit labore incididunt pariatur proident ea velit mollit adipisicing. Anim dolor in reprehenderit sunt ea nostrud est pariatur non do ad.\r\nConsequat amet reprehenderit cillum incididunt et ullamco consequat consequat proident irure. Est veniam tempor ea ad. Reprehenderit sunt tempor exercitation laborum labore anim ad duis consequat.\r\n", + "address": "2 Linden Boulevard", + "city": "Ripley", + "state": "North Carolina", + "zip": 45918, + "country": "Cambodia", + "email": "karynedwards@scentric.com", + "phone": "(877) 447-2061", + "color": "rgb(177,244,78)" + }, + { + "index": 233, + "name": "Alfreda Neal", + "first": "Dunlap", + "last": "Mcclure", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/olivierpineda/73.jpg", + "boolean": false, + "guid": "c5d9f660-404e-4dd8-a4e9-8ebd95a6d6eb", + "integer": 83, + "date": "Sun Dec 31 1978 03:35:38 GMT-0800 (PST)", + "shortText": "fugiat aliquip", + "mediumText": "Eu nulla fugiat dolor magna commodo veniam laboris sint minim Lorem pariatur do. Do elit esse magna voluptate aute nisi cillum. Voluptate culpa aliquip ea quis sunt cillum dolore cupidatat.", + "longText": "Lorem exercitation et mollit tempor Lorem consectetur irure anim. Irure officia elit tempor consequat irure non qui labore id consequat nisi cupidatat. Voluptate labore id adipisicing mollit consequat nulla mollit aute ut occaecat sint incididunt est irure. Tempor irure eiusmod commodo cillum. Officia quis reprehenderit quis elit mollit ea pariatur eu aliquip non aute. Incididunt amet consequat ad velit consequat dolore elit velit qui ea. In qui non adipisicing id anim eiusmod commodo qui Lorem deserunt culpa adipisicing.\r\n", + "address": "2 Bogart Street", + "city": "Shrewsbury", + "state": "Connecticut", + "zip": 80957, + "country": "New Zealand", + "email": "dunlapmcclure@scentric.com", + "phone": "(913) 592-3075", + "color": "rgb(208,154,61)" + }, + { + "index": 234, + "name": "Livingston Osborn", + "first": "Mathis", + "last": "Webster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronalfred/73.jpg", + "boolean": true, + "guid": "c008efb7-14cd-4e64-96a7-2ea18524bdcd", + "integer": 54, + "date": "Sat Mar 01 1986 18:24:28 GMT-0800 (PST)", + "shortText": "ut eiusmod", + "mediumText": "Do mollit cupidatat nostrud esse ex velit esse adipisicing elit labore laboris enim anim. Magna dolore nulla cillum qui laborum et sint anim culpa non aute et. Tempor nisi eiusmod laboris ex aliquip commodo id. Eiusmod aliqua aliqua sunt non ipsum veniam aliqua consequat.", + "longText": "Elit do reprehenderit eiusmod minim quis cillum ad culpa. Cupidatat eu laborum amet duis consectetur culpa fugiat dolore aute. Lorem veniam exercitation cupidatat veniam et nulla. Veniam occaecat exercitation minim nisi dolor proident adipisicing sit non. Occaecat dolore ea minim in deserunt.\r\nSint aliqua magna Lorem nostrud nisi consequat mollit. Labore Lorem amet consectetur reprehenderit duis est ullamco velit eu officia ut labore esse id. Deserunt officia ea est enim nisi elit amet deserunt do labore duis anim. Aliquip non dolore cillum dolore dolor ex tempor velit aliqua enim.\r\nIncididunt consectetur commodo irure et ut adipisicing proident velit. Qui quis consequat id irure. Mollit amet proident irure incididunt deserunt magna.\r\nLaboris ut sint incididunt sit proident officia ex non. Consequat laborum Lorem aute voluptate est laborum quis Lorem nulla. Id velit est cillum elit adipisicing aliquip occaecat nulla nulla pariatur incididunt. In veniam occaecat occaecat ad amet culpa tempor. Non cupidatat pariatur officia et cillum adipisicing veniam elit sint. In cillum minim in occaecat adipisicing. Exercitation labore in ipsum veniam non veniam amet quis.\r\n", + "address": "4 Beverly Road", + "city": "Greer", + "state": "South Carolina", + "zip": 53490, + "country": "Lebanon", + "email": "mathiswebster@scentric.com", + "phone": "(862) 466-2481", + "color": "rgb(99,84,116)" + }, + { + "index": 235, + "name": "Stephenson Blanchard", + "first": "Kirkland", + "last": "Washington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrebay007/73.jpg", + "boolean": false, + "guid": "8dc10004-46f6-432d-ad1a-b1e2ed707ea2", + "integer": 48, + "date": "Mon Feb 20 2012 00:23:49 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Incididunt cupidatat non esse ut adipisicing mollit aliquip ipsum eiusmod ullamco id aute nostrud veniam. Labore ipsum sunt duis elit labore dolor incididunt et consequat enim veniam. Ullamco quis nulla culpa ad labore laborum reprehenderit enim aliqua sit ad duis laboris. Proident non voluptate amet pariatur veniam laborum culpa sint anim mollit.", + "longText": "Nostrud mollit aliquip consectetur voluptate cillum. Qui labore aute adipisicing exercitation officia sint ipsum pariatur consectetur magna ad ad proident. Aute commodo esse veniam deserunt elit. Quis magna occaecat culpa eiusmod ipsum elit occaecat culpa. Excepteur laborum tempor ad consequat consectetur quis tempor anim. Mollit ex magna mollit ad voluptate excepteur.\r\nAmet incididunt veniam sunt deserunt non dolor. Tempor duis laboris laboris amet ullamco labore culpa sit id veniam aliquip adipisicing sunt nisi. Laboris et irure veniam pariatur quis anim officia ad. Ullamco labore anim ipsum labore ex velit nisi fugiat. Ea aliquip sunt fugiat eiusmod ex ullamco id reprehenderit pariatur nulla non sunt ad ullamco. Aliqua enim occaecat tempor ex eu magna eu nulla ex exercitation aute.\r\nQui excepteur dolore aute sunt. Laborum ea do reprehenderit adipisicing ullamco sunt nulla deserunt labore. Adipisicing eiusmod consequat in velit proident voluptate cillum. Ipsum eu adipisicing dolore aute dolor fugiat id deserunt aute veniam. Labore irure sunt non aliqua ut est cupidatat eiusmod ipsum occaecat veniam amet ex fugiat. Consequat voluptate et dolor sint cupidatat anim eiusmod enim veniam.\r\nIncididunt quis non quis ea exercitation. Cupidatat sint duis est commodo sit nulla aliqua ut amet quis fugiat. Amet aliquip aliqua duis minim aute fugiat. Quis veniam sunt ipsum voluptate. Laborum fugiat officia reprehenderit aliqua ad do quis consectetur laboris in consectetur amet anim proident. Deserunt veniam ut pariatur sunt magna aute sit pariatur. Cupidatat dolor mollit aliqua est occaecat dolore laboris sint.\r\n", + "address": "3 Humboldt Street", + "city": "Bath", + "state": "Michigan", + "zip": 99644, + "country": "Armenia", + "email": "kirklandwashington@scentric.com", + "phone": "(927) 536-3348", + "color": "rgb(161,139,176)" + }, + { + "index": 236, + "name": "Mary Bolton", + "first": "Shawn", + "last": "Bean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thisisgordon/73.jpg", + "boolean": true, + "guid": "9a1ae6b3-19d6-49d3-ade8-41d80ef9a7f9", + "integer": 89, + "date": "Tue Jan 23 1973 17:15:25 GMT-0800 (PST)", + "shortText": "sunt eu amet proident tempor", + "mediumText": "Commodo elit commodo sit sit consectetur excepteur ipsum id exercitation officia amet. Enim amet occaecat reprehenderit ipsum cillum tempor.", + "longText": "Eiusmod quis enim excepteur ipsum magna mollit adipisicing proident deserunt velit ea consequat. Cillum cillum commodo sit ipsum enim ullamco elit consequat non. Ullamco adipisicing occaecat ullamco duis enim velit voluptate eiusmod quis ipsum sunt eu.\r\nEiusmod consectetur id ea ut velit ad eu. Cillum adipisicing id nostrud qui aliquip excepteur anim. Non nulla dolor proident culpa. Adipisicing ea laborum minim occaecat cupidatat sint. Id commodo ipsum laboris ullamco esse excepteur. Duis deserunt consequat proident irure sit ad fugiat.\r\nEx ipsum amet minim cillum ut mollit minim ullamco. Dolor nostrud non dolor est tempor ad ipsum. Minim pariatur ut reprehenderit Lorem.\r\nUllamco eu tempor id fugiat officia in eu incididunt ut elit culpa. Amet eiusmod tempor eiusmod sunt. Nostrud eiusmod eiusmod exercitation sit voluptate dolore. Sint magna officia et consectetur aute nostrud qui. Officia est non non laborum aliqua eu nisi magna do id. Do amet sit culpa pariatur do sunt et eiusmod veniam. Laborum voluptate est ad est eiusmod do commodo aliqua proident id incididunt.\r\n", + "address": "2 Rapelye Street", + "city": "Steinhatchee", + "state": "Maine", + "zip": 24857, + "country": "Cayman Islands", + "email": "shawnbean@scentric.com", + "phone": "(881) 597-2110", + "color": "rgb(52,77,146)" + }, + { + "index": 237, + "name": "Jaime Horn", + "first": "Nina", + "last": "Larsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rainfalls/73.jpg", + "boolean": true, + "guid": "2d358e80-f8a9-4f14-879c-3e0d6dc7d398", + "integer": 6, + "date": "Tue Jan 10 2006 08:17:15 GMT-0800 (PST)", + "shortText": "do pariatur irure laborum qui", + "mediumText": "Magna aliquip cupidatat laborum fugiat. Et consequat est magna minim veniam mollit nulla ipsum dolore anim adipisicing enim in. Sit veniam sint velit tempor dolor laboris aute deserunt laboris incididunt aute.", + "longText": "Irure fugiat consectetur velit dolor commodo voluptate aliquip irure incididunt veniam. Cillum ipsum cupidatat qui velit consequat. Dolor laboris voluptate irure exercitation aute fugiat. Eu reprehenderit eu Lorem ex. Sint non exercitation mollit non officia nostrud non pariatur cupidatat sit enim dolor in.\r\nId qui pariatur labore commodo ex irure amet. Ex eiusmod esse consequat consequat. Irure culpa occaecat id nostrud id laborum Lorem nulla nostrud nostrud. Velit nulla voluptate cupidatat laboris do. Nisi amet anim fugiat irure esse anim exercitation non. Incididunt in id sit Lorem anim consectetur tempor ex do. Lorem pariatur do consectetur non consectetur velit magna sit eiusmod fugiat irure veniam eiusmod.\r\nMinim consequat ad nostrud sint occaecat et ea non ad et. Nostrud Lorem laborum esse amet ad dolore dolore fugiat commodo consectetur. Fugiat sint et incididunt nulla et est laborum esse ad aliqua. Quis est cupidatat sit ad reprehenderit eu commodo. Id occaecat adipisicing excepteur proident proident aliquip duis ea nostrud consectetur. Ex amet velit ad ipsum minim commodo cillum aliqua magna aliquip eiusmod nisi anim.\r\nIrure reprehenderit non aute laboris ipsum nostrud adipisicing amet voluptate. Eiusmod laborum veniam aliqua laboris consectetur do esse et mollit laborum esse. Quis excepteur officia sunt eu eiusmod enim laboris in aute. Minim nisi ipsum labore laborum. Officia eiusmod nostrud qui consectetur.\r\n", + "address": "3 Grimes Road", + "city": "Stagecoach", + "state": "Kansas", + "zip": 54299, + "country": "Italy", + "email": "ninalarsen@scentric.com", + "phone": "(833) 427-3141", + "color": "rgb(238,80,95)" + }, + { + "index": 238, + "name": "Ewing Prince", + "first": "Burch", + "last": "Hinton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eldelentes/73.jpg", + "boolean": false, + "guid": "c51adfad-516d-4572-a27b-d5029bf01030", + "integer": 70, + "date": "Sun Aug 28 2005 15:03:02 GMT-0700 (PDT)", + "shortText": "labore labore", + "mediumText": "Deserunt elit sint laborum occaecat qui mollit. In anim ad ea dolor enim nisi ut veniam. Adipisicing nisi dolore quis excepteur labore sit commodo officia qui irure elit. Ipsum commodo consectetur reprehenderit magna excepteur reprehenderit laborum culpa ullamco Lorem eu tempor eiusmod non.", + "longText": "Aliqua enim eu do veniam excepteur consequat non cillum elit consequat ipsum ea esse. Elit sit et nulla laboris ad consectetur minim ut tempor consequat do. Enim aute pariatur nostrud aliqua nulla amet adipisicing.\r\nCulpa nulla dolore exercitation dolore nulla officia. Consequat ut mollit eu cillum qui nisi consequat deserunt tempor ut fugiat. Commodo reprehenderit dolore mollit ut. Et irure consequat qui ad ipsum enim cillum in in. Aute exercitation in sunt exercitation consequat aliquip culpa ipsum deserunt esse cupidatat id.\r\nQuis deserunt quis deserunt reprehenderit sint do. Qui cillum ut minim officia amet ullamco eu nulla eu laborum ipsum excepteur. Enim aliqua occaecat commodo non anim pariatur sunt aute minim eiusmod nisi eu est. Minim esse duis nisi exercitation id dolor. Duis ullamco proident exercitation proident duis laborum irure enim ut amet.\r\n", + "address": "3 Downing Street", + "city": "Dyckesville", + "state": "Iowa", + "zip": 40075, + "country": "Lesotho", + "email": "burchhinton@scentric.com", + "phone": "(876) 448-2187", + "color": "rgb(251,248,74)" + }, + { + "index": 239, + "name": "Sharlene Bryan", + "first": "Celina", + "last": "Jimenez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/robinclediere/73.jpg", + "boolean": true, + "guid": "fc6767db-fb4a-4de3-bcc2-5a503cd8bbe6", + "integer": 40, + "date": "Mon Oct 02 1972 11:23:02 GMT-0700 (PDT)", + "shortText": "id", + "mediumText": "Exercitation exercitation exercitation proident adipisicing quis. Non aliquip dolore nostrud amet exercitation officia do elit duis nisi. Proident sit sunt magna pariatur commodo in culpa exercitation nostrud culpa adipisicing.", + "longText": "Officia adipisicing aliquip duis amet enim officia fugiat non aute exercitation. Elit ut cillum incididunt exercitation veniam id aliqua nulla voluptate reprehenderit sunt deserunt officia adipisicing. Sint ullamco eiusmod occaecat velit cupidatat ullamco pariatur ut duis fugiat. Non ullamco non aliqua cupidatat occaecat ipsum ea ut. Tempor enim ut voluptate laborum laborum reprehenderit cillum ea voluptate tempor magna ullamco enim amet. Dolor cupidatat sint do mollit.\r\n", + "address": "4 Putnam Avenue", + "city": "Fairfield", + "state": "Vermont", + "zip": 49521, + "country": "Mongolia", + "email": "celinajimenez@scentric.com", + "phone": "(853) 562-3172", + "color": "rgb(187,177,206)" + }, + { + "index": 240, + "name": "Anastasia Marquez", + "first": "Mcdonald", + "last": "Goff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/73.jpg", + "boolean": true, + "guid": "356dd512-ac27-409d-a8ae-9a518b9f0d09", + "integer": 71, + "date": "Sun Aug 11 2013 06:10:11 GMT-0700 (PDT)", + "shortText": "eu esse tempor", + "mediumText": "Excepteur esse voluptate ut officia nulla excepteur minim enim. Dolore tempor dolore ex sunt pariatur irure.", + "longText": "Irure consequat qui labore nulla veniam. Adipisicing magna eiusmod quis anim et nostrud occaecat fugiat pariatur id esse commodo et ad. Sunt adipisicing tempor Lorem tempor eiusmod ut fugiat laboris voluptate sunt. Cillum ipsum voluptate duis veniam consequat nostrud pariatur commodo aute quis. Sit aute ex quis voluptate minim incididunt veniam. Excepteur nulla qui proident id est. Id aliquip excepteur proident culpa sunt enim non ad.\r\nNon nulla proident adipisicing non nulla adipisicing magna laboris ad duis occaecat duis velit. Sunt eiusmod nulla laboris quis adipisicing adipisicing excepteur. Ea ea labore magna labore consectetur eiusmod laboris qui dolore aliquip aliquip. Reprehenderit Lorem voluptate sunt tempor non reprehenderit officia duis quis tempor.\r\nEt laboris incididunt excepteur laborum ad eu aliqua commodo pariatur. Esse in fugiat elit voluptate ad excepteur magna cillum ipsum ipsum et non fugiat ipsum. Adipisicing ut ut ex in qui fugiat incididunt exercitation excepteur consequat adipisicing.\r\nExcepteur mollit amet enim dolore ad laborum esse exercitation. Aute deserunt ullamco culpa nostrud dolore sunt nisi laboris esse Lorem culpa irure. Irure consectetur nulla Lorem laborum enim ut ut incididunt id pariatur. Est eiusmod velit ad magna deserunt excepteur sunt ex tempor elit aliquip amet. Exercitation laborum sit commodo nostrud velit pariatur Lorem cupidatat exercitation.\r\nEiusmod ex mollit aute sint aliqua nulla ea irure eiusmod dolore proident aute officia voluptate. Ipsum consequat sunt ea aliquip ea enim sint irure Lorem. Incididunt enim consequat mollit amet et occaecat qui est cupidatat ad. Cupidatat voluptate consequat cupidatat et amet in. Cupidatat id laboris duis nostrud et reprehenderit fugiat. Sit laborum non duis et.\r\n", + "address": "3 Corbin Place", + "city": "Nadine", + "state": "Nebraska", + "zip": 41484, + "country": "Germany", + "email": "mcdonaldgoff@scentric.com", + "phone": "(891) 532-3564", + "color": "rgb(165,152,170)" + }, + { + "index": 241, + "name": "Faith Hayes", + "first": "Lessie", + "last": "Garza", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hsinyo23/73.jpg", + "boolean": false, + "guid": "97574a4a-fc23-4e79-add5-5296baa4336a", + "integer": 36, + "date": "Mon Oct 29 1984 10:50:51 GMT-0800 (PST)", + "shortText": "enim consequat velit occaecat", + "mediumText": "Exercitation aute eu cupidatat labore laboris ut incididunt voluptate quis sint sit. Enim id incididunt officia aliqua adipisicing ipsum. Et duis laboris tempor velit fugiat.", + "longText": "Magna do nisi exercitation qui. Amet nostrud magna magna deserunt Lorem consectetur consectetur. Laborum exercitation magna occaecat ex commodo. Proident reprehenderit Lorem et fugiat deserunt eiusmod proident pariatur aute sint dolor. Nisi deserunt labore mollit labore eiusmod. Culpa ad aute deserunt occaecat fugiat. Ad qui labore exercitation do sint aliquip culpa ex nulla enim laboris voluptate ad.\r\nLaborum proident sit laborum excepteur. Eiusmod id in dolore sunt pariatur laboris esse. Consectetur in officia non ea aute id occaecat adipisicing nulla velit. Qui reprehenderit cupidatat quis quis elit aute tempor amet incididunt incididunt qui pariatur.\r\nConsequat veniam labore laborum cillum nostrud. Aute sit enim tempor occaecat magna ea reprehenderit consectetur sint consectetur cillum. Qui proident eiusmod quis quis duis. Ex ex laboris elit culpa laborum laboris dolore nisi id ipsum pariatur quis cupidatat. Velit id fugiat Lorem veniam. Elit pariatur culpa incididunt eiusmod anim ullamco dolore. Magna deserunt cillum non cupidatat nulla exercitation ullamco ipsum adipisicing consequat pariatur.\r\n", + "address": "2 Billings Place", + "city": "Fowlerville", + "state": "Florida", + "zip": 63875, + "country": "Thailand", + "email": "lessiegarza@scentric.com", + "phone": "(853) 436-2778", + "color": "rgb(129,67,86)" + }, + { + "index": 242, + "name": "Berg Ray", + "first": "Greer", + "last": "Turner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/axel/73.jpg", + "boolean": true, + "guid": "0fbc2172-5658-40d0-babd-9610530bf605", + "integer": 78, + "date": "Thu Apr 29 2004 02:33:23 GMT-0700 (PDT)", + "shortText": "reprehenderit labore quis voluptate magna", + "mediumText": "Veniam et magna fugiat ut ex pariatur deserunt non. Ullamco dolor esse esse ut laboris reprehenderit eiusmod amet enim. Proident sit cupidatat est consequat ex excepteur fugiat cupidatat aliquip. Veniam non sit dolor ea proident consequat elit nulla elit incididunt labore ullamco. Ut proident incididunt laboris esse.", + "longText": "Dolor tempor duis veniam excepteur nulla nostrud. Officia consectetur est adipisicing do duis quis laborum. Tempor proident proident qui consequat eu. Voluptate magna adipisicing non nulla non dolor cupidatat fugiat irure. Pariatur Lorem culpa ex sunt cupidatat. Non incididunt cupidatat mollit esse Lorem. Est et laborum enim et laborum officia non amet aliquip deserunt.\r\nMinim cupidatat eiusmod cupidatat ad amet incididunt deserunt duis velit excepteur ipsum culpa qui. Tempor eiusmod incididunt voluptate dolore id dolor dolor. Eu enim deserunt eu laborum sunt excepteur excepteur aliquip exercitation occaecat nulla magna. Est officia proident irure quis consectetur. Ut magna veniam aliquip laborum fugiat ex ea ut sint laboris sint. Quis exercitation sit nostrud proident sint et do cillum sunt duis excepteur anim aute non.\r\n", + "address": "2 Schermerhorn Street", + "city": "Century", + "state": "New Jersey", + "zip": 72260, + "country": "Seychelles", + "email": "greerturner@scentric.com", + "phone": "(962) 538-2574", + "color": "rgb(215,92,57)" + }, + { + "index": 243, + "name": "Gates Bush", + "first": "Cohen", + "last": "Sweet", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traneblow/73.jpg", + "boolean": true, + "guid": "6dd5c482-2b39-4e90-9158-ad1ef6027185", + "integer": 69, + "date": "Tue Nov 02 1982 15:17:04 GMT-0800 (PST)", + "shortText": "anim culpa culpa", + "mediumText": "Commodo et fugiat adipisicing voluptate est. Occaecat laborum ad reprehenderit in nulla dolore. Quis aute excepteur fugiat aute laboris. Ex sint consectetur dolore magna exercitation velit reprehenderit labore irure proident aliquip cupidatat aute. Ad eiusmod anim id magna elit aliqua.", + "longText": "Proident amet commodo elit sunt aliqua et irure officia. Eu quis pariatur dolore mollit esse cupidatat ut do. Officia laborum laboris quis ullamco minim adipisicing proident ullamco occaecat elit amet. Ad magna ea est dolore. Nulla irure nostrud et commodo veniam ad veniam culpa culpa adipisicing velit qui enim nostrud. Nostrud labore labore proident voluptate do quis deserunt aute ad minim velit amet ad cillum.\r\nIncididunt in fugiat incididunt tempor reprehenderit commodo ipsum aute labore laboris duis. Deserunt fugiat fugiat ipsum minim dolore ex excepteur sit cillum duis sint velit aute est. Adipisicing occaecat ut esse ullamco sint enim eu magna tempor laboris. Pariatur aute nisi id dolore mollit do occaecat ad. Consequat proident eiusmod tempor veniam incididunt commodo culpa eiusmod minim enim duis aliquip. Dolore irure eiusmod laboris nostrud ipsum laborum Lorem. Amet proident enim exercitation id duis dolor officia sunt.\r\nIn ea fugiat pariatur mollit proident fugiat do labore id Lorem aute. Nostrud sit duis minim duis laborum laboris adipisicing cillum veniam adipisicing commodo exercitation ex in. Aliqua enim velit consequat do tempor enim laborum dolore sit. Non quis irure laborum sunt cupidatat exercitation culpa reprehenderit id excepteur ullamco magna dolor aute. Nostrud nisi amet pariatur esse dolor elit aliquip dolore esse do dolor officia laboris officia. Anim voluptate sint quis sit veniam non aliqua ipsum proident qui nostrud mollit. Consectetur sunt duis ex tempor laborum eiusmod velit commodo aute laborum.\r\nAliqua commodo commodo non do occaecat esse culpa minim fugiat in labore consequat reprehenderit proident. Laboris pariatur proident ut et veniam cillum Lorem consequat qui eiusmod. Enim veniam nisi enim aliquip exercitation cillum fugiat.\r\nProident dolor ipsum aliqua amet sit do labore aute commodo. Laboris fugiat id laboris occaecat. Qui dolor id aliqua elit ex non adipisicing culpa tempor duis et laboris officia. Eu dolore pariatur est voluptate incididunt ea proident duis non incididunt minim et nulla ex. Exercitation excepteur incididunt fugiat id anim deserunt consequat nisi veniam laboris officia consectetur fugiat. Eu excepteur esse anim reprehenderit dolor enim reprehenderit aliqua consectetur cillum quis. Nisi sint quis incididunt commodo duis sit deserunt dolor laborum dolore labore ex commodo cillum.\r\n", + "address": "4 Hunterfly Place", + "city": "Osage", + "state": "Wisconsin", + "zip": 10229, + "country": "Chad", + "email": "cohensweet@scentric.com", + "phone": "(961) 506-3669", + "color": "rgb(223,99,51)" + }, + { + "index": 244, + "name": "Rosella Sharpe", + "first": "Hilary", + "last": "Jacobs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thimo_cz/73.jpg", + "boolean": false, + "guid": "b8a9b448-8f16-4879-88a7-b438a45e7dcc", + "integer": 36, + "date": "Mon Feb 09 1998 12:55:02 GMT-0800 (PST)", + "shortText": "labore consectetur", + "mediumText": "Ullamco deserunt sunt consectetur irure adipisicing nostrud incididunt incididunt cillum. Amet aute dolor labore pariatur aliquip reprehenderit sunt.", + "longText": "Nisi ad esse nulla reprehenderit elit. Occaecat amet qui consectetur quis occaecat reprehenderit ea ad ex fugiat nulla. Voluptate et velit ullamco aliquip adipisicing qui pariatur deserunt deserunt minim. Amet elit ullamco ea adipisicing aute enim non culpa quis officia exercitation pariatur.\r\nMollit qui ut nulla elit. Consectetur qui mollit adipisicing aute ad irure culpa reprehenderit proident labore. Lorem aliquip consequat tempor laborum duis id dolore aliqua. Ullamco culpa culpa adipisicing duis labore irure proident qui elit proident dolor dolor sit. Nisi nisi velit dolore ipsum Lorem cillum aute occaecat excepteur labore enim exercitation mollit non.\r\nCillum consectetur deserunt duis nulla pariatur laborum adipisicing. Nisi magna duis irure aute irure proident tempor aliquip quis sunt amet. Veniam excepteur laborum culpa nostrud id et consequat ut aliqua velit. In quis enim sunt minim esse est proident elit consequat. Ipsum id ad pariatur officia pariatur cupidatat qui sunt. Irure ut officia magna mollit et quis labore amet esse deserunt tempor Lorem duis. Duis exercitation officia ea est ipsum sunt.\r\nEiusmod Lorem officia velit elit cupidatat aliqua occaecat non aute ut nulla do pariatur. Mollit enim ad officia eiusmod sint qui ex non incididunt. Eiusmod irure voluptate aliquip nisi dolore adipisicing incididunt Lorem aute minim ea labore aute. Occaecat fugiat esse velit sit cupidatat non occaecat ex laborum qui magna enim. Laboris eu nisi nostrud incididunt est. Id dolore in adipisicing non et velit exercitation Lorem elit excepteur deserunt.\r\n", + "address": "2 Emerald Street", + "city": "Basye", + "state": "Washington", + "zip": 84048, + "country": "Uruguay", + "email": "hilaryjacobs@scentric.com", + "phone": "(850) 481-3931", + "color": "rgb(175,197,147)" + }, + { + "index": 245, + "name": "Ballard Mason", + "first": "Nell", + "last": "Harper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/majksner/73.jpg", + "boolean": true, + "guid": "4367e70e-505b-4a00-b33c-8ad5dbef5274", + "integer": 22, + "date": "Tue Feb 21 1995 19:57:05 GMT-0800 (PST)", + "shortText": "labore incididunt", + "mediumText": "Sit culpa ipsum eu nulla quis id in nostrud tempor officia tempor voluptate enim. Anim ut ullamco reprehenderit eu. Enim veniam do labore eiusmod enim elit dolor.", + "longText": "Duis do esse cillum ea esse ad. Quis incididunt nulla commodo eiusmod. Magna ipsum reprehenderit sit dolor non esse culpa anim aliquip. Esse adipisicing nostrud pariatur consectetur aliqua reprehenderit ad. Cupidatat incididunt cupidatat sit proident consequat enim duis consequat mollit elit deserunt qui. Deserunt dolor do nisi quis laboris dolor irure esse excepteur. Ex consequat incididunt id et in esse officia laboris nostrud.\r\nDolor labore nulla nisi ex sit nisi qui sit aliqua dolore elit dolore incididunt. Laboris qui do duis ipsum pariatur nulla magna. Elit reprehenderit veniam reprehenderit laboris proident amet mollit sunt minim et deserunt sint nulla minim. Nisi sunt eu aute ea ut pariatur est magna voluptate tempor anim. Do id laboris Lorem magna commodo voluptate nostrud magna cupidatat proident irure nostrud laboris sunt.\r\nQui occaecat excepteur ea magna quis enim magna consectetur nostrud consequat non veniam tempor nostrud. Mollit et ex aute aute consectetur veniam aute ut sunt culpa eu. Ullamco amet voluptate adipisicing nulla consectetur in. Minim excepteur enim aliquip nisi velit duis ea. Consectetur minim fugiat nostrud reprehenderit minim et proident id pariatur Lorem proident ipsum eiusmod. Ea nulla enim ullamco aute do. Laborum consequat sint ipsum consectetur.\r\nIrure ullamco dolore aute occaecat excepteur proident dolor. Nulla ut sunt adipisicing dolor elit duis sit laboris commodo do est. Do cillum est voluptate tempor mollit officia cupidatat ad pariatur elit officia ullamco. Eu esse aute officia est duis commodo aliquip ipsum officia cupidatat do magna Lorem. Cillum incididunt adipisicing minim aliquip ea esse adipisicing laborum proident deserunt. Deserunt Lorem excepteur enim id nisi pariatur tempor eiusmod proident nisi.\r\n", + "address": "2 Boynton Place", + "city": "Gerber", + "state": "Oregon", + "zip": 35064, + "country": "Burkina Faso", + "email": "nellharper@scentric.com", + "phone": "(978) 583-3962", + "color": "rgb(114,234,175)" + }, + { + "index": 246, + "name": "Alexis Kramer", + "first": "Koch", + "last": "Carpenter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angelcreative/73.jpg", + "boolean": false, + "guid": "27db3441-a52c-4633-9e2e-c1b68bbab9ab", + "integer": 18, + "date": "Wed May 05 2010 06:16:29 GMT-0700 (PDT)", + "shortText": "amet fugiat ut", + "mediumText": "Ad cupidatat amet ullamco ullamco officia cillum sit id duis non non. Eiusmod pariatur ea ipsum et exercitation enim minim eu nostrud voluptate. Reprehenderit nostrud nisi aliquip elit ea culpa laborum irure aliqua deserunt labore ea. Minim occaecat id quis consectetur irure nostrud exercitation laborum. Nostrud est nostrud anim reprehenderit enim dolore irure laborum enim est deserunt incididunt laboris magna.", + "longText": "Magna ex exercitation dolor ex et sit enim fugiat ad sint velit officia sunt. Sint officia dolor fugiat minim id amet dolore commodo reprehenderit aute veniam. Eu non do irure proident consequat velit pariatur amet voluptate dolor exercitation. Deserunt sunt sunt sunt eiusmod qui culpa irure anim dolor aute consequat adipisicing. Enim velit est esse ea laboris Lorem do.\r\nLabore est aliqua exercitation minim et. Proident occaecat eu aliquip minim sit mollit Lorem. Lorem aute consectetur incididunt ullamco ut et labore laboris labore. Exercitation aute ullamco velit duis.\r\nUt velit tempor proident ut. Laboris cillum enim ut aliqua amet minim et do cupidatat elit commodo veniam aliquip culpa. Duis minim consectetur proident excepteur aliquip sint quis ex sunt laboris veniam deserunt commodo aute. Commodo ipsum laborum quis exercitation nostrud aute ad laboris. Anim sint sit et minim amet officia. Pariatur labore exercitation proident veniam duis sit exercitation cupidatat cillum Lorem ea duis non.\r\nEa veniam ad voluptate labore dolore esse in. Occaecat et est sint sint tempor non culpa veniam proident elit eiusmod proident adipisicing. Proident cupidatat et nulla amet nulla.\r\nEx est duis consequat proident est. Adipisicing enim elit labore eu in ipsum qui consectetur do veniam labore. Nostrud ullamco mollit cillum Lorem labore labore mollit non amet voluptate ullamco magna. Ex id quis eiusmod eiusmod Lorem est. Velit Lorem velit pariatur fugiat irure ad est cillum cupidatat tempor sit exercitation. Lorem ea cillum aliqua nisi veniam nostrud excepteur. Magna cillum aliquip anim irure dolor.\r\n", + "address": "2 Hudson Avenue", + "city": "Hiseville", + "state": "Illinois", + "zip": 75977, + "country": "Greenland", + "email": "kochcarpenter@scentric.com", + "phone": "(912) 523-3269", + "color": "rgb(254,230,133)" + }, + { + "index": 247, + "name": "Larson Mcguire", + "first": "Earnestine", + "last": "Curry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcus3de/73.jpg", + "boolean": false, + "guid": "0e87dcfe-dfe9-4c49-9da7-37fac49566fb", + "integer": 69, + "date": "Wed Apr 27 1977 14:45:51 GMT-0700 (PDT)", + "shortText": "aute quis minim laborum", + "mediumText": "Fugiat deserunt ea do sint pariatur anim.", + "longText": "Ex ullamco ut irure quis dolore aliqua ex reprehenderit culpa non do. Amet mollit dolore esse anim velit. Dolore et laborum excepteur voluptate deserunt voluptate occaecat officia consequat veniam ad aliquip. Nisi commodo in Lorem consequat ut irure fugiat quis deserunt dolore.\r\nEiusmod tempor in reprehenderit ut ut do in labore minim consectetur laboris sunt ullamco. Eu ut fugiat enim magna elit proident. Velit laborum ipsum pariatur laborum elit pariatur quis.\r\n", + "address": "3 Blake Court", + "city": "Riceville", + "state": "West Virginia", + "zip": 44569, + "country": "Fiji", + "email": "earnestinecurry@scentric.com", + "phone": "(947) 457-2441", + "color": "rgb(192,84,251)" + }, + { + "index": 248, + "name": "Elisa Gilbert", + "first": "Opal", + "last": "Rush", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lizpradal/73.jpg", + "boolean": false, + "guid": "af31a9db-6478-45f9-b053-48ea4d2c7ad2", + "integer": 12, + "date": "Sun Aug 17 1986 13:15:07 GMT-0700 (PDT)", + "shortText": "et nulla incididunt in in", + "mediumText": "Occaecat cupidatat proident cupidatat officia exercitation veniam exercitation nisi.", + "longText": "Ex enim magna pariatur eiusmod aliqua ad id sit in culpa adipisicing sint ut anim. Ex duis consequat non voluptate exercitation qui nostrud dolore quis ipsum esse. Exercitation nisi tempor ut labore fugiat incididunt cupidatat non sunt esse. Anim mollit nisi ut veniam amet voluptate labore eiusmod adipisicing fugiat ullamco aute amet duis. Ea fugiat dolore ipsum dolore ex velit laborum aliquip eu mollit minim. Eu non dolor adipisicing sint elit labore eiusmod et aliqua.\r\nIpsum cupidatat laborum consequat excepteur quis fugiat ex veniam sint tempor ullamco sit ut aliquip. Magna ex exercitation duis proident anim ipsum esse commodo in dolor irure. Ullamco occaecat culpa elit aliquip do.\r\n", + "address": "2 Belmont Avenue", + "city": "Manitou", + "state": "Mississippi", + "zip": 31901, + "country": "Viet Nam", + "email": "opalrush@scentric.com", + "phone": "(944) 429-3751", + "color": "rgb(73,188,227)" + }, + { + "index": 249, + "name": "Richardson Pena", + "first": "Lauri", + "last": "Macias", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mironcatalin/73.jpg", + "boolean": true, + "guid": "d2190b02-e2b9-47da-9a5d-43ab822a4242", + "integer": 1, + "date": "Sat Apr 25 1981 19:27:16 GMT-0800 (PST)", + "shortText": "dolor culpa", + "mediumText": "Veniam excepteur elit esse ex mollit. Aliquip adipisicing consectetur occaecat aliquip consectetur nisi ut est ipsum tempor cillum eiusmod excepteur.", + "longText": "Sint labore cillum sit elit consequat est sunt voluptate. Irure velit enim anim elit ea culpa ut consequat aute magna dolore. Sit reprehenderit elit eiusmod in enim. Sint elit officia laborum qui do eiusmod voluptate sunt et consequat. Duis laboris consequat culpa excepteur sunt qui irure est cupidatat eiusmod dolor mollit. Eiusmod est irure quis ut ad aliqua consectetur fugiat consectetur.\r\nDeserunt voluptate laboris occaecat pariatur elit. Ad eiusmod pariatur incididunt cillum irure duis labore labore. Nostrud nostrud minim aliquip nostrud eiusmod sunt ipsum reprehenderit labore enim ea tempor. Nostrud laboris mollit enim eu labore deserunt.\r\nOfficia non reprehenderit laborum quis cupidatat sit. Consectetur dolore est non tempor Lorem sint eu ea cupidatat occaecat dolor. Culpa sunt aliquip id dolore mollit aliquip esse qui culpa in amet sit incididunt. Ullamco est laborum aliqua incididunt. Aliquip id mollit minim proident sit.\r\nCulpa nostrud culpa deserunt culpa Lorem laborum minim sit sit. Ullamco qui do sunt est duis. Voluptate magna deserunt ipsum esse laborum dolor cillum. Magna cillum laborum sit veniam.\r\nQuis enim deserunt et mollit adipisicing. Eu sunt in esse adipisicing eu consequat magna dolore commodo labore culpa elit. Consequat elit fugiat ullamco in non dolor. Eu irure adipisicing laborum nisi commodo ipsum consequat officia ipsum in dolore laboris culpa.\r\n", + "address": "2 Atkins Avenue", + "city": "Bynum", + "state": "Rhode Island", + "zip": 45405, + "country": "France, Metropolitan", + "email": "laurimacias@scentric.com", + "phone": "(889) 487-2711", + "color": "rgb(140,77,221)" + }, + { + "index": 250, + "name": "James Christensen", + "first": "Atkinson", + "last": "White", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michaelbowden3/73.jpg", + "boolean": true, + "guid": "5b8652f2-a3c4-4f58-b4ae-df90d92002f2", + "integer": 99, + "date": "Tue Jan 30 1979 23:03:56 GMT-0800 (PST)", + "shortText": "veniam mollit ad nisi", + "mediumText": "Labore veniam anim aliqua duis deserunt dolor aliquip. Excepteur est non labore eiusmod id duis. Exercitation occaecat occaecat excepteur sit sint sit nisi labore ex tempor consequat duis.", + "longText": "Excepteur laborum velit eu irure dolor magna sit proident. Sint minim cillum commodo pariatur anim reprehenderit laborum occaecat reprehenderit pariatur ullamco. Cupidatat consectetur est incididunt enim exercitation.\r\nDeserunt tempor aliqua velit laboris qui dolore nulla culpa. Minim exercitation ut minim laborum anim aliquip minim eu dolore veniam. Ut anim do elit fugiat fugiat ad dolor ea sit velit qui dolor. Excepteur voluptate ea anim ullamco labore tempor aliqua sunt cillum occaecat cupidatat irure tempor. Consectetur fugiat elit ullamco nisi reprehenderit exercitation. Ipsum adipisicing ullamco laboris pariatur consectetur eu amet reprehenderit. Veniam aliqua sit aute pariatur sit.\r\nAdipisicing esse ad non laboris irure dolore Lorem adipisicing. Voluptate pariatur sit et eiusmod. Est do aute elit ipsum. Non velit irure magna amet sunt ex.\r\nVeniam sint labore velit ad eu velit deserunt occaecat elit exercitation dolor. Aute proident sit nisi incididunt laborum consectetur ea minim nisi anim mollit do ipsum. Consectetur ullamco nulla eu elit non ex pariatur magna labore. Nisi reprehenderit Lorem quis commodo sit elit sunt eu occaecat ad velit excepteur irure. Exercitation reprehenderit aute consectetur velit dolore incididunt elit quis anim dolore aliqua laboris ex.\r\nDo ut in mollit sunt irure id enim cillum nulla elit cupidatat. Duis nulla enim mollit in in incididunt est anim occaecat commodo ea magna. Tempor enim excepteur nostrud nostrud non nostrud non esse. In id incididunt labore pariatur veniam ipsum Lorem.\r\n", + "address": "4 Kay Court", + "city": "Veyo", + "state": "Georgia", + "zip": 60806, + "country": "Uganda", + "email": "atkinsonwhite@scentric.com", + "phone": "(912) 432-3782", + "color": "rgb(177,214,156)" + }, + { + "index": 251, + "name": "Berry Greene", + "first": "Carey", + "last": "Hawkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bermonpainter/73.jpg", + "boolean": true, + "guid": "6f4e5523-3a13-4b9c-98c4-99a1f8a24e7e", + "integer": 50, + "date": "Tue Sep 23 1980 15:29:12 GMT-0700 (PDT)", + "shortText": "id pariatur eu ut dolor", + "mediumText": "Mollit aute aliquip veniam irure do enim commodo excepteur culpa occaecat commodo eiusmod in reprehenderit. Non reprehenderit sint officia aliqua. Nostrud fugiat minim pariatur dolore in minim ea ut cillum do pariatur mollit proident.", + "longText": "Ad amet sunt ea aliqua incididunt ea non tempor cillum et et tempor. Esse ullamco consectetur tempor fugiat fugiat fugiat. Ex elit consequat nisi quis ut anim cillum sit ipsum esse. Tempor ex adipisicing ea culpa aute do ipsum et. Ipsum eu fugiat velit dolore exercitation sunt Lorem minim dolore quis ut nulla fugiat. Ut consectetur commodo aute nulla reprehenderit voluptate dolor fugiat ullamco.\r\nQui excepteur fugiat incididunt Lorem exercitation dolore dolore magna qui. Eiusmod non adipisicing sit et nisi occaecat pariatur sint elit esse et aute laborum pariatur. Commodo sit ut esse irure incididunt non veniam labore occaecat commodo aliquip.\r\nCommodo incididunt ex deserunt exercitation reprehenderit. Exercitation consequat amet cillum incididunt enim aute nostrud. Sit esse reprehenderit nulla Lorem magna in.\r\nTempor fugiat ipsum sint excepteur enim magna fugiat irure fugiat ad nulla anim minim. Exercitation et veniam exercitation aute nulla do quis reprehenderit sint nostrud duis Lorem qui enim. Cillum pariatur aliqua et ex irure exercitation elit id minim nostrud in. Eiusmod do fugiat veniam cupidatat deserunt amet velit enim adipisicing.\r\nCupidatat est et labore fugiat eu elit consectetur et culpa voluptate. Exercitation dolor excepteur veniam eiusmod ullamco laboris et deserunt velit proident aliquip. Adipisicing Lorem do amet sunt enim. Pariatur labore qui aliquip elit excepteur culpa nulla velit ea laborum consequat commodo ipsum proident. Est est reprehenderit incididunt sint officia ex quis dolor enim et veniam.\r\n", + "address": "2 Tillary Street", + "city": "Fivepointville", + "state": "New Mexico", + "zip": 85127, + "country": "Antarctica", + "email": "careyhawkins@scentric.com", + "phone": "(868) 519-2817", + "color": "rgb(74,226,202)" + }, + { + "index": 252, + "name": "Melva Frederick", + "first": "Haley", + "last": "Morris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/parasenak/73.jpg", + "boolean": true, + "guid": "0280cd72-ee64-4c9c-aa16-67f76f572d10", + "integer": 13, + "date": "Thu Aug 27 1992 14:36:33 GMT-0700 (PDT)", + "shortText": "magna incididunt duis adipisicing consequat", + "mediumText": "Ea exercitation voluptate mollit consequat voluptate eu minim. Quis aute ullamco labore reprehenderit non elit laboris aute sunt mollit mollit sunt. Do velit ad enim nulla reprehenderit laboris mollit.", + "longText": "Ullamco eu cupidatat eiusmod aute. Ex non aute ea fugiat duis qui velit. Culpa est duis consequat pariatur ad dolor exercitation. Elit nostrud cillum officia esse incididunt. Excepteur et in ex nulla eiusmod anim aliqua qui Lorem do amet. Anim voluptate sint culpa aute esse exercitation ex proident ullamco elit deserunt duis. Qui culpa tempor exercitation anim ipsum.\r\nReprehenderit cupidatat est pariatur adipisicing ad laboris cillum aute laboris adipisicing exercitation fugiat. Nisi reprehenderit fugiat nulla et proident ut enim excepteur commodo. Laboris laborum quis fugiat consequat et do. Minim adipisicing reprehenderit tempor laborum voluptate occaecat incididunt in aliqua ipsum reprehenderit est duis deserunt. Mollit cillum cupidatat Lorem incididunt duis laborum aute incididunt do. Nisi ea amet excepteur sit aliqua nulla. Sunt fugiat consequat commodo nostrud deserunt sunt nostrud ad esse dolor.\r\n", + "address": "2 Anthony Street", + "city": "Vivian", + "state": "Arizona", + "zip": 87173, + "country": "Kiribati", + "email": "haleymorris@scentric.com", + "phone": "(914) 569-3745", + "color": "rgb(77,218,207)" + }, + { + "index": 253, + "name": "Moses Leach", + "first": "Margret", + "last": "Baird", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/duyvk/73.jpg", + "boolean": false, + "guid": "2da52347-1212-4146-ad5b-1d770195f05c", + "integer": 57, + "date": "Sat May 31 1980 05:14:11 GMT-0700 (PDT)", + "shortText": "veniam voluptate minim elit amet", + "mediumText": "Voluptate in elit laborum commodo quis do proident pariatur aliqua velit exercitation cupidatat consequat. Sint quis ex aliqua velit commodo non cillum amet magna velit laborum amet reprehenderit ipsum.", + "longText": "Mollit nostrud cillum duis do ipsum duis cillum sint veniam ipsum. Qui ad ex ad id do labore enim proident est aute. Lorem quis pariatur pariatur id dolore id. Nulla esse ullamco eu enim eu Lorem et adipisicing est nisi eiusmod proident. Nostrud deserunt duis qui ad ad. Adipisicing esse aute amet consectetur aliquip incididunt laboris id est quis.\r\nEsse sint cillum commodo deserunt elit anim excepteur elit nostrud exercitation consequat ad. Aliqua consequat ea minim sunt dolor nulla elit sunt. Ut id do culpa amet adipisicing aliqua ipsum. Reprehenderit velit ad aliquip ullamco mollit elit ea. Deserunt quis labore aliquip culpa id cupidatat irure duis aliqua nostrud tempor.\r\n", + "address": "2 Orange Street", + "city": "Rosine", + "state": "Texas", + "zip": 86725, + "country": "Ecuador", + "email": "margretbaird@scentric.com", + "phone": "(991) 577-2455", + "color": "rgb(212,247,87)" + }, + { + "index": 254, + "name": "Mindy Mendoza", + "first": "Valdez", + "last": "Mack", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/abdullindenis/73.jpg", + "boolean": true, + "guid": "c19cb89a-c62c-4a3b-a815-dc686df99a69", + "integer": 97, + "date": "Sun Sep 28 2008 12:27:09 GMT-0700 (PDT)", + "shortText": "aliqua laborum", + "mediumText": "Ea commodo et minim id consectetur ipsum ad sit dolor. Laborum laborum in irure ex cillum sunt officia. Ullamco quis cupidatat labore occaecat amet elit consequat aute aliquip esse.", + "longText": "Cillum eu mollit ex Lorem est duis sint incididunt est ullamco. Pariatur amet sit sunt et sint officia dolor elit aliqua laboris officia. Sunt duis non sint ea ut adipisicing ut Lorem ut velit do ad culpa mollit. Irure magna elit dolore do officia mollit commodo id aute. Culpa nostrud esse officia exercitation.\r\nAliqua aliqua aute reprehenderit aute cupidatat veniam. Aliquip sint veniam deserunt amet. Quis adipisicing tempor id officia non. Laborum tempor cupidatat reprehenderit ut reprehenderit quis proident veniam ipsum. Mollit voluptate officia exercitation proident enim nisi eiusmod veniam do id sint eu.\r\n", + "address": "3 Woodside Avenue", + "city": "Skyland", + "state": "District Of Columbia", + "zip": 24057, + "country": "Bulgaria", + "email": "valdezmack@scentric.com", + "phone": "(831) 594-3993", + "color": "rgb(223,79,247)" + }, + { + "index": 255, + "name": "Charles Sosa", + "first": "Ashley", + "last": "Adams", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umutahmet29/73.jpg", + "boolean": true, + "guid": "26a576e9-cccf-480d-8ed3-bb6f7da211ef", + "integer": 89, + "date": "Thu Apr 03 1975 03:38:57 GMT-0700 (PDT)", + "shortText": "anim adipisicing", + "mediumText": "Do minim excepteur aliquip id sit non laboris sint reprehenderit. Consectetur eu pariatur et commodo velit Lorem labore consequat quis reprehenderit commodo nisi. Adipisicing deserunt consectetur non reprehenderit deserunt elit esse elit culpa sunt.", + "longText": "Et ea anim tempor labore magna tempor est deserunt eu ullamco ipsum elit. Dolore nulla ipsum do exercitation. Sit fugiat pariatur ullamco sit tempor amet reprehenderit consectetur magna.\r\nCommodo do exercitation amet deserunt eu ea mollit. Sint labore sint occaecat reprehenderit cillum sint qui pariatur et deserunt adipisicing. Mollit excepteur qui minim culpa tempor ea. Qui esse labore dolore occaecat. Cillum duis dolor id cupidatat veniam non pariatur voluptate deserunt laboris. Quis proident occaecat veniam nulla occaecat proident occaecat ullamco. Aliqua laborum aliqua enim mollit quis.\r\n", + "address": "3 Kensington Street", + "city": "Dana", + "state": "Virgin Islands", + "zip": 96003, + "country": "American Samoa", + "email": "ashleyadams@scentric.com", + "phone": "(903) 572-3575", + "color": "rgb(125,107,131)" + }, + { + "index": 256, + "name": "Turner Franco", + "first": "Norman", + "last": "George", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pinceladasdaweb/73.jpg", + "boolean": true, + "guid": "ab082048-531a-4b8d-8801-29979233e2c1", + "integer": 41, + "date": "Sun Nov 19 1989 19:54:28 GMT-0800 (PST)", + "shortText": "consequat mollit qui aute laboris", + "mediumText": "Sint in reprehenderit commodo ex cillum ipsum est Lorem dolore amet. Eu consequat nisi nostrud est velit et ex cupidatat quis sint duis do. Irure eiusmod amet esse occaecat proident occaecat sit laborum incididunt adipisicing amet enim. Ut ex ut sunt eu eu eiusmod duis do dolor occaecat commodo deserunt exercitation.", + "longText": "Aliqua sit tempor et consequat irure elit incididunt et id sint ex ad ipsum aliquip. Aliqua fugiat sint sint reprehenderit proident pariatur nostrud. Excepteur in do non minim sunt exercitation magna et sint quis aliqua eiusmod Lorem. Nostrud exercitation proident in velit aliqua dolore nisi irure veniam quis adipisicing et excepteur. Duis dolore dolor non et reprehenderit cillum commodo. Deserunt officia labore nostrud anim id fugiat anim ex voluptate dolore esse do commodo sit.\r\nEsse ut sunt commodo sint exercitation consequat ex ea exercitation reprehenderit. Nulla in laboris qui eiusmod adipisicing ex occaecat qui qui culpa aliquip magna quis. Fugiat reprehenderit exercitation ipsum reprehenderit et Lorem cillum. Lorem et dolor minim est et et.\r\nNisi ullamco ea minim ad nulla deserunt eu aute culpa ipsum ut voluptate. Ea cupidatat eiusmod est cillum amet velit aliqua esse sunt cupidatat eu aliqua reprehenderit. Voluptate voluptate proident duis ipsum minim qui. Id ex esse excepteur reprehenderit. Eiusmod adipisicing minim quis laboris aute nostrud irure officia velit fugiat. Ad minim tempor enim commodo exercitation elit cillum proident nulla cupidatat aliqua.\r\nLaboris amet aliqua nisi ut sint ex minim ullamco voluptate in. Sunt consequat ea proident occaecat aliquip est quis officia. Cillum Lorem laboris nostrud aliquip nulla laborum dolore quis aliqua nulla. Anim sint eiusmod ea in Lorem magna aliquip cillum velit.\r\nCommodo sunt nostrud deserunt id mollit do aliqua ullamco incididunt et et sunt sunt ad. Reprehenderit consequat consectetur aliquip non in. Eiusmod dolore id labore voluptate do aute ut et amet tempor tempor. Do irure laborum reprehenderit elit eiusmod cupidatat id sunt. Nisi cupidatat cillum eu sint duis et proident aliquip commodo id minim ullamco. Magna laborum exercitation elit minim dolore irure eu velit commodo Lorem.\r\n", + "address": "2 Fanchon Place", + "city": "Siglerville", + "state": "Puerto Rico", + "zip": 95024, + "country": "Angola", + "email": "normangeorge@scentric.com", + "phone": "(909) 404-3929", + "color": "rgb(236,187,197)" + }, + { + "index": 257, + "name": "Mandy Mann", + "first": "Mccoy", + "last": "Daniels", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chris_gooley/73.jpg", + "boolean": true, + "guid": "119c0379-dc8c-4fdf-a4ca-4dd7e8367fcd", + "integer": 8, + "date": "Sat Jul 18 1970 18:24:18 GMT-0700 (PDT)", + "shortText": "pariatur nulla", + "mediumText": "Sint mollit amet elit consectetur culpa. Exercitation minim laboris culpa reprehenderit est ut deserunt in est eiusmod nostrud nostrud esse. Labore laboris incididunt sit voluptate id ut. In incididunt mollit reprehenderit ea dolor commodo anim aliquip.", + "longText": "In cupidatat enim aliquip velit nisi. Elit deserunt ad excepteur deserunt consectetur nisi proident ea exercitation laboris tempor sunt. Lorem sint incididunt proident mollit est et.\r\n", + "address": "2 Lamont Court", + "city": "Rew", + "state": "Maryland", + "zip": 15110, + "country": "Bhutan", + "email": "mccoydaniels@scentric.com", + "phone": "(912) 520-2618", + "color": "rgb(135,249,131)" + }, + { + "index": 258, + "name": "Arlene Dominguez", + "first": "Felecia", + "last": "Hines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jodyferry/73.jpg", + "boolean": true, + "guid": "280bf6b0-99d1-4792-acc8-8dde2e0f0deb", + "integer": 34, + "date": "Sat Feb 15 1992 18:16:30 GMT-0800 (PST)", + "shortText": "do non", + "mediumText": "Qui velit nulla adipisicing mollit. Officia adipisicing laboris veniam dolor enim eu laboris eu nulla tempor. Id id velit magna anim sint tempor. Voluptate nostrud anim elit laborum ut labore anim reprehenderit. Dolore ipsum do proident quis nostrud fugiat.", + "longText": "Quis veniam reprehenderit nulla quis aute deserunt cillum mollit commodo voluptate consectetur. Officia nostrud nulla tempor nulla. Dolor ipsum eu magna cillum amet velit enim amet voluptate id Lorem velit qui.\r\nProident ex amet voluptate cupidatat laborum. Laboris sint reprehenderit in minim exercitation dolor cupidatat ut proident. Aute consectetur id sunt aute pariatur velit excepteur reprehenderit adipisicing pariatur labore ea nulla mollit. Anim nulla aliqua quis minim exercitation amet sunt nulla commodo est nostrud non tempor veniam. Mollit aliquip officia consequat ex minim voluptate cillum esse. Eu sint adipisicing proident eiusmod adipisicing non. Ut excepteur mollit cupidatat anim elit sint aute magna ullamco Lorem duis dolor ullamco occaecat.\r\nDeserunt esse reprehenderit ullamco cillum velit mollit. Duis aliquip aliquip id incididunt officia magna nisi deserunt laboris magna. Enim exercitation mollit do elit voluptate minim. Sint aute incididunt Lorem nulla.\r\nConsectetur consequat nostrud et voluptate est sint ullamco adipisicing laboris. Do cillum velit enim quis reprehenderit tempor. Enim commodo duis deserunt ex et in. Voluptate Lorem qui amet anim nulla enim. Nisi voluptate do ad ea minim laborum ullamco aute amet velit officia ad et. Consequat dolore pariatur nostrud nisi ut et consequat fugiat. Occaecat aute ea officia incididunt.\r\nConsequat mollit laborum reprehenderit sit minim sunt et. Elit mollit magna in mollit cupidatat enim magna exercitation elit pariatur quis. Amet cupidatat in reprehenderit elit consectetur cillum ea aute ad exercitation quis. Velit enim officia do pariatur ex eiusmod.\r\n", + "address": "3 Howard Alley", + "city": "Corinne", + "state": "Massachusetts", + "zip": 62986, + "country": "Dominica", + "email": "feleciahines@scentric.com", + "phone": "(800) 422-3688", + "color": "rgb(143,174,64)" + }, + { + "index": 259, + "name": "Hollie Boyer", + "first": "Steele", + "last": "Schwartz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/reetajayendra/73.jpg", + "boolean": true, + "guid": "45ab7abb-8d65-4596-9843-554f49ed1ab3", + "integer": 87, + "date": "Sun Jun 06 1971 17:15:13 GMT-0700 (PDT)", + "shortText": "veniam exercitation do est laborum", + "mediumText": "Irure sunt voluptate esse minim dolor adipisicing fugiat occaecat in cupidatat do laborum. Sunt consequat nulla pariatur sit labore velit cillum cillum quis id laboris ipsum.", + "longText": "Adipisicing culpa excepteur excepteur labore. Duis esse occaecat pariatur velit qui fugiat occaecat magna et in duis. Pariatur consectetur dolore culpa esse anim cillum sint ad non adipisicing labore duis. Nisi eiusmod laboris adipisicing ea veniam cupidatat duis ad ut incididunt deserunt cupidatat. Incididunt aliqua cillum mollit dolor amet laboris dolor. Ea laborum qui Lorem duis ipsum deserunt dolore velit adipisicing minim veniam nostrud et. Irure officia Lorem labore irure ullamco.\r\nAdipisicing ullamco exercitation labore in ut. Sunt ex aliquip voluptate dolor qui ipsum est cillum magna. Dolore magna proident officia exercitation. Velit occaecat laborum laboris veniam excepteur nisi duis aliquip dolore. Consequat pariatur elit pariatur eiusmod. Minim occaecat aliquip exercitation sunt nisi dolor elit. Anim esse fugiat commodo minim.\r\nLorem incididunt aute exercitation enim qui aute. Dolore minim do proident laborum sit nulla ullamco excepteur quis sit consectetur dolore nisi. Voluptate Lorem aliqua enim aliqua mollit tempor et laborum ut aute dolor enim. Ipsum laborum anim deserunt aliquip occaecat nisi fugiat esse non cupidatat excepteur ut. Laboris velit Lorem quis aute nostrud elit dolor ullamco eiusmod exercitation. Exercitation eu ullamco cillum Lorem Lorem irure aliqua cillum anim. Adipisicing enim dolore id non enim reprehenderit voluptate velit voluptate Lorem officia.\r\n", + "address": "3 Thames Street", + "city": "Denio", + "state": "Oklahoma", + "zip": 28577, + "country": "Egypt", + "email": "steeleschwartz@scentric.com", + "phone": "(951) 401-2034", + "color": "rgb(203,161,146)" + }, + { + "index": 260, + "name": "Maxwell Levine", + "first": "Rutledge", + "last": "Vang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/namankreative/73.jpg", + "boolean": false, + "guid": "ae81b7e2-6532-41e4-b7a5-0336231f8d86", + "integer": 22, + "date": "Tue Feb 28 1989 01:26:44 GMT-0800 (PST)", + "shortText": "id sunt eiusmod", + "mediumText": "Sunt nulla aliquip ex ullamco magna mollit laborum ea cillum. Ea ad voluptate excepteur dolor tempor nulla pariatur pariatur.", + "longText": "Dolor quis magna dolor id irure laborum cillum irure. Minim ea ipsum ipsum aute officia. Commodo adipisicing aliqua voluptate eiusmod ipsum incididunt quis dolor culpa velit. Id quis duis tempor ipsum cillum do velit adipisicing do excepteur culpa magna laboris. Voluptate enim do id laborum veniam. Excepteur do adipisicing eiusmod ea laboris laborum. Nostrud sunt fugiat ut velit ex magna nisi non magna sint pariatur eiusmod minim.\r\nElit dolore nulla ipsum ullamco deserunt deserunt amet incididunt. Reprehenderit eiusmod adipisicing commodo duis eu id ad esse dolor consequat cupidatat elit. Aliquip eu fugiat consequat non sit nisi quis est id. Proident amet culpa sunt irure nostrud do ad aliqua sunt. Ut amet eiusmod ea eu aute cupidatat minim laboris qui consequat deserunt consectetur quis reprehenderit. Occaecat id proident in amet adipisicing elit tempor esse veniam elit.\r\nAdipisicing qui fugiat nostrud et magna do eu commodo minim excepteur non qui. Magna do do fugiat sint irure elit tempor deserunt. Ullamco aliqua ullamco nostrud qui incididunt cupidatat. Nisi reprehenderit in cupidatat velit et tempor. Lorem ut Lorem elit quis deserunt ut. Aliquip do Lorem eu ipsum amet eu laborum pariatur aliquip minim. Id id eu exercitation consequat.\r\n", + "address": "4 Scholes Street", + "city": "Rodanthe", + "state": "Ohio", + "zip": 39404, + "country": "Chile", + "email": "rutledgevang@scentric.com", + "phone": "(827) 440-2145", + "color": "rgb(207,158,249)" + }, + { + "index": 261, + "name": "Jimenez Mullins", + "first": "Hines", + "last": "Cooley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/paulfarino/73.jpg", + "boolean": true, + "guid": "c3fd3b86-c437-427d-9f1d-0dd5cc03af2a", + "integer": 31, + "date": "Thu Jul 22 1999 00:58:27 GMT-0700 (PDT)", + "shortText": "nisi", + "mediumText": "Eiusmod enim irure cupidatat consectetur aliquip ut labore fugiat exercitation Lorem et irure.", + "longText": "Reprehenderit duis cupidatat duis commodo enim pariatur ut ea ex elit ut adipisicing consectetur. Fugiat fugiat veniam sit esse laborum commodo laboris ipsum magna pariatur. Ipsum laborum proident mollit exercitation labore. Laborum voluptate pariatur eiusmod ad excepteur minim tempor non adipisicing consectetur proident amet.\r\nAute occaecat excepteur voluptate reprehenderit ea. Officia consequat proident et quis aliqua. Dolor et et cupidatat sit consectetur. Aute sit cillum excepteur reprehenderit enim sint voluptate occaecat.\r\n", + "address": "2 Clay Street", + "city": "Lisco", + "state": "Nevada", + "zip": 95904, + "country": "Norfolk Island", + "email": "hinescooley@scentric.com", + "phone": "(871) 552-3958", + "color": "rgb(236,51,80)" + }, + { + "index": 262, + "name": "Lesley Ashley", + "first": "Williamson", + "last": "Glass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/overcloacked/73.jpg", + "boolean": true, + "guid": "a3928300-14e0-42c0-9f8b-600a529a789b", + "integer": 17, + "date": "Wed May 25 2005 15:38:13 GMT-0700 (PDT)", + "shortText": "labore esse pariatur nulla excepteur", + "mediumText": "Eiusmod elit eiusmod deserunt enim irure Lorem sint culpa ea. Esse proident in dolor sit qui pariatur Lorem. Culpa consequat minim ullamco sit culpa voluptate occaecat consequat. Ex ex non voluptate excepteur irure ut consectetur tempor.", + "longText": "Ullamco ex id nostrud esse. Exercitation adipisicing eu est ipsum commodo. Aute aliqua exercitation eiusmod ex nulla. Enim cillum nisi tempor id. Irure proident ipsum commodo reprehenderit tempor eu ut officia labore tempor sit tempor.\r\nFugiat ut sit tempor ut aliquip ea irure. Ullamco irure nulla reprehenderit id amet fugiat. Anim Lorem ullamco ea elit esse nisi id elit occaecat. Elit voluptate aute dolore anim aliquip veniam laborum. Duis esse aliquip aute pariatur fugiat veniam velit anim irure ipsum laboris. Duis nostrud occaecat ipsum eu non mollit. Fugiat exercitation sunt ullamco sunt mollit.\r\nLabore eiusmod mollit voluptate sunt duis id enim excepteur eiusmod elit quis voluptate enim aliqua. Minim nostrud excepteur voluptate ipsum id aliqua esse pariatur consequat. Dolore aliqua Lorem veniam deserunt pariatur tempor do nisi veniam nulla voluptate. Ut velit consectetur deserunt eiusmod cupidatat. Non culpa pariatur enim eu et ut irure labore. Ut nisi aute voluptate excepteur sint culpa ad id adipisicing ut enim.\r\nQui do consectetur laborum laborum ipsum eu ex do fugiat duis est irure sunt sunt. Ullamco in velit minim veniam ea do veniam anim adipisicing in sunt occaecat in aliquip. Aliquip nisi elit fugiat cupidatat enim mollit ex mollit. Aute laborum consequat anim deserunt. Cillum est sint dolor irure laboris ad eiusmod. Lorem aliquip in est et deserunt nostrud est consequat duis ad minim. Magna qui est ullamco sit cillum cupidatat eu amet mollit commodo esse.\r\n", + "address": "4 Village Court", + "city": "Southmont", + "state": "Montana", + "zip": 63679, + "country": "Japan", + "email": "williamsonglass@scentric.com", + "phone": "(915) 505-2620", + "color": "rgb(119,251,208)" + }, + { + "index": 263, + "name": "Robertson Mcintosh", + "first": "Constance", + "last": "Sexton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maysundays/73.jpg", + "boolean": false, + "guid": "0dd239a2-9d56-4eec-a3e1-94411aacdc3f", + "integer": 71, + "date": "Sat Aug 01 1970 03:44:02 GMT-0700 (PDT)", + "shortText": "excepteur ut labore", + "mediumText": "Incididunt proident mollit elit velit sit in ipsum dolor duis ex labore aliqua culpa. Cupidatat amet ea proident ad duis. Id occaecat aliquip quis fugiat dolor aliqua consectetur.", + "longText": "Sunt ullamco culpa quis cillum mollit. Exercitation amet magna magna velit pariatur aliquip laborum ad est cupidatat. Nostrud elit irure ullamco occaecat id. Anim elit laborum ad pariatur occaecat minim tempor ullamco. Deserunt exercitation elit commodo sint reprehenderit sit proident ut labore. Eu eu officia nulla labore aliquip ut ex.\r\nVeniam non tempor laborum ea dolor nostrud laboris cupidatat deserunt sit est. Reprehenderit aliquip sint nostrud eu pariatur laborum ea. Aute id laboris esse in in amet excepteur ea laborum. Cupidatat commodo minim nostrud in aute in aute culpa eiusmod.\r\nAmet dolore commodo aute commodo commodo non voluptate officia elit amet est sint sit. Nulla est occaecat elit magna elit esse mollit cillum anim exercitation. Adipisicing non occaecat nisi irure duis aliquip occaecat culpa consectetur ex mollit aute nostrud. Et mollit nisi ad culpa dolor tempor nisi Lorem culpa aliqua. Sunt ut minim dolore voluptate sit. Minim enim ex elit excepteur voluptate.\r\nProident proident esse commodo qui laboris. Enim laboris cillum fugiat exercitation elit. Nostrud ea labore sit culpa. Reprehenderit amet minim mollit ea nulla duis duis veniam est tempor enim ut proident. Tempor consectetur culpa occaecat exercitation id ea nulla ea. Duis culpa ea labore sint culpa consectetur eu proident esse.\r\nLaborum nulla excepteur commodo sint irure veniam nisi. Duis ex ad anim et anim voluptate commodo eiusmod ea magna ut do magna ut. Mollit anim nulla ullamco et aute excepteur qui aute. Exercitation aliquip proident labore tempor consequat aute officia esse ut dolor eu mollit. Veniam occaecat amet velit in irure Lorem excepteur aliquip sunt sit. Dolor nulla sit ad anim officia cillum minim ipsum ad dolor qui sint. Incididunt velit qui ea fugiat.\r\n", + "address": "3 Driggs Avenue", + "city": "Goldfield", + "state": "California", + "zip": 10392, + "country": "Saudi Arabia", + "email": "constancesexton@scentric.com", + "phone": "(923) 433-2666", + "color": "rgb(246,200,148)" + }, + { + "index": 264, + "name": "Audra Ortega", + "first": "Anne", + "last": "Crawford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_iamnyasha/73.jpg", + "boolean": false, + "guid": "a1000f3b-0edd-4f94-8864-4f0567d089ef", + "integer": 74, + "date": "Thu Oct 19 1978 15:43:40 GMT-0700 (PDT)", + "shortText": "et voluptate", + "mediumText": "Quis nulla minim do deserunt commodo laborum laboris veniam sint pariatur voluptate ullamco eu. Laboris adipisicing ex dolore voluptate ea occaecat duis enim nulla eiusmod.", + "longText": "Voluptate velit duis reprehenderit est tempor dolor dolor deserunt ullamco. Sit proident eiusmod consectetur occaecat dolore in laborum in aliqua id sint. Aute aliqua eu est aliqua officia aliqua minim do sint ullamco voluptate tempor velit ex. Adipisicing mollit velit non cillum exercitation sunt sunt ipsum ex irure laboris ut. Fugiat aliquip aliquip ad deserunt minim minim nisi dolore ea et. Dolore magna fugiat commodo veniam commodo do deserunt. Irure sint reprehenderit nulla sunt est nostrud id do excepteur mollit nostrud ea.\r\nId pariatur nisi eu deserunt nisi minim in deserunt deserunt ex. Adipisicing excepteur officia sint exercitation mollit deserunt non velit ex fugiat laboris id. Sit eiusmod excepteur occaecat id dolore laborum fugiat ea. Commodo velit non incididunt enim aliquip magna irure. Nulla aute ipsum veniam fugiat duis cupidatat et exercitation laboris Lorem culpa. Do reprehenderit ullamco occaecat id veniam sunt non nulla excepteur exercitation.\r\n", + "address": "2 Wallabout Street", + "city": "Waikele", + "state": "Marshall Islands", + "zip": 86465, + "country": "Micronesia", + "email": "annecrawford@scentric.com", + "phone": "(986) 502-2226", + "color": "rgb(235,169,166)" + }, + { + "index": 265, + "name": "Francis Carver", + "first": "Gallagher", + "last": "Britt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/culttm/73.jpg", + "boolean": false, + "guid": "0556fe07-8214-442d-9f9c-08231097de52", + "integer": 6, + "date": "Sun Nov 28 2010 03:23:33 GMT-0800 (PST)", + "shortText": "sint ex in aliquip excepteur", + "mediumText": "Laboris anim ad nulla tempor dolor quis tempor ipsum incididunt eiusmod aute. Ea irure ea laboris irure do et aliquip dolor exercitation excepteur. Exercitation sunt dolor excepteur sunt id quis velit esse non dolore ut nostrud officia.", + "longText": "Ad ipsum minim tempor velit Lorem irure cupidatat. Minim laborum laboris esse sunt voluptate amet amet nostrud sint esse. Irure incididunt et reprehenderit magna. Mollit esse non Lorem excepteur ad. In labore ad minim id commodo tempor non irure nisi.\r\nLaboris ut veniam cillum eiusmod ad ut reprehenderit. Ad pariatur ad ea culpa. Ad est irure enim ex Lorem nulla irure do adipisicing nulla non aute. Fugiat irure quis veniam consequat ea ullamco reprehenderit ipsum.\r\nTempor cillum culpa in sint enim sit irure consequat Lorem labore deserunt. Magna magna est sunt magna mollit laboris minim irure incididunt deserunt. Est pariatur adipisicing reprehenderit mollit ea aute dolor deserunt aute ut proident eiusmod.\r\nIrure in adipisicing culpa pariatur qui aliquip amet id. Veniam deserunt labore mollit in quis. Quis nostrud dolor ullamco ut reprehenderit nisi.\r\nCillum veniam laboris ut nulla commodo est nulla reprehenderit cupidatat. Voluptate adipisicing aute magna dolore consequat dolor enim veniam Lorem incididunt pariatur amet. Qui anim pariatur et voluptate labore incididunt. Amet duis velit eu in proident ipsum culpa et nulla eu Lorem aliquip ut. Lorem fugiat aute veniam Lorem ea sit. Nisi pariatur qui excepteur ad ullamco ea non culpa non incididunt sint ex. Et nulla velit elit adipisicing sit non irure et.\r\n", + "address": "2 Oakland Place", + "city": "Brookfield", + "state": "Indiana", + "zip": 53481, + "country": "Liberia", + "email": "gallagherbritt@scentric.com", + "phone": "(835) 444-3138", + "color": "rgb(204,219,96)" + }, + { + "index": 266, + "name": "Fischer Simmons", + "first": "Gertrude", + "last": "Stephens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pollobrav0/73.jpg", + "boolean": false, + "guid": "829192ff-f636-4781-b023-9f3085717193", + "integer": 31, + "date": "Thu Nov 01 2007 09:01:49 GMT-0700 (PDT)", + "shortText": "et cupidatat ad", + "mediumText": "Ad esse officia proident adipisicing sunt excepteur. Culpa ad sint dolor aute aute est. Proident aliqua fugiat officia mollit. Minim sunt consequat irure ut tempor laborum dolor cupidatat est aliqua consequat et.", + "longText": "Officia non fugiat tempor ad enim dolor. In irure commodo culpa ut Lorem aliqua laborum. Qui in cupidatat consequat eiusmod Lorem occaecat consectetur fugiat quis sit pariatur proident. Lorem sint reprehenderit pariatur eiusmod veniam reprehenderit incididunt. Cupidatat reprehenderit in sit consectetur sint. Et excepteur sit do aliquip ea veniam eu reprehenderit deserunt non sunt magna mollit anim.\r\nAmet cupidatat culpa dolore elit minim adipisicing veniam laboris. Reprehenderit exercitation et et velit qui ea nostrud. Exercitation esse nostrud cupidatat dolor dolor fugiat cupidatat eu magna commodo velit ex.\r\nMagna sint voluptate veniam in occaecat aliquip duis nisi. Aliqua elit veniam ea nostrud nisi id cillum esse ullamco eiusmod reprehenderit culpa. Lorem velit id culpa aliquip voluptate dolore nulla officia dolore mollit in aliquip velit elit.\r\n", + "address": "4 Stoddard Place", + "city": "Whitmer", + "state": "Tennessee", + "zip": 27389, + "country": "Korea (South)", + "email": "gertrudestephens@scentric.com", + "phone": "(940) 497-2705", + "color": "rgb(171,153,217)" + }, + { + "index": 267, + "name": "Boyd Blake", + "first": "Delaney", + "last": "Anderson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlosblanco_eu/73.jpg", + "boolean": false, + "guid": "031a10d0-2fe9-4ef3-af8e-f7b7c611cb73", + "integer": 33, + "date": "Mon Aug 10 1970 14:35:08 GMT-0700 (PDT)", + "shortText": "adipisicing fugiat qui dolore aute", + "mediumText": "Sit sunt pariatur incididunt est aute consectetur quis laboris nisi cillum deserunt in dolore. Sit fugiat labore enim consequat amet elit aliquip adipisicing. In excepteur laboris irure dolor laborum esse id. Minim nulla adipisicing in eiusmod enim dolor pariatur mollit velit amet proident mollit sunt.", + "longText": "Nisi laboris culpa in sit veniam anim nisi pariatur pariatur adipisicing non occaecat reprehenderit ut. Laborum nulla occaecat laboris qui aliqua laborum excepteur excepteur commodo. Fugiat anim proident proident exercitation esse nulla aute. Adipisicing in laborum fugiat eu tempor ullamco qui qui Lorem cupidatat sint ipsum aliqua. Labore commodo amet consequat officia incididunt cillum proident deserunt sint excepteur. Enim nostrud occaecat ipsum sint adipisicing quis sunt pariatur et sunt eu. Veniam nulla cupidatat officia culpa.\r\n", + "address": "3 Branton Street", + "city": "Ada", + "state": "Palau", + "zip": 48926, + "country": "Pakistan", + "email": "delaneyanderson@scentric.com", + "phone": "(879) 508-2698", + "color": "rgb(181,108,214)" + }, + { + "index": 268, + "name": "Foreman Jennings", + "first": "Nieves", + "last": "Browning", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/giakodes/73.jpg", + "boolean": false, + "guid": "f3328487-a346-46cd-986a-180b1336ce46", + "integer": 34, + "date": "Thu Aug 18 1977 11:28:15 GMT-0700 (PDT)", + "shortText": "culpa laborum nostrud proident qui", + "mediumText": "Tempor sunt anim occaecat in irure occaecat enim cupidatat voluptate ex laboris enim. Exercitation fugiat ad eu culpa est pariatur ea laboris aliquip laboris exercitation proident consectetur. Enim officia laboris elit quis. Occaecat fugiat tempor ea labore exercitation irure sint elit sint elit reprehenderit. Cupidatat anim sit eu nulla exercitation Lorem ipsum veniam.", + "longText": "Esse aute reprehenderit enim officia culpa. Reprehenderit duis mollit voluptate exercitation officia Lorem laborum laborum irure pariatur. Exercitation ex laboris magna excepteur qui labore culpa. Ut esse incididunt aliqua incididunt dolor deserunt esse. Et magna magna quis ipsum cupidatat voluptate incididunt aute sint consectetur officia.\r\nConsequat elit nostrud laborum veniam. Pariatur id consectetur duis et id adipisicing velit et ipsum pariatur proident nostrud reprehenderit. Culpa ad amet eiusmod quis reprehenderit aute eiusmod.\r\nPariatur nulla veniam amet sit fugiat ipsum velit fugiat consequat eu irure est labore. Ut veniam excepteur excepteur nisi fugiat. Ipsum enim excepteur pariatur est laboris deserunt aliqua velit fugiat. Irure ut duis laboris culpa quis ad deserunt sunt fugiat adipisicing. Aute est consectetur ad minim deserunt do.\r\n", + "address": "3 Berriman Street", + "city": "Chaparrito", + "state": "Virginia", + "zip": 46246, + "country": "Guyana", + "email": "nievesbrowning@scentric.com", + "phone": "(876) 426-2122", + "color": "rgb(247,203,76)" + }, + { + "index": 269, + "name": "Corine Woodard", + "first": "Santana", + "last": "Everett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/komplexb/73.jpg", + "boolean": true, + "guid": "92e47eb5-8a17-4884-9c8b-2789bc456ed9", + "integer": 84, + "date": "Tue Dec 26 1978 20:05:16 GMT-0800 (PST)", + "shortText": "Lorem aute", + "mediumText": "Qui irure duis reprehenderit duis. Ut consectetur mollit sint sint occaecat id nulla sint aute consectetur anim laborum aliquip commodo.", + "longText": "Ea officia culpa cupidatat enim fugiat mollit in quis excepteur culpa. Tempor et nulla irure nostrud qui adipisicing nulla consequat dolor veniam. Ex qui et duis anim irure laboris.\r\nDo commodo aute ipsum ullamco. Velit pariatur est sit laboris reprehenderit nisi voluptate consequat voluptate laborum sunt dolor velit. Occaecat cillum ex ad anim sint. Voluptate cupidatat magna labore veniam. Cupidatat ea nostrud est ipsum in. Deserunt sint adipisicing incididunt sint labore duis minim velit tempor. Lorem sint anim sunt sunt ipsum esse ea reprehenderit elit dolore aute sint.\r\nMagna commodo cupidatat nisi aute. Qui consequat culpa enim elit minim exercitation qui amet in cillum officia. Amet amet nulla aute elit sit irure pariatur proident est sint labore.\r\nProident dolore ut mollit enim veniam aliqua minim ex voluptate Lorem ullamco amet enim. Officia laborum enim sit aute incididunt nisi nulla magna Lorem officia aute mollit. Ullamco commodo incididunt excepteur sunt. Tempor veniam commodo minim dolore eu dolore est deserunt veniam ullamco.\r\nMagna dolor voluptate sint dolor tempor anim dolore quis aute magna reprehenderit ad. Incididunt fugiat aliqua culpa ullamco quis duis pariatur ullamco consequat voluptate enim velit. Duis aute qui qui voluptate elit ut amet elit anim. Excepteur esse proident laborum occaecat.\r\n", + "address": "4 Melrose Street", + "city": "Chelsea", + "state": "Wyoming", + "zip": 81598, + "country": "Poland", + "email": "santanaeverett@scentric.com", + "phone": "(993) 537-2899", + "color": "rgb(144,158,112)" + }, + { + "index": 270, + "name": "Maria Stokes", + "first": "Chambers", + "last": "Riggs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/migl40d/73.jpg", + "boolean": true, + "guid": "cacd37bf-31ec-400b-bc9e-7ecb3a35d9be", + "integer": 9, + "date": "Thu Feb 06 2003 08:01:13 GMT-0800 (PST)", + "shortText": "veniam magna enim ullamco", + "mediumText": "Eiusmod culpa laboris est consequat in proident eiusmod occaecat consequat sit et mollit. Dolor aliquip anim ex laboris id non occaecat nisi amet eu anim ipsum proident eiusmod. Consequat esse Lorem quis aliquip duis quis minim quis duis. Occaecat commodo nulla minim ipsum do velit laborum consectetur id.", + "longText": "Dolor anim velit labore duis sunt nostrud duis sint ex irure. Voluptate laboris ipsum deserunt nisi voluptate dolor magna. Voluptate veniam amet reprehenderit laborum amet incididunt elit voluptate minim pariatur incididunt aute. Nulla excepteur eiusmod ad amet magna velit eu ea sit do Lorem ex nulla qui. Officia labore ut sint nostrud quis consectetur labore. Et quis voluptate non duis adipisicing quis sunt veniam incididunt velit consectetur.\r\nAdipisicing sit non consequat qui consequat commodo pariatur tempor consectetur. Adipisicing dolore aliquip ipsum nulla in incididunt mollit nulla. Pariatur non cillum do voluptate aliqua non aliquip esse qui voluptate aliquip magna esse. Dolor aliquip esse deserunt velit adipisicing adipisicing. Veniam in dolore do mollit ad exercitation commodo veniam eu. Magna non nulla proident occaecat.\r\nOccaecat magna magna ex culpa. Aliquip commodo laboris amet anim cillum elit officia esse id. Dolor mollit adipisicing velit excepteur anim commodo aute proident sunt. Irure reprehenderit ullamco amet id minim commodo tempor aute exercitation laboris amet incididunt et. Nostrud laborum mollit aliquip non eiusmod sint exercitation eiusmod labore cillum duis enim aute occaecat. Amet aute ea eiusmod dolore. Magna sit veniam nisi ullamco culpa.\r\n", + "address": "4 Jamaica Avenue", + "city": "Lupton", + "state": "Colorado", + "zip": 55948, + "country": "Canada", + "email": "chambersriggs@scentric.com", + "phone": "(825) 422-3231", + "color": "rgb(211,239,230)" + }, + { + "index": 271, + "name": "Montoya Battle", + "first": "Susanne", + "last": "Stein", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erwinhines/73.jpg", + "boolean": false, + "guid": "386137ac-8367-4191-bca0-0385b64defbc", + "integer": 1, + "date": "Tue Feb 18 1986 07:03:21 GMT-0800 (PST)", + "shortText": "aliqua amet", + "mediumText": "Enim aliqua minim ipsum amet incididunt labore nulla labore enim. Esse eu ea occaecat consectetur labore exercitation do ut consequat est dolor Lorem. Do dolor nostrud nostrud labore.", + "longText": "Officia qui tempor cupidatat nostrud sunt cillum qui commodo pariatur non. Aliqua consectetur commodo ad consequat in est nisi. Cupidatat in eiusmod deserunt veniam. Sunt incididunt enim ex sunt aliqua excepteur non quis deserunt magna eiusmod anim. Enim ex proident laborum excepteur ea anim sint. Consectetur anim esse et id ut incididunt sunt officia consectetur sunt anim do ea ipsum. Magna Lorem ullamco ad eu amet deserunt consectetur.\r\nEa consectetur aute laborum commodo irure excepteur ipsum cupidatat reprehenderit duis. Deserunt exercitation labore quis adipisicing amet reprehenderit ad minim esse eu esse. Qui adipisicing aliquip sunt laborum duis occaecat.\r\nPariatur eiusmod nostrud nostrud excepteur non ex anim non do voluptate. Nulla ut deserunt deserunt in aliqua duis laborum ex. Eiusmod eiusmod nostrud esse eiusmod deserunt ullamco adipisicing aute non nulla. Eiusmod eiusmod consequat proident culpa ullamco laborum.\r\nDo non veniam aliquip officia. Amet dolor excepteur qui exercitation voluptate laboris culpa laboris Lorem ullamco fugiat mollit exercitation excepteur. Esse occaecat magna reprehenderit in eiusmod magna fugiat sit occaecat consectetur velit consequat veniam aliquip. Excepteur aliquip ipsum duis sunt enim aliqua elit exercitation eu in cillum deserunt. Qui fugiat exercitation eu elit minim officia minim ex enim adipisicing incididunt ut.\r\n", + "address": "3 Porter Avenue", + "city": "Bentley", + "state": "Utah", + "zip": 67531, + "country": "US Minor Outlying Islands", + "email": "susannestein@scentric.com", + "phone": "(972) 556-2548", + "color": "rgb(176,88,163)" + }, + { + "index": 272, + "name": "Antoinette Cooper", + "first": "Stout", + "last": "Ferrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chelseabeachem/73.jpg", + "boolean": false, + "guid": "b2443100-77a3-48fc-825f-671f2f386da1", + "integer": 35, + "date": "Tue Sep 09 2008 23:36:55 GMT-0700 (PDT)", + "shortText": "tempor mollit", + "mediumText": "Eiusmod aliqua irure velit nostrud dolor nostrud.", + "longText": "Amet voluptate dolor sunt culpa eiusmod ipsum Lorem officia eiusmod est nulla. Ut minim veniam veniam sunt excepteur. Fugiat ut amet deserunt ex voluptate ex. Aute deserunt adipisicing ipsum eiusmod eiusmod duis eiusmod laborum voluptate ut commodo.\r\n", + "address": "2 Cortelyou Road", + "city": "Websterville", + "state": "Idaho", + "zip": 50360, + "country": "East Timor", + "email": "stoutferrell@scentric.com", + "phone": "(884) 588-3785", + "color": "rgb(207,67,59)" + }, + { + "index": 273, + "name": "Chavez Rhodes", + "first": "Jennifer", + "last": "Solomon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bouyghajden/73.jpg", + "boolean": true, + "guid": "cf0294a4-b641-4b2a-94ce-7db7921d670c", + "integer": 62, + "date": "Fri Oct 04 1996 10:43:24 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod", + "mediumText": "Qui dolore nisi ut eu ea duis elit ipsum aliquip aliqua. Sunt cupidatat ut reprehenderit sit nulla laborum consectetur fugiat magna elit esse nulla.", + "longText": "Sit irure nulla excepteur ad velit excepteur exercitation enim eu fugiat deserunt duis. Amet veniam adipisicing aliquip tempor irure. Mollit non culpa amet tempor magna sint esse ad proident. Duis cupidatat nostrud esse veniam pariatur voluptate cupidatat dolor ullamco occaecat magna aliquip sunt esse.\r\nNostrud deserunt proident velit tempor esse exercitation ex ipsum velit proident aute ullamco amet velit. Occaecat veniam sit ipsum do dolore nisi aute occaecat. Amet pariatur occaecat aliqua sint velit aliquip non consequat eiusmod occaecat qui aliquip enim exercitation. Id labore duis quis voluptate nulla aute occaecat. Sunt amet dolore ad minim laborum sit officia amet eu dolore Lorem quis adipisicing esse. Non quis consequat anim nostrud id in in. Sit et esse nostrud quis eu aute excepteur qui.\r\nIrure non sint sint Lorem occaecat quis aliquip exercitation adipisicing amet tempor Lorem sint consequat. Commodo tempor consectetur commodo labore et veniam sunt. Cupidatat commodo anim reprehenderit qui culpa aliqua aliquip enim dolor.\r\nDolore do nisi est exercitation nisi irure et et Lorem sint ullamco non enim duis. Sint nostrud ipsum veniam anim et dolor id amet id fugiat consequat non. Sunt laboris culpa ut deserunt ut ut irure fugiat dolore eiusmod fugiat quis.\r\nDeserunt qui veniam nostrud in nostrud adipisicing sunt veniam consequat consectetur duis esse magna ipsum. Deserunt anim dolore ullamco aute fugiat mollit adipisicing sit exercitation Lorem. Incididunt Lorem duis qui enim adipisicing sint anim. Ex velit ullamco commodo pariatur amet. Sit et voluptate occaecat mollit fugiat pariatur id elit.\r\n", + "address": "3 Ruby Street", + "city": "Goochland", + "state": "Arkansas", + "zip": 63056, + "country": "Denmark", + "email": "jennifersolomon@scentric.com", + "phone": "(852) 542-2938", + "color": "rgb(234,125,93)" + }, + { + "index": 274, + "name": "Sanchez Summers", + "first": "Osborne", + "last": "Buckley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butusai/73.jpg", + "boolean": false, + "guid": "6afd5e1c-3a29-4134-b7a5-7196eb7798a4", + "integer": 76, + "date": "Sat Oct 07 1995 23:24:37 GMT-0700 (PDT)", + "shortText": "enim do voluptate quis sit", + "mediumText": "Quis amet id irure elit eu ad duis id veniam. Qui in mollit in consectetur reprehenderit ex est. Id non tempor minim aliqua commodo dolore do mollit Lorem eu non amet est.", + "longText": "Eiusmod non velit eiusmod adipisicing ut velit est adipisicing in. Eiusmod dolore et non dolore esse velit id anim proident nisi commodo. Amet fugiat magna cupidatat est esse duis et.\r\n", + "address": "3 Seigel Street", + "city": "Thatcher", + "state": "Delaware", + "zip": 98441, + "country": "Yemen", + "email": "osbornebuckley@scentric.com", + "phone": "(930) 530-3501", + "color": "rgb(53,175,123)" + }, + { + "index": 275, + "name": "Melinda Herrera", + "first": "Paula", + "last": "Clemons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ainsleywagon/73.jpg", + "boolean": true, + "guid": "1d0ee711-59d7-4c1f-9420-3fab9a5b62f6", + "integer": 0, + "date": "Sun Aug 23 1970 02:12:34 GMT-0700 (PDT)", + "shortText": "proident laborum dolor magna laboris", + "mediumText": "Minim duis magna cillum dolore excepteur eiusmod eiusmod officia est laboris veniam. Officia amet occaecat esse non dolor. Esse quis labore ad occaecat adipisicing consequat nisi in et sunt excepteur aute consequat.", + "longText": "Mollit magna nulla exercitation commodo excepteur amet. Duis fugiat Lorem mollit adipisicing anim adipisicing adipisicing anim fugiat nulla anim. Eu adipisicing irure Lorem qui enim nisi velit exercitation duis. Aliquip ea labore commodo et nostrud. Aute sit consequat reprehenderit nulla aliquip ipsum esse esse qui exercitation pariatur cupidatat quis cillum. Do esse in ad id est id laboris incididunt.\r\nQui non quis ipsum qui fugiat pariatur. Dolore incididunt sunt eiusmod laboris nisi nulla. Qui fugiat irure consequat culpa ad non do labore commodo ut est velit nostrud. Cillum dolor aliquip elit est enim tempor consectetur. Id nostrud duis et irure nostrud do enim laboris fugiat fugiat eu eiusmod nisi.\r\nCommodo pariatur in officia cupidatat consequat eiusmod ad Lorem dolore enim aliquip elit. Ex in commodo enim sunt eiusmod. Labore consequat culpa quis voluptate aliqua. Fugiat reprehenderit cupidatat esse eiusmod duis consequat. Quis est veniam reprehenderit consectetur cupidatat aliquip in amet dolor.\r\nMagna est esse excepteur sint enim Lorem nisi deserunt pariatur non. Dolor enim officia dolore deserunt consequat quis ea adipisicing cillum aliqua anim laboris irure. In do consectetur est culpa. Sunt occaecat voluptate pariatur dolor id velit magna do veniam duis excepteur ut ad voluptate. Ut excepteur laboris ea ut.\r\nEu eiusmod excepteur reprehenderit duis ipsum commodo ullamco cillum officia incididunt esse eu nulla reprehenderit. Aliquip elit consequat dolor labore. Laborum proident ullamco excepteur dolor esse occaecat et aliqua. Commodo ad exercitation minim ad occaecat ullamco. Veniam id dolor aliquip cupidatat. Voluptate voluptate aliqua nulla aliquip adipisicing fugiat aute laboris quis amet officia magna Lorem labore.\r\n", + "address": "3 Beadel Street", + "city": "Thornport", + "state": "Federated States Of Micronesia", + "zip": 81284, + "country": "Laos", + "email": "paulaclemons@scentric.com", + "phone": "(807) 420-2457", + "color": "rgb(173,67,66)" + }, + { + "index": 276, + "name": "Mara Ortiz", + "first": "Pace", + "last": "Hunter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chadbercea/73.jpg", + "boolean": false, + "guid": "65b9988b-b552-44e7-8e59-7a490e0aa83b", + "integer": 45, + "date": "Wed Oct 25 2006 06:16:29 GMT-0700 (PDT)", + "shortText": "dolor ipsum", + "mediumText": "Dolore laborum non magna voluptate cillum irure ipsum ad eu aute. Proident mollit nostrud laboris ad sunt laboris aliquip quis aute duis id mollit. Commodo qui anim adipisicing anim. Eu deserunt dolor Lorem elit quis laboris nulla enim.", + "longText": "Sunt adipisicing ea dolore ea id veniam eiusmod consequat cupidatat nulla ullamco magna mollit. Excepteur qui do aliquip consequat incididunt fugiat nostrud pariatur eiusmod nostrud quis reprehenderit officia adipisicing. Consequat mollit esse eiusmod culpa qui in officia irure in enim veniam.\r\n", + "address": "2 Broome Street", + "city": "Hobucken", + "state": "Guam", + "zip": 15780, + "country": "Sierra Leone", + "email": "pacehunter@scentric.com", + "phone": "(929) 573-3129", + "color": "rgb(228,124,211)" + }, + { + "index": 277, + "name": "Hannah Mercado", + "first": "Velazquez", + "last": "Snider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/devinhalladay/73.jpg", + "boolean": true, + "guid": "13ecf233-dc36-43ed-8b27-00fa6f367502", + "integer": 53, + "date": "Tue Dec 26 1995 12:29:11 GMT-0800 (PST)", + "shortText": "nulla cillum dolore amet", + "mediumText": "Sunt cillum deserunt ipsum est ea occaecat deserunt ex cillum ut magna do laboris minim.", + "longText": "Nostrud non aute culpa eu consectetur nisi incididunt deserunt deserunt laborum duis ad consequat. Ad tempor mollit duis deserunt anim voluptate reprehenderit proident non dolore anim dolor. Reprehenderit excepteur mollit culpa Lorem dolore. Exercitation incididunt id non esse magna qui nostrud ad.\r\n", + "address": "2 Thatford Avenue", + "city": "Rosburg", + "state": "Pennsylvania", + "zip": 18264, + "country": "Nigeria", + "email": "velazquezsnider@scentric.com", + "phone": "(948) 461-3658", + "color": "rgb(146,114,59)" + }, + { + "index": 278, + "name": "King Murray", + "first": "Lawrence", + "last": "Floyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mateaodviteza/73.jpg", + "boolean": false, + "guid": "48e5fed4-514a-4e9e-8842-57a2e92a654c", + "integer": 33, + "date": "Fri Aug 10 2012 11:19:30 GMT-0700 (PDT)", + "shortText": "consequat", + "mediumText": "Proident nisi exercitation amet reprehenderit cupidatat ad exercitation eu ad nostrud ex sunt.", + "longText": "Elit anim consequat minim officia reprehenderit ex voluptate incididunt Lorem. Incididunt qui incididunt Lorem do pariatur. Id aute anim elit amet labore non eiusmod sint culpa sunt ullamco irure. Adipisicing officia ea ad aliqua. Proident officia occaecat velit est amet pariatur duis esse cillum quis. Et mollit culpa ipsum ad do adipisicing sint amet.\r\nCulpa aliqua do sunt veniam laboris adipisicing pariatur mollit anim. Fugiat cupidatat labore eu eu do ea. Voluptate quis dolore ex quis culpa. Nostrud ea enim elit reprehenderit. Sint veniam commodo officia et quis laboris labore culpa quis ullamco ullamco. Labore occaecat nulla et incididunt consectetur.\r\nSit sit commodo amet cupidatat velit velit qui sint culpa magna magna proident. Adipisicing deserunt anim ullamco eiusmod aliqua laboris aliquip incididunt. Ipsum nisi velit nulla ex elit sit nostrud qui. Magna irure laboris quis Lorem enim culpa. Enim velit enim culpa nisi adipisicing officia voluptate cupidatat qui et. Sit deserunt incididunt ullamco deserunt non aliquip ut laborum Lorem dolor ullamco.\r\nAute esse dolore nisi ut sit fugiat dolore aute aliqua. Aliqua est voluptate enim dolor ullamco quis nisi qui esse nisi tempor do. Do deserunt veniam aliquip qui veniam ex nostrud incididunt culpa in magna non.\r\n", + "address": "3 Hunts Lane", + "city": "Ola", + "state": "New Hampshire", + "zip": 33769, + "country": "Netherlands", + "email": "lawrencefloyd@scentric.com", + "phone": "(813) 569-3499", + "color": "rgb(116,205,80)" + }, + { + "index": 279, + "name": "Camille Massey", + "first": "Short", + "last": "Hensley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vickyshits/73.jpg", + "boolean": false, + "guid": "08757590-e154-4bf1-b5a4-3a8763c63417", + "integer": 8, + "date": "Tue Dec 26 1989 15:35:16 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Sint excepteur adipisicing veniam consectetur incididunt nostrud duis nulla velit laborum. Eu incididunt qui duis deserunt veniam. Culpa mollit nostrud magna dolor reprehenderit esse in consequat irure ad.", + "longText": "Occaecat magna ex ex qui exercitation adipisicing ea aliqua laboris est est adipisicing Lorem dolore. Sunt cillum labore ea amet eiusmod sunt qui. Duis deserunt do irure sit quis voluptate eu duis eiusmod. Ad incididunt anim fugiat esse ipsum aliquip ut cillum tempor eiusmod.\r\nEt Lorem amet cillum ipsum laboris sit deserunt esse duis sit dolore dolor commodo. Labore nulla cillum ad minim proident reprehenderit eu in duis consectetur amet. Aliquip velit nisi culpa ipsum qui sint ut elit id pariatur Lorem anim labore.\r\n", + "address": "2 Greene Avenue", + "city": "Dragoon", + "state": "North Dakota", + "zip": 18599, + "country": "Morocco", + "email": "shorthensley@scentric.com", + "phone": "(959) 437-3887", + "color": "rgb(61,124,231)" + }, + { + "index": 280, + "name": "Etta Nicholson", + "first": "Sadie", + "last": "Johnson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kamal_chaneman/73.jpg", + "boolean": true, + "guid": "445d79d7-84ef-49ef-aaac-2e47925151d7", + "integer": 36, + "date": "Wed Jan 05 2011 12:47:59 GMT-0800 (PST)", + "shortText": "aliquip quis incididunt esse commodo", + "mediumText": "Aliquip ut reprehenderit laboris veniam ad laboris excepteur. Et ut qui fugiat consequat qui aliquip aute incididunt magna non.", + "longText": "Sint anim magna Lorem incididunt tempor esse voluptate commodo qui velit velit aliqua adipisicing. Officia enim excepteur proident non nostrud est quis non quis anim ut irure nulla. Culpa officia velit et magna non sunt culpa laboris nulla enim. Et dolor laborum amet quis occaecat irure. Labore proident ea nulla aute anim do.\r\n", + "address": "4 Chestnut Avenue", + "city": "Boling", + "state": "Northern Mariana Islands", + "zip": 79666, + "country": "Czech Republic", + "email": "sadiejohnson@scentric.com", + "phone": "(929) 469-3200", + "color": "rgb(61,210,234)" + }, + { + "index": 281, + "name": "Roxanne Munoz", + "first": "Marguerite", + "last": "Rodriguez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_yardenoon/73.jpg", + "boolean": false, + "guid": "b7b8e91a-c476-45fb-b728-78461ff01383", + "integer": 59, + "date": "Tue Nov 11 1997 21:52:13 GMT-0800 (PST)", + "shortText": "amet adipisicing dolore Lorem consequat", + "mediumText": "Laborum fugiat anim pariatur minim fugiat sit pariatur exercitation proident. Incididunt ea duis nisi et. Do eu consectetur cillum veniam laboris consequat sunt labore exercitation laborum ipsum do duis sint. Pariatur id tempor cupidatat cillum ad eiusmod. Aliqua dolore enim magna officia tempor consequat Lorem excepteur culpa excepteur.", + "longText": "Occaecat ullamco nisi occaecat consequat consectetur aute in amet. Duis exercitation et ea aliqua elit ipsum ea ipsum laboris aliqua Lorem labore minim pariatur. Amet aliqua nostrud officia ex commodo mollit ex mollit consectetur esse elit sint. Est pariatur irure occaecat aute labore cillum nisi id.\r\nFugiat cupidatat veniam in adipisicing sint sunt cillum consequat in. Quis excepteur ad mollit occaecat et anim voluptate cupidatat. Sunt sit nisi amet excepteur voluptate. Cupidatat do ea fugiat sint minim elit nostrud. Culpa dolore in fugiat pariatur excepteur minim ad incididunt Lorem anim consequat consectetur. Duis est nulla sit eu nulla culpa proident et nostrud nostrud quis laborum dolore. Aute tempor et culpa amet.\r\n", + "address": "3 Box Street", + "city": "Caledonia", + "state": "South Dakota", + "zip": 29414, + "country": "Cape Verde", + "email": "margueriterodriguez@scentric.com", + "phone": "(975) 555-3617", + "color": "rgb(217,168,93)" + }, + { + "index": 282, + "name": "Chandler Mclean", + "first": "Olsen", + "last": "Rollins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/daniloc/73.jpg", + "boolean": true, + "guid": "18eb19e2-f53c-42f3-b3c0-f92ba5058e72", + "integer": 86, + "date": "Mon Nov 05 2012 21:48:32 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Sit magna labore veniam eu dolor.", + "longText": "Laboris pariatur qui esse proident aute in in quis aliquip tempor est Lorem elit nulla. Irure est id cillum in dolore qui mollit ullamco occaecat aute cupidatat culpa. Voluptate est nostrud eu laborum veniam eiusmod culpa eiusmod minim voluptate. Cupidatat cillum eiusmod aute nostrud exercitation est do anim in. Aliquip elit ullamco voluptate incididunt. In minim laboris nostrud nisi est officia proident consequat consequat velit enim ut eiusmod.\r\nSunt ex sunt ipsum dolor proident mollit cillum. In proident eiusmod nostrud cillum occaecat excepteur enim incididunt pariatur incididunt velit deserunt. Ullamco voluptate quis Lorem id qui sit occaecat qui deserunt qui aute eiusmod.\r\nCupidatat eiusmod eiusmod non officia nisi aliquip nulla eiusmod deserunt voluptate qui voluptate magna ad. Duis sit pariatur sint ea enim do esse cillum sit proident sunt. Aliqua deserunt deserunt adipisicing laboris sint voluptate occaecat culpa ipsum ut aute. Nulla amet est et aliquip commodo nostrud in ut laborum qui ullamco id aliqua. Consectetur magna aute aliquip sunt anim occaecat id ex consectetur ipsum. Eiusmod occaecat culpa laborum fugiat. Minim in sunt occaecat eu ex velit sit eiusmod ad reprehenderit.\r\nMinim nulla commodo qui velit proident. Nisi reprehenderit ullamco in in non eu. Enim exercitation voluptate consequat duis non officia quis irure consequat eu anim. Minim Lorem irure eu pariatur aute in Lorem deserunt esse elit officia excepteur. Est eiusmod tempor incididunt consectetur ullamco elit aliquip eu sunt elit eu sint aliquip. Irure adipisicing veniam aliqua incididunt officia esse veniam veniam officia.\r\nOfficia velit nostrud eiusmod ex elit nostrud non veniam commodo exercitation amet. Enim non mollit cupidatat magna aute anim tempor. Consequat ea nostrud esse laboris minim commodo culpa laborum aliqua adipisicing cupidatat sit. Ullamco enim fugiat tempor minim officia ipsum duis et sunt sint.\r\n", + "address": "4 Neptune Court", + "city": "Fillmore", + "state": "Alaska", + "zip": 62131, + "country": "Madagascar", + "email": "olsenrollins@scentric.com", + "phone": "(936) 437-3569", + "color": "rgb(163,129,119)" + }, + { + "index": 283, + "name": "Clements Wynn", + "first": "Dollie", + "last": "Rowland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jamesmbickerton/73.jpg", + "boolean": true, + "guid": "ecf696fd-aa3b-4bed-bdb1-b3b9a18f13f5", + "integer": 24, + "date": "Fri Jan 11 1974 07:17:27 GMT-0700 (PDT)", + "shortText": "consequat voluptate", + "mediumText": "Ut ullamco labore elit exercitation pariatur consequat quis proident. Tempor aute ex consectetur ut eu qui incididunt aliqua anim duis sit. Elit consequat nisi fugiat elit sit nisi eu laborum excepteur nulla proident ex. Eiusmod qui culpa quis velit elit consequat nulla.", + "longText": "Occaecat aliqua sunt velit deserunt mollit fugiat excepteur adipisicing pariatur non amet enim ad. Consectetur aliqua do sint cupidatat nostrud ipsum anim laborum nulla aliquip sit. Labore mollit amet Lorem quis. Ex cillum minim sit eu duis. Nulla sint esse nostrud nisi mollit irure commodo aute esse esse aliquip sunt ut. Ipsum et nulla cupidatat tempor consequat do occaecat ut.\r\nConsequat tempor et qui exercitation non in commodo. Aute minim nostrud laboris dolore reprehenderit. Adipisicing proident esse laborum cillum tempor veniam incididunt minim est adipisicing. Dolor nisi nisi dolore amet ea ipsum mollit amet.\r\n", + "address": "3 Minna Street", + "city": "Gratton", + "state": "Louisiana", + "zip": 90178, + "country": "Austria", + "email": "dollierowland@scentric.com", + "phone": "(992) 594-3916", + "color": "rgb(197,160,174)" + }, + { + "index": 284, + "name": "Cotton Newman", + "first": "Mccullough", + "last": "Oneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ddang33/73.jpg", + "boolean": true, + "guid": "da4451a9-1961-4257-87c6-19aa0c2780d9", + "integer": 24, + "date": "Fri Oct 26 1990 18:43:21 GMT-0700 (PDT)", + "shortText": "id nulla", + "mediumText": "In reprehenderit velit non aute ad mollit aliqua ullamco nostrud adipisicing dolore incididunt. Mollit et consequat eiusmod in laborum nulla in irure qui. Ex consequat est in laboris. Sunt ipsum eu eiusmod quis dolor nostrud sunt consectetur in ea ex commodo. Do enim occaecat labore et occaecat mollit consequat.", + "longText": "Nulla sunt aliqua ea laborum fugiat dolor reprehenderit nisi nulla pariatur minim. Duis aliquip in incididunt sunt sit nulla sunt cillum ut anim elit. Commodo excepteur dolore nisi labore exercitation commodo Lorem veniam anim nisi velit dolor aute.\r\nNulla labore laborum Lorem eu elit consequat eiusmod dolore irure ex. Occaecat enim ea nisi duis aliqua commodo sint sint enim consequat exercitation amet. Cupidatat Lorem culpa quis qui dolore. Proident non eu sint eiusmod id ullamco nisi nisi.\r\nAdipisicing nisi labore aliqua irure occaecat consectetur aute ut mollit ad excepteur. Magna et non laboris velit ipsum. Id et cillum aute nulla consectetur esse est quis culpa consequat. Veniam enim dolore dolore consequat pariatur aute elit consequat. Ipsum ullamco consectetur cillum dolor qui incididunt quis occaecat est proident eiusmod Lorem. Proident excepteur et mollit ipsum culpa duis ut fugiat tempor in ea.\r\n", + "address": "3 Troutman Street", + "city": "Roland", + "state": "Missouri", + "zip": 86860, + "country": "Venezuela", + "email": "mcculloughoneil@scentric.com", + "phone": "(823) 420-3250", + "color": "rgb(251,198,94)" + }, + { + "index": 285, + "name": "Gentry Ellis", + "first": "Bessie", + "last": "Mccarty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/captnphilip/73.jpg", + "boolean": true, + "guid": "0c5c5f6a-c138-49a9-91a2-37523afe47ad", + "integer": 89, + "date": "Fri Jun 03 1983 21:40:24 GMT-0700 (PDT)", + "shortText": "in sint", + "mediumText": "Ullamco ex Lorem dolor cillum sint duis quis consequat consequat. Do ad proident ad deserunt do incididunt tempor qui anim tempor ullamco incididunt eiusmod Lorem. Et ex adipisicing esse sit velit excepteur reprehenderit proident enim. Magna exercitation ullamco commodo culpa fugiat laborum ipsum est ullamco occaecat nisi.", + "longText": "Ut veniam ad exercitation elit in anim nulla fugiat exercitation consequat officia enim. Sint id sunt sit Lorem veniam sint eu occaecat consequat consectetur nulla. Laboris incididunt aute esse duis magna proident cupidatat incididunt incididunt anim irure excepteur nostrud anim. Velit nisi officia pariatur pariatur enim veniam culpa ipsum nulla cupidatat id.\r\n", + "address": "4 Juliana Place", + "city": "Driftwood", + "state": "Kentucky", + "zip": 15926, + "country": "Hong Kong", + "email": "bessiemccarty@scentric.com", + "phone": "(873) 427-3409", + "color": "rgb(81,159,158)" + }, + { + "index": 286, + "name": "Walsh Joyce", + "first": "Antonia", + "last": "Wilder", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rangafangs/73.jpg", + "boolean": true, + "guid": "61dd3458-c773-4f4b-b2bb-3d301963acb2", + "integer": 63, + "date": "Thu Apr 03 2008 20:31:45 GMT-0700 (PDT)", + "shortText": "quis magna nisi", + "mediumText": "Pariatur ullamco mollit aliquip adipisicing dolore reprehenderit nulla in. Et do dolor pariatur est laboris ea amet proident elit proident est. Lorem et est nisi deserunt dolor consectetur cupidatat ea ex sunt. Qui amet veniam reprehenderit mollit adipisicing nulla in do voluptate. Fugiat irure esse proident esse anim Lorem et pariatur dolor.", + "longText": "Aute commodo incididunt eu consequat. Exercitation esse dolor id id in Lorem tempor laboris ex esse. Reprehenderit eiusmod consequat commodo consequat est. Ut magna mollit officia sint minim velit sunt magna commodo occaecat Lorem eu veniam nostrud.\r\nQui eu duis aliquip dolor dolor aliquip. Officia irure proident irure nulla non sint fugiat mollit sunt irure fugiat laborum. Labore non duis voluptate velit magna laborum aliquip officia ea reprehenderit ullamco ut eiusmod eiusmod. Velit sint esse eiusmod exercitation id voluptate veniam occaecat sit id eiusmod.\r\n", + "address": "3 Vandalia Avenue", + "city": "Haena", + "state": "American Samoa", + "zip": 29939, + "country": "Sri Lanka", + "email": "antoniawilder@scentric.com", + "phone": "(871) 452-2870", + "color": "rgb(215,69,234)" + }, + { + "index": 287, + "name": "Espinoza Sargent", + "first": "Lee", + "last": "Mccray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zachbruggeman/73.jpg", + "boolean": false, + "guid": "8d6ab343-c3b7-4878-abfd-02a4bd8c4aad", + "integer": 34, + "date": "Sat Nov 24 2012 16:55:52 GMT-0800 (PST)", + "shortText": "laboris", + "mediumText": "Tempor et laboris nisi in deserunt ea veniam nostrud proident mollit ex nostrud adipisicing minim. Aliqua commodo eiusmod laborum labore. Velit et occaecat laborum aliqua labore culpa elit aute.", + "longText": "Ex labore aliquip voluptate enim Lorem qui cupidatat ipsum velit irure ullamco reprehenderit ad ad. Est enim ullamco velit pariatur eiusmod exercitation minim ex eiusmod laboris irure elit occaecat ipsum. Occaecat culpa dolore id veniam in. Consequat deserunt proident sit ad consequat proident. Dolore do voluptate ipsum eiusmod elit culpa irure in laborum aute. Ad ad dolor deserunt veniam aliqua adipisicing aliqua magna non pariatur dolore qui.\r\nNon in duis aliquip in nostrud magna ipsum ullamco. Reprehenderit do officia ad magna culpa id eiusmod et quis adipisicing nisi sint. Ullamco tempor cupidatat quis aliquip anim velit.\r\nDo id dolore veniam voluptate voluptate in ullamco dolor aliqua. Culpa duis enim eiusmod anim ipsum dolore consectetur velit esse aliqua aliquip amet. Nulla sit nulla et veniam eu. Sint nostrud do irure reprehenderit nulla consectetur in eu est id minim. Incididunt consectetur sint non nisi do anim veniam laboris in ad. Ut commodo elit est et mollit velit sunt dolore enim fugiat nulla voluptate sit irure. Laborum fugiat pariatur ut dolore ut qui minim.\r\nCupidatat nulla elit non ex elit. Deserunt exercitation excepteur nisi enim nulla commodo cupidatat exercitation est incididunt ex aute laboris. Id mollit nostrud veniam eiusmod minim esse nisi amet reprehenderit cillum aute sit fugiat. Nulla ad laboris laborum tempor dolor enim ullamco adipisicing do ipsum. Non reprehenderit sunt consectetur est labore consequat cupidatat cillum voluptate voluptate aliquip. Voluptate consectetur duis ipsum do mollit. Aute deserunt anim tempor veniam exercitation ut.\r\n", + "address": "4 Lombardy Street", + "city": "Thynedale", + "state": "Minnesota", + "zip": 37944, + "country": "Turkmenistan", + "email": "leemccray@scentric.com", + "phone": "(948) 512-3677", + "color": "rgb(124,117,105)" + }, + { + "index": 288, + "name": "Lillie Hewitt", + "first": "Cecelia", + "last": "Roman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/orkuncaylar/73.jpg", + "boolean": true, + "guid": "fd80b277-7170-4ff2-ad97-36272ea38b7d", + "integer": 54, + "date": "Mon Jul 11 1977 01:50:59 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Incididunt reprehenderit Lorem mollit consectetur adipisicing tempor occaecat nulla irure. Non nulla id proident quis est laboris adipisicing id eu id incididunt enim. Elit cillum sit ut elit nisi ea.", + "longText": "Ex adipisicing irure occaecat exercitation excepteur amet est eiusmod elit ullamco. Non tempor sit Lorem laborum laboris veniam elit sunt consequat. Pariatur officia laborum exercitation nostrud esse culpa consequat minim eiusmod voluptate consequat quis ad. Deserunt duis et Lorem labore do irure nostrud sit. Ullamco ad id sint sint cupidatat labore.\r\nEiusmod elit dolor qui nostrud eiusmod. Tempor veniam officia do exercitation. Id Lorem elit aute pariatur nostrud fugiat velit exercitation laboris ullamco irure. Laborum mollit occaecat reprehenderit dolore elit aliqua. Labore irure dolore proident non nisi culpa amet est anim non. Excepteur id veniam cupidatat aliquip ipsum cupidatat voluptate mollit in ut quis. Duis aute sunt fugiat ad consequat aliqua ea dolore esse consectetur non officia minim minim.\r\n", + "address": "3 Chauncey Street", + "city": "Rosedale", + "state": "Hawaii", + "zip": 94656, + "country": "Burundi", + "email": "ceceliaroman@scentric.com", + "phone": "(989) 468-2742", + "color": "rgb(136,244,245)" + }, + { + "index": 289, + "name": "Travis Ballard", + "first": "Georgia", + "last": "Horne", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamnac/73.jpg", + "boolean": false, + "guid": "c91bf011-bcd9-47fd-98b4-255ed2431de0", + "integer": 16, + "date": "Fri Aug 21 1998 11:13:07 GMT-0700 (PDT)", + "shortText": "sint enim fugiat culpa irure", + "mediumText": "Enim mollit ex velit anim ad. Mollit nulla sit est in minim voluptate ea deserunt commodo excepteur.", + "longText": "Consectetur aute officia nisi sint ut enim consequat. Id culpa in velit tempor nulla officia culpa. Ipsum occaecat tempor laborum veniam cillum occaecat consequat veniam. Nostrud aute velit veniam pariatur sint nostrud Lorem ipsum. Occaecat esse ea excepteur consequat exercitation eiusmod exercitation consequat do esse irure deserunt voluptate ut.\r\nConsectetur irure nostrud nulla ipsum fugiat nisi ex eu. Dolor ea deserunt aute cupidatat duis exercitation dolor consectetur do aliquip. Excepteur in ea cupidatat quis fugiat. Voluptate labore id tempor veniam pariatur excepteur ipsum.\r\nMagna qui ad aliqua minim sunt. Non enim eu proident esse dolor dolore elit Lorem dolore labore tempor eu. Incididunt elit esse cupidatat proident do sunt culpa sit elit cupidatat proident. Culpa dolore esse irure magna quis magna officia nostrud culpa dolor do non id. Esse laborum ea consequat commodo fugiat duis. Pariatur enim proident minim cupidatat dolor occaecat irure do. Incididunt dolor magna enim non ipsum minim cillum quis cillum velit culpa eu.\r\nEst esse eu commodo ea sint. Labore adipisicing cupidatat fugiat ea nostrud adipisicing ipsum. Esse eiusmod do tempor cillum sint dolor cillum occaecat incididunt ipsum exercitation sunt. Minim est ex commodo amet id sunt elit ea amet dolor ad. Ad elit exercitation consectetur nostrud elit exercitation irure fugiat dolore occaecat aliqua laborum. Sint sint et cupidatat laboris sunt exercitation ut dolor laborum consectetur minim.\r\n", + "address": "3 Jackson Place", + "city": "Titanic", + "state": "Alabama", + "zip": 30613, + "country": "Western Sahara", + "email": "georgiahorne@scentric.com", + "phone": "(862) 588-3110", + "color": "rgb(87,132,165)" + }, + { + "index": 290, + "name": "Natalie Mclaughlin", + "first": "Christa", + "last": "Whitney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremydowe/73.jpg", + "boolean": false, + "guid": "99003ea4-7908-4727-9909-1fc5a6e1b77d", + "integer": 38, + "date": "Wed Jun 18 2014 21:58:36 GMT-0700 (PDT)", + "shortText": "fugiat", + "mediumText": "Labore cillum ut voluptate laboris ipsum Lorem sint sit ut adipisicing ex occaecat aliquip nostrud. Deserunt officia minim sunt labore excepteur.", + "longText": "Voluptate cupidatat do eiusmod et ex magna nisi mollit veniam consequat fugiat. Velit culpa veniam sint nostrud aute aliquip id commodo consectetur. Reprehenderit aute consequat eu ullamco irure duis excepteur. Voluptate et aute culpa et pariatur sit ullamco deserunt cillum est magna reprehenderit tempor occaecat. Duis elit dolor id Lorem cupidatat sit aliquip. Pariatur aliqua occaecat sit sint in ullamco mollit duis aute proident. Et commodo pariatur nostrud est.\r\n", + "address": "3 Greenpoint Avenue", + "city": "Abiquiu", + "state": "North Carolina", + "zip": 97106, + "country": "Mozambique", + "email": "christawhitney@scentric.com", + "phone": "(882) 546-3928", + "color": "rgb(211,106,204)" + }, + { + "index": 291, + "name": "Sexton Phillips", + "first": "Ebony", + "last": "Riley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamawesomeface/73.jpg", + "boolean": false, + "guid": "79a69d1d-7c62-4f81-8cb4-2933233de8f0", + "integer": 31, + "date": "Mon Oct 28 1985 13:27:05 GMT-0800 (PST)", + "shortText": "duis", + "mediumText": "Duis do ullamco mollit reprehenderit proident labore laborum sint ipsum reprehenderit occaecat anim. Qui nostrud nostrud cillum in cupidatat duis sunt mollit et proident irure aliquip amet. Eiusmod amet elit occaecat ullamco in cillum proident exercitation nulla quis nisi. Velit qui ex nisi officia. Ullamco adipisicing irure sint excepteur aliquip consequat do cillum enim.", + "longText": "Ullamco labore amet est ullamco dolore quis tempor fugiat nulla eu aute duis. Pariatur officia sit Lorem occaecat aliquip nulla dolore incididunt id voluptate consequat sint ad. Tempor ipsum pariatur nisi laboris laboris id reprehenderit mollit est Lorem tempor fugiat dolore.\r\nAliqua et laborum amet proident ullamco velit minim est commodo culpa do ea excepteur anim. Sit qui nulla dolore laborum exercitation id qui id mollit consequat laboris adipisicing veniam anim. Pariatur reprehenderit id aliqua et pariatur nulla officia ex nostrud. Dolore ea do dolor nulla. Reprehenderit velit id eu nulla sunt ullamco eiusmod nulla consequat incididunt anim mollit enim.\r\n", + "address": "2 Moore Street", + "city": "Reno", + "state": "Connecticut", + "zip": 76313, + "country": "Grenada", + "email": "ebonyriley@scentric.com", + "phone": "(930) 448-2157", + "color": "rgb(79,135,188)" + }, + { + "index": 292, + "name": "Lynn Joyner", + "first": "Willis", + "last": "Wall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/low_res/73.jpg", + "boolean": true, + "guid": "0b8fad6f-6113-46f5-b586-19015be0120b", + "integer": 74, + "date": "Mon Oct 24 1988 13:00:24 GMT-0700 (PDT)", + "shortText": "excepteur exercitation", + "mediumText": "In occaecat voluptate officia in fugiat velit proident consectetur nulla tempor.", + "longText": "Amet veniam ex eiusmod ex nulla consequat nulla non duis officia. Reprehenderit esse laborum laboris velit fugiat sint incididunt consectetur nisi Lorem voluptate Lorem tempor quis. Voluptate veniam ea dolor laborum ea nostrud voluptate qui. Deserunt aliqua dolor culpa tempor ex consequat in. Esse est incididunt exercitation ad ex ad est. Aute culpa Lorem cillum est sunt adipisicing tempor eu cupidatat. Reprehenderit velit exercitation sunt adipisicing consequat velit eiusmod.\r\nDuis ex minim Lorem aute labore exercitation ipsum do magna minim. Lorem ipsum dolor laboris non minim. Ex laborum tempor commodo irure cillum dolore est ut sunt dolor excepteur officia pariatur. Labore commodo non anim et pariatur quis officia fugiat duis non id consequat.\r\nTempor ullamco cillum mollit aute id ipsum minim sunt anim aliqua fugiat. Ut incididunt dolore magna duis veniam et elit deserunt ad proident ea ea occaecat duis. Nulla proident consectetur sunt sint ex voluptate incididunt consequat laborum commodo enim do et culpa. Aute consequat minim elit Lorem adipisicing excepteur culpa.\r\n", + "address": "2 Lenox Road", + "city": "Otranto", + "state": "South Carolina", + "zip": 25833, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "williswall@scentric.com", + "phone": "(927) 481-2476", + "color": "rgb(59,194,92)" + }, + { + "index": 293, + "name": "Ursula Pearson", + "first": "Miriam", + "last": "Beck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tomas_janousek/73.jpg", + "boolean": false, + "guid": "376bb50b-cbec-450c-a0c5-400189bf6ebd", + "integer": 27, + "date": "Sat Dec 27 1986 23:08:28 GMT-0800 (PST)", + "shortText": "tempor nostrud", + "mediumText": "Pariatur ex amet nulla ut nisi non sint sint. Labore minim aute id id ex. Consectetur eu aute ad aute irure proident. Tempor tempor velit labore nulla culpa sunt aliquip.", + "longText": "Exercitation culpa do nisi elit sit. Et fugiat mollit incididunt dolor esse consequat. Ut culpa duis sit laboris in enim fugiat exercitation. Nostrud ex qui laboris Lorem magna ea non nostrud ad esse. Et irure esse deserunt reprehenderit incididunt consectetur consequat do sint sunt. Nostrud cillum adipisicing quis duis.\r\nMollit eu officia velit velit ea consectetur fugiat amet nisi. Eiusmod sit culpa tempor fugiat reprehenderit irure proident. Labore laboris occaecat qui laboris ipsum irure sit consectetur consectetur laboris culpa. Minim ad aliquip enim Lorem qui culpa. Minim proident ipsum et ea sunt. Nulla et consectetur esse aute.\r\n", + "address": "2 Beayer Place", + "city": "Snelling", + "state": "Michigan", + "zip": 94691, + "country": "Philippines", + "email": "miriambeck@scentric.com", + "phone": "(829) 585-3891", + "color": "rgb(168,101,180)" + }, + { + "index": 294, + "name": "Hill Aguirre", + "first": "Kelley", + "last": "Myers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jghyllebert/73.jpg", + "boolean": true, + "guid": "34b624b3-92b6-4e5a-b477-c30521137ed1", + "integer": 85, + "date": "Tue Jun 01 2004 12:36:52 GMT-0700 (PDT)", + "shortText": "magna sit", + "mediumText": "Minim in cupidatat ullamco aliquip aliqua in nulla ullamco commodo esse quis sit. Ut aliquip elit cillum ad. Ex exercitation occaecat nulla nostrud elit aliquip nostrud commodo. Velit non cupidatat labore pariatur reprehenderit nulla anim deserunt mollit tempor ad nulla laboris qui. Exercitation aute fugiat quis anim aute.", + "longText": "Laboris id magna culpa aliquip anim nulla adipisicing mollit. Aute ad consequat ullamco in deserunt fugiat excepteur consectetur qui aliqua irure. Veniam ut in proident adipisicing dolore Lorem anim. Lorem veniam enim adipisicing nulla sint esse enim cupidatat. Sit ea ullamco laboris occaecat officia laborum ea do laboris duis velit minim.\r\nLaborum laborum sunt minim ex voluptate do elit ullamco reprehenderit mollit. Aliqua est esse magna aliqua laborum incididunt commodo aute velit esse sint irure tempor. Ut ut cupidatat quis exercitation exercitation. Proident aute id voluptate velit sint anim proident ea officia exercitation. Aliqua do labore veniam duis occaecat commodo. Anim duis elit esse non elit ut.\r\nVeniam minim excepteur consectetur enim ea enim ad nostrud exercitation enim deserunt. Fugiat cupidatat culpa dolore occaecat incididunt non aliquip sint ipsum. Duis velit ullamco consequat et nulla eu reprehenderit ut nostrud enim velit. Voluptate veniam et nulla incididunt aliqua nulla et consequat anim duis qui. Ullamco ipsum velit amet eu proident proident nisi qui aliquip sint. Minim do consectetur laborum laborum reprehenderit quis aliquip ut duis consectetur laboris reprehenderit mollit excepteur. Eiusmod aliquip deserunt aute ex.\r\n", + "address": "4 Garfield Place", + "city": "Enoree", + "state": "Maine", + "zip": 11286, + "country": "Bermuda", + "email": "kelleymyers@scentric.com", + "phone": "(843) 584-2383", + "color": "rgb(122,201,168)" + }, + { + "index": 295, + "name": "Roseann Bryant", + "first": "Jerry", + "last": "Hester", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gkaam/73.jpg", + "boolean": true, + "guid": "b860c080-a929-47e5-a0d0-71451a0c3af2", + "integer": 27, + "date": "Mon Feb 21 1977 02:23:49 GMT-0800 (PST)", + "shortText": "id commodo", + "mediumText": "Nulla reprehenderit laboris culpa aute laborum excepteur voluptate ullamco id. Consequat ut veniam occaecat officia dolore do. Laborum exercitation reprehenderit nostrud aute ut do. Esse laborum sit Lorem sint do mollit.", + "longText": "Dolore in cupidatat officia sunt. Sunt elit labore nisi est laboris dolore veniam. Esse pariatur in ex magna veniam aute.\r\nReprehenderit dolor nostrud amet reprehenderit sit nulla veniam ea id irure sit cupidatat laborum. Consectetur labore eiusmod magna ea esse ut exercitation voluptate eiusmod do. Ut cupidatat officia fugiat irure anim eu eu cillum minim ex ullamco.\r\nLabore reprehenderit culpa laboris irure cillum aliqua. Labore velit esse officia duis Lorem veniam fugiat laboris exercitation reprehenderit anim est incididunt qui. Cillum velit excepteur duis ullamco officia amet. Velit reprehenderit Lorem est pariatur culpa in amet quis nostrud nisi proident ex ex. Laboris aliquip nulla anim mollit mollit ea amet quis amet nisi et culpa nostrud. Magna esse in sit cillum eu sunt anim sit officia culpa ea aliqua ipsum. Excepteur ex ullamco quis in reprehenderit ex id sint commodo dolor tempor.\r\n", + "address": "2 Classon Avenue", + "city": "Harmon", + "state": "Kansas", + "zip": 61846, + "country": "Benin", + "email": "jerryhester@scentric.com", + "phone": "(890) 533-3064", + "color": "rgb(137,53,240)" + }, + { + "index": 296, + "name": "Darlene Brady", + "first": "Cindy", + "last": "Aguilar", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmetalpbalkan/73.jpg", + "boolean": false, + "guid": "1701f080-0b5d-4b9b-b030-9e4c5f307453", + "integer": 65, + "date": "Thu Aug 06 1981 04:50:44 GMT-0700 (PDT)", + "shortText": "minim", + "mediumText": "Reprehenderit aliquip consequat ut aliqua exercitation dolor ipsum cillum elit pariatur. Pariatur nisi laborum cupidatat eiusmod cillum exercitation pariatur magna eu sunt. Dolore culpa ut non occaecat.", + "longText": "Do occaecat do quis qui laboris veniam. Non minim eiusmod est do exercitation eu commodo irure sint deserunt nisi anim. Aute ex ea culpa fugiat sit labore ut incididunt tempor et aliqua culpa sint. Duis cillum laborum officia eiusmod qui veniam laborum incididunt. Cillum ullamco sint nostrud reprehenderit velit consectetur nostrud exercitation aute elit nisi velit occaecat ex.\r\n", + "address": "4 Fountain Avenue", + "city": "Bennett", + "state": "Iowa", + "zip": 74097, + "country": "Lithuania", + "email": "cindyaguilar@scentric.com", + "phone": "(812) 401-3316", + "color": "rgb(232,141,62)" + }, + { + "index": 297, + "name": "Patty Barr", + "first": "Ferguson", + "last": "Estrada", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/Silveredge9/73.jpg", + "boolean": false, + "guid": "fd87de9f-318b-4a1a-81e7-568f64e7c526", + "integer": 98, + "date": "Thu May 21 2009 02:11:35 GMT-0700 (PDT)", + "shortText": "excepteur excepteur esse culpa", + "mediumText": "Duis quis id elit culpa aute occaecat occaecat mollit culpa commodo ad labore laborum. Aliqua ea dolor Lorem ad laboris deserunt.", + "longText": "Ex in occaecat enim voluptate ex nisi officia. Id nostrud adipisicing sint commodo do proident minim sint tempor Lorem. Fugiat aliquip quis anim tempor laborum nisi voluptate minim non incididunt sint in. Aliqua dolore deserunt qui id eu cillum cillum ex nulla laboris nostrud eiusmod dolore. Qui dolor ullamco dolore proident aliqua.\r\nMagna consequat ex sunt occaecat enim deserunt dolor. Proident deserunt enim nulla eiusmod esse ea. Laborum aliquip nulla ipsum elit non pariatur nisi anim veniam amet aliqua. Ullamco cillum deserunt ex consectetur. Esse ex fugiat dolor ea ullamco dolor sit non. Esse eu occaecat dolore quis ipsum. Labore sint qui veniam fugiat est laboris sit.\r\nEst sint do veniam cillum occaecat aliqua ut sit Lorem consequat irure nostrud excepteur. Veniam dolore Lorem et nostrud quis esse est. Reprehenderit cillum laborum occaecat anim Lorem culpa sit aliquip consectetur ut enim eiusmod irure. Qui eu non eiusmod enim cillum sint in laborum sunt ipsum eiusmod enim est. Et labore occaecat dolor aliquip anim esse pariatur. Labore sit incididunt deserunt dolore ad deserunt. Lorem deserunt ex cillum qui amet adipisicing dolor eiusmod culpa id.\r\nEnim fugiat excepteur in ut ex pariatur pariatur sunt deserunt Lorem proident. Ipsum eu enim fugiat est ut ipsum do sint proident ipsum esse deserunt. Culpa minim duis ut aliquip sint sunt velit dolore amet. Consectetur enim enim velit velit non commodo velit nulla cupidatat laborum. Aliqua duis sint cupidatat excepteur adipisicing. Laboris proident irure aliqua esse irure aliqua ex consectetur.\r\n", + "address": "4 Monitor Street", + "city": "Clarksburg", + "state": "Vermont", + "zip": 44637, + "country": "Virgin Islands (British)", + "email": "fergusonestrada@scentric.com", + "phone": "(896) 548-2171", + "color": "rgb(100,112,105)" + }, + { + "index": 298, + "name": "Cunningham Flores", + "first": "Barbra", + "last": "Weiss", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_rennerlisa/73.jpg", + "boolean": false, + "guid": "c5081ce2-b967-4d87-9edd-e1b2d4d029cb", + "integer": 58, + "date": "Wed Nov 21 2001 11:50:05 GMT-0800 (PST)", + "shortText": "duis deserunt voluptate", + "mediumText": "Ea enim eu sit eu officia esse sunt. Consequat consequat exercitation officia incididunt consequat exercitation veniam do aute duis eiusmod irure velit. Anim labore ut exercitation excepteur irure incididunt laborum. Adipisicing et pariatur sit officia dolor laboris. Duis ipsum amet ipsum sit labore ipsum elit aliqua eiusmod.", + "longText": "Labore esse consectetur dolor veniam tempor incididunt ipsum aliqua velit laborum dolore Lorem in. Duis proident occaecat Lorem eu officia labore ullamco duis Lorem. Eu deserunt amet laboris aliqua anim sunt aliqua. Occaecat pariatur proident fugiat officia in dolore mollit consectetur dolore officia fugiat esse. Proident culpa veniam sit commodo. Quis sunt in velit id magna tempor est. Velit veniam aliquip cupidatat sunt quis veniam et minim.\r\nLorem ut fugiat in sit eiusmod officia in ad ad culpa culpa. Sit occaecat qui laboris labore amet magna irure ut ut anim esse incididunt ut velit. Dolor minim id reprehenderit reprehenderit labore. Dolore sint ipsum esse ut ex. Dolor esse est Lorem Lorem commodo veniam minim. Eu laborum amet labore nostrud cillum sint aliqua pariatur laborum ullamco consequat do. Quis proident in sunt laborum officia qui aliquip.\r\nIn cillum do cupidatat qui sint. Irure aliqua dolor proident esse tempor cupidatat laborum cillum. Culpa laboris nostrud esse eiusmod.\r\nReprehenderit non duis amet dolore excepteur ad et. Officia magna quis ipsum fugiat eu in nostrud labore culpa. Ullamco ullamco duis irure sit dolore amet aute non dolor adipisicing.\r\n", + "address": "2 River Street", + "city": "Wedgewood", + "state": "Nebraska", + "zip": 20486, + "country": "Jordan", + "email": "barbraweiss@scentric.com", + "phone": "(828) 488-2896", + "color": "rgb(86,115,171)" + }, + { + "index": 299, + "name": "Bobbi Salas", + "first": "Ines", + "last": "Howell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kulturpessimist/73.jpg", + "boolean": false, + "guid": "3bfa3d64-c2c0-4ea1-9111-2f9ca46c2a87", + "integer": 81, + "date": "Mon Jan 06 2014 11:35:59 GMT-0800 (PST)", + "shortText": "elit nostrud", + "mediumText": "In anim nulla tempor Lorem sunt in enim fugiat eiusmod occaecat aliquip eiusmod aute.", + "longText": "Consectetur excepteur pariatur officia esse cupidatat duis do excepteur nostrud id deserunt. Veniam ad consequat nostrud id fugiat cupidatat sint sunt cillum aute commodo dolore adipisicing. Eu dolor exercitation ullamco enim consequat ad pariatur incididunt. Nisi dolor eiusmod reprehenderit non. Culpa ex labore cupidatat mollit incididunt veniam qui ipsum commodo sunt. In qui aliqua tempor excepteur ut ea cillum.\r\n", + "address": "2 Cypress Court", + "city": "Kiskimere", + "state": "Florida", + "zip": 33788, + "country": "Nicaragua", + "email": "ineshowell@scentric.com", + "phone": "(959) 501-3404", + "color": "rgb(139,215,118)" + }, + { + "index": 300, + "name": "Alice Cooke", + "first": "Dillon", + "last": "Goodwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/picard102/73.jpg", + "boolean": true, + "guid": "b536f301-48d7-4e68-90a9-c9d3caf00547", + "integer": 95, + "date": "Mon Jan 13 1992 21:08:29 GMT-0800 (PST)", + "shortText": "amet dolor ut consequat", + "mediumText": "Laborum excepteur esse qui sint. Enim ullamco amet anim commodo sunt incididunt dolore. Pariatur mollit esse consectetur fugiat ex esse voluptate enim.", + "longText": "Occaecat duis sit labore magna. Aute veniam ex reprehenderit irure dolor. Aliquip dolor quis sint eu do sunt commodo nulla cillum. Non minim fugiat nulla amet ullamco ipsum ex. Nulla incididunt proident labore veniam aliquip duis fugiat fugiat laboris nisi anim. Aliqua aliqua aliqua elit excepteur magna esse non ipsum mollit qui sint irure magna labore.\r\nId commodo sunt officia sit aute dolor consectetur et eiusmod deserunt mollit est magna laboris. Est laborum nulla in ex adipisicing veniam. Nisi anim ut dolore cupidatat fugiat eu. Eiusmod et culpa ex quis fugiat nostrud culpa. Excepteur ipsum enim excepteur minim esse aliquip elit amet aliquip incididunt Lorem. Quis laboris officia pariatur nisi ad sunt pariatur mollit cillum eu nostrud nulla. Ad ea excepteur est sint aliqua minim sint voluptate magna tempor nostrud pariatur duis.\r\nEu laboris ea esse adipisicing est veniam sint elit eiusmod. Consectetur voluptate eiusmod do anim reprehenderit pariatur aliqua ullamco voluptate nulla commodo aliqua id. Voluptate deserunt irure Lorem velit amet consectetur amet deserunt. Excepteur id esse eiusmod cupidatat laborum fugiat. Ea labore et amet non.\r\nAmet ea aute magna tempor. Duis voluptate culpa voluptate culpa ut irure. Adipisicing laborum deserunt nulla amet magna velit est nisi do pariatur nulla culpa laboris. Amet proident voluptate cillum ullamco cupidatat. Elit est incididunt sint fugiat tempor.\r\nEiusmod exercitation voluptate laborum laboris laborum aliquip magna esse mollit cupidatat magna excepteur do. Magna tempor excepteur ex dolor. Pariatur sunt duis minim duis aute cupidatat qui in anim qui. Do nulla anim reprehenderit deserunt nostrud enim dolore ad eu eu eiusmod irure duis culpa.\r\n", + "address": "4 Vanderbilt Street", + "city": "Disautel", + "state": "New Jersey", + "zip": 93269, + "country": "South Africa", + "email": "dillongoodwin@scentric.com", + "phone": "(884) 433-3460", + "color": "rgb(218,70,51)" + }, + { + "index": 301, + "name": "Bianca Miles", + "first": "Eddie", + "last": "Lambert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/e_zrra/73.jpg", + "boolean": false, + "guid": "d469f64f-4779-4372-ae48-a5c5546cc282", + "integer": 69, + "date": "Sat Feb 23 1974 14:20:00 GMT-0700 (PDT)", + "shortText": "proident mollit ad ipsum eu", + "mediumText": "Id sint adipisicing nostrud nulla velit amet ullamco Lorem adipisicing sit in ipsum. Ad ex ut nostrud exercitation pariatur proident ullamco esse ex quis id aliqua elit. Culpa et laborum enim laboris.", + "longText": "Consectetur reprehenderit qui velit proident ipsum voluptate Lorem. Nisi sit consectetur irure do occaecat tempor cupidatat dolor deserunt excepteur velit. Culpa incididunt veniam consequat veniam ex nisi nulla deserunt. Reprehenderit aliqua nisi enim in fugiat magna consectetur officia aute elit commodo mollit. Quis ipsum eiusmod fugiat ut consequat amet do eu.\r\nExcepteur magna deserunt qui ut esse duis commodo nostrud magna adipisicing culpa ullamco proident enim. Laboris aliquip non dolor in enim quis eu. Ex non cupidatat nostrud sit ut ea et ex irure tempor sint excepteur sit fugiat. Id cupidatat elit amet sit ullamco sint tempor sit tempor. Incididunt Lorem magna veniam occaecat duis aute minim duis sint.\r\nCillum pariatur non esse amet incididunt. Consectetur veniam aliquip consequat id consectetur enim excepteur dolore ullamco enim sunt elit ea eiusmod. Eiusmod aute veniam nostrud irure sunt pariatur irure magna exercitation irure adipisicing consequat enim. In et ex occaecat occaecat velit. In id qui aliquip nisi nostrud anim laborum nulla magna exercitation esse aliquip culpa amet. Exercitation tempor adipisicing culpa sit eu est fugiat consequat. Laboris minim nulla nisi labore enim sint consequat pariatur.\r\nPariatur occaecat culpa voluptate exercitation velit esse excepteur. Exercitation eiusmod et enim labore. Sunt sunt qui non ipsum nostrud nostrud veniam dolor velit velit qui. Anim qui reprehenderit ut quis mollit cillum. Eu dolor reprehenderit excepteur do ipsum eu. Proident veniam cillum qui in ex cupidatat duis anim deserunt consectetur Lorem eu. Incididunt consectetur eiusmod mollit dolor cupidatat adipisicing adipisicing est.\r\nVeniam ad ipsum fugiat occaecat laborum est culpa mollit ipsum Lorem. Ut ullamco quis amet adipisicing pariatur fugiat qui labore labore consectetur tempor adipisicing proident. Proident tempor reprehenderit ut ea dolor Lorem nisi. Labore adipisicing commodo ad eu sit nulla cillum. Adipisicing veniam Lorem ex nulla labore ad excepteur aliquip cillum Lorem. Ea incididunt proident ullamco incididunt tempor esse est. Incididunt quis nostrud deserunt irure sit do.\r\n", + "address": "2 Oriental Boulevard", + "city": "Cobbtown", + "state": "Wisconsin", + "zip": 11605, + "country": "Mexico", + "email": "eddielambert@scentric.com", + "phone": "(946) 553-2155", + "color": "rgb(90,142,67)" + }, + { + "index": 302, + "name": "Gracie Fuentes", + "first": "Cecilia", + "last": "Page", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/voldy333/73.jpg", + "boolean": false, + "guid": "55c8f54a-2927-4fc0-b0c6-4f8f5ef1107c", + "integer": 93, + "date": "Wed Aug 26 2009 01:27:46 GMT-0700 (PDT)", + "shortText": "culpa est", + "mediumText": "Aliquip consequat exercitation est sit magna sunt cillum occaecat. Nulla qui aute non eu exercitation.", + "longText": "Amet elit in ullamco aliqua proident dolore quis excepteur tempor ut. Lorem aliqua ipsum labore fugiat voluptate duis anim sunt dolor enim do proident non. Magna aliqua exercitation cupidatat fugiat non deserunt qui laborum cupidatat nisi.\r\nCommodo ullamco incididunt est dolore ad sint culpa sunt dolor enim. Esse consequat consectetur eiusmod dolore Lorem eu aliquip minim id exercitation incididunt. Fugiat aliquip non in commodo ex consectetur eiusmod reprehenderit exercitation aute. Aliqua ut occaecat adipisicing sint duis mollit cillum id sunt pariatur tempor proident aliqua. Culpa exercitation non dolor id laborum labore duis dolore ex duis mollit veniam sit. Ut id est ipsum anim labore do ex tempor anim laboris consequat eu commodo. Cillum do Lorem aliqua Lorem in sunt non ullamco velit aliquip.\r\nUllamco minim quis eu consequat. Et labore irure adipisicing cillum fugiat in in. Pariatur amet in dolore ipsum amet consectetur veniam commodo esse dolore. Nostrud sit aliquip ipsum incididunt enim commodo qui irure. Occaecat nostrud consequat aliquip ex labore excepteur nostrud velit labore et amet nulla dolor. Ea exercitation nulla sint magna aute aute enim labore enim exercitation. Est dolor ipsum mollit aliquip sunt voluptate amet veniam ullamco.\r\nEiusmod ea aute pariatur pariatur et tempor. Veniam eiusmod incididunt ullamco nulla. Esse excepteur culpa veniam sunt. Aliquip duis amet laboris qui est nostrud consequat. Fugiat incididunt laboris aute Lorem ea laboris consequat nostrud mollit duis. Reprehenderit consequat dolore labore nostrud non eiusmod tempor consequat nostrud ipsum adipisicing.\r\nTempor cillum reprehenderit consectetur elit incididunt exercitation. Sint anim eu enim ullamco adipisicing nostrud et sunt sit nulla quis et non quis. Ut eiusmod elit dolor ea commodo reprehenderit non. Sint duis commodo excepteur ad ad laboris exercitation dolore proident quis. Eu laborum exercitation consequat mollit esse. Aute tempor ipsum veniam exercitation labore culpa duis qui.\r\n", + "address": "2 Lloyd Court", + "city": "Roy", + "state": "Washington", + "zip": 84762, + "country": "Sudan", + "email": "ceciliapage@scentric.com", + "phone": "(834) 596-3524", + "color": "rgb(96,136,83)" + }, + { + "index": 303, + "name": "Marion Mcleod", + "first": "Valerie", + "last": "Snow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jasonmarkjones/73.jpg", + "boolean": false, + "guid": "c9e129b1-7fdd-4a79-82ea-ec24bd138ccb", + "integer": 3, + "date": "Sun Dec 28 2008 07:30:23 GMT-0800 (PST)", + "shortText": "incididunt culpa anim officia", + "mediumText": "Eiusmod laborum aute culpa incididunt reprehenderit quis sunt minim culpa proident non proident ex. Ea mollit pariatur in voluptate Lorem ullamco ea fugiat deserunt laboris magna quis commodo Lorem. Irure sunt commodo proident id adipisicing irure deserunt ad ullamco eiusmod deserunt tempor sint labore. Eiusmod fugiat commodo aliquip excepteur nisi irure deserunt esse.", + "longText": "Est consectetur adipisicing est officia. Fugiat esse dolor qui aliquip aute est eu irure excepteur incididunt. Consectetur qui nulla culpa ea cupidatat labore adipisicing. Consectetur aliquip reprehenderit anim magna nulla Lorem proident consectetur mollit consectetur fugiat et deserunt magna. Incididunt culpa Lorem velit ut fugiat irure dolore enim nulla ut. Commodo elit enim incididunt deserunt incididunt officia.\r\nNostrud sit ipsum non elit proident fugiat aliqua culpa aute nostrud. Occaecat amet duis enim aliquip dolor aute anim nulla duis duis commodo sunt nisi. Amet ex eiusmod commodo veniam aliquip Lorem enim irure elit pariatur esse.\r\nEiusmod et ea aute elit ea ullamco consectetur adipisicing adipisicing sit anim. Cillum ipsum deserunt irure do incididunt tempor aliqua sit tempor sunt sit nisi officia est. Incididunt aliquip amet ex est ea ullamco consequat tempor voluptate ex anim quis officia. Pariatur commodo velit amet deserunt. Aliquip irure ullamco laboris laborum ea duis ea aute elit culpa sit deserunt ad.\r\nDolor veniam Lorem reprehenderit nostrud culpa excepteur pariatur eiusmod tempor. Amet nisi excepteur id laborum minim veniam. Nisi laborum aliqua pariatur laboris qui eiusmod nisi deserunt reprehenderit cillum nulla non reprehenderit.\r\n", + "address": "2 Wyckoff Street", + "city": "Brantleyville", + "state": "Oregon", + "zip": 70507, + "country": "Papua New Guinea", + "email": "valeriesnow@scentric.com", + "phone": "(998) 544-3267", + "color": "rgb(187,108,144)" + }, + { + "index": 304, + "name": "Jimmie Rutledge", + "first": "Robbie", + "last": "Morton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/r_oy/73.jpg", + "boolean": true, + "guid": "d8dded94-1c64-4d63-b175-e22679a649ea", + "integer": 98, + "date": "Wed Aug 22 1990 18:30:41 GMT-0700 (PDT)", + "shortText": "labore fugiat exercitation cupidatat ex", + "mediumText": "Cupidatat aliquip reprehenderit officia eu est fugiat deserunt. Fugiat labore do elit quis et nisi culpa. Exercitation labore laborum ad irure deserunt consequat. Commodo do dolor nulla anim aliqua consectetur cupidatat excepteur non minim commodo.", + "longText": "Qui incididunt reprehenderit veniam eu fugiat aute enim ipsum. Quis aliquip ea commodo proident exercitation tempor duis. Non commodo in duis id cillum excepteur eu elit. Deserunt Lorem proident in laboris quis ea et. Cupidatat irure veniam sit incididunt. Dolor ut dolor labore ullamco enim. Qui deserunt ullamco ex aute elit nulla officia sit exercitation.\r\nDo commodo officia esse sint. Aliqua est reprehenderit anim fugiat sunt esse tempor dolor officia dolore veniam ex mollit. Ad ea culpa laboris ea anim commodo. Incididunt sunt reprehenderit non laboris aute magna laborum aute labore aliqua. Esse nulla nostrud id occaecat pariatur laborum ut voluptate. Ex cillum officia cupidatat duis ex Lorem laboris fugiat aliquip in est et incididunt. Veniam laboris commodo nostrud consequat sunt dolore.\r\n", + "address": "3 Hornell Loop", + "city": "Aguila", + "state": "Illinois", + "zip": 50667, + "country": "Romania", + "email": "robbiemorton@scentric.com", + "phone": "(980) 409-3469", + "color": "rgb(235,114,85)" + }, + { + "index": 305, + "name": "Sweet Humphrey", + "first": "Duke", + "last": "Vargas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/boericke/73.jpg", + "boolean": true, + "guid": "e9257b10-4071-40be-a831-77dc11b731e5", + "integer": 25, + "date": "Sun Oct 19 2008 14:12:07 GMT-0700 (PDT)", + "shortText": "duis deserunt ex ad", + "mediumText": "Anim duis quis amet laboris id adipisicing magna. Lorem ullamco magna consequat adipisicing dolor magna.", + "longText": "Velit mollit pariatur fugiat cupidatat veniam est. Laborum non reprehenderit qui in labore nisi. Reprehenderit officia est culpa fugiat dolore non sint consequat duis velit enim do laboris. Cillum reprehenderit consectetur minim nisi consectetur sint culpa pariatur reprehenderit incididunt.\r\nDolore cillum sit enim pariatur sunt duis deserunt nostrud occaecat sit. Aliqua do ut cillum aliquip adipisicing qui. Pariatur culpa velit dolor ut aliqua elit sunt non anim magna deserunt et anim. Irure non aute velit cupidatat labore esse non duis sit qui amet officia voluptate. Deserunt et proident amet anim duis consectetur commodo mollit. Commodo voluptate deserunt eiusmod sit.\r\n", + "address": "4 Carroll Street", + "city": "Sehili", + "state": "West Virginia", + "zip": 80913, + "country": "Bangladesh", + "email": "dukevargas@scentric.com", + "phone": "(978) 506-3898", + "color": "rgb(226,72,213)" + }, + { + "index": 306, + "name": "Rivas Mcmillan", + "first": "Kelley", + "last": "Gamble", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/phanalpha/73.jpg", + "boolean": false, + "guid": "bd339242-0db1-4838-9a8f-198fefcd1392", + "integer": 97, + "date": "Thu Mar 09 1972 11:02:38 GMT-0800 (PST)", + "shortText": "reprehenderit exercitation consectetur officia", + "mediumText": "Id culpa aliqua ullamco ad. Dolor eu cillum minim officia quis occaecat. Labore nulla ea dolore aliquip exercitation enim. Non ipsum dolore Lorem esse incididunt tempor culpa nulla.", + "longText": "Id do duis dolore cupidatat culpa aliquip Lorem cupidatat mollit proident minim sint duis. Reprehenderit dolor incididunt cillum elit esse irure aliquip fugiat ex officia ad cupidatat velit. Ex ea aliquip ea labore id non occaecat mollit nostrud consequat irure cillum minim. Officia quis nostrud dolore quis nostrud esse laborum id magna nulla qui id commodo. Nisi mollit elit elit velit minim cillum sit eiusmod fugiat eiusmod et cillum eiusmod pariatur.\r\nNulla pariatur enim mollit sunt ad excepteur exercitation minim culpa adipisicing. Anim qui adipisicing pariatur aliquip. Proident cupidatat veniam in et est magna labore reprehenderit in. Qui Lorem reprehenderit in in.\r\n", + "address": "4 Fleet Street", + "city": "Nile", + "state": "Mississippi", + "zip": 85536, + "country": "Monaco", + "email": "kelleygamble@scentric.com", + "phone": "(880) 406-2442", + "color": "rgb(60,94,167)" + }, + { + "index": 307, + "name": "Arline Cantrell", + "first": "Maldonado", + "last": "Kaufman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/miguellagran/73.jpg", + "boolean": false, + "guid": "8b28f57b-1d99-4094-a3a5-8ca8bdc0ebac", + "integer": 83, + "date": "Mon Jan 21 1974 10:44:50 GMT-0700 (PDT)", + "shortText": "cillum mollit irure id cillum", + "mediumText": "Duis aliqua fugiat deserunt ad veniam veniam esse fugiat commodo tempor. Non consectetur commodo eu dolore eu veniam. Mollit ullamco ut minim mollit. Qui enim aliqua nisi officia. Ipsum dolore ut adipisicing ea aliqua et ea incididunt consectetur laborum dolore qui fugiat ut.", + "longText": "Excepteur adipisicing cupidatat et aliquip commodo voluptate aute pariatur culpa occaecat reprehenderit nostrud. Reprehenderit occaecat eiusmod ut elit magna occaecat. Et aute duis consectetur dolor ut consequat ad.\r\nProident ad cillum sit ullamco. Labore eu laborum enim adipisicing nisi sunt ipsum in non excepteur quis officia in. Anim anim eu consectetur est sint et quis. Amet amet cupidatat reprehenderit aliquip. Elit voluptate ad anim dolore anim tempor nostrud tempor.\r\n", + "address": "4 Hinckley Place", + "city": "Swartzville", + "state": "Rhode Island", + "zip": 72582, + "country": "Martinique", + "email": "maldonadokaufman@scentric.com", + "phone": "(902) 553-3658", + "color": "rgb(87,176,75)" + }, + { + "index": 308, + "name": "Ortega Terry", + "first": "Muriel", + "last": "Pickett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dustinlamont/73.jpg", + "boolean": true, + "guid": "46a75489-56ac-4c3a-88c3-1bc1b2260321", + "integer": 79, + "date": "Thu Dec 20 2012 17:16:17 GMT-0800 (PST)", + "shortText": "quis laborum", + "mediumText": "Eu eu occaecat esse ad aliquip occaecat tempor dolor veniam sint ut mollit.", + "longText": "Elit labore ex culpa ad consectetur mollit. Dolore velit nostrud consectetur officia pariatur dolore do laboris deserunt cillum id consequat occaecat aliqua. Mollit est sit aute cillum tempor laborum officia. Eiusmod in aliquip est consequat excepteur sunt voluptate do deserunt ea. Tempor non laborum aliqua ad sit culpa consequat laborum.\r\nAmet tempor ipsum et laborum adipisicing non nulla ad. Nostrud in ex incididunt minim et ullamco velit. Voluptate aliquip est culpa exercitation fugiat proident ex elit enim aute excepteur in dolore duis. Cillum consectetur fugiat eiusmod consequat cupidatat commodo aliqua consectetur excepteur mollit voluptate sint. Deserunt ad dolor elit reprehenderit deserunt esse nisi in deserunt est eiusmod exercitation fugiat.\r\n", + "address": "4 Alice Court", + "city": "Whitewater", + "state": "Georgia", + "zip": 58312, + "country": "Kuwait", + "email": "murielpickett@scentric.com", + "phone": "(848) 468-2790", + "color": "rgb(99,60,211)" + }, + { + "index": 309, + "name": "Rosie Beasley", + "first": "Cora", + "last": "Vaughan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrzero158/73.jpg", + "boolean": true, + "guid": "94799d19-471d-4d23-9c9f-44ee2cb25c6f", + "integer": 96, + "date": "Tue Nov 09 1982 16:08:56 GMT-0800 (PST)", + "shortText": "do ea aute", + "mediumText": "Ex aliquip duis quis dolore adipisicing mollit excepteur aliquip consectetur id. Adipisicing eu ipsum cupidatat ullamco voluptate. Duis occaecat occaecat mollit incididunt cillum ipsum id tempor. Officia ex eiusmod pariatur dolore fugiat aute ad. Sit ad non ipsum nulla.", + "longText": "Officia officia ad non commodo anim. Anim ad non ut excepteur voluptate amet consequat Lorem sunt ad. Deserunt enim ad nisi in amet anim anim culpa et officia aute reprehenderit sint eiusmod. Anim laborum occaecat culpa aute ipsum do. Officia irure sit nostrud nulla laborum reprehenderit laboris est ex culpa. Cillum exercitation aute Lorem enim amet commodo amet anim sunt mollit pariatur in consequat.\r\nCupidatat occaecat ex ex pariatur dolore fugiat incididunt velit qui reprehenderit. Ullamco enim nisi deserunt laborum aute. Aliquip duis do enim adipisicing cupidatat. Consequat aute sint non laborum quis laboris reprehenderit aliqua non culpa. Enim est amet nostrud ullamco minim duis eu labore ut magna excepteur.\r\nAmet sint pariatur ad nostrud irure qui do eiusmod irure id ea. Veniam cillum minim excepteur ut quis tempor et officia consequat ut in. Laboris exercitation ad proident esse in tempor exercitation aliqua veniam aute minim.\r\nConsectetur fugiat duis adipisicing dolore et exercitation reprehenderit. Eu nostrud qui veniam non. Voluptate quis nisi reprehenderit non adipisicing amet ipsum irure velit labore nostrud reprehenderit.\r\n", + "address": "3 Canton Court", + "city": "Glendale", + "state": "New Mexico", + "zip": 99043, + "country": "Ukraine", + "email": "coravaughan@scentric.com", + "phone": "(961) 557-2273", + "color": "rgb(111,160,125)" + }, + { + "index": 310, + "name": "Olivia Becker", + "first": "Wyatt", + "last": "Mcneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donaldjohns/73.jpg", + "boolean": true, + "guid": "4c1be78a-e176-445f-93d3-f818ae0d96b0", + "integer": 31, + "date": "Thu Sep 18 1980 04:25:22 GMT-0700 (PDT)", + "shortText": "excepteur labore sint in", + "mediumText": "Sint consectetur anim tempor ea pariatur cillum sit do in exercitation. Aliqua nisi esse laborum voluptate consectetur et amet magna consequat irure anim. Adipisicing veniam veniam id veniam laboris Lorem cupidatat quis pariatur voluptate.", + "longText": "Non et officia eu do eu deserunt tempor dolore velit commodo cillum sint. Consectetur aliqua sunt pariatur sint. Quis esse aliqua elit labore sunt velit officia consequat anim consequat quis mollit id reprehenderit.\r\n", + "address": "2 Menahan Street", + "city": "Lorraine", + "state": "Arizona", + "zip": 11066, + "country": "Guatemala", + "email": "wyattmcneil@scentric.com", + "phone": "(888) 600-2767", + "color": "rgb(65,51,174)" + }, + { + "index": 311, + "name": "Aguirre Mendez", + "first": "Dona", + "last": "Kane", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ah_lice/73.jpg", + "boolean": true, + "guid": "5c63b545-e732-43bc-af3f-32e0c68ad484", + "integer": 76, + "date": "Wed Oct 10 2007 23:01:28 GMT-0700 (PDT)", + "shortText": "voluptate eu cillum anim", + "mediumText": "Culpa voluptate laborum pariatur consectetur sit esse ullamco cupidatat elit adipisicing qui culpa ex. Ut ad tempor ipsum ut quis ipsum. Non officia enim do tempor ad do excepteur velit sit duis mollit aliquip. Dolore aliqua eiusmod commodo nostrud amet cillum dolore.", + "longText": "Ullamco laborum esse mollit aliqua aute deserunt Lorem. Officia eiusmod fugiat exercitation esse consequat commodo veniam. Cupidatat amet non cillum mollit do ut excepteur reprehenderit consectetur eiusmod ut exercitation sit. Sint id irure ullamco quis anim labore. Culpa duis aliquip qui elit ex laborum.\r\nAdipisicing et est culpa deserunt irure. Ullamco ut sit do fugiat. Enim nulla laborum ea anim Lorem eiusmod incididunt eiusmod velit enim incididunt id sit. Consectetur magna ut minim ipsum est commodo cillum cupidatat excepteur. Nostrud minim veniam veniam laborum anim. Nulla consectetur ea nostrud et culpa dolor est.\r\n", + "address": "2 Losee Terrace", + "city": "Fedora", + "state": "Texas", + "zip": 18483, + "country": "Argentina", + "email": "donakane@scentric.com", + "phone": "(876) 594-2112", + "color": "rgb(134,128,159)" + }, + { + "index": 312, + "name": "Holden Shaffer", + "first": "Dana", + "last": "Raymond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "boolean": true, + "guid": "2f0136bc-47e0-4206-b4f4-d87b45b44a4a", + "integer": 94, + "date": "Thu Jul 04 2002 17:43:16 GMT-0700 (PDT)", + "shortText": "quis ex cillum enim", + "mediumText": "Sit incididunt reprehenderit velit elit laborum sint est nulla. Ipsum dolore sit laborum eu occaecat dolor reprehenderit adipisicing nisi. Et aliquip officia fugiat consequat aliquip exercitation.", + "longText": "Deserunt veniam veniam fugiat eu proident aute aute cupidatat pariatur qui non nostrud qui nulla. Consequat quis enim consequat ea minim ex est duis commodo qui exercitation. Ex et mollit ea adipisicing aliqua occaecat nostrud elit minim sint esse. Magna deserunt nulla voluptate aute. Duis ullamco tempor voluptate adipisicing eu veniam ad quis quis enim. Ea adipisicing veniam eu nostrud amet laborum.\r\n", + "address": "2 Lawton Street", + "city": "Durham", + "state": "District Of Columbia", + "zip": 20487, + "country": "Mauritius", + "email": "danaraymond@scentric.com", + "phone": "(836) 540-2790", + "color": "rgb(187,110,242)" + }, + { + "index": 313, + "name": "Cherie Lynn", + "first": "Johnston", + "last": "Head", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "boolean": true, + "guid": "72ab6b5a-bd21-4563-b6b0-ab24cff5caed", + "integer": 80, + "date": "Fri May 10 1974 03:24:27 GMT-0700 (PDT)", + "shortText": "ad enim", + "mediumText": "Ut adipisicing excepteur ex Lorem cupidatat esse ipsum deserunt nisi irure in ut. Quis reprehenderit sunt non amet consectetur Lorem ut sit. Culpa ex laboris pariatur nisi quis qui. Amet in aliquip occaecat quis eiusmod nostrud occaecat consequat consequat.", + "longText": "Adipisicing esse occaecat sint quis nostrud. Sint incididunt elit mollit excepteur dolore. Lorem tempor excepteur occaecat cupidatat voluptate sit officia exercitation laborum. Cupidatat id reprehenderit deserunt minim.\r\n", + "address": "4 Surf Avenue", + "city": "Cleary", + "state": "Virgin Islands", + "zip": 76947, + "country": "St. Helena", + "email": "johnstonhead@scentric.com", + "phone": "(925) 538-2973", + "color": "rgb(59,239,155)" + }, + { + "index": 314, + "name": "Alvarez Byrd", + "first": "Cristina", + "last": "Bullock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "boolean": true, + "guid": "11934487-0dbb-4d2a-bf49-4f9e5938f248", + "integer": 88, + "date": "Fri Mar 12 1993 09:02:34 GMT-0800 (PST)", + "shortText": "veniam ad ullamco", + "mediumText": "Quis labore cillum magna incididunt. Nisi enim magna et tempor voluptate amet aute proident.", + "longText": "Laborum proident non sint cupidatat pariatur occaecat adipisicing voluptate aliquip. Mollit elit ut voluptate eu labore Lorem. Ullamco aliquip commodo do duis labore do aliquip in aliquip reprehenderit occaecat exercitation. Duis cillum voluptate ipsum minim sit commodo occaecat ex ipsum ex. Anim et Lorem ex elit fugiat.\r\n", + "address": "3 Ross Street", + "city": "Dola", + "state": "Puerto Rico", + "zip": 69951, + "country": "Suriname", + "email": "cristinabullock@scentric.com", + "phone": "(847) 528-3630", + "color": "rgb(146,84,109)" + }, + { + "index": 315, + "name": "Gonzalez Freeman", + "first": "Sampson", + "last": "Smith", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "boolean": true, + "guid": "62c47315-656a-41e7-b9b4-7ee380ad77e8", + "integer": 58, + "date": "Sat Feb 15 2003 14:30:07 GMT-0800 (PST)", + "shortText": "sint", + "mediumText": "Excepteur tempor magna eiusmod pariatur anim consequat mollit excepteur nulla duis ut eu esse pariatur. Deserunt cillum amet incididunt nisi ut laboris quis enim labore. Eiusmod cupidatat qui officia ex dolor sint occaecat elit fugiat ex.", + "longText": "Do consequat voluptate duis aliqua Lorem cillum labore. Reprehenderit commodo esse anim aliqua exercitation qui. Elit nostrud officia esse aliquip in eiusmod ipsum duis ullamco. Elit deserunt magna voluptate mollit. Quis dolore esse reprehenderit sunt dolore nulla sunt duis fugiat.\r\n", + "address": "4 Hutchinson Court", + "city": "Utting", + "state": "Maryland", + "zip": 69064, + "country": "Greece", + "email": "sampsonsmith@scentric.com", + "phone": "(829) 445-2244", + "color": "rgb(246,63,201)" + }, + { + "index": 316, + "name": "Wheeler Zamora", + "first": "Bush", + "last": "Dickerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "boolean": true, + "guid": "a91485a2-e0b1-4e16-afa8-afb990283828", + "integer": 25, + "date": "Mon Jun 05 2006 06:35:22 GMT-0700 (PDT)", + "shortText": "sit pariatur", + "mediumText": "Officia minim occaecat nostrud dolor eiusmod. Reprehenderit aliquip esse sint qui deserunt do nostrud proident id est quis minim. Consectetur ad ut tempor anim elit dolore reprehenderit consectetur do culpa minim.", + "longText": "Exercitation officia est aute sunt nisi. Et officia irure eu deserunt enim est nulla. Commodo commodo consequat dolor eiusmod dolor. Aliqua qui consequat cillum velit et minim consectetur duis et culpa velit nostrud laborum. Labore id cillum nulla excepteur voluptate eu velit pariatur anim nulla. Ut qui tempor officia dolore anim enim veniam tempor ex exercitation eiusmod commodo ex ut. Non aute veniam sunt esse culpa non aliqua quis elit culpa elit.\r\nCommodo ut cillum quis laboris aliquip in. Mollit nisi amet cillum nisi laboris est officia. Non laborum fugiat ea non nisi. Et velit incididunt enim magna. Aute anim aute occaecat consequat ipsum Lorem et laboris esse aliquip proident pariatur. Consectetur non consectetur labore laboris ea est.\r\nAdipisicing laborum officia esse reprehenderit nostrud Lorem cillum magna. Labore ad ullamco pariatur irure. Sit ea aliquip ad Lorem ut consequat quis. Eiusmod consequat anim dolor in aliquip est laborum adipisicing incididunt excepteur excepteur laborum duis qui. Sunt consequat voluptate sunt cupidatat nostrud nisi. Ullamco reprehenderit anim est laboris et nulla.\r\nAmet ut dolor nostrud voluptate laboris nisi reprehenderit culpa ea velit mollit nulla. Esse qui sint anim ut incididunt. Nisi mollit ut nisi laborum ut deserunt magna dolor eiusmod. Elit enim sit reprehenderit cupidatat et. Aliqua dolore id fugiat occaecat occaecat ipsum.\r\nEsse fugiat amet quis adipisicing tempor deserunt tempor exercitation excepteur dolore incididunt ex. Laborum adipisicing dolore enim veniam non ut consectetur Lorem ut cupidatat duis id. Incididunt laboris cupidatat adipisicing deserunt fugiat veniam tempor. Fugiat officia eu ullamco magna sunt fugiat consectetur. Occaecat irure proident do officia. Laborum nulla quis non incididunt velit.\r\n", + "address": "4 Campus Road", + "city": "Bethpage", + "state": "Massachusetts", + "zip": 23000, + "country": "New Caledonia", + "email": "bushdickerson@scentric.com", + "phone": "(914) 557-2160", + "color": "rgb(106,245,89)" + }, + { + "index": 317, + "name": "Nadine Heath", + "first": "Dee", + "last": "Burnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "boolean": false, + "guid": "315f838f-f59d-4c6c-bae4-f431576cf508", + "integer": 59, + "date": "Wed Aug 06 1980 08:47:43 GMT-0700 (PDT)", + "shortText": "nostrud labore culpa sint occaecat", + "mediumText": "Dolore irure officia consequat commodo exercitation non et consectetur minim fugiat.", + "longText": "Velit ipsum enim laboris cillum qui quis deserunt laborum. Nostrud voluptate commodo nisi ipsum adipisicing aliqua laborum culpa excepteur minim ex sint. Non minim voluptate pariatur consectetur. Dolor minim aute sint anim exercitation id laborum laborum.\r\nExercitation est ullamco culpa ut cillum commodo minim ipsum qui cupidatat et cillum mollit. Incididunt anim esse veniam veniam. Nulla ullamco ea eu proident laboris voluptate laboris ad in excepteur excepteur qui. Incididunt aute nisi irure quis commodo aute. Elit nisi labore qui sunt est velit anim cupidatat nostrud.\r\nCulpa anim consequat occaecat sunt. Velit commodo deserunt duis proident exercitation ullamco esse fugiat. Ullamco velit elit pariatur ut qui ex. Tempor voluptate labore consectetur id elit. Deserunt occaecat occaecat aliqua ad laborum irure mollit officia fugiat aliqua aliqua irure do. Sit id duis occaecat cupidatat ullamco nulla. Sit laborum eu tempor magna laborum mollit aliquip proident aute anim magna.\r\n", + "address": "4 Bay Parkway", + "city": "Gila", + "state": "Oklahoma", + "zip": 89518, + "country": "Syria", + "email": "deeburnett@scentric.com", + "phone": "(995) 481-3920", + "color": "rgb(158,55,147)" + }, + { + "index": 318, + "name": "Cash Baker", + "first": "Tanya", + "last": "Patton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "boolean": true, + "guid": "4f3b7c6f-78ec-4074-b24d-b1e0788829a9", + "integer": 17, + "date": "Mon Jun 19 1972 16:40:48 GMT-0700 (PDT)", + "shortText": "proident duis eiusmod pariatur", + "mediumText": "Ullamco qui dolore fugiat id ad non.", + "longText": "Sint irure officia do magna eu deserunt non laborum ut qui incididunt est irure voluptate. Amet eiusmod eiusmod ut occaecat reprehenderit sunt irure do aute reprehenderit pariatur laborum consectetur. Proident quis ex reprehenderit aliquip non ullamco ullamco sunt commodo. Nostrud proident adipisicing laborum voluptate sit cillum ad magna id adipisicing cillum fugiat. Anim sit do quis cupidatat reprehenderit tempor pariatur deserunt. Tempor culpa reprehenderit adipisicing ea.\r\n", + "address": "2 Garnet Street", + "city": "Crawfordsville", + "state": "Ohio", + "zip": 65388, + "country": "Rwanda", + "email": "tanyapatton@scentric.com", + "phone": "(912) 427-3358", + "color": "rgb(122,127,173)" + }, + { + "index": 319, + "name": "Sears Conley", + "first": "Boyle", + "last": "Schmidt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "boolean": true, + "guid": "17ce3452-2b9d-4fe3-b1db-7009a74b7e32", + "integer": 69, + "date": "Sat May 18 1996 00:26:16 GMT-0700 (PDT)", + "shortText": "amet consequat", + "mediumText": "Nulla non deserunt elit nostrud dolore elit Lorem sit qui aliqua aute aliquip elit. Mollit aliqua enim velit ea consectetur dolor duis minim ea. Ipsum aute ut labore duis labore nostrud labore. Aliqua proident cillum id cupidatat elit anim nostrud culpa aliquip enim irure nisi qui. Magna sint exercitation ullamco commodo labore sunt ipsum anim nostrud voluptate non et reprehenderit.", + "longText": "Labore irure est cillum sit exercitation nisi ex exercitation ea pariatur ipsum consectetur. Nisi ad qui eiusmod nulla deserunt eiusmod dolor officia magna labore deserunt aliqua. Consequat labore proident cupidatat qui fugiat magna voluptate esse ex nisi officia enim. Ipsum nisi fugiat in proident magna deserunt magna incididunt sint cupidatat Lorem. Sunt veniam consectetur ut ea. Nulla exercitation do deserunt consequat elit aliqua excepteur aliquip laborum mollit ex non. Commodo fugiat occaecat sint tempor dolore ut ex proident amet mollit fugiat.\r\nVeniam ex consequat consectetur incididunt. Qui enim eu incididunt anim. Reprehenderit eiusmod labore consequat pariatur adipisicing esse incididunt quis velit. Pariatur elit amet deserunt eu exercitation cupidatat aute eiusmod anim sit anim est. Adipisicing ea cupidatat sunt labore id amet magna anim pariatur cupidatat. Sint ex sunt nulla elit ut aute laboris deserunt cillum. Consectetur sunt aliqua minim eu commodo nulla tempor anim non cillum quis culpa occaecat.\r\nFugiat veniam qui ut sunt Lorem. Sint elit do deserunt laborum. Voluptate pariatur sit eiusmod labore elit aliqua sunt eu labore id sunt. Officia id non minim cillum. Laboris reprehenderit elit commodo esse exercitation minim aute aliqua esse. Dolor Lorem fugiat non reprehenderit occaecat dolore magna.\r\nMollit velit dolore mollit non consequat ullamco do incididunt nisi. Dolore ex eiusmod ex anim consequat deserunt qui. Culpa laborum laboris adipisicing pariatur duis elit sint consectetur duis. Ut ea consectetur dolore ullamco amet est irure Lorem. Aliqua do reprehenderit id incididunt amet fugiat id amet. Exercitation duis sit pariatur fugiat elit dolore do aliqua culpa anim adipisicing velit aliquip consectetur.\r\nElit ex excepteur do aute enim incididunt. Est eu aute occaecat quis dolor eiusmod quis ut quis fugiat enim id. Duis incididunt esse pariatur voluptate. Velit dolore ut aliqua culpa officia quis esse.\r\n", + "address": "3 Llama Court", + "city": "Murillo", + "state": "Nevada", + "zip": 82006, + "country": "Puerto Rico", + "email": "boyleschmidt@scentric.com", + "phone": "(938) 529-3967", + "color": "rgb(238,104,187)" + }, + { + "index": 320, + "name": "Regina Duke", + "first": "Pacheco", + "last": "Finch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "boolean": true, + "guid": "1cd2ce04-b8d2-4d31-8130-6c88fda8666e", + "integer": 28, + "date": "Sun Sep 22 1974 11:52:41 GMT-0700 (PDT)", + "shortText": "deserunt proident voluptate anim", + "mediumText": "Tempor eiusmod culpa incididunt esse mollit elit anim Lorem magna et occaecat. Quis exercitation aute laboris adipisicing excepteur non consectetur. Eu sunt esse velit sint ad voluptate cillum est. Et adipisicing sunt incididunt incididunt tempor nostrud aute eu occaecat ea.", + "longText": "Qui exercitation commodo sunt nostrud dolor elit labore in laboris. Minim cillum Lorem enim sunt nostrud culpa sint reprehenderit. Cillum reprehenderit occaecat non eu ea veniam aliquip occaecat quis et in eiusmod enim Lorem. Aliquip duis cupidatat aliqua aliquip commodo qui aliqua excepteur ipsum. Lorem labore tempor nisi ut deserunt. Excepteur est sint nulla dolor officia ex ex est in duis magna consectetur. Occaecat anim irure pariatur sit fugiat.\r\nFugiat nulla mollit quis ex deserunt non id anim proident. Officia sint fugiat eiusmod qui fugiat consequat ut magna Lorem. Officia cillum ipsum reprehenderit laboris proident et minim consectetur laboris cupidatat do ea aliqua deserunt. Ullamco tempor elit velit sunt qui in et amet irure aliqua eiusmod reprehenderit. Quis mollit consectetur veniam est ad esse quis nostrud esse magna id minim qui eu. Occaecat elit ullamco in aliqua aute sint. Incididunt qui esse ad voluptate nisi.\r\n", + "address": "2 Fillmore Avenue", + "city": "Riverton", + "state": "Montana", + "zip": 10495, + "country": "Korea (North)", + "email": "pachecofinch@scentric.com", + "phone": "(935) 574-3165", + "color": "rgb(231,59,64)" + }, + { + "index": 321, + "name": "Watts Forbes", + "first": "Crystal", + "last": "Holman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "boolean": true, + "guid": "78f69b15-a996-41aa-be22-2350d747a215", + "integer": 37, + "date": "Sat Oct 27 2001 01:47:57 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Sit sint ut incididunt esse irure do tempor esse est velit aliqua consectetur consectetur fugiat.", + "longText": "Dolore sunt mollit nisi adipisicing esse laboris. Cillum quis mollit voluptate consequat qui cillum sunt incididunt voluptate velit ea. Enim id ut duis minim pariatur. Nulla esse aliqua exercitation aute enim elit proident et ipsum et tempor eiusmod do esse.\r\nAnim id nisi ex occaecat eu ipsum nulla non pariatur sunt ut esse duis do. Exercitation est anim sit eiusmod qui pariatur dolore. Fugiat eu mollit consectetur occaecat duis exercitation deserunt aliqua cupidatat nostrud. Deserunt cillum duis officia nostrud non tempor cillum mollit enim sit. Ad commodo nostrud adipisicing mollit culpa non dolore. Amet pariatur sunt officia irure enim minim ea. Nulla qui id laborum velit cillum incididunt cupidatat duis exercitation tempor tempor sit.\r\n", + "address": "2 Beekman Place", + "city": "Advance", + "state": "California", + "zip": 50813, + "country": "Bosnia and Herzegovina", + "email": "crystalholman@scentric.com", + "phone": "(886) 454-2038", + "color": "rgb(212,198,57)" + }, + { + "index": 322, + "name": "Janelle Leblanc", + "first": "Velma", + "last": "Stone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "boolean": true, + "guid": "84151da3-43cb-4cb5-ac3f-dce5eac66594", + "integer": 10, + "date": "Wed Mar 15 1995 04:06:56 GMT-0800 (PST)", + "shortText": "sit duis", + "mediumText": "Sint incididunt in ex officia cupidatat consectetur fugiat eiusmod labore.", + "longText": "Ullamco non sunt duis duis commodo ipsum ipsum nulla eiusmod irure adipisicing eu tempor. Elit labore magna incididunt est. Officia id incididunt minim pariatur officia consequat sunt. Non ut voluptate proident ipsum. Irure nulla cillum aute exercitation. Aliqua sit eu occaecat minim.\r\nAd excepteur qui est culpa. Mollit in adipisicing duis deserunt minim Lorem tempor nisi tempor enim. Nulla ex aliqua nostrud id. Adipisicing officia nulla amet aliqua non ipsum eiusmod elit ad pariatur labore eiusmod consectetur. Duis sint et aliqua commodo dolor veniam in eiusmod occaecat consectetur.\r\nConsectetur ea voluptate ullamco tempor nisi in. Lorem anim mollit fugiat tempor. Consectetur adipisicing deserunt consequat exercitation reprehenderit exercitation cillum ad anim do. Commodo occaecat ad do et laborum veniam aliqua cupidatat. Et velit ullamco cupidatat nostrud exercitation aute sint ea adipisicing culpa aliquip. Aliquip consectetur dolor ut adipisicing laborum id est magna pariatur amet.\r\n", + "address": "2 Albemarle Terrace", + "city": "Knowlton", + "state": "Marshall Islands", + "zip": 80538, + "country": "France", + "email": "velmastone@scentric.com", + "phone": "(910) 600-2666", + "color": "rgb(84,227,83)" + }, + { + "index": 323, + "name": "Holman Atkinson", + "first": "Myra", + "last": "Ellison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "boolean": false, + "guid": "51f45fc6-fc94-4be1-8769-ac78341d3d69", + "integer": 13, + "date": "Mon Jan 24 2011 03:20:14 GMT-0800 (PST)", + "shortText": "labore sit eiusmod sit", + "mediumText": "Qui ipsum tempor occaecat ullamco Lorem officia voluptate. Consequat cillum ea sunt cupidatat est quis quis pariatur.", + "longText": "Eiusmod fugiat ullamco sunt ea sint eiusmod aute excepteur eiusmod ullamco non nostrud aliqua. Pariatur pariatur aute aliqua nisi nisi amet. Non officia ipsum eu do veniam excepteur ea sit sint consequat. Do sint minim culpa enim ullamco excepteur officia mollit Lorem id commodo culpa est. Laborum ex anim Lorem et. Cupidatat mollit esse do adipisicing.\r\nEu velit ipsum officia ex. Deserunt esse et tempor magna duis ex ut sunt dolore do. Elit labore excepteur aliqua culpa cillum deserunt nulla veniam veniam commodo do mollit.\r\n", + "address": "3 Nova Court", + "city": "Hoehne", + "state": "Indiana", + "zip": 44523, + "country": "Guinea", + "email": "myraellison@scentric.com", + "phone": "(892) 546-2971", + "color": "rgb(252,153,180)" + }, + { + "index": 324, + "name": "Carson Glover", + "first": "Annabelle", + "last": "Reid", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "boolean": false, + "guid": "560ce64c-d4a7-43a1-a119-c815a7d0eddc", + "integer": 43, + "date": "Sun Oct 21 1979 10:07:45 GMT-0700 (PDT)", + "shortText": "qui reprehenderit", + "mediumText": "Ullamco incididunt minim ullamco id exercitation.", + "longText": "In veniam fugiat laboris incididunt excepteur ad proident. Consequat nisi mollit nostrud excepteur sunt laboris mollit voluptate exercitation exercitation tempor velit dolore. Sunt amet aute pariatur tempor adipisicing Lorem consequat pariatur exercitation sit cupidatat Lorem duis culpa. Aute velit exercitation occaecat cillum incididunt fugiat ipsum ut labore tempor mollit velit ad adipisicing. Tempor nisi elit est culpa tempor eiusmod velit enim occaecat tempor excepteur ut veniam. Culpa eiusmod nisi officia quis nulla ipsum laboris magna elit esse exercitation nostrud occaecat amet. Esse anim culpa est esse elit ad velit ad eu do exercitation occaecat adipisicing.\r\nIn duis enim Lorem id ullamco cillum veniam. Nulla sint laboris sint non ad mollit incididunt tempor ea voluptate sint eiusmod. Mollit nisi labore est labore anim laboris irure qui Lorem nulla veniam velit et non. Do occaecat excepteur aliqua in ea pariatur elit incididunt.\r\nDolore eiusmod commodo do commodo sit incididunt deserunt ullamco fugiat eiusmod consectetur ipsum. Fugiat eiusmod consectetur elit aliquip tempor labore cillum. Duis ullamco qui sit consectetur nulla qui amet Lorem occaecat esse tempor eiusmod aute.\r\n", + "address": "4 Lexington Avenue", + "city": "Canoochee", + "state": "Tennessee", + "zip": 16359, + "country": "Senegal", + "email": "annabellereid@scentric.com", + "phone": "(833) 494-3476", + "color": "rgb(56,217,233)" + }, + { + "index": 325, + "name": "Gibbs Good", + "first": "Hendrix", + "last": "Lyons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "boolean": false, + "guid": "2a5302bc-b0dd-4ccc-8688-7df77439ace5", + "integer": 21, + "date": "Thu Jan 01 1976 12:47:48 GMT-0800 (PST)", + "shortText": "aliqua tempor", + "mediumText": "Commodo pariatur enim velit ut reprehenderit in culpa. Culpa nulla ipsum velit est occaecat elit et laborum reprehenderit eu minim do.", + "longText": "Qui quis do nulla sit velit non elit duis exercitation do laboris cillum sit. Eiusmod reprehenderit sit aliqua qui dolor sunt qui commodo. Tempor aute Lorem labore aliqua ea minim duis irure sint non veniam. Ad ex aute reprehenderit nulla aliqua nostrud ullamco Lorem esse aliquip do qui velit. Nostrud elit esse ad duis occaecat culpa. Aliqua officia quis mollit ipsum velit cupidatat sit quis quis ea veniam sit aute ullamco. Laboris et ad cillum veniam nulla fugiat.\r\nFugiat in incididunt minim consequat sit pariatur occaecat reprehenderit aliquip incididunt ullamco eu. Nostrud qui nostrud laboris magna. Aute ullamco veniam consequat nulla aute nulla culpa. Fugiat id mollit ullamco eu enim velit reprehenderit sunt ut est elit fugiat sint veniam. Reprehenderit amet ea anim veniam consectetur proident commodo. Aliquip Lorem amet occaecat cupidatat dolor officia quis pariatur. Sit ea exercitation minim deserunt elit sit excepteur id reprehenderit.\r\nIpsum in tempor culpa esse fugiat mollit esse. Incididunt consequat dolor duis aute cillum ut veniam commodo do fugiat eu culpa fugiat. Enim pariatur reprehenderit elit ex proident aute aliqua. Elit do veniam fugiat in qui quis ullamco esse exercitation tempor non commodo nulla anim. Non Lorem sunt cupidatat aliquip dolor labore laboris Lorem fugiat. Do velit et ipsum pariatur duis sit id consectetur officia occaecat culpa reprehenderit. Nulla est in commodo nostrud ea deserunt duis culpa.\r\n", + "address": "4 Cranberry Street", + "city": "Belgreen", + "state": "Palau", + "zip": 13045, + "country": "Yugoslavia", + "email": "hendrixlyons@scentric.com", + "phone": "(884) 521-3084", + "color": "rgb(234,55,208)" + }, + { + "index": 326, + "name": "Reba Horton", + "first": "Ochoa", + "last": "Reed", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "boolean": false, + "guid": "b51d4b79-1289-46e1-9874-cac40d2a3f4c", + "integer": 89, + "date": "Mon Sep 06 2010 03:05:58 GMT-0700 (PDT)", + "shortText": "sint reprehenderit", + "mediumText": "Consectetur velit id fugiat amet aliquip laboris deserunt. Pariatur officia non Lorem consectetur officia ipsum occaecat sint commodo laboris amet minim ullamco officia.", + "longText": "Deserunt consequat eiusmod commodo qui adipisicing et. Occaecat elit occaecat ullamco eu ea minim cupidatat veniam veniam aliquip tempor laboris. Exercitation duis cupidatat ullamco magna incididunt cupidatat reprehenderit consequat laborum.\r\nOfficia occaecat quis quis fugiat aliquip et. In laborum et pariatur qui consectetur ullamco cillum excepteur voluptate fugiat. Eiusmod nulla elit qui in irure. Nulla enim consectetur proident nostrud.\r\nVeniam sit tempor laboris aute dolor officia laborum. Deserunt ad consequat non nulla dolor eiusmod elit veniam tempor. Esse sint amet nisi et ea labore amet. Officia aliquip pariatur dolore anim dolore culpa esse elit amet aliqua voluptate. Esse elit ex ipsum proident occaecat deserunt non amet reprehenderit. Voluptate anim sunt fugiat consectetur ut quis esse sit.\r\nCillum incididunt sint sit nostrud magna minim anim labore elit adipisicing est ipsum. Laborum ut officia ullamco labore non dolore veniam labore dolor et sint ex duis. Excepteur irure exercitation Lorem occaecat exercitation in consequat. Nulla est excepteur elit qui magna quis nulla laboris amet. Laborum nisi ex enim consequat mollit ullamco magna aliquip occaecat occaecat et elit sunt. Consectetur reprehenderit magna officia do aliquip proident minim. Aute qui officia deserunt labore id in esse aliqua do anim pariatur dolore consequat.\r\nAmet pariatur veniam cupidatat deserunt voluptate aliquip fugiat occaecat eu sit pariatur. Consectetur eu quis proident reprehenderit nisi. Voluptate aliquip quis culpa proident anim culpa esse. Mollit eiusmod magna cupidatat nostrud non ad duis. Laboris reprehenderit amet cupidatat duis sint qui deserunt excepteur amet. Consectetur reprehenderit Lorem esse nisi aliquip incididunt ipsum aute occaecat esse occaecat. Laboris sit Lorem incididunt laborum in.\r\n", + "address": "2 Montauk Avenue", + "city": "Wildwood", + "state": "Virginia", + "zip": 44321, + "country": "Uzbekistan", + "email": "ochoareed@scentric.com", + "phone": "(873) 450-2072", + "color": "rgb(87,106,105)" + }, + { + "index": 327, + "name": "Newton Townsend", + "first": "Cara", + "last": "Armstrong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "boolean": false, + "guid": "396fee22-8931-4acb-9aa0-ef4e3d463f65", + "integer": 32, + "date": "Sun Feb 20 2011 09:27:11 GMT-0800 (PST)", + "shortText": "magna", + "mediumText": "Magna aute elit cupidatat ipsum velit reprehenderit. Occaecat qui fugiat nostrud quis excepteur commodo. Voluptate id consequat laborum mollit exercitation proident voluptate cillum voluptate in. Amet culpa consequat ullamco dolore incididunt consequat aliqua est nulla quis proident culpa.", + "longText": "Enim esse anim veniam est sunt labore ut qui magna cillum fugiat. Labore cupidatat ullamco deserunt veniam elit irure elit quis qui tempor anim et magna. Ex commodo ex adipisicing non laborum. Aliquip ex consequat dolor ut non consequat excepteur. Laboris laborum adipisicing cupidatat est. Id est aliqua laborum mollit incididunt excepteur. Enim commodo in culpa Lorem.\r\nLaborum sunt et exercitation mollit ut nulla aliqua nulla fugiat dolor. Deserunt commodo Lorem eu id adipisicing amet qui reprehenderit eu consectetur aliquip mollit eiusmod. Ad sit anim qui irure et ipsum laboris qui consectetur.\r\n", + "address": "4 School Lane", + "city": "Garfield", + "state": "Wyoming", + "zip": 38497, + "country": "Estonia", + "email": "caraarmstrong@scentric.com", + "phone": "(824) 554-2497", + "color": "rgb(82,224,190)" + }, + { + "index": 328, + "name": "Jenkins Short", + "first": "Castaneda", + "last": "Padilla", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "boolean": true, + "guid": "bf4be80d-f135-468d-adab-23bf03ffb166", + "integer": 12, + "date": "Thu Sep 22 1994 12:13:32 GMT-0700 (PDT)", + "shortText": "et duis Lorem occaecat deserunt", + "mediumText": "Voluptate sint non minim elit. Est tempor tempor tempor nisi id cupidatat sunt.", + "longText": "In esse voluptate velit dolore ullamco in. Deserunt anim fugiat laboris sunt pariatur. Magna veniam ad eu labore aliquip non quis do adipisicing. Quis esse ad nostrud commodo. Non non aliquip sit laboris quis commodo laboris.\r\nPariatur laborum ad in ut et deserunt labore aute sint eiusmod. Voluptate eiusmod est enim quis id culpa aute eiusmod magna deserunt quis sint deserunt tempor. Deserunt quis deserunt enim elit. Esse duis irure eu officia ut tempor in velit in pariatur. Ea aute enim occaecat amet enim nisi excepteur consequat qui ut laboris incididunt tempor.\r\nIpsum enim dolore irure esse incididunt. Voluptate elit qui mollit aliquip ex proident ad adipisicing ipsum. Tempor dolore minim esse esse sint irure pariatur esse.\r\nMagna sunt labore Lorem do laboris duis exercitation aliqua fugiat eiusmod incididunt. Dolor mollit sunt commodo occaecat dolor eu sunt id occaecat sint. Et sunt esse eiusmod veniam nisi magna culpa voluptate nisi esse.\r\n", + "address": "2 Elton Street", + "city": "Gouglersville", + "state": "Colorado", + "zip": 96057, + "country": "Gambia", + "email": "castanedapadilla@scentric.com", + "phone": "(911) 571-2320", + "color": "rgb(80,137,178)" + }, + { + "index": 329, + "name": "Deborah Klein", + "first": "Sandoval", + "last": "Miranda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "boolean": true, + "guid": "9daaa0e4-d04c-4232-a637-24e733f0b9ac", + "integer": 76, + "date": "Sun Aug 14 1994 19:32:54 GMT-0700 (PDT)", + "shortText": "exercitation mollit reprehenderit dolore deserunt", + "mediumText": "Quis sint eu occaecat ex ex amet pariatur deserunt ea magna excepteur. Laborum in fugiat eiusmod amet sunt nostrud officia qui magna id et. Non fugiat eu consectetur veniam tempor. Nostrud proident reprehenderit sint aute nisi aliqua anim enim deserunt id. Labore excepteur sit dolor nisi occaecat velit pariatur id aliquip.", + "longText": "Labore officia tempor adipisicing amet. Aliqua amet deserunt dolore nisi commodo velit aliqua. Eu nisi fugiat minim duis ipsum esse adipisicing eu nulla ex ad.\r\n", + "address": "2 Olive Street", + "city": "Fairview", + "state": "Utah", + "zip": 99892, + "country": "Nepal", + "email": "sandovalmiranda@scentric.com", + "phone": "(808) 578-2445", + "color": "rgb(234,209,129)" + }, + { + "index": 330, + "name": "Tricia Moss", + "first": "Dickson", + "last": "Houston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "boolean": true, + "guid": "f41db055-f748-45e3-9ce3-4d867e00f776", + "integer": 9, + "date": "Mon Jun 15 1992 12:38:40 GMT-0700 (PDT)", + "shortText": "esse consectetur", + "mediumText": "Non nisi ut aliqua ipsum consequat excepteur culpa labore labore. Incididunt adipisicing qui mollit elit eiusmod aliqua aute. Laboris ut consequat consectetur elit aliquip irure enim aute cupidatat. Laboris incididunt id laborum reprehenderit duis nisi consectetur laboris nostrud.", + "longText": "Occaecat mollit reprehenderit tempor veniam consectetur non officia. Laboris consequat velit mollit in quis. Qui dolore excepteur in esse magna cupidatat incididunt eiusmod magna do. Laboris consectetur adipisicing occaecat cillum mollit duis. Officia excepteur exercitation quis consequat deserunt magna officia voluptate officia sint magna quis officia voluptate. Ullamco qui nostrud id incididunt veniam eu Lorem ad voluptate.\r\nConsequat cupidatat laborum sint consectetur. Anim do anim reprehenderit excepteur occaecat duis eu ea ipsum anim non nostrud nulla minim. Voluptate eu id officia consequat minim. Proident nulla qui amet qui veniam mollit non.\r\n", + "address": "3 Russell Street", + "city": "Fruitdale", + "state": "Idaho", + "zip": 49478, + "country": "Falkland Islands (Malvinas)", + "email": "dicksonhouston@scentric.com", + "phone": "(904) 444-3745", + "color": "rgb(237,192,112)" + }, + { + "index": 331, + "name": "Mclaughlin Spence", + "first": "Vicky", + "last": "Montoya", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "boolean": true, + "guid": "b76384d1-fb6b-4500-ad6a-f266c0a380ce", + "integer": 95, + "date": "Tue Apr 18 1995 21:15:18 GMT-0700 (PDT)", + "shortText": "aute aliqua", + "mediumText": "Aliquip ea ad aute pariatur exercitation ex elit.", + "longText": "Labore veniam officia officia dolore. Ea quis et incididunt irure. Ut exercitation proident nostrud eiusmod quis ad. Laboris et Lorem qui quis ullamco dolore minim do incididunt. Lorem dolor fugiat consectetur eu qui nulla est voluptate veniam eu reprehenderit laboris dolore ex.\r\nUllamco Lorem voluptate deserunt ut et nulla cupidatat non et exercitation elit est. Mollit esse aute excepteur eiusmod commodo pariatur. Aute exercitation exercitation duis cupidatat ad pariatur minim anim adipisicing minim esse eu sit laborum. Laboris excepteur eu commodo dolor amet eiusmod. Officia quis reprehenderit dolor laborum non amet pariatur sit. Minim anim minim minim nulla minim ut non adipisicing consequat esse.\r\n", + "address": "2 Carlton Avenue", + "city": "Bend", + "state": "Arkansas", + "zip": 21354, + "country": "Peru", + "email": "vickymontoya@scentric.com", + "phone": "(808) 516-2094", + "color": "rgb(156,150,201)" + }, + { + "index": 332, + "name": "Montgomery Farrell", + "first": "Hayden", + "last": "Maldonado", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "boolean": false, + "guid": "098a567c-1dc4-4f48-aa95-7c039f017b7e", + "integer": 99, + "date": "Sat Jul 30 2005 17:18:13 GMT-0700 (PDT)", + "shortText": "do culpa elit magna tempor", + "mediumText": "Non esse aliqua dolor irure cillum labore excepteur. Amet labore dolor tempor duis quis ullamco proident enim anim incididunt nulla pariatur sit eiusmod.", + "longText": "Cupidatat anim anim cupidatat fugiat Lorem id pariatur excepteur et nisi. Commodo pariatur proident id fugiat consectetur irure velit consectetur ipsum non velit aute adipisicing irure. Do aliqua aute id esse Lorem. Lorem minim incididunt et labore pariatur Lorem ex enim ipsum cupidatat exercitation. Amet aliquip nisi cupidatat laboris eu officia aute velit. Dolor non sit consequat elit eu ut qui occaecat. Proident ut reprehenderit commodo ipsum deserunt ex quis elit.\r\nEsse Lorem deserunt adipisicing esse tempor ad officia sit do officia laborum voluptate. Do voluptate voluptate eiusmod magna in quis minim consectetur. Officia fugiat cillum aliquip et magna esse elit voluptate ea ad officia dolor sint. Ad velit aliqua reprehenderit consectetur quis incididunt nisi.\r\nAute pariatur pariatur aliquip incididunt ut enim id dolor aute sit aute. Elit occaecat labore nostrud enim veniam. Eu laborum mollit quis sit ut incididunt et. Nulla Lorem excepteur culpa ullamco adipisicing est irure reprehenderit cillum tempor cillum culpa ad.\r\n", + "address": "2 Folsom Place", + "city": "Edmund", + "state": "Delaware", + "zip": 95338, + "country": "Tonga", + "email": "haydenmaldonado@scentric.com", + "phone": "(891) 403-3020", + "color": "rgb(131,136,141)" + }, + { + "index": 333, + "name": "Mavis Sanchez", + "first": "Ginger", + "last": "Dale", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "boolean": true, + "guid": "ba039378-7a45-4b1c-8ec3-cb2714651e82", + "integer": 67, + "date": "Sun Dec 13 1992 23:12:22 GMT-0800 (PST)", + "shortText": "adipisicing sint", + "mediumText": "Pariatur minim ipsum aliquip nulla qui voluptate irure irure est anim culpa laboris cupidatat. Enim adipisicing exercitation eiusmod sunt ex ad irure id labore. Aute labore voluptate amet eu. Dolor ea non enim nostrud elit aliqua qui amet aliqua et.", + "longText": "Occaecat mollit pariatur ea nisi veniam. Dolore incididunt dolore commodo incididunt ad ex dolore officia et ea aliqua magna. Ad sunt est proident nostrud consectetur. Ullamco laboris incididunt sit aute aliquip dolor proident tempor duis adipisicing esse pariatur.\r\nDo quis ea proident quis ea aliquip cupidatat culpa elit deserunt consectetur sunt. Anim excepteur aliquip culpa amet minim nostrud laborum proident eiusmod labore culpa est dolor. Amet et fugiat irure nisi commodo tempor irure aliqua nostrud nostrud. Dolore tempor sit laborum anim.\r\nOfficia commodo dolore duis officia do. Eu fugiat quis voluptate sunt excepteur nulla irure quis cupidatat sit quis. Ex irure non cupidatat ex. Sunt qui sit excepteur occaecat mollit velit eiusmod esse dolore aliqua laborum ullamco.\r\n", + "address": "4 Brown Street", + "city": "Comptche", + "state": "Federated States Of Micronesia", + "zip": 91514, + "country": "Tunisia", + "email": "gingerdale@scentric.com", + "phone": "(883) 563-2014", + "color": "rgb(163,218,120)" + }, + { + "index": 334, + "name": "Terrie Peters", + "first": "Adeline", + "last": "Franklin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "boolean": false, + "guid": "7eb5d929-28c8-4d9e-8728-a158423e70eb", + "integer": 69, + "date": "Thu Mar 20 1986 06:50:48 GMT-0800 (PST)", + "shortText": "commodo", + "mediumText": "Nisi nulla enim ad deserunt proident qui. Aliqua duis id ea deserunt. Ut amet adipisicing sint consequat qui ut nisi et sit cillum amet. Velit laboris nulla nisi laborum cillum laborum qui minim velit aute sunt elit culpa aliqua. Adipisicing aliqua nulla proident sit sit laborum ea eu.", + "longText": "Fugiat dolor cupidatat sunt ex quis labore proident esse. Cupidatat exercitation elit do commodo ex Lorem tempor pariatur consequat laboris in elit. Ea cupidatat culpa elit officia nulla pariatur consequat magna incididunt tempor sunt voluptate. Voluptate nisi eiusmod fugiat nostrud dolore occaecat labore esse esse incididunt Lorem aliquip et.\r\nCupidatat consectetur dolor culpa cillum cupidatat occaecat. Dolor mollit nostrud cupidatat aliqua enim cupidatat consequat dolor labore ex nisi excepteur. Elit aliqua quis aliquip magna. Nostrud excepteur officia tempor laboris sunt voluptate proident pariatur. Consequat laboris Lorem id dolore in est sunt cillum irure exercitation id adipisicing minim aliquip. Non est dolore duis deserunt commodo elit amet esse sint reprehenderit. Aliqua quis fugiat elit duis minim exercitation consectetur.\r\n", + "address": "3 Desmond Court", + "city": "Fredericktown", + "state": "Guam", + "zip": 17881, + "country": "Guadeloupe", + "email": "adelinefranklin@scentric.com", + "phone": "(814) 430-3138", + "color": "rgb(186,245,118)" + }, + { + "index": 335, + "name": "Reed Banks", + "first": "Frost", + "last": "Velez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "boolean": true, + "guid": "0ea4f50e-f8d5-4d36-b794-5124c98c0103", + "integer": 38, + "date": "Fri Feb 13 1981 04:31:25 GMT-0800 (PST)", + "shortText": "do adipisicing", + "mediumText": "Sit dolor occaecat sint ipsum. Velit nostrud ea ex officia id minim do minim dolore occaecat duis laborum.", + "longText": "Aute ullamco eu ad quis voluptate dolore qui. Laborum deserunt consectetur dolore ut deserunt amet Lorem ut est duis eiusmod Lorem in. Dolor voluptate aliqua aute cillum exercitation sit deserunt ut cillum cupidatat cillum aliquip mollit voluptate. Aute anim ad nulla minim deserunt dolor ut dolore adipisicing anim laborum deserunt do eiusmod. Id excepteur nisi enim ullamco sunt esse minim velit dolore aliqua. Elit adipisicing laborum est est Lorem quis est.\r\n", + "address": "2 Osborn Street", + "city": "Orviston", + "state": "Pennsylvania", + "zip": 73473, + "country": "Australia", + "email": "frostvelez@scentric.com", + "phone": "(805) 408-3874", + "color": "rgb(61,142,146)" + }, + { + "index": 336, + "name": "Horton Howe", + "first": "Loretta", + "last": "Hudson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "boolean": false, + "guid": "22d30b57-493f-4a7d-9b75-bb3a630d6a21", + "integer": 97, + "date": "Sat Oct 11 1975 04:15:11 GMT-0700 (PDT)", + "shortText": "do enim", + "mediumText": "Ea magna cillum aliqua reprehenderit consequat velit laboris aliqua. Officia laboris nostrud ullamco magna mollit occaecat est velit ea minim veniam tempor esse id. Consequat dolore quis id pariatur velit mollit quis. Quis veniam consectetur ad esse sit amet Lorem anim irure occaecat laborum duis. Aute sunt fugiat anim cillum dolor elit consequat sint magna commodo fugiat laboris.", + "longText": "Ut elit do mollit tempor aliqua duis anim incididunt anim consectetur veniam deserunt enim aliquip. Ad velit ad cupidatat ad deserunt reprehenderit aliqua ut elit sit. Commodo reprehenderit eu do consequat irure enim nisi exercitation qui minim. Minim fugiat culpa excepteur duis ea laborum. Elit occaecat adipisicing fugiat consequat minim cillum commodo laborum labore sunt consequat ut reprehenderit. Veniam non exercitation nostrud magna magna ullamco dolor eiusmod officia enim nisi quis. Enim nisi eu velit excepteur et exercitation irure.\r\nAmet consequat ea proident anim minim sint consequat consectetur sunt nostrud proident ut. Aliquip proident aliqua consectetur occaecat esse magna sunt labore id quis officia pariatur officia excepteur. Occaecat Lorem ut esse irure. Ullamco eiusmod ipsum qui culpa eu esse exercitation ullamco irure elit.\r\nEu consectetur commodo sunt laborum consectetur nulla laboris in reprehenderit id. Culpa dolore deserunt nulla labore cillum enim enim do velit deserunt quis cupidatat tempor labore. Enim proident sunt aliquip dolor laborum labore sint eu cillum. Ut irure quis proident laboris cupidatat et anim anim qui. Nisi reprehenderit eu esse laboris qui excepteur sunt cupidatat eiusmod magna nostrud ipsum consectetur. Non ut amet velit non laboris fugiat duis.\r\nReprehenderit et incididunt sit consectetur qui non aliquip mollit pariatur nisi. Enim eu dolor id eu. Laborum laboris ex esse veniam Lorem exercitation exercitation nostrud officia. Exercitation ipsum dolor exercitation ullamco adipisicing anim non tempor laboris deserunt consequat amet tempor tempor. Cupidatat sunt non magna aute excepteur magna dolor in irure esse dolor pariatur. Eiusmod commodo minim ipsum elit. Ut reprehenderit veniam ex magna mollit duis magna.\r\n", + "address": "3 Hampton Avenue", + "city": "Brecon", + "state": "New Hampshire", + "zip": 11881, + "country": "Dominican Republic", + "email": "lorettahudson@scentric.com", + "phone": "(969) 542-2613", + "color": "rgb(245,143,237)" + }, + { + "index": 337, + "name": "Byrd Hopkins", + "first": "Charmaine", + "last": "Gibbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "boolean": false, + "guid": "bf3bdf33-82fb-4240-b2be-d215fbaff029", + "integer": 55, + "date": "Wed Sep 12 2001 15:08:00 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Minim culpa et ea labore labore ad do officia eiusmod. Incididunt duis elit sit cupidatat mollit qui ea. Dolor id adipisicing est tempor commodo.", + "longText": "Consequat consequat eiusmod sint esse ex. Nisi eu est magna esse cillum exercitation velit ea. Pariatur irure cupidatat est non anim do magna adipisicing eu aliqua Lorem.\r\nSunt tempor qui id aliqua minim culpa non adipisicing in id elit. Laborum laboris aliquip ea mollit excepteur aute. Culpa id sit quis cupidatat nostrud irure duis aliqua do laboris veniam. Ullamco aute cillum in excepteur enim. Ipsum amet voluptate aliqua mollit commodo sint.\r\nAmet aute pariatur cillum adipisicing ad culpa velit do commodo nulla consequat elit exercitation ad. Do nisi in laboris id proident deserunt. Dolor commodo do qui esse aliqua dolore duis officia adipisicing Lorem.\r\nTempor eu sit id occaecat nostrud esse non voluptate officia exercitation mollit. Aliqua elit commodo incididunt nulla labore nostrud est duis. Pariatur ut laboris laboris laborum mollit anim consequat. Veniam eu non nostrud elit amet incididunt mollit sint duis adipisicing voluptate duis fugiat qui. Velit labore nostrud anim ex laboris ullamco elit. Ad in adipisicing anim culpa. Aliqua ullamco quis cupidatat exercitation qui.\r\n", + "address": "2 Norfolk Street", + "city": "Beechmont", + "state": "North Dakota", + "zip": 44060, + "country": "Zaire", + "email": "charmainegibbs@scentric.com", + "phone": "(882) 485-2815", + "color": "rgb(52,73,103)" + }, + { + "index": 338, + "name": "Walter Hoffman", + "first": "John", + "last": "Arnold", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "boolean": true, + "guid": "775148e8-ce9f-4917-b50d-93d7d88dcc90", + "integer": 64, + "date": "Sat Oct 10 1992 03:41:40 GMT-0700 (PDT)", + "shortText": "culpa esse eiusmod amet nisi", + "mediumText": "Excepteur sunt fugiat dolor dolor cupidatat laboris esse sint incididunt elit fugiat reprehenderit aliqua dolor.", + "longText": "Proident aliquip eu incididunt nulla laboris deserunt dolore ipsum. Officia elit in laboris nulla nostrud. Voluptate dolore Lorem qui consectetur id amet qui esse est. Ipsum pariatur non id quis proident est exercitation culpa consectetur occaecat ut eiusmod minim. Nostrud dolore id nulla ullamco mollit aute minim ad quis.\r\n", + "address": "2 Madeline Court", + "city": "Coinjock", + "state": "Northern Mariana Islands", + "zip": 94228, + "country": "China", + "email": "johnarnold@scentric.com", + "phone": "(832) 506-2961", + "color": "rgb(124,211,144)" + }, + { + "index": 339, + "name": "Conner Santiago", + "first": "Geneva", + "last": "Cline", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "boolean": true, + "guid": "42040b16-aa43-4862-94d5-186ca3462e87", + "integer": 42, + "date": "Sat Jan 30 1988 20:47:01 GMT-0800 (PST)", + "shortText": "pariatur enim fugiat", + "mediumText": "Pariatur voluptate mollit deserunt voluptate proident sit sint Lorem magna sunt deserunt ipsum. Exercitation nostrud proident consequat amet.", + "longText": "Occaecat nulla nulla labore laborum id est enim adipisicing proident commodo incididunt sit ex. Aute excepteur deserunt tempor quis sit deserunt eu velit elit veniam dolore dolore adipisicing consectetur. Consequat tempor nostrud excepteur laboris quis. Duis aute magna do mollit ullamco ex ipsum occaecat aute sunt.\r\nCupidatat nisi ullamco dolor incididunt magna nulla dolor amet consectetur laborum ex non cupidatat. Labore incididunt in anim anim quis sint sit consequat quis labore aute. Magna nisi sint nostrud ea esse voluptate.\r\nLorem ex cupidatat Lorem aute sunt consectetur proident. Labore dolor ipsum laboris laboris nulla enim ea excepteur aliqua incididunt incididunt et ipsum mollit. Dolor labore cillum dolor Lorem nulla voluptate reprehenderit fugiat dolor ad sint id commodo. Aliqua in fugiat laboris fugiat ea officia dolor magna labore laborum non commodo. In labore consequat incididunt ut minim. Lorem enim tempor mollit minim esse deserunt anim ex labore. Officia nulla reprehenderit dolore eu duis eu.\r\n", + "address": "2 Ford Street", + "city": "Buxton", + "state": "South Dakota", + "zip": 92541, + "country": "British Indian Ocean Territory", + "email": "genevacline@scentric.com", + "phone": "(945) 577-3780", + "color": "rgb(88,84,180)" + }, + { + "index": 340, + "name": "Rosales Cain", + "first": "Lucille", + "last": "Sims", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "boolean": false, + "guid": "05c0e183-2ebf-459b-8755-1581a4a5e362", + "integer": 66, + "date": "Thu Oct 16 1997 15:05:12 GMT-0700 (PDT)", + "shortText": "esse labore", + "mediumText": "Ipsum cillum sunt laboris reprehenderit quis nulla.", + "longText": "Enim adipisicing non occaecat dolore sunt qui magna do velit mollit. Adipisicing enim esse quis Lorem sit ut elit est. Nostrud ea sit duis ex esse tempor enim exercitation non exercitation sint. Occaecat ipsum ex id elit eu id occaecat ea pariatur nisi tempor velit. Amet duis do minim minim excepteur adipisicing elit reprehenderit do tempor do sint ex.\r\nElit eu laboris mollit ullamco. Reprehenderit sit elit ipsum ad aliqua nostrud sunt quis ut irure aliqua. Quis non in cillum aliquip laboris esse in aliquip laboris eu qui adipisicing consectetur. Magna tempor irure officia duis sunt.\r\nSit ad dolore mollit fugiat do culpa in anim aliqua. Ad adipisicing esse occaecat ullamco proident. Cillum consequat nostrud sit consequat ullamco do et aute dolore nulla ullamco. Occaecat aliquip ut et incididunt ex fugiat ea esse aute quis amet consequat dolore ex. Officia aute incididunt esse exercitation culpa.\r\n", + "address": "4 Bergen Place", + "city": "Neibert", + "state": "Alaska", + "zip": 90229, + "country": "Libya", + "email": "lucillesims@scentric.com", + "phone": "(881) 438-3457", + "color": "rgb(57,64,85)" + }, + { + "index": 341, + "name": "Jillian Puckett", + "first": "Bean", + "last": "Dyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "boolean": false, + "guid": "a5317fd0-0be0-41ea-bbe9-a86a56e64aee", + "integer": 79, + "date": "Fri Oct 22 2004 15:49:39 GMT-0700 (PDT)", + "shortText": "ipsum aliqua", + "mediumText": "Occaecat ut eu consectetur sit Lorem nulla incididunt magna mollit reprehenderit fugiat.", + "longText": "Ad non eiusmod ullamco consectetur. In incididunt officia ex irure id. Quis minim ut quis duis id adipisicing commodo consectetur ut voluptate eiusmod duis.\r\nCulpa aliquip amet esse tempor do adipisicing. Excepteur do amet duis ad labore exercitation do nulla minim do pariatur ea. Magna amet dolor Lorem do nostrud aliqua eiusmod ad ut aliquip irure ullamco deserunt ipsum. Eu enim amet ut ut tempor sit cupidatat magna dolore. Laborum magna irure sit incididunt quis duis ex.\r\n", + "address": "2 Throop Avenue", + "city": "Saddlebrooke", + "state": "Louisiana", + "zip": 90267, + "country": "Cook Islands", + "email": "beandyer@scentric.com", + "phone": "(996) 420-2363", + "color": "rgb(127,126,117)" + }, + { + "index": 342, + "name": "Imelda Barrera", + "first": "Ramos", + "last": "Burke", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "boolean": true, + "guid": "7af4342e-1e1e-4807-8c51-aa37e8b7e551", + "integer": 25, + "date": "Thu Apr 19 2012 18:26:05 GMT-0700 (PDT)", + "shortText": "excepteur in culpa duis ullamco", + "mediumText": "In minim officia mollit veniam esse deserunt enim ullamco adipisicing ullamco deserunt quis.", + "longText": "Non cupidatat ipsum sint pariatur laborum ex in non aliquip est laborum. Aliquip fugiat proident sint in ea adipisicing dolor veniam consequat labore quis Lorem occaecat amet. Exercitation do commodo sunt nisi elit aliqua aliqua consectetur. Reprehenderit eu qui ea aliquip labore eiusmod cillum sunt.\r\n", + "address": "4 Cozine Avenue", + "city": "Sedley", + "state": "Missouri", + "zip": 43280, + "country": "Iran", + "email": "ramosburke@scentric.com", + "phone": "(800) 574-2091", + "color": "rgb(187,50,171)" + }, + { + "index": 343, + "name": "Witt Tyson", + "first": "Rebekah", + "last": "Kelly", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "boolean": false, + "guid": "81d76694-4ec9-4a0d-b1d2-87c3513414e3", + "integer": 92, + "date": "Thu Jul 31 1975 13:57:11 GMT-0700 (PDT)", + "shortText": "do quis", + "mediumText": "Reprehenderit veniam in sit magna nulla non ad ut enim culpa consequat in nisi id. Aute culpa ex laborum est cillum excepteur amet labore culpa nostrud magna. Enim deserunt aliquip eu et voluptate consequat culpa do minim occaecat voluptate sit.", + "longText": "Dolor excepteur minim magna tempor cillum duis voluptate reprehenderit veniam nulla anim tempor elit sint. Enim eu consectetur aliqua labore est non anim reprehenderit aliquip deserunt aute. Consequat et veniam id id ullamco amet adipisicing eiusmod. Ullamco fugiat quis ad sit consequat aliqua ipsum labore. Laboris magna est incididunt mollit magna voluptate velit duis aute ut. Laborum in proident nulla officia voluptate do in nostrud consectetur cupidatat est.\r\nLorem elit nulla tempor officia incididunt consequat aliqua. Voluptate anim labore esse veniam. Voluptate commodo occaecat minim duis qui enim veniam anim exercitation nulla laborum officia irure.\r\nNulla est eiusmod duis deserunt ea. Non deserunt ea nulla est quis occaecat cupidatat sit officia aliqua et nulla irure sint. Ea duis aliqua veniam reprehenderit culpa eiusmod sint. Quis et eu eu dolore. Nulla est officia adipisicing laborum est dolore duis culpa. Cupidatat eu aliqua adipisicing magna irure et deserunt eu magna Lorem tempor culpa.\r\nIrure cillum velit dolor duis dolore non sunt elit deserunt pariatur ut elit cupidatat. Qui irure sint duis ad nostrud dolore laborum. Labore esse amet et deserunt elit enim est duis in irure proident adipisicing irure. In laboris mollit eiusmod aliquip irure fugiat nulla commodo quis do eiusmod aute.\r\nIn voluptate aute ex qui ex adipisicing ea sint aliqua in mollit consequat. Duis sit adipisicing proident elit eu duis non dolor aliquip eiusmod duis nostrud reprehenderit. Amet et sint aliquip proident ea cillum veniam qui elit excepteur occaecat voluptate culpa. Mollit ea labore nulla mollit Lorem velit velit sit commodo nostrud. Ex deserunt laborum ea laborum culpa culpa sit eu dolor aute sunt amet. Est dolor tempor proident sint labore proident ipsum consectetur nostrud. Qui commodo qui aliqua commodo esse aute non enim.\r\n", + "address": "2 Kosciusko Street", + "city": "Zarephath", + "state": "Kentucky", + "zip": 42417, + "country": "Aruba", + "email": "rebekahkelly@scentric.com", + "phone": "(941) 590-3874", + "color": "rgb(228,211,182)" + }, + { + "index": 344, + "name": "Daphne Murphy", + "first": "Solis", + "last": "Norris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "boolean": true, + "guid": "aba2b0e9-cd59-410a-b0d2-70b43acabbc0", + "integer": 71, + "date": "Sun Apr 30 1972 14:07:42 GMT-0700 (PDT)", + "shortText": "aute consequat voluptate adipisicing ex", + "mediumText": "Dolore commodo sit ea sunt in consectetur fugiat laboris incididunt aliquip.", + "longText": "Sunt dolor duis fugiat voluptate veniam. In cillum irure nisi quis reprehenderit est ipsum. Dolore duis est ea duis labore laborum ea ex nisi minim. Velit eiusmod nulla laborum eu dolor aliqua sunt officia proident nulla sunt in pariatur. Pariatur sit do ullamco nostrud commodo ex et ex in. Labore excepteur tempor et qui nisi Lorem culpa eu. Incididunt esse Lorem ex ipsum aliquip sunt velit et voluptate consectetur duis.\r\nAdipisicing esse ipsum tempor eu. Voluptate aliqua laborum incididunt excepteur veniam. Laboris sunt id quis sint voluptate duis ex.\r\nQui dolore culpa reprehenderit est est do. Duis mollit consequat quis velit do dolore elit voluptate consequat deserunt aliquip culpa consequat. Laboris adipisicing qui nulla voluptate irure cillum velit eiusmod officia Lorem cillum pariatur tempor duis. Et magna consectetur laborum consectetur est culpa ipsum ullamco sunt aute dolor velit. Duis ipsum reprehenderit quis adipisicing voluptate do laborum.\r\nExcepteur minim est adipisicing ipsum id Lorem eu nisi ea mollit anim ut. Incididunt eu sint eu in ex ut voluptate consectetur ex consectetur aliquip exercitation labore. Proident amet labore sit laborum sit et officia est proident aliqua enim id id. Ea consectetur minim deserunt non. Eu in est labore aliqua non amet aliquip minim enim cupidatat veniam magna. Commodo occaecat dolore Lorem Lorem Lorem sint consequat proident ut duis enim magna. Aute occaecat nisi duis culpa velit sunt.\r\n", + "address": "3 Bushwick Avenue", + "city": "Farmington", + "state": "American Samoa", + "zip": 46996, + "country": "Faroe Islands", + "email": "solisnorris@scentric.com", + "phone": "(926) 567-2180", + "color": "rgb(195,76,204)" + }, + { + "index": 345, + "name": "Summer Sawyer", + "first": "Cheri", + "last": "Watts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "boolean": false, + "guid": "edf13e03-caa7-418a-8781-3ec09c26861d", + "integer": 75, + "date": "Tue May 08 2012 18:10:55 GMT-0700 (PDT)", + "shortText": "incididunt excepteur", + "mediumText": "Ullamco adipisicing id culpa irure anim non fugiat. Quis laborum nisi cillum incididunt minim ad cupidatat eiusmod mollit. Et nostrud eiusmod dolor et Lorem aliquip deserunt. In minim ut pariatur commodo. Ullamco minim commodo velit labore commodo eiusmod magna ea officia ex.", + "longText": "Mollit irure non aute magna. Amet dolor dolore ipsum pariatur anim ipsum ipsum cupidatat voluptate. Veniam excepteur eiusmod labore voluptate. Ipsum cillum anim esse aliqua ex consequat. Tempor adipisicing aute laborum deserunt magna labore duis deserunt.\r\nEt fugiat amet esse aliquip veniam magna est ad. Veniam velit velit ipsum pariatur duis incididunt sunt consequat esse. Cillum eiusmod duis aliqua ullamco. Magna pariatur adipisicing magna reprehenderit tempor eiusmod cillum consequat ipsum mollit occaecat enim. Officia tempor aute eu elit aliquip anim voluptate minim cupidatat fugiat esse labore excepteur. Nulla ex aliqua ipsum irure minim. Consectetur dolor non quis consequat eiusmod reprehenderit fugiat eiusmod quis qui qui elit nisi.\r\nDo mollit dolor id occaecat pariatur sint nulla ea aliquip ullamco aliquip exercitation eiusmod ex. Duis magna nulla amet fugiat Lorem tempor duis nisi ex exercitation ex. Non irure ullamco reprehenderit nulla consectetur in.\r\nNisi proident cillum labore anim consectetur in. Amet ullamco magna laboris minim velit eu incididunt non elit sit eu est consequat. Duis consectetur in nulla anim elit in sint nostrud excepteur quis velit. Mollit proident enim voluptate irure officia cupidatat anim Lorem anim occaecat consectetur Lorem.\r\n", + "address": "2 Oxford Street", + "city": "Bordelonville", + "state": "Minnesota", + "zip": 67948, + "country": "Zambia", + "email": "cheriwatts@scentric.com", + "phone": "(854) 438-3356", + "color": "rgb(90,88,182)" + }, + { + "index": 346, + "name": "Anita Jacobson", + "first": "Lucile", + "last": "Roberts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "boolean": false, + "guid": "c88108ef-0dce-42ae-b03e-770b8b26ecf0", + "integer": 37, + "date": "Mon Apr 18 1977 02:05:21 GMT-0800 (PST)", + "shortText": "nostrud", + "mediumText": "Deserunt fugiat veniam minim ipsum consequat ipsum tempor voluptate ut. Elit tempor eu non ea pariatur dolore incididunt laboris quis eiusmod est qui.", + "longText": "Fugiat tempor dolore proident adipisicing fugiat minim. Sunt in veniam dolor anim non Lorem id proident in anim sint. Cupidatat et esse culpa sunt incididunt ex proident elit qui ad eu elit laboris cillum. Laboris culpa pariatur ea sit culpa et ea minim fugiat. Eu nulla est excepteur deserunt officia.\r\nSunt cupidatat do sunt anim ad ullamco veniam est tempor elit id ex sunt. Velit consectetur occaecat laborum do consequat dolore duis sint exercitation anim. Ad sunt aliqua culpa dolore fugiat excepteur elit magna labore. Nostrud cupidatat aliquip et officia aliquip incididunt. Fugiat excepteur pariatur officia magna. Ex id velit enim amet culpa.\r\n", + "address": "2 Adams Street", + "city": "Southview", + "state": "Hawaii", + "zip": 67415, + "country": "Albania", + "email": "lucileroberts@scentric.com", + "phone": "(826) 522-3183", + "color": "rgb(114,159,181)" + }, + { + "index": 347, + "name": "Beverly Ayala", + "first": "Teresa", + "last": "Serrano", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "boolean": false, + "guid": "e5824ea2-1204-42b5-8075-232d1e648cfc", + "integer": 47, + "date": "Mon Jul 24 2000 15:52:57 GMT-0700 (PDT)", + "shortText": "non cillum mollit enim ullamco", + "mediumText": "Amet do eu non culpa ea eiusmod culpa reprehenderit aute adipisicing duis nostrud in dolor. Do sint ex anim consectetur reprehenderit.", + "longText": "Et quis laboris ad ea do quis id enim. Ex culpa cupidatat velit nostrud cupidatat voluptate velit ipsum. Eu amet culpa aute officia non commodo irure fugiat. Qui sit consectetur labore exercitation officia cillum veniam enim.\r\n", + "address": "2 Quincy Street", + "city": "Vale", + "state": "Alabama", + "zip": 98150, + "country": "Panama", + "email": "teresaserrano@scentric.com", + "phone": "(898) 426-2065", + "color": "rgb(110,156,140)" + }, + { + "index": 348, + "name": "Golden Zimmerman", + "first": "Greta", + "last": "Gillespie", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "boolean": true, + "guid": "e4300d91-7791-4fcb-b61e-c551eeed9488", + "integer": 57, + "date": "Thu Sep 20 2007 17:36:22 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Lorem duis adipisicing et ea dolore dolore non anim nisi exercitation enim. Ea incididunt velit quis mollit nisi dolor proident. Ipsum enim id eiusmod ex reprehenderit magna et reprehenderit deserunt aliqua. Qui mollit sit occaecat sunt ex veniam excepteur ex velit ea commodo ad.", + "longText": "Do dolore culpa cillum officia aliqua cillum. Fugiat nisi ipsum proident reprehenderit velit. Nulla proident aliqua proident velit incididunt consectetur quis ut adipisicing do aliqua. Amet laboris elit amet commodo adipisicing. Nisi esse minim ut elit. Est officia do minim mollit occaecat ipsum officia aliqua commodo in ipsum laborum labore.\r\nReprehenderit dolore irure dolore occaecat cillum minim quis non laborum ullamco tempor. Irure ut magna ad esse nostrud nostrud ut. Eiusmod sunt nulla commodo officia incididunt nisi aliqua. Eiusmod occaecat non do non qui eiusmod. Amet sit dolore fugiat aliquip.\r\n", + "address": "2 Foster Avenue", + "city": "Neahkahnie", + "state": "North Carolina", + "zip": 57285, + "country": "Turks and Caicos Islands", + "email": "gretagillespie@scentric.com", + "phone": "(907) 597-3902", + "color": "rgb(54,207,230)" + }, + { + "index": 349, + "name": "Sandra Taylor", + "first": "Schroeder", + "last": "Noel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "boolean": false, + "guid": "10f56b06-75ab-4405-929b-533362c0fd8f", + "integer": 65, + "date": "Thu Jul 19 1979 21:31:02 GMT-0700 (PDT)", + "shortText": "laboris pariatur anim est", + "mediumText": "Velit nostrud voluptate labore eu irure laboris proident reprehenderit.", + "longText": "Ex irure sit ut quis exercitation enim voluptate laborum. Cillum deserunt amet est et. Nostrud consequat ullamco minim sit deserunt amet officia sit dolore. Incididunt laboris amet cupidatat exercitation enim enim veniam nostrud ipsum excepteur reprehenderit esse. Adipisicing esse do et est esse nulla duis nisi veniam sint.\r\nAmet incididunt est velit incididunt id consectetur ut eiusmod commodo nostrud do aliqua esse excepteur. Ullamco laborum proident ullamco aliqua nisi aliquip ex id. Irure voluptate non exercitation qui do enim incididunt incididunt esse dolor. Eiusmod aute id consectetur ullamco laboris cupidatat consequat.\r\nSunt commodo amet deserunt sit esse ad eiusmod tempor. Excepteur deserunt ea aliquip tempor nostrud nostrud labore eu et et. Dolore ex mollit officia voluptate non consequat. Tempor enim eiusmod est labore ut esse magna minim eu officia sit enim veniam. Quis do veniam magna elit enim amet est veniam irure.\r\nMollit sit incididunt sunt tempor adipisicing Lorem incididunt. Dolor veniam velit esse laboris fugiat eiusmod velit tempor ea pariatur nisi fugiat. Velit proident ex ipsum id cillum amet ad.\r\nCupidatat incididunt minim ex ipsum exercitation commodo aliquip excepteur. Voluptate labore reprehenderit quis in ex magna. Ad cillum adipisicing proident nostrud eu proident cupidatat consectetur adipisicing amet. Quis labore sunt sit ullamco deserunt amet ad occaecat cupidatat et pariatur fugiat commodo aute. Enim et veniam proident Lorem sint. Labore nisi in esse eiusmod laborum occaecat excepteur cillum incididunt esse in dolore. Aliqua eiusmod velit id occaecat sunt qui ex ea.\r\n", + "address": "2 Williams Court", + "city": "Davenport", + "state": "Connecticut", + "zip": 57031, + "country": "Christmas Island", + "email": "schroedernoel@scentric.com", + "phone": "(982) 532-3421", + "color": "rgb(240,238,143)" + }, + { + "index": 350, + "name": "Shelby Lott", + "first": "Maryanne", + "last": "Dixon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "boolean": false, + "guid": "86ccb30c-436b-4e11-b33f-231007768e3c", + "integer": 16, + "date": "Wed Jan 07 1970 01:58:18 GMT-0800 (PST)", + "shortText": "anim officia nulla aliqua", + "mediumText": "Officia et eu enim esse veniam. Incididunt fugiat occaecat amet officia ad commodo aute amet reprehenderit reprehenderit nostrud non aute velit. Duis excepteur consectetur enim consequat labore exercitation irure nisi sint ullamco qui quis labore.", + "longText": "Tempor culpa mollit id anim labore sit Lorem cillum. Occaecat cupidatat sit ad voluptate tempor non do. Ullamco id laborum et ex esse. Do ex ad excepteur magna consequat. Qui proident qui occaecat ut aute nostrud.\r\n", + "address": "2 Quay Street", + "city": "Santel", + "state": "South Carolina", + "zip": 32917, + "country": "Botswana", + "email": "maryannedixon@scentric.com", + "phone": "(808) 502-2314", + "color": "rgb(150,72,230)" + }, + { + "index": 351, + "name": "Buck Reyes", + "first": "Meredith", + "last": "Kennedy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "boolean": true, + "guid": "1836f1d4-6bef-4b29-8a27-b11d78119e5a", + "integer": 56, + "date": "Wed Jul 03 2013 04:17:00 GMT-0700 (PDT)", + "shortText": "cillum enim aute ea enim", + "mediumText": "Voluptate do Lorem veniam ullamco id excepteur. Mollit et occaecat ut amet nostrud dolore consectetur id minim. Eu esse nisi incididunt nulla occaecat sunt. Minim labore dolor do pariatur voluptate do nostrud irure tempor ipsum consectetur ea fugiat ut.", + "longText": "Et ex ipsum eu commodo aliquip sit officia id. Deserunt reprehenderit sunt dolore nisi veniam adipisicing esse exercitation velit anim ex. Eiusmod do aliquip magna cillum dolore cillum excepteur. Excepteur dolore quis nisi veniam quis eiusmod occaecat. Amet nulla ut excepteur duis officia dolor esse incididunt ipsum. Laboris est aliqua qui nostrud labore duis eu non do.\r\nDo id commodo et deserunt aliquip. Aliqua in ullamco ex consequat nisi laborum esse culpa ipsum mollit do occaecat occaecat incididunt. Tempor est irure irure ex incididunt laboris. Dolore veniam fugiat ea eiusmod cupidatat nostrud est reprehenderit sit id sunt consectetur eu irure. In laborum voluptate proident et dolor aute. Deserunt dolore dolor ad sit duis veniam.\r\n", + "address": "4 Herzl Street", + "city": "Sisquoc", + "state": "Michigan", + "zip": 13348, + "country": "Algeria", + "email": "meredithkennedy@scentric.com", + "phone": "(805) 554-3669", + "color": "rgb(179,239,148)" + }, + { + "index": 352, + "name": "Wooten Sloan", + "first": "Allen", + "last": "Wade", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "boolean": false, + "guid": "dc87dc7f-bf6e-4633-9a8e-2e7ce98a216b", + "integer": 94, + "date": "Fri Mar 13 1998 22:52:34 GMT-0800 (PST)", + "shortText": "consectetur ipsum eu velit", + "mediumText": "Lorem commodo sit nostrud culpa esse deserunt laboris magna. Elit esse id Lorem ut.", + "longText": "Sunt veniam est ex duis sit amet eiusmod ullamco cupidatat cillum Lorem. Deserunt ex do mollit consequat elit. Nostrud voluptate proident do commodo Lorem fugiat nostrud minim anim excepteur ad magna.\r\nQui et velit consequat Lorem occaecat irure anim esse. Labore veniam exercitation do excepteur velit pariatur excepteur consectetur aute voluptate enim exercitation non deserunt. Mollit irure magna id elit laborum. Elit pariatur aute pariatur nulla deserunt. Deserunt sit consectetur anim tempor duis laborum do quis enim.\r\nDolore dolore nostrud voluptate ipsum qui. Ea laboris culpa proident duis officia sit. Non do pariatur aute elit dolor aliqua cillum. Lorem ullamco eiusmod laboris mollit sint tempor consectetur laborum laboris deserunt exercitation. Eu fugiat nulla irure excepteur aliqua enim et consequat culpa. Amet dolor excepteur proident labore mollit mollit pariatur culpa incididunt occaecat dolor aliqua aliquip dolor.\r\nIn qui enim cupidatat quis magna do qui aliquip magna. Proident culpa nostrud nulla eiusmod occaecat sit id pariatur labore voluptate aute veniam. Eu amet labore labore aliqua amet adipisicing commodo. Non commodo est ea reprehenderit fugiat est ullamco voluptate excepteur ipsum sint est.\r\nCupidatat dolor aliqua amet ipsum incididunt non consectetur duis proident aliqua sit. Occaecat aliqua labore commodo qui consequat reprehenderit ut voluptate. Sint velit minim mollit elit occaecat laboris aliqua dolor enim do.\r\n", + "address": "2 Sandford Street", + "city": "Levant", + "state": "Maine", + "zip": 74609, + "country": "Switzerland", + "email": "allenwade@scentric.com", + "phone": "(971) 515-2074", + "color": "rgb(55,67,137)" + }, + { + "index": 353, + "name": "Luella Hogan", + "first": "Flores", + "last": "Wolfe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "boolean": true, + "guid": "3e88723e-2180-4ee0-8c96-fd9c48538abd", + "integer": 65, + "date": "Thu Sep 03 1998 10:25:29 GMT-0700 (PDT)", + "shortText": "commodo reprehenderit anim", + "mediumText": "Magna in quis irure duis. Nisi duis non pariatur magna ipsum excepteur ea. Ea exercitation culpa commodo consectetur. Do cillum Lorem nisi ipsum nulla cupidatat officia sunt pariatur ea. Dolor deserunt enim reprehenderit in in.", + "longText": "Officia cillum proident consequat quis non dolor nisi id sit amet laborum sint. Elit enim ex laborum amet nulla qui. Ut amet eiusmod mollit id.\r\nEt fugiat laborum adipisicing laboris adipisicing. Sint ea est non ut laborum velit irure officia cupidatat excepteur. Eu cillum occaecat minim id proident incididunt.\r\nLaboris enim aliqua id et duis laborum dolore mollit proident. Culpa commodo dolor labore tempor minim nulla minim esse cupidatat do. Adipisicing ut non ullamco magna do commodo est dolore elit ea est eu. Est dolore duis Lorem culpa adipisicing. Tempor qui sunt qui et. Anim veniam esse consequat ut elit Lorem voluptate excepteur non culpa. Quis veniam Lorem aliqua culpa.\r\nNisi duis ex sunt magna enim proident et sint proident minim. In excepteur id pariatur ullamco. Nulla ea cupidatat sunt ut pariatur minim duis.\r\n", + "address": "2 Grafton Street", + "city": "Falconaire", + "state": "Kansas", + "zip": 39969, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "floreswolfe@scentric.com", + "phone": "(961) 502-3921", + "color": "rgb(81,99,101)" + }, + { + "index": 354, + "name": "Mckee Tillman", + "first": "Patsy", + "last": "Odonnell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "boolean": true, + "guid": "3cc7cc1e-1856-4b5a-a9f7-0e938e0206e5", + "integer": 14, + "date": "Fri Jan 11 1985 09:25:30 GMT-0800 (PST)", + "shortText": "minim in proident", + "mediumText": "Duis eiusmod pariatur consectetur et laboris magna. Est aute cupidatat enim proident qui ea quis officia anim reprehenderit officia deserunt nostrud deserunt.", + "longText": "Qui occaecat irure veniam aliqua nisi Lorem exercitation in consequat nostrud fugiat. Magna cupidatat incididunt tempor in. Esse cillum ullamco minim et nisi tempor nostrud tempor. Fugiat duis veniam enim enim consequat. Incididunt anim fugiat in Lorem sunt sit fugiat. Do ut anim officia aliquip irure consectetur ipsum eu ex magna esse et exercitation. Reprehenderit irure velit sunt minim aute proident nisi ad enim tempor nostrud dolor.\r\n", + "address": "2 Dekalb Avenue", + "city": "Sattley", + "state": "Iowa", + "zip": 56105, + "country": "Brazil", + "email": "patsyodonnell@scentric.com", + "phone": "(991) 576-3320", + "color": "rgb(151,157,82)" + }, + { + "index": 355, + "name": "Tammy Mckenzie", + "first": "Araceli", + "last": "Villarreal", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "boolean": true, + "guid": "645a7c4c-a0cf-4361-9c6d-5d32d77d5500", + "integer": 69, + "date": "Sun Dec 24 2006 07:06:15 GMT-0800 (PST)", + "shortText": "anim laborum nisi", + "mediumText": "Incididunt consectetur culpa nisi Lorem eiusmod cillum non nisi tempor mollit irure nisi ut cupidatat. Proident non magna consectetur ut consequat occaecat est consectetur culpa aliqua cupidatat consequat ea. Commodo et veniam qui magna velit non deserunt exercitation proident Lorem eu non. Mollit eu laboris labore ipsum id nisi aute culpa dolore in magna ad cillum. Ea adipisicing Lorem ad irure exercitation amet aliqua esse.", + "longText": "Ea laboris in irure labore cillum. Lorem aliqua ut amet aliqua sint sunt officia adipisicing ipsum minim velit. Elit in reprehenderit occaecat et et elit sint. In consequat quis nulla cillum cillum sint ullamco do officia. Excepteur id fugiat ullamco elit adipisicing veniam deserunt tempor. Nisi dolor tempor amet irure in amet consequat ea. Sit tempor amet excepteur in tempor irure ut ipsum amet velit culpa dolor occaecat fugiat.\r\nLorem consequat deserunt irure veniam culpa fugiat incididunt eu sunt excepteur commodo sit adipisicing cillum. Magna ea mollit anim ullamco nisi do laboris duis aliquip excepteur labore reprehenderit dolor. Amet ea proident cupidatat cupidatat magna magna amet proident aute tempor. Officia non culpa tempor reprehenderit nostrud ut anim quis nisi laboris ipsum nostrud deserunt. Magna proident elit eiusmod et incididunt deserunt est ad anim occaecat enim tempor ex. Id veniam ad commodo ad proident reprehenderit. Veniam in culpa do dolore excepteur pariatur mollit.\r\nCupidatat ex occaecat nulla irure excepteur. Duis sit do nisi officia. Ea eu commodo magna aliquip ea sint aute dolor mollit laborum aute reprehenderit Lorem sit. Proident laboris incididunt sit in sint. Veniam nisi sunt laboris eu aliquip sunt reprehenderit irure ad reprehenderit. In ea ullamco ullamco amet cillum irure pariatur veniam.\r\nDolor deserunt sunt sunt aliqua consequat est deserunt culpa proident labore proident sit laborum. Cupidatat aute nostrud ad non consequat laboris. Cupidatat dolor magna et occaecat laboris. Ipsum magna id amet non consectetur adipisicing veniam. Aliqua anim pariatur nostrud anim in sint sit deserunt anim. Laborum dolor sunt anim sunt eiusmod consectetur do aliqua aute magna ad ea. Enim amet exercitation culpa deserunt proident.\r\nCommodo nisi officia commodo Lorem irure occaecat qui. Est eu Lorem et labore excepteur elit enim. Minim occaecat eu cupidatat labore ad deserunt irure officia quis enim. Consequat eiusmod labore minim ex ipsum velit ea veniam. Elit minim do non eiusmod cillum incididunt proident. In excepteur exercitation nisi aliquip adipisicing consequat qui.\r\n", + "address": "2 Richards Street", + "city": "Bancroft", + "state": "Vermont", + "zip": 63605, + "country": "Anguilla", + "email": "aracelivillarreal@scentric.com", + "phone": "(922) 535-2085", + "color": "rgb(123,74,237)" + }, + { + "index": 356, + "name": "Joyce Carney", + "first": "Vance", + "last": "Boyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "boolean": true, + "guid": "0714e7c1-db9c-4bc9-ae14-47d72e9f36b2", + "integer": 29, + "date": "Sat Jan 18 1986 13:37:09 GMT-0800 (PST)", + "shortText": "Lorem non cillum laborum culpa", + "mediumText": "Laboris Lorem anim cillum et deserunt nostrud laborum ex laborum laboris laborum sint nostrud. In anim aliqua pariatur cupidatat adipisicing esse ex nulla pariatur sunt velit laborum cupidatat. Culpa irure elit occaecat ea in aliqua. Aliqua ex sint anim elit aute enim consectetur ea culpa pariatur. Reprehenderit culpa nisi nostrud cillum sint ullamco mollit sit velit ea officia pariatur.", + "longText": "Minim magna ipsum excepteur irure non qui pariatur excepteur. Minim velit ea ullamco irure quis est duis velit est enim do labore. Irure laboris mollit commodo fugiat. Elit dolor ipsum non veniam culpa id esse.\r\nAnim excepteur deserunt cillum fugiat quis dolor aliqua cillum occaecat. Occaecat deserunt incididunt voluptate cupidatat eu nulla do consequat laborum id veniam laborum. Laboris adipisicing cupidatat laboris sint elit fugiat ipsum mollit laboris sint proident dolore officia. Pariatur ut laboris aliquip culpa irure magna officia velit velit occaecat. Duis ipsum duis occaecat aute magna sunt ex veniam dolore laborum aliqua.\r\nUllamco deserunt minim et qui consequat esse. Cillum do elit magna culpa exercitation occaecat tempor reprehenderit nostrud ex do. Ex laborum irure aliquip ipsum. Excepteur cupidatat laboris consequat sint esse est aute voluptate est minim.\r\n", + "address": "3 Suydam Place", + "city": "Wiscon", + "state": "Nebraska", + "zip": 24690, + "country": "Mayotte", + "email": "vanceboyd@scentric.com", + "phone": "(950) 499-2028", + "color": "rgb(151,255,141)" + }, + { + "index": 357, + "name": "Briggs Cash", + "first": "Mason", + "last": "Norton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "boolean": true, + "guid": "06751f30-d76a-46ef-a97a-3d8233acee4e", + "integer": 36, + "date": "Wed Oct 22 1997 23:32:22 GMT-0700 (PDT)", + "shortText": "qui aliquip laborum", + "mediumText": "Velit eiusmod est incididunt sint ipsum qui ullamco amet. Elit est velit adipisicing occaecat velit nisi irure tempor enim exercitation tempor sunt nulla elit. Incididunt ad quis officia nostrud aliqua incididunt commodo. Duis ex quis sint mollit laboris sint in ipsum enim.", + "longText": "Nisi excepteur culpa ipsum cillum aute cupidatat nisi. Culpa aliqua in excepteur et elit eu est irure laboris amet pariatur. Eiusmod culpa do nostrud sunt velit ea aliquip laboris nulla occaecat quis amet elit cupidatat. Excepteur sit mollit fugiat laborum nostrud sint pariatur. Officia ullamco consequat ex est quis. Dolor est laboris sint eu in laborum culpa.\r\n", + "address": "3 Williams Avenue", + "city": "Marbury", + "state": "Florida", + "zip": 96679, + "country": "Northern Mariana Islands", + "email": "masonnorton@scentric.com", + "phone": "(988) 478-3734", + "color": "rgb(122,225,185)" + }, + { + "index": 358, + "name": "Frank Vance", + "first": "Eva", + "last": "Christian", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "boolean": false, + "guid": "90639571-dc94-4c8f-98c8-db8781d4d7e2", + "integer": 11, + "date": "Thu Jan 05 1984 02:00:59 GMT-0800 (PST)", + "shortText": "laboris non cillum laborum amet", + "mediumText": "Nulla consequat aute non non esse elit nostrud labore dolor consectetur. Fugiat culpa dolore commodo aute et enim exercitation reprehenderit. Mollit velit anim labore est dolor. Id fugiat proident qui in Lorem eiusmod. Officia labore reprehenderit nulla irure aute enim tempor sint mollit et.", + "longText": "Duis ad proident anim sint eu. Qui aute dolore minim nisi proident cillum consequat laboris. Aliquip sunt sunt irure eiusmod esse laboris amet ad nisi occaecat exercitation ullamco aliqua ex. Ipsum minim labore ut officia ut ut minim officia qui. Qui aliqua commodo nulla labore nulla aliqua sunt laboris ullamco anim. Enim exercitation labore excepteur et eiusmod Lorem fugiat sunt nulla enim aliquip magna. Excepteur esse et nisi in excepteur reprehenderit excepteur duis magna cupidatat labore exercitation adipisicing enim.\r\n", + "address": "2 Cypress Avenue", + "city": "Westwood", + "state": "New Jersey", + "zip": 64807, + "country": "Pitcairn", + "email": "evachristian@scentric.com", + "phone": "(933) 555-3019", + "color": "rgb(65,246,66)" + }, + { + "index": 359, + "name": "Bennett Fitzgerald", + "first": "Alyce", + "last": "Roth", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "boolean": true, + "guid": "abc6eb23-4f14-4711-aaa1-0356ef6ac47e", + "integer": 79, + "date": "Mon Dec 15 1986 02:54:47 GMT-0800 (PST)", + "shortText": "veniam adipisicing velit magna deserunt", + "mediumText": "Laboris fugiat cupidatat ad aute laboris aliquip qui magna cupidatat cupidatat reprehenderit occaecat do.", + "longText": "Incididunt pariatur qui et ad adipisicing laborum. Aliqua eiusmod qui occaecat incididunt laboris sit. Amet ut commodo amet reprehenderit sit ex labore labore reprehenderit velit irure officia esse. Fugiat dolor ullamco sit ex ipsum aliqua irure aute dolore dolor.\r\n", + "address": "3 Howard Avenue", + "city": "Imperial", + "state": "Wisconsin", + "zip": 43410, + "country": "Saint Vincent and The Grenadines", + "email": "alyceroth@scentric.com", + "phone": "(930) 449-2969", + "color": "rgb(122,168,204)" + }, + { + "index": 360, + "name": "Garrett Lawson", + "first": "Marlene", + "last": "Hatfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "boolean": true, + "guid": "ea670adf-3aa0-4b5f-9ffc-4e448f9ad69b", + "integer": 63, + "date": "Sun Nov 16 1986 08:23:14 GMT-0800 (PST)", + "shortText": "aliqua sit aliquip id elit", + "mediumText": "Anim qui adipisicing enim est consequat duis qui aliquip. Elit excepteur tempor in eu ex exercitation. Dolor ex velit amet laboris. Sit non nisi anim ut et quis qui non irure elit pariatur nulla.", + "longText": "Ut pariatur magna duis cupidatat enim proident eiusmod tempor do aute Lorem non occaecat. Amet anim id quis cupidatat nulla exercitation nulla dolore eu irure Lorem anim incididunt. Laboris id dolore ullamco exercitation nostrud mollit pariatur Lorem. Consequat labore ea Lorem elit duis cupidatat nostrud do nulla. Elit amet proident fugiat commodo nostrud ipsum incididunt. Incididunt sunt qui laborum officia sit proident aute. Laboris laboris do est voluptate eu id officia labore amet aliquip eiusmod.\r\nLorem tempor elit nisi sunt. Laboris eu ea id id. Esse ad duis laboris elit tempor sint officia enim qui nulla elit aliquip cillum qui. Ex id culpa consequat laboris et voluptate esse irure.\r\nMollit sunt elit duis sunt reprehenderit aliquip id consequat elit ea amet Lorem non culpa. Et ad qui est mollit laboris mollit aute amet ut. Veniam occaecat mollit aliquip cillum consequat sit sint eu Lorem voluptate pariatur ad ad irure. Id aliquip velit eiusmod veniam anim duis proident do esse culpa non aliqua. Irure duis aute fugiat aliquip esse sint mollit aute non magna aliquip. Aliqua Lorem officia veniam cillum ad. Laboris reprehenderit adipisicing occaecat labore cupidatat cupidatat consectetur elit fugiat.\r\nUt amet tempor qui irure ex sunt nisi nostrud. Ipsum dolor cillum nisi mollit cupidatat adipisicing tempor ipsum veniam mollit anim aute nulla. Dolor aliqua occaecat aliqua eiusmod Lorem voluptate laborum. Aliquip sit quis culpa quis velit ut minim anim quis aliquip voluptate laborum. Sint qui exercitation elit occaecat consequat fugiat in nulla voluptate. Consequat fugiat culpa nulla qui Lorem cillum commodo elit aliqua proident enim dolore dolor excepteur. Voluptate pariatur ad culpa eiusmod ad nisi.\r\nSint eiusmod non reprehenderit proident Lorem anim nostrud id id. Adipisicing cupidatat magna commodo culpa quis amet sunt amet dolore veniam duis veniam duis occaecat. Cillum exercitation elit fugiat non. Consequat enim deserunt et nisi id. Ut occaecat est amet ea Lorem occaecat minim irure dolor nulla esse fugiat in aliqua. Commodo commodo occaecat duis consectetur sint ad ea exercitation adipisicing amet adipisicing aute duis.\r\n", + "address": "4 Elm Avenue", + "city": "Bluffview", + "state": "Washington", + "zip": 66639, + "country": "Iceland", + "email": "marlenehatfield@scentric.com", + "phone": "(944) 414-3916", + "color": "rgb(156,157,84)" + }, + { + "index": 361, + "name": "Rosalinda Barber", + "first": "Rosalind", + "last": "Little", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "boolean": true, + "guid": "301b4435-b804-43a6-b90e-8b509a8d7482", + "integer": 30, + "date": "Mon Dec 21 2009 13:14:30 GMT-0800 (PST)", + "shortText": "ea veniam dolor enim", + "mediumText": "Excepteur et labore esse commodo in. In irure quis qui veniam cillum. Reprehenderit aliqua velit cillum fugiat velit eiusmod ad ex consectetur occaecat.", + "longText": "Aliquip minim ex adipisicing tempor labore qui deserunt laborum consequat. Cillum excepteur id cupidatat minim ex. Consequat officia voluptate aliqua cupidatat qui.\r\n", + "address": "4 Centre Street", + "city": "Efland", + "state": "Oregon", + "zip": 37697, + "country": "Andorra", + "email": "rosalindlittle@scentric.com", + "phone": "(912) 415-2087", + "color": "rgb(158,187,61)" + }, + { + "index": 362, + "name": "Krystal Lane", + "first": "Kitty", + "last": "Hodge", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "boolean": true, + "guid": "8918af69-f5ee-41e7-b442-d3e13fa03f20", + "integer": 88, + "date": "Tue Apr 11 1978 05:39:13 GMT-0800 (PST)", + "shortText": "adipisicing quis dolore ullamco exercitation", + "mediumText": "Nulla ipsum mollit sunt ad fugiat officia labore velit Lorem elit id. Tempor magna aliquip nulla laborum labore ea voluptate.", + "longText": "Nostrud culpa pariatur mollit nisi labore aliquip enim nulla reprehenderit. Laborum magna ut voluptate in occaecat irure non magna non aliqua sunt commodo anim. Consectetur officia irure proident enim. Sit amet nulla duis minim cillum consequat labore anim cillum. Cillum minim voluptate commodo ex aute duis nulla do. Incididunt cupidatat occaecat commodo labore pariatur eu sit commodo fugiat proident exercitation sint est.\r\nSunt voluptate sunt quis pariatur excepteur et. Id exercitation veniam cupidatat incididunt quis commodo duis cupidatat enim laboris elit. Consectetur irure reprehenderit consequat labore qui commodo quis excepteur irure nisi labore mollit Lorem voluptate. Aute dolore consectetur voluptate cillum anim qui incididunt.\r\n", + "address": "3 President Street", + "city": "Laurelton", + "state": "Illinois", + "zip": 32233, + "country": "Myanmar", + "email": "kittyhodge@scentric.com", + "phone": "(994) 498-3202", + "color": "rgb(139,225,83)" + }, + { + "index": 363, + "name": "Lorrie Carey", + "first": "Moran", + "last": "Bradshaw", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "boolean": false, + "guid": "8040adde-26e1-416b-9053-e33e98a911a9", + "integer": 0, + "date": "Sat May 27 1972 21:40:25 GMT-0700 (PDT)", + "shortText": "culpa fugiat", + "mediumText": "Commodo cillum Lorem duis laborum minim cillum labore irure nostrud excepteur ut fugiat fugiat anim. Occaecat do eiusmod proident irure. Voluptate id nisi veniam tempor. Consequat non reprehenderit nulla esse irure magna pariatur occaecat minim nisi sunt velit. Labore reprehenderit ad consectetur et exercitation esse commodo.", + "longText": "Ad occaecat amet cillum nisi culpa pariatur sint Lorem ex. Ea ullamco Lorem officia exercitation pariatur cupidatat non mollit voluptate proident. Fugiat tempor irure pariatur eu minim nisi fugiat cupidatat. Ad anim ad qui occaecat. Do id veniam est cupidatat non proident occaecat deserunt fugiat incididunt.\r\nAliqua ea adipisicing elit est officia. Dolor voluptate ex labore proident aute laboris fugiat fugiat. Et fugiat enim qui et laborum sint. Aute excepteur ut ad duis. Voluptate duis adipisicing cupidatat ullamco magna.\r\nEu sint anim ea mollit ea labore pariatur velit adipisicing laborum velit. Irure eu ipsum consequat Lorem aute aliqua exercitation magna est anim commodo deserunt ea. Minim laboris adipisicing laboris in cillum culpa magna ea esse enim veniam. Non enim velit qui veniam commodo do incididunt. Aliqua quis reprehenderit consequat tempor ut excepteur fugiat ad tempor sit est ad est.\r\nUllamco quis et ea ex est deserunt ut. Adipisicing quis commodo laboris pariatur exercitation sit mollit labore. Dolore ut ad do magna incididunt ut adipisicing dolor eu eiusmod irure consectetur ipsum. Exercitation magna incididunt exercitation eiusmod. Esse veniam mollit Lorem qui eu officia aute.\r\n", + "address": "3 Hart Street", + "city": "Vandiver", + "state": "West Virginia", + "zip": 46407, + "country": "Saint Lucia", + "email": "moranbradshaw@scentric.com", + "phone": "(807) 537-3271", + "color": "rgb(54,143,210)" + }, + { + "index": 364, + "name": "Kirk Richard", + "first": "Delia", + "last": "Cervantes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "boolean": false, + "guid": "42e322d1-8045-429a-8eeb-8c62ba84d618", + "integer": 75, + "date": "Sat Nov 22 2003 15:26:15 GMT-0800 (PST)", + "shortText": "eu in consequat qui", + "mediumText": "Ullamco elit eu id excepteur incididunt Lorem ipsum pariatur laboris incididunt Lorem ullamco. Veniam consequat id sunt commodo fugiat magna velit laborum do Lorem enim in sunt. In non non magna deserunt duis nisi exercitation cupidatat eiusmod fugiat ea ex do in. Reprehenderit non consequat sit nostrud.", + "longText": "Dolor excepteur exercitation et ullamco. Non nulla duis qui cillum aliqua nostrud elit sunt dolor. Ex excepteur voluptate do minim non ea sint Lorem incididunt laborum sint. Officia elit labore reprehenderit proident. Laborum eiusmod occaecat eu nulla nisi voluptate. Dolor id in ullamco laborum ut ea est laborum adipisicing tempor et. Incididunt laborum consequat quis anim proident irure amet do.\r\n", + "address": "3 Amboy Street", + "city": "Tuttle", + "state": "Mississippi", + "zip": 27056, + "country": "Equatorial Guinea", + "email": "deliacervantes@scentric.com", + "phone": "(829) 471-3065", + "color": "rgb(94,71,106)" + }, + { + "index": 365, + "name": "Tate Mcdowell", + "first": "Adrian", + "last": "Mccullough", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "boolean": false, + "guid": "9e89b9c6-cf38-4f45-99ed-c7f3f5623d7c", + "integer": 86, + "date": "Sat Jul 23 1977 13:14:21 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "In non excepteur est ex sunt laborum commodo esse ex. Elit officia laborum incididunt tempor consectetur ea incididunt duis aliqua culpa quis occaecat minim.", + "longText": "Aliquip nisi elit commodo quis exercitation aliquip et do magna quis aute excepteur tempor dolor. Laborum deserunt ullamco aute velit fugiat non labore aliquip. Non exercitation aliqua sunt eiusmod laborum occaecat cupidatat amet commodo enim occaecat amet. Duis laboris labore enim dolor nisi deserunt id cupidatat id. Deserunt esse Lorem minim proident laboris fugiat irure laborum consectetur cillum laborum proident ex. Nulla est excepteur nostrud eiusmod consectetur dolor magna nostrud elit dolore.\r\nElit magna do occaecat in ea elit reprehenderit cupidatat excepteur labore consequat est minim enim. Laborum culpa id commodo esse elit nulla. Irure nulla aliquip adipisicing deserunt nisi ut duis sint. Duis culpa id ex duis incididunt irure nostrud excepteur.\r\nDolor cillum nisi eiusmod ea Lorem sint. Aute duis proident aute in aliquip. Nostrud ut cupidatat ex sit pariatur tempor duis consequat quis quis mollit. Ullamco nostrud id consequat ut. Nostrud officia officia nostrud anim occaecat culpa laborum nostrud fugiat cupidatat irure ex aliqua tempor. Eiusmod pariatur adipisicing reprehenderit exercitation minim Lorem commodo deserunt velit dolor esse elit dolore. Mollit dolore ipsum eu do excepteur nulla magna ea aliquip ut velit aliquip exercitation.\r\nDuis dolor magna voluptate irure enim eu mollit commodo enim commodo nostrud. Laborum magna culpa aliqua aliquip consequat consequat incididunt sunt proident ex eu adipisicing. Sunt esse non exercitation excepteur quis quis fugiat. Qui anim sint nisi proident non quis cillum magna. Ipsum amet veniam anim esse sint et occaecat occaecat in.\r\nAdipisicing ad mollit consequat ut quis eiusmod exercitation quis elit veniam do. Lorem excepteur occaecat labore ex deserunt cupidatat irure officia dolor sunt adipisicing elit officia. Laboris labore aliqua aliqua dolore Lorem laboris ipsum in. Irure ut mollit adipisicing incididunt magna.\r\n", + "address": "2 Bedell Lane", + "city": "Chilton", + "state": "Rhode Island", + "zip": 97237, + "country": "Tanzania", + "email": "adrianmccullough@scentric.com", + "phone": "(810) 599-3339", + "color": "rgb(178,126,71)" + }, + { + "index": 366, + "name": "Terry Romero", + "first": "Barrett", + "last": "Burgess", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "boolean": true, + "guid": "f92c32bc-6e74-46d1-85b4-49fefcf41773", + "integer": 59, + "date": "Thu Mar 25 2004 20:56:10 GMT-0800 (PST)", + "shortText": "amet ex aliqua dolor", + "mediumText": "Ullamco mollit in excepteur et sit do ad nulla in ex. Deserunt dolore elit velit est cillum irure non dolor consectetur pariatur adipisicing aute qui officia. Quis minim cillum ex reprehenderit Lorem eu non consequat dolor nisi consequat qui. Ex do eu ad velit ad do ut dolor aliquip id. Aliqua ullamco elit cupidatat laborum laborum ut velit quis aliquip.", + "longText": "In duis aute elit nostrud sint ut veniam. Aute sunt tempor laborum et consectetur. Incididunt qui excepteur dolor proident in et aliqua anim nisi magna incididunt duis fugiat. Irure amet laboris excepteur consequat dolore est magna. Eu velit dolore velit eiusmod id mollit esse dolore ullamco enim aute reprehenderit commodo occaecat. Ea quis cillum cillum ea consequat dolor non ea aute ipsum.\r\nDolore qui consectetur Lorem deserunt cupidatat pariatur est magna consectetur veniam. Pariatur ullamco nostrud commodo cillum fugiat cillum id ipsum ad. Occaecat laboris irure est nostrud proident ipsum aliqua cillum fugiat nulla enim.\r\n", + "address": "2 Whitney Avenue", + "city": "Weeksville", + "state": "Georgia", + "zip": 31104, + "country": "Slovak Republic", + "email": "barrettburgess@scentric.com", + "phone": "(946) 534-2498", + "color": "rgb(219,133,212)" + }, + { + "index": 367, + "name": "Karen Collins", + "first": "Barton", + "last": "Diaz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "boolean": true, + "guid": "98c26038-07d2-4135-bbd2-9a3f427c12e0", + "integer": 8, + "date": "Sat Sep 17 2005 00:39:48 GMT-0700 (PDT)", + "shortText": "aute aute nulla Lorem", + "mediumText": "Aliqua aliquip adipisicing veniam aliqua magna adipisicing dolor officia nisi nulla non voluptate ut.", + "longText": "Qui aliqua culpa sunt ea eu ipsum velit reprehenderit. Do eu veniam ad velit proident ea ea ut cupidatat elit sunt. Nisi cillum est tempor anim veniam. Sit nostrud exercitation veniam minim magna. Esse veniam amet est cillum dolore magna sunt ea minim aliqua incididunt reprehenderit est. Nulla pariatur consectetur officia aliqua veniam irure labore minim dolor amet cupidatat anim sint.\r\nCulpa id amet esse officia. Officia esse ex cillum velit. Cupidatat in in adipisicing exercitation deserunt. Amet id adipisicing ipsum deserunt.\r\n", + "address": "4 Garland Court", + "city": "Martinez", + "state": "New Mexico", + "zip": 87856, + "country": "Iraq", + "email": "bartondiaz@scentric.com", + "phone": "(915) 446-2455", + "color": "rgb(198,214,168)" + }, + { + "index": 368, + "name": "Carly Kirkland", + "first": "Malone", + "last": "West", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "boolean": true, + "guid": "a0fe6dd2-da36-4fe8-9172-64d79b76016a", + "integer": 40, + "date": "Thu Sep 03 2009 05:16:20 GMT-0700 (PDT)", + "shortText": "dolor culpa", + "mediumText": "Incididunt nulla est do proident qui culpa ea non eu et velit.", + "longText": "Quis non exercitation in cupidatat ad. Irure pariatur anim magna est elit excepteur nulla elit est quis nisi tempor quis. Sint irure consectetur consequat nostrud. Excepteur officia eiusmod reprehenderit sit irure aliqua id minim esse consectetur dolore.\r\nIncididunt incididunt sint magna excepteur quis reprehenderit qui pariatur dolore magna est. Pariatur exercitation minim et culpa consequat eiusmod cillum nostrud Lorem cupidatat. Amet labore amet laborum qui qui id laborum. Officia magna ipsum proident mollit deserunt sit veniam nostrud reprehenderit do laborum voluptate. Excepteur laboris excepteur pariatur proident pariatur minim dolor. Fugiat veniam nostrud ut non duis fugiat ex culpa. Velit enim culpa voluptate culpa reprehenderit officia irure velit ad qui veniam non exercitation.\r\nLaborum fugiat ea ex sint. Veniam labore duis non sunt ad reprehenderit voluptate irure voluptate commodo elit non. Eiusmod labore elit magna irure dolor aliquip.\r\nDolore qui occaecat magna ex amet irure officia adipisicing consequat Lorem proident reprehenderit sint. Laboris esse eiusmod quis ex sunt dolor ipsum sunt Lorem labore laborum id eu. Quis dolore qui quis exercitation minim nostrud do aliquip qui deserunt commodo aute fugiat aliqua. Pariatur proident eiusmod pariatur sit esse eiusmod aliquip fugiat exercitation culpa duis eiusmod. Mollit pariatur commodo ex qui et incididunt.\r\n", + "address": "2 Livonia Avenue", + "city": "Bartley", + "state": "Arizona", + "zip": 65737, + "country": "Congo", + "email": "malonewest@scentric.com", + "phone": "(884) 560-3387", + "color": "rgb(203,128,144)" + }, + { + "index": 369, + "name": "Cline Porter", + "first": "Villarreal", + "last": "Berg", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "boolean": true, + "guid": "bc0ae406-a0b0-46b8-a78c-e814bf6e352a", + "integer": 34, + "date": "Sat Dec 17 2011 17:11:11 GMT-0800 (PST)", + "shortText": "aliquip", + "mediumText": "Sit eu exercitation deserunt fugiat sunt. Duis amet Lorem sint fugiat aliquip sint nisi nulla officia. Mollit magna esse magna mollit ex aliquip sit voluptate occaecat. Sint ea reprehenderit pariatur ut proident consequat tempor do irure.", + "longText": "Sunt sunt culpa enim anim reprehenderit minim occaecat officia est exercitation exercitation. Magna irure consequat aliquip nisi sint. Ad excepteur et exercitation consectetur. Nulla magna pariatur commodo velit consectetur elit sunt voluptate laborum eiusmod sint cupidatat proident ex.\r\nConsectetur minim aute in eu tempor enim laboris deserunt. Proident laboris fugiat cupidatat ullamco ex. Laboris et eu qui tempor nisi non anim magna sunt est commodo qui et. In sint eu quis ea. Adipisicing ad nisi non mollit officia elit. Reprehenderit veniam aute consequat qui aliqua incididunt.\r\n", + "address": "4 Willmohr Street", + "city": "Russellville", + "state": "Texas", + "zip": 61324, + "country": "Cocos (Keeling Islands)", + "email": "villarrealberg@scentric.com", + "phone": "(934) 457-2444", + "color": "rgb(128,225,98)" + }, + { + "index": 370, + "name": "Davidson Parker", + "first": "George", + "last": "Pittman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "boolean": true, + "guid": "4d0d0e84-953f-4ab2-819d-ae72aa4552f7", + "integer": 2, + "date": "Sat Jun 23 1979 15:10:33 GMT-0700 (PDT)", + "shortText": "adipisicing Lorem", + "mediumText": "Est ullamco qui est cupidatat magna velit cupidatat do sunt officia ad.", + "longText": "Velit enim nostrud et ut elit nostrud laboris mollit. Pariatur sit sint proident officia ea sunt consectetur occaecat esse velit. Nulla Lorem ad anim ut aute nostrud amet sit labore sint ullamco nisi ad.\r\nEsse proident in magna elit ex esse et consequat incididunt eiusmod officia. Occaecat labore ut aliqua sunt labore minim Lorem ut velit magna occaecat sit sunt. Commodo ut magna cillum minim.\r\nDolor cupidatat et ullamco velit elit labore. Sint dolore incididunt anim nisi aliquip. Ullamco id laboris cillum id enim cillum exercitation non.\r\nLaboris qui Lorem ipsum dolor proident exercitation consectetur commodo incididunt. Ad pariatur cillum et aute. Nulla cillum sint quis laboris fugiat do ullamco incididunt aliqua aliquip eu aute.\r\nLorem irure nisi magna ex do voluptate tempor consequat. Aliquip dolore ullamco laboris reprehenderit Lorem elit. Dolor esse minim veniam eu ex reprehenderit. Sit do irure anim ipsum id duis culpa laboris dolore velit cillum nulla amet dolor. Exercitation enim proident ut aliqua culpa ipsum. Aute ad irure ipsum exercitation fugiat ut. Labore non do incididunt nulla veniam ex exercitation nostrud enim fugiat.\r\n", + "address": "3 Stryker Court", + "city": "Bourg", + "state": "District Of Columbia", + "zip": 63976, + "country": "Saint Kitts and Nevis", + "email": "georgepittman@scentric.com", + "phone": "(812) 518-3391", + "color": "rgb(128,255,152)" + }, + { + "index": 371, + "name": "Ingram Ware", + "first": "Caitlin", + "last": "Hart", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "boolean": true, + "guid": "b6de624e-cbfa-436a-9fcb-b5d584616793", + "integer": 24, + "date": "Thu Feb 14 1974 18:30:07 GMT-0700 (PDT)", + "shortText": "tempor reprehenderit nulla quis", + "mediumText": "Qui id adipisicing do deserunt laboris anim. Eiusmod magna dolor labore fugiat aute amet commodo ad sit. Esse occaecat labore qui culpa aute pariatur commodo velit laborum enim voluptate. Consequat sunt labore cupidatat ex labore id exercitation ad deserunt quis laboris et dolor.", + "longText": "Et consequat duis excepteur occaecat reprehenderit labore dolor nostrud. Aliqua irure ullamco reprehenderit incididunt dolore aliquip eiusmod. Et et in commodo quis.\r\nFugiat fugiat amet qui deserunt incididunt consequat ex anim culpa Lorem. Magna cillum incididunt ut consectetur esse quis veniam nulla aliqua esse velit consequat ipsum. Veniam ut amet officia tempor aliquip ad ad ad commodo ut et. Ad esse mollit adipisicing adipisicing cillum.\r\nUllamco dolore ullamco adipisicing in duis enim eiusmod sit. Proident nisi nostrud ea ipsum. Aliquip officia est ut Lorem ad incididunt qui tempor aliquip aute non esse. Id culpa ipsum proident duis eu sint elit eiusmod esse quis veniam nulla mollit. Elit mollit pariatur occaecat sunt duis et ipsum quis pariatur consequat ad culpa deserunt ex.\r\n", + "address": "2 Elliott Place", + "city": "Moscow", + "state": "Virgin Islands", + "zip": 16190, + "country": "Spain", + "email": "caitlinhart@scentric.com", + "phone": "(802) 458-3217", + "color": "rgb(245,222,100)" + }, + { + "index": 372, + "name": "Rodriguez Herring", + "first": "Blevins", + "last": "Richards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "boolean": false, + "guid": "16027d94-5563-418b-b92e-879c2bfe66a2", + "integer": 27, + "date": "Thu Aug 04 1977 16:52:59 GMT-0700 (PDT)", + "shortText": "ea incididunt commodo", + "mediumText": "Fugiat culpa duis velit ullamco cupidatat esse pariatur deserunt laborum. Irure nostrud nulla culpa cupidatat est quis sunt veniam culpa. Aliqua anim mollit nulla aliquip quis dolore irure aliquip non est.", + "longText": "Anim laborum aliquip et culpa mollit eiusmod laboris. Consectetur tempor deserunt ullamco cillum elit sunt esse ut ullamco do aliquip. Irure pariatur occaecat id deserunt fugiat irure Lorem tempor excepteur ut dolor cupidatat reprehenderit adipisicing.\r\nIpsum sit ipsum aute ex sint magna commodo in anim enim consequat occaecat nisi. Qui do pariatur do ea. Consequat cupidatat sit aute fugiat qui laboris culpa elit irure excepteur. Duis ea elit et aliqua qui ipsum commodo proident adipisicing duis tempor. Duis ad nulla dolore minim anim dolore aute amet tempor.\r\nExercitation pariatur mollit cupidatat adipisicing deserunt pariatur incididunt. Sit deserunt consequat nisi do irure et duis quis. Cupidatat ea et ut velit ullamco ad dolore fugiat voluptate cillum.\r\nDolore ipsum anim nisi voluptate id ad non do dolor cupidatat duis dolor in. Excepteur esse aliquip ex dolor aute adipisicing duis dolore. Mollit amet deserunt occaecat qui cupidatat do et ea reprehenderit qui.\r\n", + "address": "2 Mill Street", + "city": "Sunriver", + "state": "Puerto Rico", + "zip": 60210, + "country": "Guinea-Bissau", + "email": "blevinsrichards@scentric.com", + "phone": "(880) 569-2358", + "color": "rgb(141,69,176)" + }, + { + "index": 373, + "name": "Larsen Petersen", + "first": "Kayla", + "last": "Wolf", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "boolean": false, + "guid": "a7e99e07-e0c7-499a-a66b-a5b931143a55", + "integer": 25, + "date": "Fri Nov 24 1995 21:45:58 GMT-0800 (PST)", + "shortText": "elit exercitation", + "mediumText": "Minim in laboris culpa cupidatat ea nostrud sunt id dolore officia ea ipsum sit.", + "longText": "Id amet fugiat voluptate labore ea. Velit fugiat qui magna cillum ullamco duis eu qui pariatur. Do laboris irure nulla id. Minim enim commodo non ut sint. Consequat ut in consequat laborum pariatur commodo consectetur irure.\r\nDolor in aute mollit anim. Laboris incididunt occaecat ipsum Lorem velit nisi anim sunt consectetur. Occaecat aliquip ex irure adipisicing. Culpa elit dolore deserunt nisi. Laboris quis nulla in incididunt culpa proident culpa Lorem ea. Incididunt eiusmod culpa Lorem in cillum amet eu aute qui anim et qui sunt et.\r\nAmet veniam adipisicing minim minim proident sit commodo reprehenderit. Duis consequat do ex mollit minim consectetur. Nulla cillum enim esse sit commodo ad cupidatat ipsum veniam aliquip sunt. Ut dolore ullamco velit est minim laboris incididunt consequat.\r\nVoluptate excepteur Lorem ut id minim incididunt quis proident cupidatat consequat sunt magna dolor. Nostrud aliqua laborum exercitation dolor Lorem. Magna adipisicing cupidatat anim reprehenderit mollit aliquip esse nisi magna est. Laboris mollit consectetur ut tempor minim excepteur fugiat do consectetur tempor. Enim fugiat tempor labore occaecat elit est minim. Enim ex quis pariatur est eiusmod.\r\nDo velit nisi enim adipisicing qui consectetur reprehenderit aute occaecat exercitation consectetur. Cupidatat proident aute sit aliqua cupidatat velit adipisicing occaecat eu sint et proident ad quis. Qui laboris dolore id proident mollit labore aliqua sint aliquip. Minim reprehenderit consequat est voluptate proident irure aliqua reprehenderit do nisi. Nulla culpa culpa eu ea laborum minim ad culpa Lorem enim. Aliqua officia ut id et laboris quis eiusmod ex consequat aliquip voluptate.\r\n", + "address": "4 Sunnyside Avenue", + "city": "Jacksonwald", + "state": "Maryland", + "zip": 86841, + "country": "Cameroon", + "email": "kaylawolf@scentric.com", + "phone": "(905) 565-3468", + "color": "rgb(60,235,69)" + }, + { + "index": 374, + "name": "Holt Oconnor", + "first": "Newman", + "last": "Skinner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "boolean": true, + "guid": "b20aa0b1-320a-4487-8af0-78e7cbf30443", + "integer": 29, + "date": "Sun Apr 26 1981 19:50:41 GMT-0700 (PDT)", + "shortText": "non duis elit", + "mediumText": "Esse fugiat ut incididunt fugiat minim enim sit. Aliquip amet incididunt enim quis culpa et ut incididunt eu officia mollit adipisicing ex. Tempor velit magna deserunt voluptate occaecat id laborum occaecat labore id dolore.", + "longText": "Ut deserunt ut minim consequat. Non aute commodo minim proident ex ex id. Consectetur sunt reprehenderit consectetur Lorem eu sit ut reprehenderit aliqua eu occaecat.\r\nEiusmod occaecat dolor mollit adipisicing aute enim do. Aliqua ut sit tempor velit sunt. Minim eiusmod qui aute ea quis dolor et dolor excepteur qui sit eu incididunt qui. Ex id incididunt nisi sint dolore laboris reprehenderit officia velit.\r\nCupidatat dolor nostrud reprehenderit irure aliquip minim minim voluptate in Lorem labore eiusmod proident minim. Commodo reprehenderit eu velit magna fugiat ad cillum in deserunt elit tempor est commodo. Pariatur aliqua dolore proident cillum ex laboris culpa proident irure velit reprehenderit. Irure sit ad ipsum mollit ex. Reprehenderit nulla sit adipisicing excepteur dolore magna ullamco quis laborum minim enim ut.\r\nEnim sit Lorem nulla adipisicing ipsum cillum pariatur cillum aute culpa proident non Lorem dolor. Ea cupidatat anim labore duis nisi et ex id proident tempor. Qui sunt est aliqua in non do ea fugiat. Aute aliqua consectetur sunt culpa nisi sunt. Ipsum nulla quis ad ut elit proident ad culpa deserunt enim elit ea. Ea sint ea ipsum velit esse labore labore est ex aliquip nulla fugiat id dolor. Officia sunt ipsum est officia laborum in ea eiusmod irure laborum ea id magna non.\r\nAliquip nostrud nisi dolor aliquip commodo. Enim ex labore velit anim nisi consectetur excepteur labore reprehenderit. Lorem exercitation ut cillum et magna commodo labore esse nostrud duis Lorem. Cillum incididunt deserunt eu in cupidatat. Veniam cillum culpa voluptate irure cillum sit veniam elit velit labore. Dolore voluptate commodo labore nisi anim esse veniam deserunt sint anim amet velit.\r\n", + "address": "2 Neptune Avenue", + "city": "Croom", + "state": "Massachusetts", + "zip": 45897, + "country": "Niger", + "email": "newmanskinner@scentric.com", + "phone": "(895) 579-2625", + "color": "rgb(213,132,55)" + }, + { + "index": 375, + "name": "Ray Mcdonald", + "first": "Gladys", + "last": "Hamilton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "boolean": true, + "guid": "129213d5-185b-462e-9d98-ec5d7ebbf584", + "integer": 29, + "date": "Fri Oct 24 2008 13:24:33 GMT-0700 (PDT)", + "shortText": "sit in", + "mediumText": "Sit ut sit ut ullamco pariatur.", + "longText": "Nulla veniam officia ipsum cupidatat est sit deserunt officia eiusmod. Ut aliquip mollit sint qui do laborum esse id. Cillum mollit Lorem laboris deserunt quis reprehenderit do deserunt excepteur ullamco cillum. Qui sit consequat velit ipsum elit non officia laborum eiusmod ad aliquip velit. Minim consectetur reprehenderit nisi irure ullamco occaecat ipsum.\r\nEu fugiat do in ad dolore reprehenderit aute ullamco sit non. Incididunt qui esse fugiat nisi excepteur eiusmod mollit non deserunt qui sunt do. Velit deserunt ex culpa sunt ipsum elit veniam aute. Dolor occaecat officia eiusmod sint sint non aute consectetur quis ea.\r\n", + "address": "4 Lacon Court", + "city": "Iberia", + "state": "Oklahoma", + "zip": 71131, + "country": "Malta", + "email": "gladyshamilton@scentric.com", + "phone": "(966) 483-3351", + "color": "rgb(155,104,148)" + }, + { + "index": 376, + "name": "Clay Langley", + "first": "Burris", + "last": "Randall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "boolean": true, + "guid": "51f80793-c017-41ad-9079-d752d4d47d9e", + "integer": 53, + "date": "Mon Jun 07 1982 18:22:42 GMT-0700 (PDT)", + "shortText": "elit", + "mediumText": "Irure in cillum eiusmod do laboris. Magna sit consectetur elit quis dolore quis ea esse. Minim velit adipisicing consequat mollit veniam. Minim eiusmod laboris nisi mollit ea labore commodo ipsum et ullamco duis.", + "longText": "Sit est fugiat sit nostrud laboris veniam aliqua enim aliqua eu ex cillum. Incididunt occaecat minim consectetur duis eiusmod. Pariatur laborum nostrud dolore minim excepteur sunt pariatur aute. Do anim quis ad enim est sint minim dolore laboris in fugiat cupidatat mollit pariatur. Ipsum est dolor aliqua aute. Sunt proident duis pariatur qui veniam sunt. Ea anim consequat nostrud reprehenderit ea ad non.\r\n", + "address": "4 McClancy Place", + "city": "Nash", + "state": "Ohio", + "zip": 18742, + "country": "Antigua and Barbuda", + "email": "burrisrandall@scentric.com", + "phone": "(844) 495-2795", + "color": "rgb(161,56,157)" + }, + { + "index": 377, + "name": "Whitaker Duffy", + "first": "Consuelo", + "last": "Vaughn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "boolean": false, + "guid": "d79e9e47-4d77-47c0-9b13-a19147d76339", + "integer": 69, + "date": "Tue Apr 18 1989 16:24:01 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Cillum mollit amet fugiat aliquip proident. Cillum veniam ut do anim eiusmod officia laborum enim voluptate commodo.", + "longText": "Aliquip labore non amet cillum ipsum ex non commodo enim eiusmod ea. Est non do nulla laborum minim nostrud esse exercitation fugiat eiusmod. Aliquip labore dolor ad duis velit nisi exercitation fugiat proident cupidatat Lorem elit ullamco dolore. Cupidatat enim sunt id veniam exercitation voluptate consectetur pariatur. Irure labore tempor sint adipisicing nisi anim. Proident officia minim amet sunt enim in officia dolor voluptate ea magna ullamco.\r\n", + "address": "4 Senator Street", + "city": "Emerald", + "state": "Nevada", + "zip": 95049, + "country": "Kazakhstan", + "email": "consuelovaughn@scentric.com", + "phone": "(820) 453-3820", + "color": "rgb(211,124,127)" + }, + { + "index": 378, + "name": "Millicent Brewer", + "first": "Carpenter", + "last": "French", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "boolean": true, + "guid": "fc81e8c8-56bf-4cc7-9a99-bc5e5336cc44", + "integer": 10, + "date": "Mon Dec 20 2004 03:29:39 GMT-0800 (PST)", + "shortText": "cillum elit dolore id", + "mediumText": "Consectetur laboris velit culpa nisi est nostrud ea laboris et. Voluptate incididunt qui cillum velit occaecat nisi deserunt. Ut nisi do veniam sunt deserunt adipisicing nostrud nostrud eu nulla consectetur amet elit.", + "longText": "Enim aliquip ipsum voluptate ut adipisicing anim dolor. Est est nisi est ex fugiat labore aute proident nisi amet deserunt anim nisi dolore. Eiusmod elit Lorem et officia cillum in proident cillum sint do. Laboris dolore ad cupidatat anim et eu.\r\nIn aute eiusmod esse commodo officia culpa Lorem quis laboris. Ipsum pariatur pariatur dolore amet ipsum amet ex laboris laboris. Magna elit sunt Lorem magna ea laborum non voluptate eu velit irure id excepteur. Adipisicing non pariatur culpa sit tempor ea anim officia aute. Magna eu cupidatat sint nostrud veniam sunt irure non. Lorem mollit eiusmod ea magna qui consectetur quis aliqua nulla nulla. Ipsum deserunt cupidatat irure fugiat et commodo ut.\r\nVelit anim eiusmod Lorem incididunt id deserunt mollit voluptate. Commodo id excepteur id occaecat sit. Qui amet proident ipsum est aute culpa et mollit et nulla occaecat minim minim. Magna ut enim exercitation laborum deserunt occaecat enim sunt veniam aliquip exercitation elit et. Nulla enim tempor fugiat eiusmod qui laborum ad est minim incididunt reprehenderit voluptate ad reprehenderit. Officia exercitation reprehenderit aliquip in id Lorem laboris laboris ipsum laborum minim ullamco eiusmod.\r\nConsectetur consequat irure consectetur reprehenderit aliqua quis ea fugiat ullamco reprehenderit. Fugiat fugiat elit voluptate in aliqua qui excepteur duis ipsum veniam occaecat eu sint amet. Aliquip deserunt ea ipsum ea pariatur in magna dolore voluptate.\r\nEnim eiusmod laboris officia exercitation irure laboris sit adipisicing non tempor nostrud officia. Quis ut esse deserunt qui laborum do velit eu amet dolore. Consequat adipisicing nulla officia ipsum veniam eiusmod. Occaecat deserunt veniam tempor sint labore nisi irure. Ullamco ad eu pariatur commodo aute ea cupidatat et consequat do commodo tempor. Adipisicing eiusmod culpa nostrud commodo adipisicing irure dolore aliquip labore. Ullamco commodo mollit consequat incididunt ut in officia occaecat voluptate.\r\n", + "address": "3 Drew Street", + "city": "Enetai", + "state": "Montana", + "zip": 76072, + "country": "Bahrain", + "email": "carpenterfrench@scentric.com", + "phone": "(981) 464-3639", + "color": "rgb(116,120,98)" + }, + { + "index": 379, + "name": "Blanchard Solis", + "first": "Kristie", + "last": "Cabrera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "boolean": false, + "guid": "c2c84ffa-4a75-48e1-998f-924681ab4240", + "integer": 1, + "date": "Sat Jul 09 1988 08:58:08 GMT-0700 (PDT)", + "shortText": "excepteur velit quis dolore amet", + "mediumText": "Culpa magna fugiat est consequat deserunt elit eiusmod ullamco. Non esse consectetur id amet excepteur magna culpa mollit ea veniam elit.", + "longText": "Nulla et laboris qui aute commodo sunt enim occaecat ad eu. Enim eu consequat in id irure minim. Id pariatur commodo duis ea aute deserunt. Cillum consequat ea nostrud cillum proident.\r\n", + "address": "3 Aitken Place", + "city": "Germanton", + "state": "California", + "zip": 10214, + "country": "India", + "email": "kristiecabrera@scentric.com", + "phone": "(870) 486-2499", + "color": "rgb(60,117,146)" + }, + { + "index": 380, + "name": "Armstrong Leon", + "first": "Wolfe", + "last": "Hansen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "boolean": true, + "guid": "ae0fcdb0-49fc-4ff8-85f2-7414f67b99f6", + "integer": 60, + "date": "Fri Feb 27 1970 07:01:10 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Laboris adipisicing consectetur qui do nostrud occaecat in consectetur sit. Esse nisi commodo voluptate magna eu nisi fugiat amet nostrud.", + "longText": "Sunt ut labore sint sint labore dolor ullamco cupidatat velit tempor ea cillum. Veniam sit ex dolor sint irure ut. Nulla culpa ullamco ut ullamco tempor consectetur pariatur adipisicing reprehenderit laborum nostrud sint.\r\nEnim nisi aliquip pariatur non laboris ea. Aute aute pariatur commodo tempor sint pariatur quis ad ea pariatur Lorem cupidatat aute consectetur. Laboris ad laboris in cillum proident nostrud mollit consectetur irure nisi magna. Dolor nisi amet anim esse voluptate ipsum minim officia ut ex laboris cillum sunt elit. Tempor quis ex ullamco pariatur officia. Ad excepteur enim ea laborum id officia aliquip cillum est. Do ut labore aliquip dolor sit commodo.\r\nMinim excepteur esse esse enim proident eiusmod reprehenderit proident qui amet. Lorem culpa proident reprehenderit officia tempor magna sunt deserunt qui velit voluptate sunt. Ad ex nulla dolore duis veniam exercitation enim dolore excepteur consequat laborum officia ea fugiat. Et proident eiusmod incididunt quis do fugiat consectetur consectetur esse culpa magna magna.\r\nIn excepteur eu esse duis et excepteur. Qui incididunt eu dolore tempor pariatur occaecat. Dolor ex voluptate ut incididunt est mollit mollit aliqua Lorem sunt est irure ullamco in. Id culpa amet voluptate do aliquip laborum sit duis anim occaecat ea adipisicing do.\r\n", + "address": "4 Kent Street", + "city": "Carlton", + "state": "Marshall Islands", + "zip": 34631, + "country": "Qatar", + "email": "wolfehansen@scentric.com", + "phone": "(834) 587-3684", + "color": "rgb(135,161,252)" + }, + { + "index": 381, + "name": "Kerry Emerson", + "first": "Hurst", + "last": "Gilliam", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "boolean": false, + "guid": "454852cf-301c-42cc-88a5-fef2dce8ac2d", + "integer": 54, + "date": "Mon Jan 15 1990 07:32:08 GMT-0800 (PST)", + "shortText": "amet ullamco", + "mediumText": "Sunt tempor irure nulla do esse aliqua. Velit fugiat incididunt aliqua voluptate nisi qui ut.", + "longText": "Do labore aute veniam voluptate reprehenderit Lorem cupidatat excepteur est cupidatat adipisicing irure. Veniam consectetur fugiat esse et. Excepteur magna dolore duis ea occaecat. Voluptate occaecat id occaecat velit nostrud.\r\nFugiat sint eiusmod reprehenderit magna consequat esse. Dolor sint officia aliquip occaecat occaecat qui ipsum magna cupidatat excepteur ad et est laborum. Ut consectetur ex proident elit.\r\nAdipisicing incididunt excepteur ea labore proident proident et id in reprehenderit ut occaecat et. Et aliquip incididunt enim ea enim ea minim ut eiusmod. Velit mollit sunt voluptate laboris aliquip incididunt. Duis laborum do adipisicing non tempor nisi minim do aliquip laboris irure tempor ad dolore. Aliqua amet adipisicing eu Lorem esse fugiat fugiat velit.\r\nSunt irure ex reprehenderit nostrud minim magna. Commodo nostrud mollit pariatur reprehenderit consequat occaecat aliqua. Reprehenderit id non magna nisi amet sunt incididunt deserunt dolor quis cupidatat adipisicing voluptate sunt. Tempor proident magna amet culpa est est. Mollit sint eiusmod reprehenderit est. Lorem do culpa ut enim quis enim cillum elit ullamco deserunt fugiat commodo dolor.\r\n", + "address": "3 Vandam Street", + "city": "Carlos", + "state": "Indiana", + "zip": 18552, + "country": "Vatican City State (Holy See)", + "email": "hurstgilliam@scentric.com", + "phone": "(883) 509-3820", + "color": "rgb(92,147,218)" + }, + { + "index": 382, + "name": "Rosanna Mercer", + "first": "Jeannie", + "last": "Harrington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "boolean": true, + "guid": "81b02f40-06df-4e1f-bb59-400a488d75c1", + "integer": 9, + "date": "Thu Apr 29 1982 09:20:09 GMT-0700 (PDT)", + "shortText": "velit exercitation laborum excepteur nulla", + "mediumText": "Lorem minim consequat sunt eu commodo. Irure occaecat do irure ex dolore. Dolore consequat occaecat aliqua aliqua do incididunt consectetur in et eiusmod. Laboris incididunt esse magna aliquip excepteur sint quis ipsum consectetur aute labore. Et non consequat reprehenderit ipsum incididunt nisi do.", + "longText": "Dolor esse nostrud in culpa. Elit cillum cupidatat cillum aute nulla labore sint aliquip enim exercitation. Nulla do tempor labore sit adipisicing. Ex sint deserunt in pariatur veniam. Ea do do aliqua cillum id mollit duis elit aute eiusmod pariatur cupidatat duis anim.\r\nCulpa officia ea amet non non nulla occaecat quis ut Lorem eiusmod velit ad ut. Ex deserunt ut pariatur excepteur fugiat dolor ex aute elit officia amet consectetur consectetur excepteur. Dolor culpa pariatur proident anim reprehenderit velit laboris velit aliquip.\r\nSit velit amet laboris incididunt qui excepteur irure excepteur. Nulla adipisicing pariatur enim nisi. Dolore ea veniam adipisicing mollit eiusmod. Eu sit ea in consequat proident ex magna veniam pariatur quis aute aliquip sint. Ullamco irure nisi anim tempor.\r\n", + "address": "3 Brooklyn Road", + "city": "Northchase", + "state": "Tennessee", + "zip": 58954, + "country": "Malaysia", + "email": "jeannieharrington@scentric.com", + "phone": "(869) 440-3471", + "color": "rgb(54,179,184)" + }, + { + "index": 383, + "name": "Hudson Gill", + "first": "Erma", + "last": "Medina", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "boolean": true, + "guid": "5cc52dab-f9b6-4d23-9718-12faaca42aaa", + "integer": 29, + "date": "Fri Nov 07 1975 23:03:48 GMT-0800 (PST)", + "shortText": "elit consequat", + "mediumText": "Exercitation aliqua fugiat Lorem fugiat amet est elit. Incididunt voluptate sunt sint ut veniam. Non velit deserunt duis est excepteur consectetur excepteur commodo non ex consequat. Non et ullamco ipsum eiusmod.", + "longText": "Sint ea duis commodo sunt elit ut nulla. Tempor consectetur id aliqua voluptate. Anim sint occaecat nisi eu commodo nisi magna deserunt commodo fugiat quis aliqua.\r\nEiusmod aliquip incididunt dolore elit et fugiat in ex. Qui cupidatat duis tempor amet aute. Nulla et cillum culpa irure consequat sit exercitation ex quis ex. Qui sit ipsum non laboris esse cupidatat eu excepteur. Incididunt tempor sit in fugiat tempor excepteur culpa veniam in incididunt reprehenderit. Ad quis enim cillum quis anim.\r\n", + "address": "2 Decatur Street", + "city": "Hardyville", + "state": "Palau", + "zip": 41443, + "country": "Belize", + "email": "ermamedina@scentric.com", + "phone": "(806) 595-3481", + "color": "rgb(144,140,116)" + }, + { + "index": 384, + "name": "Dominique Valenzuela", + "first": "Stacey", + "last": "Foreman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "boolean": true, + "guid": "11147a9a-0058-436d-96c3-f7ae0639677c", + "integer": 82, + "date": "Sat Jul 25 1992 11:14:15 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Enim aliqua aute nostrud ad veniam eiusmod Lorem occaecat sit magna aliqua. Ad ut ipsum dolore pariatur officia sunt tempor velit minim ea consequat commodo deserunt cupidatat. Aliqua ad nostrud aliqua officia mollit ut dolor aliqua est mollit elit ad in veniam. Dolor et nostrud elit ea proident dolore excepteur sit adipisicing cillum enim. Reprehenderit mollit do adipisicing excepteur ullamco exercitation culpa ipsum in eu aliqua.", + "longText": "Reprehenderit ullamco esse aute et laborum pariatur consectetur tempor. Consequat eiusmod fugiat commodo incididunt laborum. Et eiusmod cupidatat incididunt dolor cupidatat sint in nisi anim duis sit labore ex occaecat. Excepteur ipsum officia ut qui ad tempor eu ad cillum commodo.\r\nMagna quis nisi nostrud sint et eiusmod laborum laborum ut. In labore labore veniam anim labore laboris reprehenderit aliquip voluptate aute ullamco duis. Aute tempor magna elit elit aute adipisicing est consequat enim occaecat culpa.\r\nIn aliqua adipisicing aliquip do consequat ipsum Lorem. Nisi nulla velit mollit deserunt laboris elit magna ullamco sint magna anim ut ullamco. Aliquip commodo qui ipsum tempor amet nostrud sit aliquip qui eiusmod minim deserunt esse. Incididunt adipisicing irure excepteur reprehenderit id officia sit amet reprehenderit reprehenderit nostrud ut. Officia deserunt officia qui magna incididunt non cillum esse cupidatat dolor quis eiusmod. Cillum amet minim dolor ipsum anim officia velit aliqua adipisicing anim mollit. Irure enim laborum ex esse id magna dolore non nulla nisi excepteur ad nulla aute.\r\n", + "address": "3 McDonald Avenue", + "city": "Robbins", + "state": "Virginia", + "zip": 22185, + "country": "Singapore", + "email": "staceyforeman@scentric.com", + "phone": "(829) 412-3655", + "color": "rgb(214,140,189)" + }, + { + "index": 385, + "name": "Dolores Morgan", + "first": "Gaines", + "last": "Mullen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "boolean": false, + "guid": "ee76f873-95bb-4f4d-84fd-c7313d26386b", + "integer": 51, + "date": "Mon Feb 22 1999 15:26:58 GMT-0800 (PST)", + "shortText": "officia proident", + "mediumText": "Aliquip proident ad incididunt veniam.", + "longText": "Esse excepteur ex sunt id sit laborum. Ut ea qui esse esse qui aliqua ut ex in. Dolore magna laborum veniam magna non ad eiusmod et eiusmod deserunt tempor occaecat. Eiusmod voluptate ut do non. Deserunt est laborum eu aute deserunt eiusmod amet consectetur elit ullamco laboris elit.\r\nConsectetur aliquip reprehenderit est sunt do est sint ad deserunt dolor est. Pariatur id Lorem nostrud elit proident in nulla anim. Duis sunt veniam fugiat sunt aliquip ea eiusmod consectetur nulla consectetur quis.\r\n", + "address": "4 Village Road", + "city": "Springville", + "state": "Wyoming", + "zip": 48245, + "country": "Trinidad and Tobago", + "email": "gainesmullen@scentric.com", + "phone": "(832) 562-2069", + "color": "rgb(177,196,203)" + }, + { + "index": 386, + "name": "Washington Bates", + "first": "Mccray", + "last": "Davenport", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "boolean": false, + "guid": "97224884-727c-4a89-b596-60fbca7914a7", + "integer": 34, + "date": "Thu Nov 13 1980 22:28:43 GMT-0800 (PST)", + "shortText": "enim nostrud", + "mediumText": "Sunt fugiat esse ad sint sint duis ex tempor enim excepteur ullamco. Dolor ipsum occaecat laborum enim. Nisi ex cillum ex culpa laborum proident esse minim incididunt anim est occaecat deserunt cillum. Excepteur aliqua dolore duis do non adipisicing anim excepteur. Sit aliquip ut nisi aliquip labore do officia proident amet esse deserunt laborum sunt veniam.", + "longText": "Aute magna amet irure mollit ex. Deserunt exercitation irure aute eiusmod aute occaecat mollit reprehenderit sit ea esse esse. Laborum cillum Lorem Lorem officia velit minim cillum reprehenderit tempor velit exercitation deserunt ad velit. Irure nulla aliqua ex cupidatat adipisicing cillum amet ex quis deserunt.\r\nVoluptate amet nisi incididunt eiusmod consequat et laboris consequat est voluptate sunt enim. Adipisicing nostrud pariatur aute commodo minim veniam. Anim mollit velit esse cupidatat aliquip exercitation est id est. Cillum incididunt nulla duis non incididunt dolore ipsum est culpa pariatur duis quis.\r\nAd commodo laborum ex voluptate commodo non fugiat ut. Id labore quis aute eiusmod deserunt cupidatat. Consequat irure eu velit aliqua reprehenderit consequat qui labore magna. Sunt ad ad sit irure laboris enim sint do eiusmod Lorem velit cupidatat labore enim. Exercitation veniam sint nulla excepteur id reprehenderit laboris qui et adipisicing. Anim occaecat duis cupidatat dolore labore id duis ad ipsum do.\r\nCulpa fugiat minim cupidatat nisi occaecat reprehenderit sit. Ipsum laboris incididunt tempor irure adipisicing veniam. Nisi laborum cupidatat anim quis fugiat velit ea ad commodo cupidatat. Aliquip esse eu deserunt sint.\r\n", + "address": "4 Lincoln Avenue", + "city": "Deercroft", + "state": "Colorado", + "zip": 53863, + "country": "Namibia", + "email": "mccraydavenport@scentric.com", + "phone": "(970) 600-2028", + "color": "rgb(55,74,60)" + }, + { + "index": 387, + "name": "Estela Dotson", + "first": "Brewer", + "last": "Barnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "boolean": false, + "guid": "ec7da2db-8a36-430c-bb60-68be4ca38e6f", + "integer": 50, + "date": "Tue Sep 10 1985 22:13:34 GMT-0700 (PDT)", + "shortText": "pariatur do deserunt enim velit", + "mediumText": "Nulla consequat incididunt sint do. Mollit dolor veniam sunt nisi ex consectetur eu excepteur officia culpa.", + "longText": "Veniam proident laboris fugiat id. Ex ut consectetur tempor pariatur duis quis veniam eiusmod amet cupidatat amet enim. Est consectetur exercitation deserunt tempor laboris dolor velit dolore consectetur. Amet anim excepteur sunt sunt ut exercitation minim. Cillum velit aliqua enim magna sunt cillum exercitation esse.\r\nFugiat magna eu nulla anim est voluptate pariatur dolore tempor esse. Nostrud adipisicing laborum ea sint sint aliquip deserunt culpa ipsum sunt. Dolor deserunt ex quis duis dolor sint labore. Et tempor eu cillum est aliqua non. Proident dolore irure est labore duis. Cupidatat ullamco magna excepteur et ex adipisicing ullamco consectetur.\r\n", + "address": "4 Batchelder Street", + "city": "Unionville", + "state": "Utah", + "zip": 19511, + "country": "Paraguay", + "email": "brewerbarnett@scentric.com", + "phone": "(824) 468-3108", + "color": "rgb(251,142,227)" + }, + { + "index": 388, + "name": "Griffith Calhoun", + "first": "Elma", + "last": "Delaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "boolean": false, + "guid": "bcdb801c-da6b-4e33-8b60-cb63d7391110", + "integer": 26, + "date": "Thu Oct 07 2004 12:09:01 GMT-0700 (PDT)", + "shortText": "incididunt commodo est", + "mediumText": "Ullamco aliqua excepteur nisi veniam dolor veniam excepteur aute est. Sit in reprehenderit laborum non laboris incididunt esse quis veniam ex. In sit laboris enim ex mollit. Esse nisi ipsum sit adipisicing velit excepteur reprehenderit pariatur excepteur aute Lorem consequat. Aliquip culpa dolor commodo consectetur ad aute amet eu tempor velit eiusmod.", + "longText": "Do velit in aliqua id eu occaecat duis ex officia amet. Aliquip consectetur fugiat quis labore. Commodo commodo veniam incididunt aute sit in dolore excepteur eiusmod mollit sint nisi laborum incididunt.\r\n", + "address": "3 Willow Street", + "city": "Craig", + "state": "Idaho", + "zip": 23018, + "country": "Macau", + "email": "elmadelaney@scentric.com", + "phone": "(820) 569-3637", + "color": "rgb(73,159,77)" + }, + { + "index": 389, + "name": "Delgado Brennan", + "first": "Mercedes", + "last": "Livingston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "boolean": true, + "guid": "f39cc1c7-24fe-4b1d-a1ae-3a5b625510ee", + "integer": 14, + "date": "Wed May 28 2008 07:59:57 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Sit et labore aute exercitation cupidatat deserunt proident proident et ad occaecat. Sint occaecat adipisicing qui eiusmod id enim consectetur dolor qui dolore sunt ullamco. Laboris ex ad ad nostrud nisi laborum est sint occaecat elit. Ut ad anim aliquip voluptate aute eiusmod do minim ad do voluptate ullamco in occaecat. Irure deserunt culpa dolor consectetur eu ad magna officia nostrud ea.", + "longText": "Ex id adipisicing non ipsum sint tempor in anim. Fugiat consequat culpa dolor eu non sint quis velit nulla voluptate. Et commodo laborum laboris anim ut fugiat occaecat sunt pariatur. Commodo adipisicing cillum consectetur proident velit deserunt. Dolore veniam aute ipsum minim velit occaecat. Ut aute laborum quis in mollit. Quis labore sit sint elit deserunt nostrud deserunt elit ex cillum.\r\nElit incididunt cillum ad ullamco nisi eu esse nisi ipsum voluptate magna exercitation nisi sit. Adipisicing mollit dolore magna duis. Aliqua non Lorem voluptate nulla ad id excepteur ullamco magna id magna pariatur ea anim. Officia voluptate laborum reprehenderit consequat.\r\nMagna deserunt consequat dolor elit ullamco. Amet labore tempor esse ipsum excepteur officia ut irure reprehenderit dolor fugiat proident culpa. Enim eu eiusmod do ex sit ut aute sit dolore consequat et laboris labore sint. Elit elit laborum exercitation velit consectetur. Aute esse occaecat in nisi sunt veniam sint sit sunt dolor pariatur consectetur.\r\nConsectetur cupidatat amet id mollit dolore occaecat pariatur in ea proident consectetur. Minim eiusmod nulla proident ut pariatur incididunt ullamco mollit nulla occaecat excepteur fugiat eu. Sint veniam anim nostrud deserunt excepteur id labore aliquip consectetur.\r\n", + "address": "4 Summit Street", + "city": "Chloride", + "state": "Arkansas", + "zip": 87932, + "country": "Mauritania", + "email": "mercedeslivingston@scentric.com", + "phone": "(982) 574-2165", + "color": "rgb(166,233,208)" + }, + { + "index": 390, + "name": "Melanie Gilmore", + "first": "Michael", + "last": "Rodriquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "boolean": false, + "guid": "7505cfd7-3696-48c3-8cb0-20a4ddd83340", + "integer": 30, + "date": "Sun Dec 27 1992 18:33:54 GMT-0800 (PST)", + "shortText": "cupidatat est in excepteur dolor", + "mediumText": "Consectetur est Lorem do dolore reprehenderit irure. Culpa et aliquip nulla pariatur aute sit aliqua incididunt enim. Elit nostrud excepteur nulla dolor aute ad sunt laboris sint reprehenderit est do. Irure irure reprehenderit adipisicing amet fugiat sunt ullamco nisi laborum non ad.", + "longText": "Voluptate officia eu dolore ullamco laborum enim id et adipisicing aute reprehenderit cillum. Incididunt et deserunt mollit elit incididunt qui dolore quis. Consectetur magna minim irure culpa sint tempor aliquip proident cillum elit velit. Elit pariatur aliquip cillum id enim.\r\n", + "address": "2 Havens Place", + "city": "Nettie", + "state": "Delaware", + "zip": 89009, + "country": "Ghana", + "email": "michaelrodriquez@scentric.com", + "phone": "(870) 537-3435", + "color": "rgb(69,106,81)" + }, + { + "index": 391, + "name": "Hamilton Sanford", + "first": "Quinn", + "last": "Deleon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "boolean": true, + "guid": "f4a9b5c2-7e54-4d86-ac2b-dd1367a2ddb7", + "integer": 84, + "date": "Mon Feb 27 2006 05:53:41 GMT-0800 (PST)", + "shortText": "consequat cupidatat dolore veniam", + "mediumText": "Do id aliquip esse Lorem anim mollit est velit laborum deserunt.", + "longText": "Quis commodo esse aute qui ea anim ex Lorem duis culpa ipsum. Nostrud sint et anim Lorem officia sit dolor ipsum voluptate fugiat proident incididunt. Deserunt magna eu aute aliquip culpa exercitation. Voluptate et sit non dolor reprehenderit non proident enim qui. Ea do labore nisi commodo deserunt qui esse incididunt mollit velit esse fugiat officia.\r\nVoluptate dolor Lorem cillum commodo esse adipisicing veniam est pariatur esse aliqua. Aliquip commodo tempor fugiat ea quis deserunt sint nostrud minim. Consequat occaecat reprehenderit deserunt nisi irure consectetur et veniam esse exercitation dolore quis enim. Lorem deserunt anim ut occaecat culpa. Magna reprehenderit quis sunt deserunt ipsum.\r\nLaboris ut labore aliqua ut in anim sint. Ex fugiat duis elit ullamco veniam excepteur laboris. Aliqua dolore consequat excepteur incididunt nisi laboris irure et adipisicing aliquip Lorem fugiat dolor. Irure magna do cupidatat qui sint cupidatat qui commodo aute nostrud incididunt.\r\nPariatur minim proident excepteur ad pariatur mollit ipsum. Id eu elit deserunt elit cupidatat duis cillum proident do voluptate commodo aliqua. Tempor deserunt eiusmod commodo officia est enim non fugiat excepteur. Laborum exercitation Lorem voluptate sit est esse laboris ea sunt nostrud ipsum. Elit nostrud exercitation ad consequat ipsum velit velit fugiat excepteur consequat exercitation qui. Fugiat ex aliqua officia velit occaecat sint dolore. Excepteur cupidatat sit dolor dolore et eu.\r\nQui laboris aute et exercitation elit sint pariatur ea nulla Lorem do laboris ipsum. Fugiat nostrud proident laboris laborum adipisicing. Eu consectetur in ad tempor nisi qui do ea Lorem id labore pariatur anim officia. Cillum commodo est ex commodo nostrud elit consequat est dolore enim minim cillum. Dolore tempor dolor irure cupidatat eiusmod magna sit pariatur occaecat. Consequat non sit pariatur consequat nulla dolore adipisicing.\r\n", + "address": "4 Gerald Court", + "city": "Wanship", + "state": "Federated States Of Micronesia", + "zip": 83910, + "country": "Moldova", + "email": "quinndeleon@scentric.com", + "phone": "(843) 402-3938", + "color": "rgb(178,174,101)" + }, + { + "index": 392, + "name": "Williams Wiggins", + "first": "Brooke", + "last": "Pitts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "boolean": true, + "guid": "4ed6c0c9-de4f-460e-807c-24402159047d", + "integer": 8, + "date": "Mon May 03 1976 22:14:52 GMT-0700 (PDT)", + "shortText": "velit elit", + "mediumText": "Voluptate ea officia laborum exercitation ullamco veniam aliquip mollit duis dolor eu et. Veniam exercitation fugiat aute ipsum cupidatat. Mollit ad id irure enim adipisicing. Ullamco aliqua voluptate laborum non commodo pariatur aliquip.", + "longText": "Dolor fugiat aliqua aliqua Lorem tempor proident elit cillum exercitation. Voluptate ipsum Lorem pariatur fugiat mollit exercitation occaecat consequat laborum enim Lorem. Elit exercitation tempor eu sint nostrud aliquip aliquip enim in. Anim incididunt ad laboris deserunt duis sit ut anim esse ea dolore ipsum nostrud. Id pariatur velit velit pariatur elit sunt aliqua excepteur. Enim commodo amet sunt id mollit adipisicing quis sunt incididunt aliqua eiusmod nostrud.\r\nOfficia id sunt nulla adipisicing laborum. Laborum laborum eiusmod velit commodo non labore eu. Non nostrud sint do Lorem. Excepteur ipsum est esse minim ullamco reprehenderit quis Lorem sit veniam magna cupidatat laboris. Incididunt est in officia qui sit sit dolore. Aute voluptate irure commodo ad mollit elit amet consequat elit cupidatat consectetur tempor.\r\nOccaecat Lorem aliquip amet sint enim. Ullamco sunt quis commodo cupidatat voluptate ea. Est sint commodo exercitation sunt duis duis mollit reprehenderit. Incididunt consectetur eu et esse et pariatur velit laborum tempor. Nulla ea ea est pariatur et non.\r\nIn irure pariatur non commodo est cillum ut esse. Amet aliquip proident culpa Lorem velit et nostrud amet. Esse Lorem anim nulla dolore cillum labore do irure est aliqua labore sint magna non. Quis consequat nulla ex deserunt ex. Eiusmod commodo magna voluptate qui ex. Ex anim exercitation deserunt duis proident ea voluptate non enim.\r\nAd fugiat dolor officia cupidatat aute dolor dolor consectetur sit. Aliqua magna occaecat nulla minim ea aute fugiat sint irure aliquip nostrud dolor. Amet et non duis fugiat enim excepteur ipsum nisi. Ex amet dolore ex reprehenderit elit consectetur sunt sint laboris et. Ad do consequat aliqua adipisicing tempor pariatur non excepteur nisi ipsum elit cupidatat. Aliqua exercitation pariatur ullamco sint exercitation irure cupidatat aliquip mollit elit veniam ex reprehenderit.\r\n", + "address": "3 Portal Street", + "city": "Berwind", + "state": "Guam", + "zip": 84129, + "country": "Costa Rica", + "email": "brookepitts@scentric.com", + "phone": "(951) 474-2640", + "color": "rgb(210,98,96)" + }, + { + "index": 393, + "name": "Lucia Maynard", + "first": "Moore", + "last": "Bass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "boolean": false, + "guid": "044b1bae-19f0-48c3-a675-b3840c1f0350", + "integer": 13, + "date": "Sun Jun 29 2008 08:11:07 GMT-0700 (PDT)", + "shortText": "eiusmod", + "mediumText": "Est ullamco aute deserunt minim duis sunt dolore cillum tempor exercitation sit. Laboris voluptate labore sit eu adipisicing in occaecat excepteur elit ipsum in eu. Eiusmod est minim veniam do excepteur laborum amet aute. Laboris tempor deserunt cillum ipsum.", + "longText": "Laboris ad excepteur eiusmod non dolor sunt in proident velit. Incididunt laborum eiusmod enim pariatur exercitation ut. Laboris culpa fugiat consequat qui. Do aliquip incididunt et labore minim ex mollit. Occaecat id duis velit velit occaecat laborum ex officia. Veniam irure fugiat cillum dolore nostrud. Amet ea consectetur incididunt ut minim.\r\nAdipisicing quis consectetur consectetur adipisicing eiusmod excepteur ullamco nostrud sit tempor labore ad. Ea incididunt commodo occaecat qui ea veniam nulla sunt ex. Non aliquip incididunt aute cillum magna nisi. Aliqua culpa deserunt nulla ad fugiat. Enim non consectetur pariatur voluptate enim qui consectetur aliquip irure nisi. Minim eu commodo aliquip laboris elit sint quis.\r\nMagna commodo laborum fugiat commodo voluptate quis. Adipisicing laborum in anim exercitation proident. Magna est cillum voluptate consectetur reprehenderit. Velit veniam laboris fugiat anim est esse aliquip. Cupidatat aliquip excepteur voluptate laboris.\r\nOfficia anim laborum anim velit adipisicing et. Velit magna quis culpa ipsum. Id et culpa eu dolore ullamco aute ut cupidatat pariatur commodo anim nostrud qui sit. Qui nulla veniam quis elit sint et exercitation exercitation aute cupidatat nostrud. Aliquip fugiat aute nostrud magna amet dolore adipisicing elit ipsum sint labore nisi.\r\nPariatur aute voluptate veniam eu eu id tempor exercitation ipsum eu cillum velit. Elit fugiat commodo officia in. Laboris do sunt excepteur ut deserunt aliquip. Adipisicing commodo ipsum quis proident voluptate reprehenderit sint ea magna ipsum anim est occaecat. Aliqua do eu elit aute dolor culpa nisi cupidatat incididunt. Id eu veniam adipisicing veniam qui sint velit voluptate. Laborum amet ea minim minim nulla sint sit labore dolor pariatur.\r\n", + "address": "4 Newton Street", + "city": "Harviell", + "state": "Pennsylvania", + "zip": 25300, + "country": "El Salvador", + "email": "moorebass@scentric.com", + "phone": "(913) 577-3866", + "color": "rgb(103,233,105)" + }, + { + "index": 394, + "name": "Walker Workman", + "first": "Howard", + "last": "Fleming", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "boolean": true, + "guid": "ec870357-2a02-4dff-b9c5-a4574e39ddcf", + "integer": 73, + "date": "Sun Jun 02 1974 13:38:40 GMT-0700 (PDT)", + "shortText": "officia dolore consequat", + "mediumText": "Aliqua ex nisi adipisicing tempor elit pariatur voluptate cillum dolore duis excepteur commodo do eiusmod. Exercitation nulla sint officia voluptate ut ipsum esse fugiat quis sint reprehenderit irure. Voluptate voluptate deserunt sit aliqua Lorem et labore. Magna qui eu nisi do cupidatat eu ea. Nulla sint eiusmod in ipsum est dolor qui.", + "longText": "Magna elit sunt qui ut dolor et. Enim adipisicing aliquip dolore ex consectetur dolor ut. Ex culpa fugiat id sunt sunt incididunt Lorem adipisicing nostrud magna dolore mollit enim est.\r\nPariatur ea magna anim sit incididunt veniam occaecat pariatur ullamco nulla. Sit commodo cupidatat elit commodo eu do officia nostrud. Eu consequat ipsum amet eiusmod elit commodo ut enim ex.\r\nIrure ipsum ipsum ullamco magna deserunt pariatur in consectetur. Mollit nisi mollit reprehenderit et laboris in esse irure minim. Ipsum culpa nostrud nisi fugiat sint culpa consequat incididunt nostrud culpa occaecat aliquip sit. Commodo cupidatat nulla qui cupidatat sint anim. Ad quis cillum magna adipisicing ad qui ex fugiat velit velit amet aliqua. Ea laboris laborum dolor amet sunt. Fugiat sit dolor ipsum ut.\r\nElit labore fugiat commodo reprehenderit nostrud culpa qui cupidatat deserunt eiusmod tempor est excepteur laboris. Aliqua aliqua elit occaecat magna ullamco nisi commodo enim. Reprehenderit et mollit mollit aliqua ex tempor sint minim magna eu. Voluptate ullamco voluptate excepteur ullamco ea consectetur non do. Officia deserunt duis ullamco Lorem officia esse. Consequat et quis cupidatat officia.\r\nDo esse reprehenderit incididunt quis voluptate sunt eu amet ad incididunt. Do occaecat amet in culpa anim id. Fugiat est fugiat Lorem enim adipisicing do qui officia. Proident elit labore consectetur Lorem eiusmod cupidatat mollit sit fugiat magna ex commodo minim. Ea nisi amet non enim culpa veniam aliqua ad labore.\r\n", + "address": "3 Exeter Street", + "city": "Wakulla", + "state": "New Hampshire", + "zip": 85378, + "country": "Oman", + "email": "howardfleming@scentric.com", + "phone": "(844) 545-2412", + "color": "rgb(126,110,68)" + }, + { + "index": 395, + "name": "Harper Chase", + "first": "Glenda", + "last": "Burns", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "boolean": false, + "guid": "d6866e9e-6cc1-4021-9e8e-c0657bd2f64c", + "integer": 36, + "date": "Sun Dec 12 1971 00:30:23 GMT-0800 (PST)", + "shortText": "ad aliquip consequat", + "mediumText": "Consectetur exercitation commodo ut labore incididunt velit laborum labore velit aute. Aliquip velit id enim sit. Nostrud magna est veniam excepteur commodo irure. Sunt ex sint irure nisi anim. Nisi dolore veniam tempor cupidatat irure incididunt culpa veniam sunt aute.", + "longText": "Duis enim ex officia reprehenderit consectetur esse. Adipisicing ea velit labore officia sint nisi do anim ex incididunt irure. Laborum amet fugiat laboris proident. Ex duis dolor dolor nisi Lorem do qui sunt incididunt exercitation nulla do deserunt pariatur.\r\nOfficia et dolor incididunt elit non quis. Deserunt ad esse enim tempor aliquip officia excepteur magna esse deserunt. Excepteur dolore veniam commodo non quis. Do Lorem ex est exercitation sit consectetur exercitation duis duis laborum. Aliquip elit ea nulla elit quis deserunt eu adipisicing id pariatur non occaecat. Irure dolore nulla nisi irure qui tempor quis ut minim.\r\nAnim officia et laboris culpa velit consectetur do voluptate ad voluptate Lorem. Nostrud fugiat ut ad amet est elit duis consequat cupidatat. Ad minim cillum dolore incididunt sunt enim deserunt. Dolor aliqua qui nulla aliquip enim magna incididunt. Minim enim occaecat dolor in aliqua. Laborum eu quis culpa in voluptate commodo culpa sint dolor Lorem duis elit. Incididunt sint et enim sit laboris pariatur laboris eu sit eu anim.\r\nEa elit minim tempor ut id ut ea et tempor aute magna eiusmod adipisicing exercitation. Culpa elit esse tempor proident sint duis consequat. Sint ullamco ex veniam aliquip aute labore anim adipisicing est magna velit nisi. Ipsum dolore labore proident id irure qui velit anim. Incididunt Lorem nisi ut amet in enim laboris labore proident fugiat officia irure. Occaecat dolor Lorem qui nulla. Aliqua officia ipsum et cillum aliquip adipisicing ex.\r\nEu incididunt deserunt cupidatat ex laborum in voluptate excepteur ea consectetur est incididunt. Occaecat qui aliqua consequat nostrud in ex labore dolor eiusmod. Enim duis eu laboris consectetur culpa aliquip commodo. Elit ullamco reprehenderit consequat proident et ex veniam ea consectetur aute minim. Voluptate ut in laborum exercitation laboris irure culpa esse deserunt adipisicing sunt.\r\n", + "address": "4 Hinsdale Street", + "city": "Belva", + "state": "North Dakota", + "zip": 11729, + "country": "Belgium", + "email": "glendaburns@scentric.com", + "phone": "(856) 471-3316", + "color": "rgb(157,180,79)" + }, + { + "index": 396, + "name": "Lynch Dillard", + "first": "Marta", + "last": "Trujillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "boolean": true, + "guid": "66702f6f-a19b-4e41-8b5c-0df08d432b1b", + "integer": 55, + "date": "Mon Nov 21 1983 17:47:19 GMT-0800 (PST)", + "shortText": "culpa qui ullamco", + "mediumText": "Lorem dolor esse veniam minim culpa aliquip dolore occaecat Lorem quis.", + "longText": "Ea est sunt et duis dolor irure voluptate. Nostrud esse do irure exercitation officia magna proident irure deserunt magna. Dolore minim exercitation qui exercitation proident. Excepteur ea occaecat irure qui ea et duis minim voluptate id culpa enim ad dolor. Enim anim aliquip sint aliqua veniam Lorem id.\r\n", + "address": "3 Eckford Street", + "city": "Savage", + "state": "Northern Mariana Islands", + "zip": 46157, + "country": "Kyrgyzstan", + "email": "martatrujillo@scentric.com", + "phone": "(867) 559-3000", + "color": "rgb(184,176,151)" + }, + { + "index": 397, + "name": "Blake Wilkins", + "first": "Lara", + "last": "Gentry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "boolean": false, + "guid": "e4e03f54-413f-4638-be7c-12175f24c458", + "integer": 5, + "date": "Sun Oct 10 1971 04:19:14 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Ullamco ut ex tempor est irure proident.", + "longText": "Labore id reprehenderit elit velit adipisicing amet voluptate exercitation adipisicing. Eiusmod anim officia sint Lorem ullamco cupidatat. Consectetur culpa nostrud elit nisi aute velit amet Lorem esse laborum sint exercitation.\r\nNon labore proident adipisicing duis veniam. Mollit ad irure Lorem minim ullamco elit aliqua occaecat excepteur. Veniam elit eiusmod quis minim enim ad Lorem est ut nulla voluptate amet Lorem ad. In dolore irure magna elit officia. Non velit anim Lorem eiusmod fugiat nostrud in reprehenderit officia commodo culpa ea sunt. Enim ut exercitation deserunt laborum laboris fugiat pariatur incididunt officia deserunt consectetur Lorem. Dolor nisi culpa dolor anim id laborum aute qui elit est quis occaecat esse id.\r\nEu ullamco aliquip enim qui cillum non anim reprehenderit. Nulla et tempor enim nulla consectetur. Reprehenderit nulla velit sunt consectetur exercitation consequat cupidatat. Anim dolor qui enim ex do labore dolore commodo voluptate ut laborum. Ut aute sint adipisicing reprehenderit est aliquip laborum esse dolore commodo aute excepteur fugiat est. Ex cupidatat commodo sit mollit veniam sint ex magna adipisicing occaecat laborum occaecat.\r\n", + "address": "4 Schenck Place", + "city": "Greenwich", + "state": "South Dakota", + "zip": 61210, + "country": "Swaziland", + "email": "laragentry@scentric.com", + "phone": "(909) 447-3849", + "color": "rgb(209,112,163)" + }, + { + "index": 398, + "name": "Lawson Peck", + "first": "Mullen", + "last": "Keller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "boolean": false, + "guid": "27329629-6fcc-48e1-a7b9-e3158f75ea79", + "integer": 2, + "date": "Wed Jul 31 1974 10:57:47 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Irure ut velit ea nisi enim est fugiat magna non duis pariatur. Sint voluptate irure incididunt incididunt exercitation id magna culpa.", + "longText": "Ex labore ut aliquip magna. Laborum consectetur anim voluptate commodo Lorem nisi veniam incididunt dolor aliqua irure fugiat nostrud. Amet aliquip elit in sint. Proident voluptate nisi nulla culpa tempor. Fugiat dolor minim elit dolor elit ex incididunt Lorem non eu. Ad ex laboris ut magna eu sunt veniam excepteur velit officia ipsum reprehenderit commodo.\r\nEu irure ullamco aute qui ex mollit. Officia anim proident non officia. Aute in voluptate mollit eiusmod voluptate. Culpa esse deserunt nostrud culpa consectetur mollit. Minim fugiat amet cillum anim eu velit qui non et duis ut.\r\nDo labore enim tempor in ipsum dolore veniam consequat aliqua deserunt excepteur duis. Sunt ad elit in aliquip officia veniam tempor ad velit consectetur Lorem. Voluptate sint commodo ullamco nisi sunt minim enim labore labore. In sit laboris officia exercitation labore minim ex velit ullamco. Adipisicing ex consectetur mollit occaecat id. Officia minim dolore qui do magna exercitation. Nisi in ipsum aliqua adipisicing ad sit ad anim dolore ipsum officia elit.\r\n", + "address": "2 Rugby Road", + "city": "Kirk", + "state": "Alaska", + "zip": 73560, + "country": "Slovenia", + "email": "mullenkeller@scentric.com", + "phone": "(964) 598-3707", + "color": "rgb(210,88,176)" + }, + { + "index": 399, + "name": "Rosario Camacho", + "first": "Trina", + "last": "Perez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "boolean": true, + "guid": "2f75ea28-cf05-4abd-8600-a3f69265392c", + "integer": 41, + "date": "Mon Jul 19 1993 06:30:42 GMT-0700 (PDT)", + "shortText": "est fugiat tempor", + "mediumText": "Irure cupidatat et officia velit ut ipsum exercitation. Aliquip pariatur enim enim duis labore duis. Excepteur Lorem eu in id exercitation eu enim dolore occaecat deserunt consequat. Aute commodo amet incididunt cillum ipsum adipisicing in. Aute sunt consequat fugiat cillum qui velit deserunt nisi nisi cupidatat.", + "longText": "Minim elit nisi enim pariatur tempor consequat et voluptate. Proident officia ipsum aliqua esse deserunt ex id nisi. Labore reprehenderit sint fugiat duis Lorem consectetur enim labore nostrud sit commodo id anim sint.\r\nEa labore et consectetur in aliqua consectetur exercitation labore dolor laborum id labore irure irure. Commodo elit ex culpa amet ex velit eiusmod consequat. Nostrud consequat id excepteur consequat et ad labore. Tempor sint consequat exercitation consectetur ex ad laboris et. Laboris fugiat consequat minim commodo veniam cillum nostrud dolore voluptate minim aute.\r\nAdipisicing commodo aliquip occaecat incididunt consequat aliqua dolor in nulla aliquip veniam aliqua aute. Incididunt ex ut minim aute mollit fugiat proident voluptate Lorem minim. Ipsum eiusmod ullamco consectetur sint in. Qui magna occaecat cillum eu et consectetur. Cillum duis occaecat cillum ipsum aliquip fugiat laborum et eiusmod consectetur id deserunt. Minim minim qui ea cillum sit quis duis non anim.\r\nVelit mollit aute ex exercitation sit consequat incididunt voluptate. Non eu laboris nulla cillum anim eu minim elit eu occaecat culpa reprehenderit consectetur. Tempor cupidatat est aute cupidatat laboris culpa qui aute veniam cillum ut incididunt esse dolor. Laboris irure ex ad ut labore dolore irure mollit irure aliquip eu tempor proident Lorem. Lorem sit eiusmod do Lorem consequat quis id minim cupidatat ex sunt magna. Laboris tempor adipisicing adipisicing et sint cupidatat ad dolor exercitation et qui occaecat laborum et.\r\nDuis incididunt anim proident dolore tempor voluptate nulla sunt aliquip voluptate dolor enim. Laborum anim sunt anim adipisicing exercitation commodo eu esse. Proident labore nostrud et excepteur sit eiusmod exercitation culpa eu in id adipisicing voluptate. Pariatur officia aute mollit amet et nisi aute sit. Aute eiusmod consectetur excepteur magna quis enim sint velit velit excepteur fugiat. Non Lorem nostrud eu voluptate anim reprehenderit et aliquip nostrud ipsum Lorem. Magna fugiat laborum culpa anim sunt laboris consectetur culpa quis pariatur minim minim minim.\r\n", + "address": "4 Ridge Boulevard", + "city": "Crown", + "state": "Louisiana", + "zip": 12286, + "country": "Mali", + "email": "trinaperez@scentric.com", + "phone": "(848) 593-3474", + "color": "rgb(121,115,73)" + }, + { + "index": 400, + "name": "Savannah Nieves", + "first": "Sutton", + "last": "Oneill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "boolean": true, + "guid": "2a23bf3c-f5ec-4e78-90bc-ace28f8f2bab", + "integer": 2, + "date": "Thu Apr 23 1992 13:29:05 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Et aute minim non exercitation ut in aliqua officia consequat.", + "longText": "Elit officia excepteur aliqua deserunt est. Exercitation magna culpa ut aute. Laborum Lorem aliquip labore enim velit in. Dolore in do do dolor do do qui.\r\nLabore sunt laborum id sit esse pariatur amet ea. Nostrud irure excepteur Lorem ea duis adipisicing est ea voluptate. Ea consectetur dolor duis anim. Non laborum incididunt aliquip mollit pariatur. Amet laborum esse enim velit aute sit fugiat sit laborum commodo. In nulla veniam adipisicing et velit dolore culpa mollit ad dolore dolor commodo proident dolore.\r\nPariatur nisi eu sint ullamco proident elit dolore officia quis mollit nisi. Do officia cillum minim occaecat duis. Exercitation adipisicing reprehenderit esse aliqua non elit eiusmod deserunt qui.\r\nMinim culpa aliqua sit id ex. Qui do ea in sint cillum Lorem non. Consequat Lorem sunt est nulla Lorem exercitation culpa esse ex. Veniam dolor in Lorem cillum amet esse eiusmod minim voluptate aute ipsum ex ad. Elit magna laboris id occaecat aute sit tempor fugiat velit incididunt consectetur minim. Sint est dolore occaecat aliquip in sint amet eiusmod esse exercitation quis duis dolore adipisicing.\r\n", + "address": "2 Ridgewood Place", + "city": "Ventress", + "state": "Missouri", + "zip": 37064, + "country": "Cyprus", + "email": "suttononeill@scentric.com", + "phone": "(957) 407-3116", + "color": "rgb(163,237,93)" + }, + { + "index": 401, + "name": "Faye Graves", + "first": "Mildred", + "last": "Branch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "boolean": true, + "guid": "12b69605-f47d-4b63-b96d-48e2e24c1031", + "integer": 82, + "date": "Wed Feb 04 1981 06:07:39 GMT-0800 (PST)", + "shortText": "tempor occaecat ullamco", + "mediumText": "Velit aute non nisi elit laborum. Id nisi reprehenderit culpa incididunt eu labore est excepteur aute laborum officia enim. Qui proident deserunt voluptate commodo elit id irure voluptate. Consequat quis dolor id ea tempor ipsum culpa.", + "longText": "Velit sit eu nulla sunt nulla veniam velit mollit nostrud reprehenderit cillum velit. Nostrud non deserunt culpa Lorem quis. Sit elit ex tempor amet officia cupidatat. Dolore laboris et est consectetur elit dolor. Exercitation consectetur qui pariatur laborum pariatur aliquip irure veniam dolore laboris.\r\nLabore incididunt cupidatat elit nostrud ipsum aliquip ipsum commodo incididunt reprehenderit exercitation ipsum. Voluptate et ipsum qui nisi irure esse cillum ut. Tempor culpa et excepteur incididunt adipisicing laboris aliqua mollit minim incididunt. Dolor dolor fugiat anim culpa culpa id reprehenderit voluptate laboris occaecat. Esse Lorem sit cillum non consequat mollit minim non tempor aliquip culpa. Pariatur velit amet ad reprehenderit esse cillum veniam in ad. Nisi dolore irure dolore deserunt.\r\nNon amet elit pariatur nisi id dolor in adipisicing nisi elit sit. Adipisicing cillum sint tempor deserunt aute exercitation do pariatur. Nulla et eiusmod do dolore elit ullamco magna mollit. Irure deserunt consectetur Lorem ex elit consequat consequat laboris.\r\nDuis aute sint nisi tempor in ipsum laboris. Cillum magna exercitation mollit eu amet proident reprehenderit cupidatat irure. Ea minim dolor magna id aliquip. Ex commodo proident adipisicing sint velit non eiusmod sit in exercitation non laboris. Consequat nulla laborum sint qui dolor sint amet non. Qui sint dolore occaecat cillum proident ullamco ipsum incididunt duis sit duis fugiat consequat.\r\nQuis occaecat nulla officia quis nulla sunt reprehenderit nostrud. Cillum anim duis irure do nulla id. Sunt eiusmod quis dolor aliqua occaecat non. Sit velit elit sit laborum et cupidatat est veniam aliqua enim. In dolore veniam amet duis incididunt. Elit est quis minim nisi consectetur consequat sunt enim culpa eiusmod ea elit cupidatat. Officia reprehenderit in do consequat.\r\n", + "address": "4 Farragut Place", + "city": "Grayhawk", + "state": "Kentucky", + "zip": 53142, + "country": "Georgia", + "email": "mildredbranch@scentric.com", + "phone": "(888) 489-2923", + "color": "rgb(206,181,98)" + }, + { + "index": 402, + "name": "England Cameron", + "first": "Heath", + "last": "Roach", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "boolean": false, + "guid": "7eecdcf4-46f8-401c-aff2-9c22abf751ae", + "integer": 92, + "date": "Mon Jul 02 1990 04:55:35 GMT-0700 (PDT)", + "shortText": "velit", + "mediumText": "Cillum minim qui ex officia magna velit sunt nisi. Non reprehenderit sint pariatur minim elit commodo reprehenderit proident elit occaecat non duis voluptate. Aliquip ullamco ut duis officia do magna minim cupidatat in. Ex irure officia occaecat laboris tempor velit reprehenderit quis anim ipsum sit.", + "longText": "Cupidatat excepteur officia veniam id tempor sit amet. Deserunt mollit aliquip labore cupidatat sint laboris velit voluptate aute consectetur exercitation sit sint. Labore et pariatur laboris quis labore. Irure consectetur labore sit et. Aute consectetur veniam veniam id nulla pariatur deserunt. Deserunt nulla proident id nulla.\r\nUt nostrud tempor et laborum laboris aliquip ullamco exercitation exercitation elit culpa non culpa in. Cupidatat consectetur exercitation ea excepteur culpa sint eiusmod culpa reprehenderit Lorem fugiat laboris. Veniam sint mollit dolor consequat sunt officia. Irure ipsum culpa et non. Aliqua nisi amet Lorem nisi enim commodo aliquip occaecat duis aute eu cupidatat ut. Pariatur Lorem tempor consequat in irure pariatur mollit sunt reprehenderit dolore officia.\r\n", + "address": "2 Maujer Street", + "city": "Morningside", + "state": "American Samoa", + "zip": 87621, + "country": "Djibouti", + "email": "heathroach@scentric.com", + "phone": "(947) 435-3218", + "color": "rgb(247,200,211)" + }, + { + "index": 403, + "name": "Michele Reynolds", + "first": "Mayo", + "last": "Gray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "boolean": false, + "guid": "826af78f-bd69-4f81-a45e-1a38d5afb1a8", + "integer": 54, + "date": "Mon Nov 02 2009 06:31:46 GMT-0800 (PST)", + "shortText": "exercitation adipisicing et", + "mediumText": "Aliqua ex amet anim proident nostrud et id Lorem aliqua. Quis reprehenderit veniam cupidatat fugiat.", + "longText": "Ipsum ullamco commodo aliqua non consectetur culpa in. Et nulla nulla adipisicing sit sunt irure ea commodo ex cupidatat enim excepteur. Aliqua eu dolore commodo culpa est nostrud velit exercitation irure. Ad est fugiat duis ipsum non Lorem deserunt esse.\r\nAliquip reprehenderit id voluptate ullamco anim sunt aliquip veniam proident esse magna officia eiusmod. Nostrud nostrud cillum sunt fugiat incididunt irure pariatur veniam incididunt irure Lorem irure velit velit. Eiusmod occaecat proident culpa Lorem labore culpa ad. Eu dolor ad cupidatat sunt fugiat sint. Ea sunt quis amet nulla labore dolor occaecat consequat ea nulla. Sint magna qui et veniam cillum.\r\nOccaecat sunt aliqua adipisicing non consequat in ipsum esse sunt elit reprehenderit. Enim adipisicing cupidatat voluptate deserunt aliqua reprehenderit aliquip excepteur dolore non Lorem est do. Dolor ipsum non ex id tempor tempor mollit. Consequat cupidatat ad elit nulla ex nostrud nisi dolor nulla cillum labore dolor dolor.\r\nFugiat exercitation nulla irure aliqua id. Laboris reprehenderit cillum quis cillum Lorem exercitation Lorem ipsum deserunt. Velit sint aute adipisicing aliquip voluptate et culpa ullamco aliqua.\r\nNon cillum magna elit sunt aliqua ea. Veniam eu esse in est proident non reprehenderit nulla enim. Nisi non sunt et laborum minim non qui nisi nisi elit excepteur nisi. Ex excepteur consequat mollit sunt proident velit et deserunt sint excepteur et. Ullamco qui ipsum labore culpa aliquip. Qui pariatur veniam non velit qui nisi non veniam incididunt Lorem laboris occaecat. Ut duis qui labore anim amet dolor.\r\n", + "address": "4 Eagle Street", + "city": "Allentown", + "state": "Minnesota", + "zip": 44111, + "country": "Tokelau", + "email": "mayogray@scentric.com", + "phone": "(992) 459-3031", + "color": "rgb(215,198,143)" + }, + { + "index": 404, + "name": "Dorthy Simon", + "first": "Gena", + "last": "Calderon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "boolean": false, + "guid": "6afa8867-330b-419e-b186-df524f163ef0", + "integer": 1, + "date": "Mon Jun 09 2014 19:43:18 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Incididunt ea id eu id mollit eu. Culpa fugiat dolor minim mollit.", + "longText": "Dolor exercitation dolor minim cillum anim ut ex elit sunt laborum voluptate est ea non. Sunt tempor deserunt aute ut aliqua. Nostrud eu ullamco in est eu ea mollit qui. Ad mollit fugiat quis ex elit. Proident duis cupidatat ex amet sint dolore laboris elit. Excepteur cupidatat minim id consequat dolor.\r\nTempor ipsum eu commodo ipsum ut. Elit elit eiusmod fugiat ullamco labore. Mollit est ea nulla ea cupidatat excepteur.\r\nDeserunt duis ipsum adipisicing in laboris sit. Esse incididunt in aliqua non anim esse consectetur. Exercitation dolor deserunt eiusmod incididunt et ea culpa. Mollit anim non mollit adipisicing est. Pariatur aliqua dolore ullamco aliqua.\r\nEt id laboris sit adipisicing adipisicing eu occaecat et quis sint. Proident voluptate ad et velit. Quis aliqua elit deserunt consectetur sunt. Incididunt sit qui ex excepteur et culpa et. Non occaecat ea amet commodo Lorem. Minim mollit eu eiusmod id ipsum esse ut mollit do do.\r\n", + "address": "3 Vermont Court", + "city": "Williston", + "state": "Hawaii", + "zip": 55240, + "country": "San Marino", + "email": "genacalderon@scentric.com", + "phone": "(888) 431-2447", + "color": "rgb(169,113,77)" + }, + { + "index": 405, + "name": "Estella Bird", + "first": "Candice", + "last": "Grant", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "boolean": true, + "guid": "acee6de8-e101-4121-92a2-004058e99752", + "integer": 82, + "date": "Sat Sep 14 2002 06:24:28 GMT-0700 (PDT)", + "shortText": "id pariatur in tempor", + "mediumText": "Reprehenderit nulla consectetur minim minim ut consequat id tempor anim labore. Occaecat reprehenderit in consequat velit occaecat Lorem.", + "longText": "Nulla tempor et esse nostrud minim aliqua mollit ullamco elit consectetur cupidatat. Non non aliqua labore aute Lorem magna excepteur tempor. Velit exercitation veniam elit proident do nostrud et adipisicing et consectetur est dolore. Quis minim cupidatat occaecat Lorem aute labore ea et do nisi nisi consectetur. Do aute commodo labore elit laboris. In ipsum quis voluptate nulla est officia eu.\r\n", + "address": "4 Wythe Avenue", + "city": "Rivera", + "state": "Alabama", + "zip": 33941, + "country": "Vanuatu", + "email": "candicegrant@scentric.com", + "phone": "(991) 536-3705", + "color": "rgb(157,106,60)" + }, + { + "index": 406, + "name": "Clarissa Bray", + "first": "Rojas", + "last": "Robles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "boolean": false, + "guid": "bfc3f083-ca88-443f-8639-1467b45a7b5e", + "integer": 54, + "date": "Fri Jul 03 1970 19:21:58 GMT-0700 (PDT)", + "shortText": "consectetur duis ullamco est", + "mediumText": "Excepteur qui sint nulla pariatur reprehenderit ex fugiat anim ut. Id voluptate quis incididunt sint sint aliqua aliquip excepteur sit officia ad dolore. Aute eu elit tempor laborum eu voluptate ipsum duis sunt. Reprehenderit fugiat ex Lorem aute quis nostrud commodo Lorem.", + "longText": "Labore ad nostrud ad eu dolor pariatur sit exercitation tempor voluptate do eu deserunt. Consectetur culpa culpa veniam nisi eu elit minim est est. Mollit cillum sit pariatur quis. Cupidatat ex reprehenderit ad eu ad amet id esse aliqua. Adipisicing sint adipisicing ex consectetur magna quis sint culpa irure pariatur laboris exercitation ea ex. Elit fugiat proident dolor amet minim cillum et sint. Non nostrud nulla ipsum eu.\r\n", + "address": "4 Clifton Place", + "city": "Walton", + "state": "North Carolina", + "zip": 22683, + "country": "Somalia", + "email": "rojasrobles@scentric.com", + "phone": "(829) 530-3596", + "color": "rgb(58,225,142)" + }, + { + "index": 407, + "name": "Jody Schultz", + "first": "Baird", + "last": "Robinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "boolean": false, + "guid": "7a26e07a-6210-47eb-8a15-d60b73f0b0ba", + "integer": 34, + "date": "Sat Oct 25 1980 07:30:41 GMT-0700 (PDT)", + "shortText": "dolor qui", + "mediumText": "Aliqua sunt magna esse aute veniam occaecat tempor aliquip aliquip adipisicing aliquip qui deserunt incididunt.", + "longText": "Laboris dolore anim pariatur laboris in veniam irure. Lorem laborum nulla amet dolore cupidatat. Dolor est reprehenderit eiusmod labore excepteur duis mollit veniam ipsum sunt magna. Minim ut aliquip sunt ut irure voluptate voluptate duis ea. Exercitation occaecat mollit cupidatat sint dolore aliquip cupidatat aute minim exercitation ipsum occaecat. Consequat sit tempor esse ut culpa tempor duis irure duis quis. Enim incididunt sint consequat adipisicing veniam fugiat eiusmod.\r\nMinim mollit voluptate amet laborum fugiat eiusmod duis esse aute ea tempor. Ea minim ipsum sint pariatur amet voluptate ipsum. Excepteur magna pariatur esse culpa ipsum do. Ad deserunt excepteur aliquip cillum non eiusmod excepteur non labore ut nostrud fugiat. Minim sunt duis dolor ex ipsum reprehenderit. Magna incididunt reprehenderit tempor reprehenderit voluptate. Irure magna non minim quis sunt laboris ut velit velit eu consequat ad.\r\nEst et sunt consequat adipisicing elit non pariatur nostrud reprehenderit sit. Pariatur irure veniam veniam aliquip velit fugiat adipisicing. Consectetur ex mollit tempor cillum commodo ad magna dolore Lorem. Consectetur non esse ex esse irure consectetur ullamco proident eu ex ullamco. Ipsum ut tempor Lorem exercitation et voluptate nulla aute commodo. Adipisicing nostrud laboris quis elit minim.\r\nProident ea irure ex qui qui deserunt ex consequat est ex et elit consequat ut. Sunt deserunt tempor dolor esse reprehenderit excepteur est. Mollit eu occaecat anim voluptate.\r\n", + "address": "4 Montieth Street", + "city": "Lowell", + "state": "Connecticut", + "zip": 26397, + "country": "Maldives", + "email": "bairdrobinson@scentric.com", + "phone": "(881) 497-3274", + "color": "rgb(109,107,114)" + }, + { + "index": 408, + "name": "Sullivan Singleton", + "first": "Lupe", + "last": "Shields", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "boolean": false, + "guid": "77364f56-0bf3-44a2-b715-57adc5471291", + "integer": 76, + "date": "Sun Jan 30 2000 05:01:36 GMT-0800 (PST)", + "shortText": "eiusmod enim officia", + "mediumText": "Deserunt sunt nulla ex reprehenderit nulla laborum fugiat consectetur aliqua est. Dolor qui laborum non anim in. Nisi amet commodo ullamco id excepteur ipsum veniam. Id quis nulla amet sint pariatur. Velit irure exercitation ut excepteur pariatur anim amet deserunt.", + "longText": "Ullamco labore cupidatat qui ad consequat consequat incididunt ullamco non. Id tempor est laboris non. Pariatur incididunt veniam irure Lorem aute. Eu reprehenderit do adipisicing adipisicing officia est consectetur laboris ut et et consequat duis ut.\r\nFugiat excepteur dolore culpa excepteur excepteur laboris Lorem non esse do ad. Duis consectetur aliqua voluptate veniam velit culpa incididunt incididunt ad anim. Quis id elit officia in ut.\r\nCupidatat dolor excepteur in mollit proident nostrud duis consequat in. Duis ullamco eu qui culpa. Nostrud culpa eu cupidatat occaecat. Eu reprehenderit ex nisi voluptate aliqua aute.\r\n", + "address": "4 Knickerbocker Avenue", + "city": "Alafaya", + "state": "South Carolina", + "zip": 66270, + "country": "Israel", + "email": "lupeshields@scentric.com", + "phone": "(945) 571-2010", + "color": "rgb(61,207,100)" + }, + { + "index": 409, + "name": "Bullock Harrell", + "first": "Morse", + "last": "Haynes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "boolean": false, + "guid": "4176d27b-2ff0-44dd-9f1e-17963821d222", + "integer": 45, + "date": "Sat Feb 20 1999 17:08:27 GMT-0800 (PST)", + "shortText": "id nostrud fugiat irure culpa", + "mediumText": "Reprehenderit quis elit id amet laborum labore.", + "longText": "Nulla pariatur in cupidatat qui fugiat. Id incididunt ad aute consequat velit anim ad velit fugiat labore. Sunt magna do dolore ullamco Lorem Lorem enim et aliquip mollit esse id sunt. Nisi reprehenderit magna sit non officia Lorem eu fugiat. Elit non occaecat laborum in sunt consequat amet in non.\r\nSit ipsum mollit proident pariatur ea esse. Culpa magna aliqua ipsum excepteur ea esse laborum aliquip occaecat reprehenderit nostrud ex ea. Non esse exercitation nulla nostrud esse in sunt. Esse tempor aliqua sit veniam proident aute sint nulla do velit eiusmod. Qui duis occaecat tempor do aliquip irure cillum elit. Culpa Lorem et est nisi ut qui consequat exercitation magna nisi ad officia magna voluptate.\r\nTempor enim sit deserunt do nisi amet enim ipsum ea dolore eu. Proident excepteur aliqua sit sit qui duis ad nostrud adipisicing qui. Exercitation eiusmod velit aliquip officia voluptate anim laborum anim duis in enim qui consectetur. Ad est occaecat occaecat do ex esse ipsum ipsum Lorem veniam. Minim et et sunt non sit irure ad amet minim in et anim reprehenderit voluptate. Irure anim id nisi eiusmod eu eiusmod proident aute sunt. Consequat et aute ipsum ullamco do aute ad do Lorem ipsum in minim.\r\n", + "address": "4 Louise Terrace", + "city": "Blodgett", + "state": "Michigan", + "zip": 68968, + "country": "Reunion", + "email": "morsehaynes@scentric.com", + "phone": "(933) 478-3987", + "color": "rgb(127,118,223)" + }, + { + "index": 410, + "name": "Tammi Gordon", + "first": "Cooke", + "last": "Chandler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "boolean": true, + "guid": "c65f8ce1-2436-4ef2-9dc8-74fcc3a09b55", + "integer": 7, + "date": "Wed Jan 12 2005 21:50:12 GMT-0800 (PST)", + "shortText": "laboris est ipsum", + "mediumText": "Id dolore quis voluptate dolor ullamco enim velit cillum mollit dolor occaecat officia.", + "longText": "Laborum est amet mollit esse exercitation exercitation culpa commodo laborum irure enim commodo aliquip amet. Eu ea commodo occaecat cupidatat velit adipisicing reprehenderit amet. Reprehenderit in Lorem voluptate amet consectetur id incididunt reprehenderit in quis commodo est deserunt non. Pariatur pariatur in elit labore ut esse esse irure. Tempor mollit labore laborum voluptate ut. Ut occaecat mollit mollit cillum aliquip ipsum quis voluptate veniam. Cillum ad exercitation incididunt culpa ex in reprehenderit eiusmod deserunt voluptate.\r\nDo eiusmod esse aliquip eiusmod veniam deserunt do non dolor pariatur. Occaecat dolore minim irure proident laborum in nostrud sit. Ipsum deserunt duis reprehenderit duis occaecat fugiat voluptate aute aliquip consectetur consequat eiusmod. Qui laborum sunt incididunt id quis eu consectetur adipisicing mollit commodo eiusmod ipsum amet.\r\nCulpa anim officia ea occaecat occaecat occaecat occaecat mollit ipsum commodo dolore laboris. Ut anim velit amet laboris velit et aliqua aliquip incididunt consectetur culpa aliquip sint cupidatat. Enim eu adipisicing ut non. Amet duis nostrud est ad dolore non cupidatat veniam in. Voluptate nostrud sint aliqua voluptate culpa qui Lorem tempor.\r\nCommodo Lorem officia aute ut do mollit sint labore ex fugiat ullamco eu ut consectetur. Nulla nisi laborum anim et qui ullamco est dolore enim pariatur ex velit. Sit ullamco aliqua reprehenderit ea anim aliquip velit ut amet culpa eiusmod cillum. Aute eu sit aute proident Lorem dolor ea pariatur. Nisi pariatur consequat tempor occaecat consectetur deserunt irure magna adipisicing anim.\r\n", + "address": "3 Bergen Avenue", + "city": "Tolu", + "state": "Maine", + "zip": 88956, + "country": "Taiwan", + "email": "cookechandler@scentric.com", + "phone": "(975) 467-3292", + "color": "rgb(138,124,136)" + }, + { + "index": 411, + "name": "Jeanine Shaw", + "first": "Kasey", + "last": "Guerrero", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "boolean": false, + "guid": "be3a2408-087f-4d1d-ba80-0cffdd225a29", + "integer": 82, + "date": "Sun May 13 2001 01:14:30 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Non quis officia mollit labore velit est in Lorem culpa laboris voluptate et. Exercitation dolor non sit magna Lorem consequat.", + "longText": "Labore ea elit irure eiusmod deserunt aliqua. Aliqua velit esse voluptate sunt duis dolor ad in nostrud consectetur proident. Amet aliquip excepteur veniam commodo dolore do voluptate non. Lorem sunt duis anim officia sunt culpa laborum dolor occaecat.\r\nOfficia cillum est enim labore minim esse voluptate culpa consectetur Lorem aliquip. Quis incididunt esse dolor Lorem nulla nostrud aliquip duis aliqua laboris ut. Qui nisi proident voluptate nostrud anim. Sunt culpa est elit exercitation magna sint.\r\nEst mollit quis fugiat deserunt quis ullamco dolore enim exercitation occaecat nulla aute anim ullamco. Nisi consequat consequat consequat pariatur nostrud ad nostrud voluptate irure anim adipisicing ex in sint. Sunt culpa incididunt laborum laborum in adipisicing excepteur dolor tempor ad. Reprehenderit et mollit sint duis irure sit enim ex dolore est duis sunt incididunt. Eiusmod deserunt et est laborum est ipsum reprehenderit pariatur sunt duis. Sunt minim magna consectetur do occaecat. Duis ut tempor ullamco sunt dolor sit deserunt nisi amet.\r\n", + "address": "3 Conduit Boulevard", + "city": "Itmann", + "state": "Kansas", + "zip": 88741, + "country": "Cuba", + "email": "kaseyguerrero@scentric.com", + "phone": "(807) 548-3703", + "color": "rgb(77,230,193)" + }, + { + "index": 412, + "name": "Mcmahon Reeves", + "first": "Amanda", + "last": "Holloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "boolean": false, + "guid": "d7d7d64e-e5c2-426c-b930-5d2e09aba244", + "integer": 32, + "date": "Thu May 08 1986 15:44:35 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Dolor aute Lorem irure occaecat. Dolore culpa eu ex id eu ad ad quis.", + "longText": "Nisi officia commodo consequat consequat aliquip. Eu non esse sit sit ipsum duis exercitation tempor. Voluptate officia eiusmod consequat sunt esse exercitation sint tempor nulla cillum ad Lorem qui ea. Id dolore elit ullamco ex ea commodo reprehenderit consequat. Anim dolore id ullamco laborum commodo dolore proident ex.\r\nEnim minim elit adipisicing occaecat occaecat veniam. Dolor culpa occaecat adipisicing proident ex id. Incididunt ullamco aute ex anim est ullamco magna nisi. Occaecat duis mollit id duis ipsum reprehenderit proident ut elit consectetur non deserunt eiusmod commodo.\r\nIrure do nulla consequat fugiat. Aliqua proident est voluptate consectetur culpa reprehenderit labore aute voluptate aliqua anim laborum. Voluptate consectetur commodo et enim enim sint eiusmod ut consectetur quis ipsum. Proident dolor ipsum duis cillum sunt.\r\nEsse culpa non esse consectetur mollit reprehenderit commodo velit esse nulla sit ad. Ex ad amet exercitation irure velit reprehenderit. Qui officia incididunt commodo minim fugiat exercitation ut magna amet voluptate ullamco.\r\nEnim occaecat consequat officia ad incididunt magna nulla ea laborum in consectetur laborum Lorem laboris. Deserunt esse cillum nulla anim. Ea laborum amet ex aliquip aliquip.\r\n", + "address": "3 Kingston Avenue", + "city": "Herlong", + "state": "Iowa", + "zip": 83835, + "country": "Turkey", + "email": "amandaholloway@scentric.com", + "phone": "(818) 520-3833", + "color": "rgb(198,210,85)" + }, + { + "index": 413, + "name": "Fox Patterson", + "first": "Samantha", + "last": "Frazier", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "boolean": true, + "guid": "24f589f7-f6f9-4cab-9292-d754c16d9e45", + "integer": 63, + "date": "Fri Mar 16 2007 14:40:33 GMT-0700 (PDT)", + "shortText": "adipisicing velit Lorem", + "mediumText": "Anim amet dolore eiusmod sit ea officia duis aliqua ipsum ea consequat Lorem. Lorem sunt non amet ullamco elit. Aliquip reprehenderit pariatur mollit officia irure irure dolor incididunt voluptate qui sit duis esse amet. Tempor aliqua magna excepteur ad aliqua. In fugiat et aliqua irure excepteur dolore ipsum voluptate.", + "longText": "Consequat sit pariatur exercitation esse tempor adipisicing labore amet nulla elit elit fugiat. Laborum id in ad laborum officia nulla id cillum occaecat. Esse consectetur fugiat veniam ex minim eiusmod nostrud.\r\nExercitation officia velit officia occaecat voluptate ipsum ipsum et fugiat id enim laboris veniam. Commodo eu velit reprehenderit cupidatat. Do incididunt anim irure laborum ut voluptate est aute elit anim. Duis dolor dolore ex sit adipisicing ipsum voluptate voluptate anim. Non adipisicing aute nostrud anim magna id qui quis.\r\nEst sint irure eu pariatur elit id non cupidatat. Exercitation nisi ea commodo in nulla pariatur anim sunt adipisicing culpa esse sint. Quis et culpa ad anim cillum mollit excepteur. Cillum fugiat amet reprehenderit nisi ullamco. In ipsum commodo nisi ut reprehenderit. Deserunt eiusmod labore enim consequat.\r\nSit eu est irure excepteur ea esse magna minim adipisicing consequat ad ut esse. Laboris ut duis culpa nulla cillum sunt sint velit. Excepteur aute aliquip aute id adipisicing aute nulla ex incididunt consequat occaecat cillum. In consectetur aute veniam adipisicing et non dolor aliqua qui eiusmod ea aliquip elit. Ut fugiat aliqua nisi deserunt excepteur eu aute minim culpa aute mollit.\r\nQui et laborum deserunt proident dolore mollit fugiat labore. Dolore et ullamco laboris sit adipisicing do voluptate ullamco nulla amet eu voluptate. Mollit nisi officia nisi incididunt minim culpa commodo irure elit quis in.\r\n", + "address": "2 Roosevelt Court", + "city": "Mammoth", + "state": "Vermont", + "zip": 32042, + "country": "Solomon Islands", + "email": "samanthafrazier@scentric.com", + "phone": "(831) 425-2424", + "color": "rgb(239,229,222)" + }, + { + "index": 414, + "name": "Gloria Mcclain", + "first": "Marisol", + "last": "Marshall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "boolean": true, + "guid": "0eb44c61-37e0-4715-9356-2231abd957a0", + "integer": 93, + "date": "Thu Nov 03 2005 21:43:21 GMT-0800 (PST)", + "shortText": "quis nisi ad ut commodo", + "mediumText": "Consequat tempor ad id sint consectetur officia aliqua excepteur duis. Voluptate cupidatat id est eu velit id voluptate aute sunt cillum elit minim nulla tempor.", + "longText": "Magna tempor elit reprehenderit aliquip laboris eu commodo et consectetur laborum officia magna. Veniam fugiat minim ut occaecat incididunt nisi. Sunt adipisicing quis aliqua sit in aliquip eiusmod laborum.\r\n", + "address": "2 Scott Avenue", + "city": "Emison", + "state": "Nebraska", + "zip": 11179, + "country": "Malawi", + "email": "marisolmarshall@scentric.com", + "phone": "(850) 423-2670", + "color": "rgb(179,133,229)" + }, + { + "index": 415, + "name": "Mcintyre Cochran", + "first": "Courtney", + "last": "Faulkner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "boolean": true, + "guid": "07e7e322-9ff5-428a-a8d7-1d9e39a2bc7c", + "integer": 19, + "date": "Tue Aug 26 1975 19:13:06 GMT-0700 (PDT)", + "shortText": "ullamco fugiat", + "mediumText": "Ipsum veniam commodo consectetur occaecat. Aliqua velit dolor aliqua pariatur eu proident enim do eu mollit proident consectetur ipsum.", + "longText": "Sunt in veniam dolor anim cupidatat Lorem proident pariatur culpa. Pariatur ipsum consectetur nostrud officia dolor magna esse anim aliqua. Exercitation ex nisi enim irure veniam eiusmod et ipsum sint do. Consectetur eu minim minim aute aliquip consequat laborum exercitation commodo ex adipisicing culpa.\r\nNulla anim velit amet laboris. Commodo deserunt et duis consectetur consequat aute est pariatur consequat do tempor. Voluptate reprehenderit irure esse minim. Qui tempor id eiusmod id aliquip sit quis quis anim exercitation nulla. Laborum cillum veniam cupidatat incididunt adipisicing magna non laboris labore aliquip. Minim sit sint id ea in adipisicing et ex cillum reprehenderit. Pariatur tempor ea fugiat in irure.\r\nEa culpa proident aliquip officia sint irure Lorem consectetur. Ad reprehenderit adipisicing mollit nostrud ad amet ipsum aliqua dolore dolor eiusmod in. Lorem sit in aliquip esse aute sunt id nostrud ex culpa reprehenderit mollit. Qui laboris anim culpa id fugiat veniam. Reprehenderit exercitation sint pariatur mollit sint sunt. Velit excepteur consectetur proident non labore non aute incididunt duis. Excepteur amet occaecat occaecat commodo ut do velit tempor aliqua laborum.\r\nMinim veniam dolor id id culpa cillum enim sunt qui esse pariatur pariatur aliquip. Esse et ad dolor aliquip. Adipisicing fugiat do elit exercitation eiusmod fugiat ea ullamco mollit non. Minim occaecat ipsum dolore elit anim velit occaecat cupidatat. Irure irure reprehenderit fugiat ad mollit ullamco esse sit. Fugiat veniam reprehenderit amet ullamco nostrud irure ea reprehenderit.\r\n", + "address": "4 Nassau Street", + "city": "Bowden", + "state": "Florida", + "zip": 14172, + "country": "Samoa", + "email": "courtneyfaulkner@scentric.com", + "phone": "(861) 587-3003", + "color": "rgb(87,119,212)" + }, + { + "index": 416, + "name": "Sheppard Pacheco", + "first": "Shepard", + "last": "Hopper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "boolean": false, + "guid": "25a22dc2-f676-4e38-b172-8b3d6598cafd", + "integer": 98, + "date": "Thu Jun 19 2003 12:30:27 GMT-0700 (PDT)", + "shortText": "incididunt ad ad nulla elit", + "mediumText": "Consectetur magna dolore consequat consectetur officia labore culpa aute deserunt officia laboris exercitation. Duis labore consectetur ex id id ullamco voluptate commodo ut ea cillum.", + "longText": "Ea do adipisicing enim mollit cillum officia sunt amet exercitation esse. Incididunt deserunt dolore deserunt sunt ut tempor. Quis magna consectetur commodo nisi eiusmod cupidatat ea velit. Consectetur Lorem cillum laborum velit enim esse et officia ipsum consectetur sit.\r\nDo cillum irure aliqua nostrud elit proident sunt deserunt pariatur sunt ad. Esse adipisicing fugiat sunt irure duis eu non officia eiusmod fugiat. Quis ut officia commodo elit ad veniam ut eu amet do. Mollit eiusmod Lorem adipisicing officia cillum culpa deserunt ullamco reprehenderit eu labore voluptate. Irure reprehenderit consequat tempor laboris exercitation aliquip velit nulla. Tempor quis adipisicing et esse. Lorem ea nulla consequat culpa aliquip tempor amet.\r\n", + "address": "4 Buffalo Avenue", + "city": "Tampico", + "state": "New Jersey", + "zip": 90074, + "country": "United Kingdom", + "email": "shepardhopper@scentric.com", + "phone": "(985) 565-3301", + "color": "rgb(103,234,218)" + }, + { + "index": 417, + "name": "Hobbs Chapman", + "first": "Byers", + "last": "Craig", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "boolean": true, + "guid": "355ebabb-a1d0-4ed7-adfb-e8a0515d4ee5", + "integer": 3, + "date": "Fri Mar 26 2010 15:05:55 GMT-0700 (PDT)", + "shortText": "cupidatat", + "mediumText": "Aute sit fugiat nostrud enim proident ad quis reprehenderit irure. Enim esse ex sunt dolore id occaecat proident fugiat cillum non ex dolore.", + "longText": "Nisi excepteur cillum incididunt ipsum ullamco esse do sit duis deserunt pariatur. Eiusmod commodo veniam excepteur deserunt veniam aliquip aute nisi dolore ut do cupidatat. Aliqua tempor occaecat amet sit do laboris ea dolor mollit duis laborum dolore aute deserunt. Nulla non duis sunt do eiusmod sunt labore dolore excepteur cillum reprehenderit veniam elit reprehenderit. Occaecat Lorem incididunt amet ad ullamco minim ullamco enim nostrud aute occaecat duis Lorem. Ea labore in nostrud pariatur ea fugiat deserunt. Laborum eu enim officia amet sint et qui in id.\r\nFugiat minim adipisicing anim duis eiusmod id deserunt ea minim esse est nostrud laboris cupidatat. Ex ut reprehenderit commodo veniam. Aliquip duis incididunt proident ut sit aliquip occaecat commodo reprehenderit qui. Enim enim dolor non quis magna esse aliqua labore labore officia ut ut anim. Ex dolor velit aliqua pariatur.\r\nDolor enim ad non dolor do qui nulla exercitation eiusmod cillum elit minim non. Esse sint voluptate ullamco et sit esse. Ut ullamco non eiusmod anim quis anim ullamco irure amet. Amet ut pariatur ad mollit eu occaecat aliqua adipisicing. Dolore et sint veniam qui ad veniam fugiat aliqua dolor. Deserunt eiusmod et reprehenderit consequat enim quis deserunt dolor.\r\nCillum amet aliquip laborum eiusmod. Consequat commodo aliquip velit quis fugiat velit. Lorem nulla nostrud deserunt aliquip Lorem sunt et. Ea sunt duis officia Lorem elit do commodo. Tempor nostrud incididunt sunt nisi fugiat ex eu. Commodo nisi do duis non culpa consectetur ut exercitation ad in. Laborum laborum tempor sit laborum labore reprehenderit voluptate.\r\n", + "address": "2 Aberdeen Street", + "city": "Maplewood", + "state": "Wisconsin", + "zip": 44000, + "country": "French Guiana", + "email": "byerscraig@scentric.com", + "phone": "(830) 519-3986", + "color": "rgb(189,244,220)" + }, + { + "index": 418, + "name": "Lisa Yates", + "first": "Lea", + "last": "Underwood", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "boolean": true, + "guid": "dc5b7819-35b2-4a5e-b228-74fa3c7bdf7a", + "integer": 38, + "date": "Mon Nov 07 2011 03:37:10 GMT-0800 (PST)", + "shortText": "laborum ipsum enim et quis", + "mediumText": "Nulla proident ut aliquip consectetur occaecat aliqua laboris incididunt. Reprehenderit labore laborum sint non mollit reprehenderit amet ullamco proident dolore cupidatat ad adipisicing. Cupidatat consectetur mollit enim sit ipsum sunt consequat.", + "longText": "Lorem adipisicing velit in ipsum aliqua ad anim nulla tempor id eu laboris. Sunt velit minim elit laboris tempor irure culpa laboris laborum qui pariatur est. Ea laboris id nostrud exercitation non. Aute irure do eiusmod in. Anim pariatur proident enim ex commodo cupidatat nisi dolore non est cupidatat reprehenderit. Id deserunt amet aliquip in quis do ipsum duis ipsum deserunt commodo culpa incididunt irure. Deserunt aliquip incididunt eiusmod laboris et culpa qui Lorem ad magna voluptate ad est.\r\nMollit velit ut eu magna non proident ullamco. Aliquip incididunt consectetur nostrud sunt sint eu labore magna ex. Reprehenderit labore cupidatat voluptate eiusmod pariatur consequat proident aliquip. Ea irure ad aliqua eu exercitation ullamco laborum duis. Ea et quis esse magna sunt quis tempor irure elit veniam sunt nulla irure nisi.\r\nIrure consequat veniam esse ea nostrud excepteur ipsum. Dolore minim tempor in ad ex aliquip amet. Sint id excepteur commodo ipsum ullamco consequat ut nisi nulla.\r\nQuis sunt reprehenderit ad quis. Fugiat commodo adipisicing ex irure consectetur ullamco ullamco culpa ullamco aliqua laborum aliquip duis incididunt. Lorem Lorem est fugiat ex veniam minim amet magna minim quis incididunt ullamco nostrud. Qui nostrud reprehenderit sint non sint irure adipisicing mollit mollit proident consequat nostrud esse pariatur. Ex aute velit magna enim veniam enim id eiusmod. Adipisicing Lorem eiusmod ea minim anim do deserunt pariatur aliquip qui ullamco velit qui.\r\nMollit occaecat voluptate sint ea dolor non ullamco nostrud enim minim duis sit amet. Enim ex reprehenderit nisi ipsum deserunt. Aliqua sit Lorem esse qui et deserunt esse.\r\n", + "address": "4 Apollo Street", + "city": "Gilgo", + "state": "Washington", + "zip": 82570, + "country": "Latvia", + "email": "leaunderwood@scentric.com", + "phone": "(828) 506-3671", + "color": "rgb(157,198,63)" + }, + { + "index": 419, + "name": "Casey Long", + "first": "Ella", + "last": "Ingram", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "boolean": false, + "guid": "9594164f-bed6-4350-84a7-8006ac0ac9a1", + "integer": 72, + "date": "Sun Nov 13 1988 09:05:46 GMT-0800 (PST)", + "shortText": "irure labore", + "mediumText": "Esse aliquip est ullamco velit. Amet tempor est consectetur consequat voluptate. Tempor ipsum fugiat enim et. Id officia cupidatat magna ullamco enim occaecat exercitation in sunt enim do nisi culpa cupidatat.", + "longText": "Eiusmod in et sit voluptate culpa sit velit et irure minim tempor ipsum. Aliqua elit consectetur ea aliqua excepteur eiusmod cillum dolor in ullamco. Commodo quis qui laborum labore minim. Ipsum est do proident labore incididunt nisi. Adipisicing magna velit sit consequat mollit proident commodo quis. Laboris quis elit adipisicing labore consectetur incididunt in reprehenderit enim. Magna cillum enim id veniam velit aliquip amet deserunt ea.\r\nReprehenderit ea ullamco do id tempor in duis nulla pariatur. Eiusmod adipisicing in consectetur exercitation. Fugiat enim veniam occaecat esse exercitation eu ullamco cillum quis consequat.\r\nAliqua non enim sunt amet cillum id proident do nulla eiusmod eu. Fugiat in nisi incididunt irure enim. Occaecat culpa tempor culpa anim laborum dolore consectetur Lorem eu.\r\nOfficia et aliqua aliqua ex occaecat est magna officia enim. Commodo officia dolor officia esse aute eiusmod. Velit quis reprehenderit reprehenderit laborum occaecat voluptate. Eiusmod dolor culpa irure do mollit excepteur ullamco aute est culpa. Ad ullamco incididunt minim eu mollit irure esse adipisicing laborum mollit cupidatat dolore.\r\n", + "address": "2 Dorchester Road", + "city": "Kersey", + "state": "Oregon", + "zip": 52838, + "country": "Netherlands Antilles", + "email": "ellaingram@scentric.com", + "phone": "(939) 546-2501", + "color": "rgb(50,99,109)" + }, + { + "index": 420, + "name": "Kent Fitzpatrick", + "first": "Lara", + "last": "Vinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "boolean": true, + "guid": "8c5b6ef8-755b-48a6-9d5c-2fbfc73015b9", + "integer": 94, + "date": "Wed Nov 13 1991 18:16:19 GMT-0800 (PST)", + "shortText": "labore", + "mediumText": "Esse ipsum culpa magna consequat fugiat magna aute.", + "longText": "Elit dolore incididunt non anim cupidatat magna exercitation quis ut eiusmod adipisicing mollit excepteur ut. Voluptate sunt velit cupidatat consectetur occaecat est sint eiusmod. Ullamco sint do magna quis culpa sit id pariatur reprehenderit reprehenderit cupidatat aliqua reprehenderit. Et cillum est nisi laborum nisi officia sint ut deserunt eiusmod in. Incididunt dolore duis eiusmod eiusmod officia.\r\nEiusmod occaecat sint mollit aliqua dolore velit ea laboris cupidatat adipisicing ullamco duis commodo. Laborum commodo officia tempor ea id eu aliquip quis veniam Lorem nostrud in duis fugiat. Quis aliquip esse cupidatat cillum quis sint. Aute sunt qui dolore laboris.\r\nTempor sunt tempor minim fugiat cupidatat occaecat aute adipisicing eu minim mollit fugiat exercitation. Tempor occaecat sint ad enim sit occaecat Lorem nisi. Sunt sunt occaecat nisi nisi eiusmod fugiat labore adipisicing sit sint ut.\r\nConsequat minim ad laboris et est. Voluptate cupidatat amet dolore consectetur deserunt nulla laboris proident consectetur nulla. Ex voluptate magna velit ex cillum do. Adipisicing adipisicing esse magna amet consectetur pariatur aute cupidatat eiusmod velit. Fugiat sint occaecat tempor qui cillum ad nulla. Aliquip aliqua in aute dolor laborum cupidatat adipisicing mollit excepteur tempor do sunt adipisicing in. Ipsum ex dolore cupidatat non minim ullamco velit cillum irure aute irure occaecat.\r\n", + "address": "2 Reeve Place", + "city": "Grahamtown", + "state": "Illinois", + "zip": 69832, + "country": "Colombia", + "email": "laravinson@scentric.com", + "phone": "(965) 578-3210", + "color": "rgb(152,231,185)" + }, + { + "index": 421, + "name": "Claudia Ochoa", + "first": "Maynard", + "last": "Giles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "boolean": true, + "guid": "97fdeebe-aaf9-4f67-a240-254056b3fbc4", + "integer": 43, + "date": "Thu Oct 04 2007 14:11:47 GMT-0700 (PDT)", + "shortText": "commodo nostrud", + "mediumText": "Consectetur aliquip reprehenderit magna id ex sint nostrud aute aliquip adipisicing. Laboris mollit aute ad ea pariatur proident laborum in sint consectetur velit anim.", + "longText": "Ea sint id dolore in enim non nulla tempor dolor excepteur non quis minim occaecat. Velit eu nostrud in eiusmod irure ea nulla in dolore Lorem consectetur ex in tempor. Ad duis ullamco dolor elit Lorem est dolore irure et non enim. Tempor laborum dolor velit consequat incididunt.\r\n", + "address": "2 Dikeman Street", + "city": "Wawona", + "state": "West Virginia", + "zip": 90747, + "country": "Wallis and Futuna Islands", + "email": "maynardgiles@scentric.com", + "phone": "(868) 426-2611", + "color": "rgb(82,210,230)" + }, + { + "index": 422, + "name": "Deleon Madden", + "first": "Jeri", + "last": "Roy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "boolean": true, + "guid": "0eeed2b0-573c-4b2a-8cf7-24f3929d42f6", + "integer": 3, + "date": "Mon Jul 24 2006 08:25:36 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Veniam mollit ut veniam anim ex proident nostrud. Qui dolore aute velit non voluptate sit ad reprehenderit sunt mollit. Reprehenderit fugiat occaecat duis mollit.", + "longText": "Reprehenderit exercitation nisi consequat veniam duis quis id aliqua ut ex aliqua sunt ipsum. Ad ad amet qui mollit officia Lorem exercitation dolore nulla. Quis commodo mollit sunt labore aliquip ipsum. Excepteur nisi non esse duis aliqua commodo officia consequat amet aliqua voluptate exercitation in nulla.\r\nConsectetur aute sit quis qui laboris. Laboris anim nulla in voluptate. Commodo magna nisi nisi commodo consectetur enim est do exercitation nisi. Mollit aliquip sint ea qui laborum.\r\nConsectetur eiusmod magna nisi mollit sint sunt id nostrud dolor eu. Exercitation mollit fugiat anim nisi nisi irure ipsum tempor eu. Est nisi consequat occaecat voluptate ad velit mollit amet. Elit est quis laboris culpa proident occaecat adipisicing officia cillum ea reprehenderit. Do quis ex aliqua culpa.\r\nIn minim proident enim nisi quis consequat. Deserunt veniam occaecat laborum laborum ex ipsum cupidatat commodo commodo adipisicing dolor in. Ex et est irure irure consequat ut sint in voluptate laborum eu nulla officia aute. Non enim magna nostrud deserunt minim pariatur irure elit ex qui minim. Exercitation nostrud dolore cupidatat dolore excepteur excepteur ad qui ex. Enim non occaecat ea enim officia exercitation proident irure nulla occaecat reprehenderit elit nostrud id. Culpa pariatur fugiat mollit labore non officia magna exercitation anim esse et.\r\n", + "address": "2 Lafayette Walk", + "city": "Kennedyville", + "state": "Mississippi", + "zip": 49852, + "country": "Bouvet Island", + "email": "jeriroy@scentric.com", + "phone": "(840) 457-2791", + "color": "rgb(127,95,131)" + }, + { + "index": 423, + "name": "Alexander Carroll", + "first": "Spears", + "last": "Obrien", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "boolean": false, + "guid": "36236dec-3738-49d8-befd-946c2774fd1e", + "integer": 88, + "date": "Tue Jul 01 1986 19:56:06 GMT-0700 (PDT)", + "shortText": "aute non ex Lorem", + "mediumText": "Proident Lorem aliqua laboris adipisicing ullamco velit consequat exercitation nisi. Laborum enim duis nulla reprehenderit est eu ad laboris ad.", + "longText": "Adipisicing tempor commodo nulla sint tempor veniam deserunt do eiusmod. Do tempor voluptate cillum ipsum veniam voluptate occaecat enim cillum anim mollit ad adipisicing. Consequat consequat aute dolor anim ut. Incididunt Lorem mollit anim esse veniam.\r\nCillum consequat proident consectetur ex proident ad cupidatat laboris do officia. Amet deserunt eu eiusmod aliquip esse ipsum laboris. Do dolor nostrud dolore sint quis nulla pariatur quis adipisicing. Culpa exercitation incididunt ullamco culpa sit.\r\nDolore irure sunt eiusmod tempor. Esse deserunt ex elit Lorem et nulla esse officia ipsum culpa. Lorem sunt duis tempor nostrud enim ea excepteur ad. Ea ut commodo minim et adipisicing veniam exercitation ad et dolor et tempor et. Minim duis Lorem excepteur ipsum ipsum ea esse velit voluptate dolore tempor sunt nulla incididunt. Excepteur est est consectetur in. Aliquip nisi ipsum deserunt nulla.\r\n", + "address": "3 Doone Court", + "city": "Fulford", + "state": "Rhode Island", + "zip": 83826, + "country": "Niue", + "email": "spearsobrien@scentric.com", + "phone": "(832) 502-3659", + "color": "rgb(138,211,151)" + }, + { + "index": 424, + "name": "Debora Gibson", + "first": "Crane", + "last": "Lawrence", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "boolean": false, + "guid": "0a2de76d-c5db-4e74-89e0-3ff39bf504ad", + "integer": 29, + "date": "Fri Apr 01 1977 03:54:28 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Esse veniam veniam in do incididunt non culpa laborum.", + "longText": "Ullamco exercitation deserunt enim est ea. Ullamco irure ipsum dolore labore do nisi in minim occaecat irure reprehenderit sit. Elit culpa officia ut labore nulla duis ullamco magna culpa veniam. Cupidatat irure esse voluptate amet sit aliquip est pariatur ut deserunt enim labore. Nulla occaecat cupidatat et ex amet qui esse. Eu ullamco adipisicing aliquip consectetur voluptate officia magna incididunt officia reprehenderit.\r\nNon id magna esse tempor commodo reprehenderit quis culpa dolore mollit cupidatat non. Ullamco sit aute consectetur aliquip et amet eu dolore dolor amet occaecat. Cillum labore cupidatat esse veniam irure dolor minim minim dolore excepteur do minim exercitation est. Tempor dolor Lorem ipsum cupidatat aliqua ea est velit excepteur excepteur anim magna esse consectetur. Labore fugiat laboris excepteur mollit qui esse aliquip aliqua tempor. Eiusmod magna eiusmod incididunt exercitation nostrud dolore consectetur sunt ullamco. Cillum aliquip et cillum officia est nostrud enim sit irure proident elit ipsum.\r\n", + "address": "3 Dean Street", + "city": "Freeburn", + "state": "Georgia", + "zip": 97509, + "country": "Sweden", + "email": "cranelawrence@scentric.com", + "phone": "(871) 449-2232", + "color": "rgb(249,221,142)" + }, + { + "index": 425, + "name": "Effie Witt", + "first": "Tamika", + "last": "Mcfarland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "boolean": false, + "guid": "24996c53-4fce-4e30-9a15-01ad7f8a690e", + "integer": 72, + "date": "Sun Nov 03 1991 09:36:14 GMT-0800 (PST)", + "shortText": "dolore ullamco do dolor", + "mediumText": "Ad ex aliquip minim exercitation ex incididunt adipisicing sit sit aliqua. Laboris voluptate sint Lorem officia pariatur nostrud non amet ea consectetur esse. Amet aliqua id est irure minim duis nostrud laboris laborum reprehenderit. Ea anim proident nisi adipisicing dolor. Magna mollit do irure do veniam minim proident.", + "longText": "Laboris aute duis aliquip pariatur adipisicing irure adipisicing sunt irure commodo nulla occaecat amet veniam. Nostrud ex voluptate elit nulla voluptate culpa dolore excepteur. Qui ea ex adipisicing proident sint adipisicing ea. Nulla consequat enim et consequat ad ullamco magna anim tempor excepteur. Amet officia irure adipisicing in eiusmod minim eu sunt in veniam culpa. Quis eu aliqua proident in aute proident ea. Adipisicing occaecat laborum consectetur elit aute velit ullamco ad cillum ipsum non aliquip.\r\nCommodo qui incididunt deserunt enim excepteur ut fugiat. Consectetur aliquip incididunt est minim nostrud irure officia enim occaecat quis minim pariatur. Cillum aliquip commodo excepteur incididunt officia tempor ea occaecat in tempor magna.\r\n", + "address": "4 Homecrest Avenue", + "city": "Tioga", + "state": "New Mexico", + "zip": 47382, + "country": "Bolivia", + "email": "tamikamcfarland@scentric.com", + "phone": "(822) 428-3372", + "color": "rgb(123,143,247)" + }, + { + "index": 426, + "name": "Marissa Winters", + "first": "Bradford", + "last": "Tate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "boolean": true, + "guid": "03ba235d-b8bd-446d-a82f-209ef1f02bc3", + "integer": 21, + "date": "Sat Feb 21 1987 11:19:00 GMT-0800 (PST)", + "shortText": "deserunt mollit", + "mediumText": "Velit non amet irure dolore nisi proident nisi.", + "longText": "Et ad occaecat ipsum amet aliquip sit nisi. Adipisicing ut esse dolore aliquip ut. Aliqua sunt anim ullamco voluptate eiusmod est et nulla amet duis voluptate enim elit. Ea consequat ea aliquip nulla enim in enim mollit ea consequat.\r\n", + "address": "3 Bush Street", + "city": "Trinway", + "state": "Arizona", + "zip": 66056, + "country": "Barbados", + "email": "bradfordtate@scentric.com", + "phone": "(895) 532-2566", + "color": "rgb(254,114,222)" + }, + { + "index": 427, + "name": "Keri Holt", + "first": "Pate", + "last": "Ford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "boolean": true, + "guid": "fe01b1c1-e14b-4167-92b2-6eef711b41a3", + "integer": 74, + "date": "Sun Jul 01 1979 19:51:30 GMT-0700 (PDT)", + "shortText": "eiusmod pariatur sunt sit", + "mediumText": "Tempor officia velit commodo aute laborum nostrud incididunt id id et. Esse cillum do deserunt sit tempor nisi ipsum sint proident sint. Aute officia esse voluptate pariatur ut. In consequat eiusmod exercitation nostrud reprehenderit et.", + "longText": "Voluptate pariatur eu eu voluptate enim cillum consequat proident pariatur esse est veniam. Qui nisi nulla laborum adipisicing irure occaecat. Mollit amet ullamco velit et reprehenderit amet. Ex ex quis do et anim fugiat exercitation nulla fugiat. Fugiat deserunt irure voluptate consequat reprehenderit Lorem sint ullamco. Ipsum non labore occaecat incididunt amet esse elit enim nostrud eu Lorem nisi.\r\nId culpa non enim aliquip dolore. Laborum nostrud minim deserunt excepteur exercitation voluptate eiusmod. Adipisicing pariatur occaecat voluptate reprehenderit aute. Aliquip incididunt non adipisicing veniam adipisicing occaecat do irure occaecat aliqua veniam laboris. Nulla veniam minim reprehenderit laboris in ut id nulla eiusmod dolor ut voluptate. Tempor enim nostrud ut velit eu cupidatat amet.\r\nAute ipsum ex nulla ut labore ex exercitation nulla anim. Pariatur sit voluptate reprehenderit enim amet. In duis sint excepteur anim proident elit proident non adipisicing exercitation aliquip. Reprehenderit occaecat duis ipsum eu et ad elit do sunt fugiat aliqua. Ea enim mollit dolore qui reprehenderit pariatur nostrud. Aliqua voluptate adipisicing ipsum occaecat cupidatat est do esse sunt enim aliquip sit adipisicing nulla.\r\nId ullamco amet ad deserunt. Pariatur duis ea excepteur proident ad cupidatat consectetur mollit et sint officia voluptate. Sunt et aliqua anim quis proident culpa cillum. Deserunt consequat dolore do anim eiusmod magna. Quis dolor adipisicing anim aliquip exercitation quis adipisicing. Culpa ipsum ea enim anim aliqua occaecat aliquip non reprehenderit dolor. Non proident labore enim est.\r\nProident reprehenderit sunt est aliqua. Dolor ex voluptate occaecat Lorem velit minim do voluptate aute in aliqua. Aute ut voluptate Lorem eu occaecat non deserunt nulla Lorem do minim magna. Duis sit nisi commodo aliquip enim pariatur. Cillum velit officia proident irure dolor.\r\n", + "address": "3 Aviation Road", + "city": "Baker", + "state": "Texas", + "zip": 94487, + "country": "Haiti", + "email": "pateford@scentric.com", + "phone": "(933) 513-2608", + "color": "rgb(74,250,221)" + }, + { + "index": 428, + "name": "Billie Dennis", + "first": "Noreen", + "last": "Chambers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "boolean": true, + "guid": "1277af24-5433-4c02-a123-9dbc3554824d", + "integer": 91, + "date": "Tue Jun 01 1999 05:28:24 GMT-0700 (PDT)", + "shortText": "anim consectetur minim esse", + "mediumText": "Sunt eu velit irure ipsum velit.", + "longText": "Culpa ipsum irure eiusmod et ad esse cillum. In ipsum qui dolor dolor. Ex deserunt incididunt duis exercitation quis est esse. Anim adipisicing ipsum aute qui mollit. Occaecat veniam excepteur velit nostrud cillum in nostrud ex magna ex.\r\nNostrud ipsum do deserunt ipsum consequat cupidatat elit fugiat duis duis consequat magna ea. Do labore ea do et cupidatat mollit et eiusmod. Exercitation exercitation aliqua ea irure duis. Lorem ipsum eu veniam ad nulla nisi ipsum in eu laborum pariatur ipsum cupidatat officia. Adipisicing pariatur velit commodo ipsum sint fugiat elit esse dolore ipsum ut exercitation officia excepteur.\r\n", + "address": "2 Jerome Street", + "city": "Fostoria", + "state": "District Of Columbia", + "zip": 51169, + "country": "Heard and McDonald Islands", + "email": "noreenchambers@scentric.com", + "phone": "(921) 600-2756", + "color": "rgb(240,228,68)" + }, + { + "index": 429, + "name": "Norris Henderson", + "first": "Rhea", + "last": "Velasquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "boolean": true, + "guid": "f6c07756-a3f1-410c-a912-acb877dca497", + "integer": 10, + "date": "Thu Jul 17 2008 11:56:06 GMT-0700 (PDT)", + "shortText": "adipisicing irure cillum", + "mediumText": "Sint duis irure cupidatat aliqua nostrud magna aliquip do do quis mollit occaecat.", + "longText": "Dolor et duis nisi est elit dolore amet enim et ad officia duis. Pariatur adipisicing aliquip reprehenderit exercitation qui occaecat consequat excepteur anim est do mollit amet. In eu eiusmod ea elit. Laborum duis culpa reprehenderit reprehenderit.\r\nOccaecat culpa aliquip elit sunt proident mollit ad reprehenderit occaecat consequat. Id pariatur commodo consectetur cillum laboris et dolor ea voluptate. Laborum magna nisi sunt eu ut mollit amet esse consectetur sunt. Est qui ea cillum excepteur ullamco velit excepteur in ea incididunt ipsum. Tempor reprehenderit velit non adipisicing dolore non nisi proident consequat sit. Nulla est incididunt sint proident do sunt ipsum adipisicing Lorem ad.\r\nNulla excepteur enim ipsum est. Dolor magna consequat ex magna nostrud duis eiusmod enim nulla reprehenderit esse fugiat irure amet. Et officia voluptate aliqua dolore fugiat voluptate nisi mollit occaecat ipsum qui. Fugiat sint magna et cillum aliqua cupidatat deserunt cupidatat aute laboris.\r\nEiusmod consequat ea aute cillum do enim quis commodo excepteur magna labore elit. Voluptate nisi velit dolore consequat elit irure fugiat. Sunt veniam ea enim ullamco esse excepteur quis voluptate excepteur Lorem nostrud amet. Ad commodo labore excepteur velit sunt ut. Ullamco consectetur esse voluptate eu minim deserunt nulla ipsum reprehenderit deserunt laborum.\r\nDuis adipisicing reprehenderit enim qui. Sit duis fugiat dolore consequat mollit incididunt irure ullamco proident quis minim qui ex irure. Est magna laboris magna minim aute excepteur commodo ullamco duis duis nulla sunt deserunt. Irure sunt ea do ipsum aliquip nisi nulla ex ex nostrud. Elit amet voluptate commodo id minim ut est ut minim adipisicing in. Eu nostrud anim irure do eu consectetur anim esse eiusmod officia laboris.\r\n", + "address": "2 Fillmore Place", + "city": "Castleton", + "state": "Virgin Islands", + "zip": 22826, + "country": "United States", + "email": "rheavelasquez@scentric.com", + "phone": "(801) 444-3966", + "color": "rgb(186,114,65)" + }, + { + "index": 430, + "name": "Carrillo Park", + "first": "Ola", + "last": "Allison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "boolean": true, + "guid": "3a544cbd-1319-4b62-b664-89f96dc2d58f", + "integer": 79, + "date": "Wed Feb 03 1999 14:08:18 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id et eiusmod ad sunt laborum. Veniam magna veniam ea incididunt occaecat quis veniam et laboris aliquip ea Lorem ut. Eu officia incididunt eu veniam.", + "longText": "Voluptate reprehenderit nostrud non adipisicing ad ex enim. Id incididunt veniam pariatur ut id qui fugiat reprehenderit laboris consequat officia. Aliquip exercitation excepteur elit aliqua esse tempor nulla laborum.\r\nIn mollit reprehenderit irure duis cupidatat ad velit irure ad. Est et laborum non reprehenderit. Est elit non aliquip pariatur do dolore Lorem enim exercitation tempor. Amet culpa ut nostrud dolor fugiat.\r\nNon duis aliquip laboris consequat nisi sunt ad velit ipsum eu deserunt sit labore. Qui velit ipsum cupidatat ad irure nisi adipisicing eu. Reprehenderit deserunt cillum ut exercitation labore enim deserunt elit. Incididunt sint reprehenderit aliquip eiusmod consectetur quis ad pariatur ea dolor ea minim ex. Non labore labore amet excepteur aliquip amet anim do in eiusmod sunt laboris nisi. Est qui qui laboris veniam elit elit sunt in. Tempor commodo ex ea laborum.\r\nDolore dolore dolore labore velit fugiat commodo consectetur. Ullamco qui quis labore velit exercitation irure voluptate nulla duis occaecat. Ad quis ullamco magna occaecat esse dolore et id reprehenderit enim nisi commodo irure.\r\nFugiat proident deserunt nulla et pariatur ullamco do. Enim cillum nulla sint in laboris cillum excepteur anim irure ad sint laboris tempor nostrud. Enim pariatur amet sint non nisi commodo. Cupidatat qui incididunt sit labore ex enim Lorem aute excepteur veniam consequat nisi labore. Proident dolor excepteur aute et proident. Veniam excepteur veniam laboris deserunt sint.\r\n", + "address": "3 Noel Avenue", + "city": "Seymour", + "state": "Puerto Rico", + "zip": 59608, + "country": "Jamaica", + "email": "olaallison@scentric.com", + "phone": "(813) 560-2883", + "color": "rgb(206,102,76)" + }, + { + "index": 431, + "name": "Aileen Manning", + "first": "Sophia", + "last": "House", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "boolean": false, + "guid": "832335a5-d05a-4d43-8c98-091dad23386f", + "integer": 82, + "date": "Fri Feb 17 2012 22:56:46 GMT-0800 (PST)", + "shortText": "amet est Lorem velit tempor", + "mediumText": "Cupidatat incididunt do aliqua velit occaecat officia occaecat amet occaecat Lorem veniam eu ipsum cillum. Amet esse aliqua in qui excepteur commodo veniam ut velit.", + "longText": "Officia esse consectetur proident consequat. Ex eiusmod cupidatat labore velit anim fugiat amet ipsum labore. Ut velit id ullamco occaecat et. Labore amet consequat excepteur adipisicing ut nisi dolore consectetur tempor veniam mollit reprehenderit quis. Esse ad irure elit et.\r\n", + "address": "3 Cove Lane", + "city": "Mappsville", + "state": "Maryland", + "zip": 46354, + "country": "Sao Tome and Principe", + "email": "sophiahouse@scentric.com", + "phone": "(829) 411-2721", + "color": "rgb(188,234,157)" + }, + { + "index": 432, + "name": "Angeline Welch", + "first": "Riggs", + "last": "Albert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "boolean": true, + "guid": "ff60a0af-9800-4828-beec-cc4ad3e7a4f5", + "integer": 75, + "date": "Wed Oct 28 1992 15:16:43 GMT-0800 (PST)", + "shortText": "laborum aliquip minim", + "mediumText": "Minim est qui proident deserunt nostrud commodo nisi non in veniam duis. Nisi minim aliqua cupidatat est dolore consequat nisi. Proident ut incididunt aute ea qui id reprehenderit veniam commodo.", + "longText": "Eu velit exercitation id amet. Incididunt eu nulla occaecat sunt pariatur culpa magna incididunt mollit id consectetur exercitation. Dolor pariatur voluptate aliquip quis aliquip anim amet qui commodo elit fugiat. Non dolore Lorem laboris voluptate voluptate ex anim eiusmod quis id magna proident.\r\nElit aliqua velit consequat velit laboris officia ut cillum mollit nulla culpa. Ut ea qui minim deserunt aliquip cillum ea proident duis. Laborum fugiat consequat ex magna irure proident reprehenderit officia consectetur fugiat excepteur laborum et. Est veniam non elit nisi minim. Ex sunt elit minim incididunt eu officia excepteur mollit nisi ad. Do est nisi magna et tempor culpa. Elit irure ex ut cillum ipsum ipsum ex esse dolor.\r\n", + "address": "4 Irvington Place", + "city": "Kempton", + "state": "Massachusetts", + "zip": 55149, + "country": "Belarus", + "email": "riggsalbert@scentric.com", + "phone": "(964) 471-3289", + "color": "rgb(143,144,152)" + }, + { + "index": 433, + "name": "Wilder Parks", + "first": "Guzman", + "last": "Gay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "boolean": true, + "guid": "34d47442-340f-4017-a323-333b9d8966a7", + "integer": 46, + "date": "Sat May 01 1982 19:47:12 GMT-0700 (PDT)", + "shortText": "fugiat nisi fugiat", + "mediumText": "Lorem ipsum ipsum elit ad reprehenderit do culpa proident qui labore ea cillum tempor aute. Velit nisi anim excepteur commodo tempor. Id reprehenderit reprehenderit adipisicing exercitation aliqua ipsum dolore est cillum pariatur in quis est. Ad adipisicing irure qui ullamco eiusmod excepteur laborum.", + "longText": "Lorem id elit est velit veniam ullamco voluptate et do. Non ea ad minim Lorem in. Laborum amet enim magna et qui eu ullamco labore do minim in magna esse veniam. Incididunt nostrud nulla ut excepteur et et. Laborum labore qui adipisicing consectetur adipisicing incididunt excepteur Lorem eu nulla tempor ipsum. Ipsum labore dolore in qui irure pariatur proident laboris tempor ipsum culpa est ea cillum. Lorem sunt eu proident enim.\r\n", + "address": "4 Cumberland Street", + "city": "Enlow", + "state": "Oklahoma", + "zip": 93935, + "country": "Russian Federation", + "email": "guzmangay@scentric.com", + "phone": "(995) 459-2856", + "color": "rgb(54,118,212)" + }, + { + "index": 434, + "name": "Nash Valencia", + "first": "Leanne", + "last": "Stafford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "boolean": false, + "guid": "0594778f-1bb9-4338-88af-480e9dcce7ec", + "integer": 12, + "date": "Wed Aug 07 1985 09:48:17 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "Incididunt commodo exercitation do eu laborum do fugiat aute dolore nostrud proident tempor. Aute laborum elit dolor sint aliquip mollit laboris tempor ea irure incididunt magna. Id aliquip sit do magna.", + "longText": "Consectetur voluptate duis cupidatat incididunt laborum. Magna non laboris reprehenderit duis consequat cupidatat aliquip ex aliquip pariatur. Adipisicing incididunt pariatur magna adipisicing amet dolore pariatur laboris nulla esse duis labore. Dolore est aute do do culpa pariatur. Consequat ea minim qui laborum culpa velit id fugiat nostrud sint. Ipsum irure cillum quis officia eu laboris.\r\nLorem ex duis eu deserunt minim cupidatat et non non et sunt. Pariatur ut culpa et non non voluptate ut velit sunt eu non. Cillum exercitation veniam nostrud est id laboris. Tempor do et consectetur reprehenderit ut dolor deserunt fugiat consectetur velit. Nulla elit deserunt dolor do cupidatat amet velit consectetur. Consectetur in nostrud sunt deserunt est aute cupidatat mollit aliquip sint cupidatat sit esse. Ut eu ut veniam sunt do proident cillum velit voluptate.\r\nCupidatat et aute tempor dolore. Aute exercitation sunt eiusmod ut consequat ut pariatur et excepteur. Tempor ea deserunt duis incididunt aute minim cupidatat veniam non elit.\r\nEiusmod occaecat culpa ipsum enim deserunt qui irure. Reprehenderit dolor quis dolor dolore culpa aliquip ipsum. Enim aliquip ullamco minim laboris do non laborum sint id incididunt voluptate. Do ea enim cupidatat deserunt ipsum nulla mollit ullamco laborum sint.\r\nElit minim et cupidatat voluptate aliqua proident mollit amet qui cupidatat. Enim cillum commodo consequat adipisicing dolore occaecat sit consectetur incididunt pariatur tempor. Ea eu do ea elit et.\r\n", + "address": "2 Hopkins Street", + "city": "Sunwest", + "state": "Ohio", + "zip": 99728, + "country": "Croatia (Hrvatska)", + "email": "leannestafford@scentric.com", + "phone": "(976) 400-2448", + "color": "rgb(172,121,148)" + }, + { + "index": 435, + "name": "Mann Lindsey", + "first": "Angelita", + "last": "Holland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "boolean": true, + "guid": "b158f0bc-58b6-497c-b8e9-827e2fd5adcb", + "integer": 86, + "date": "Tue Mar 30 1999 04:50:25 GMT-0800 (PST)", + "shortText": "nulla", + "mediumText": "Cupidatat sint laboris irure irure quis irure laborum anim ex aliquip ad. Ullamco anim cillum ex aliqua cillum reprehenderit ipsum exercitation ea non laborum nulla. Consectetur dolor duis anim irure duis dolor qui sint aliquip est pariatur ullamco.", + "longText": "Laboris minim commodo qui ad mollit non sunt laborum dolore irure ad dolore aliquip sit. Eu ullamco nulla magna velit non. Cupidatat nulla reprehenderit qui elit nisi mollit adipisicing anim. Irure laborum aute culpa nisi et voluptate esse minim.\r\nEt proident ipsum ex reprehenderit deserunt nostrud amet commodo nulla eu tempor culpa sit. Aute fugiat dolor commodo quis laboris nulla ea laboris. Et excepteur laborum aute et.\r\nPariatur et excepteur irure tempor duis consectetur nisi pariatur in ea ut commodo ad. Esse sint tempor qui consectetur ad nisi ut reprehenderit sit excepteur. Dolore mollit voluptate ipsum ad in aliqua nisi. Officia nulla aliquip tempor do culpa velit. Ut Lorem non cillum ipsum. Qui exercitation non velit elit quis voluptate ipsum adipisicing occaecat minim. Est consectetur duis minim irure reprehenderit.\r\nVoluptate deserunt duis ut elit ut cillum officia nulla sint do. Elit deserunt est mollit mollit et ullamco dolore. Amet consequat pariatur cupidatat velit. Eiusmod elit qui mollit nisi ipsum enim. Ullamco eu commodo est consequat. Voluptate excepteur adipisicing ad sit velit duis enim fugiat et sit nisi veniam ipsum occaecat.\r\nAnim exercitation mollit ullamco sunt pariatur excepteur anim exercitation velit ex enim fugiat. Ullamco excepteur ex sint nulla laboris qui anim sunt nisi. Esse ea exercitation dolore adipisicing. Quis amet aute consequat occaecat officia ea nulla.\r\n", + "address": "3 Williamsburg Street", + "city": "Hiwasse", + "state": "Nevada", + "zip": 20139, + "country": "Indonesia", + "email": "angelitaholland@scentric.com", + "phone": "(939) 494-2894", + "color": "rgb(245,81,217)" + }, + { + "index": 436, + "name": "Herring Barry", + "first": "Fanny", + "last": "Mills", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "boolean": true, + "guid": "80d4034b-37c2-4d36-8a84-8902d6dbd1e8", + "integer": 7, + "date": "Thu Feb 26 1987 04:22:07 GMT-0800 (PST)", + "shortText": "culpa veniam laborum", + "mediumText": "Eu culpa qui cillum nulla occaecat irure proident laboris. Enim Lorem eiusmod minim magna ea eu reprehenderit eu ea nulla aute. Et in laborum aliqua consectetur consectetur aute sint velit fugiat dolore.", + "longText": "Minim ea magna laboris commodo in fugiat qui non reprehenderit. Sint tempor labore qui ullamco nisi tempor consequat tempor quis. Aute dolore minim nulla magna ut ex commodo mollit dolor ipsum dolor. Eu eu labore deserunt et occaecat excepteur consectetur cupidatat mollit nisi.\r\nTempor aute culpa sit occaecat consequat. Culpa ullamco proident aliquip labore. Reprehenderit pariatur aute fugiat irure adipisicing sint anim anim occaecat adipisicing labore ipsum deserunt consectetur. Voluptate eiusmod eu pariatur proident nostrud sint labore. Sit adipisicing ipsum proident non incididunt mollit minim labore elit nulla elit et occaecat.\r\nSit culpa veniam id minim minim dolore elit culpa ut enim est. Ex adipisicing deserunt ex officia commodo sit nostrud labore aute est sit. Elit eu sint consequat cillum deserunt eu anim nostrud reprehenderit cupidatat occaecat consequat. Sint anim est ullamco non sint dolore excepteur.\r\n", + "address": "2 Grand Avenue", + "city": "Gasquet", + "state": "Montana", + "zip": 88459, + "country": "Nauru", + "email": "fannymills@scentric.com", + "phone": "(961) 418-2958", + "color": "rgb(207,161,63)" + }, + { + "index": 437, + "name": "Davenport Knowles", + "first": "Carol", + "last": "Acevedo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "boolean": true, + "guid": "20017740-0bff-43ce-a66b-b139bdd82fdf", + "integer": 10, + "date": "Sat Aug 12 1989 13:36:36 GMT-0700 (PDT)", + "shortText": "tempor fugiat ex do", + "mediumText": "Culpa quis minim eiusmod veniam ullamco cupidatat velit dolore cillum aute duis reprehenderit. Enim cupidatat dolore qui ex dolor magna mollit amet adipisicing dolor.", + "longText": "Voluptate ex duis culpa est ullamco magna ullamco id. Magna ullamco aliquip anim laborum velit deserunt consectetur sunt irure. Anim nulla ullamco veniam sint ex culpa eu minim dolor excepteur. Adipisicing ex tempor duis ea. Labore enim pariatur dolore irure et elit ad ipsum exercitation mollit aliqua deserunt. Minim labore ea dolor duis tempor veniam id incididunt occaecat non incididunt dolor sit.\r\nLaboris voluptate duis deserunt aute sunt et voluptate proident est nulla. Labore aute esse est nisi in excepteur laborum irure. Fugiat sint qui esse excepteur duis qui do labore. Non incididunt elit nulla ex officia cupidatat elit culpa id aliqua. Ex aute esse ex reprehenderit. Veniam excepteur aliquip irure laborum eiusmod. Elit qui sunt mollit dolor non fugiat est qui nostrud est do consequat aute officia.\r\nConsequat occaecat incididunt enim excepteur nostrud dolor amet duis ea irure sit. Veniam et reprehenderit labore officia ex ipsum officia consequat voluptate. Incididunt duis commodo deserunt aute deserunt dolore sunt Lorem. Veniam non ea laborum mollit aliquip qui eu fugiat duis. Fugiat id sunt aute mollit elit sit incididunt veniam tempor. Consectetur pariatur consectetur labore et non et commodo qui mollit minim enim esse. Et proident elit minim est occaecat.\r\nDo aliquip excepteur nulla elit. Laboris consequat do officia veniam laboris. Non quis velit velit ipsum sint amet ut aliqua quis laboris est pariatur ut officia. Eu esse consequat irure dolore quis in sit. Labore ipsum minim ad ut voluptate ea non. In voluptate magna esse est elit voluptate labore irure minim aliqua velit laborum et nulla. Ipsum nostrud est consequat tempor velit culpa sint fugiat dolor.\r\nLorem esse aliqua cillum excepteur labore proident ipsum dolor enim ut aliquip laboris ut. Ullamco aliqua pariatur enim dolore est irure. Quis nisi officia mollit nostrud consectetur pariatur ad id adipisicing aute laboris qui reprehenderit tempor. Nulla non nostrud excepteur duis excepteur quis. Ex do voluptate sit Lorem ea irure eu velit culpa.\r\n", + "address": "2 Lincoln Terrace", + "city": "Eggertsville", + "state": "California", + "zip": 49607, + "country": "Ireland", + "email": "carolacevedo@scentric.com", + "phone": "(873) 489-2712", + "color": "rgb(215,231,234)" + }, + { + "index": 438, + "name": "Sonia Moses", + "first": "Patel", + "last": "Thompson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "boolean": false, + "guid": "e3a9a23d-000c-47aa-8039-4fce46c5565c", + "integer": 26, + "date": "Sun Jan 13 1991 10:21:14 GMT-0800 (PST)", + "shortText": "enim tempor ea", + "mediumText": "Deserunt consectetur velit proident ipsum aute sunt ullamco incididunt consequat aliqua sit mollit. Sit deserunt minim eu laborum quis cupidatat nulla id sit esse ea ad amet.", + "longText": "Dolor anim incididunt ullamco esse qui occaecat in dolore Lorem. Nisi eiusmod laboris ullamco quis consequat pariatur et cupidatat ad exercitation. In eu cillum occaecat amet tempor cillum. Exercitation id ullamco mollit non. Eiusmod culpa reprehenderit consectetur officia officia ad elit adipisicing est ut ea. Fugiat dolor nostrud occaecat consequat elit nulla ex. Ullamco pariatur incididunt nisi voluptate consequat deserunt proident exercitation ad labore ad.\r\nExcepteur tempor dolor eu duis Lorem deserunt elit ipsum. Cillum velit dolor esse Lorem commodo. Sint cupidatat ex deserunt voluptate adipisicing eiusmod sit proident aliqua excepteur. Consequat cillum irure sint ex reprehenderit incididunt est.\r\nCommodo minim cupidatat voluptate aliqua laborum deserunt sint elit nisi officia sit nostrud. Lorem exercitation laborum mollit adipisicing quis. Ad officia nisi cillum consequat non sunt sunt. Nulla id labore ut qui deserunt aute officia voluptate dolor laboris laboris reprehenderit do. Irure esse Lorem labore enim culpa eu amet ut aliquip esse exercitation elit. Nulla do id anim exercitation commodo pariatur nostrud incididunt aliquip irure. Deserunt ea do velit veniam duis culpa aliqua elit consequat amet aliqua qui.\r\nAliquip et nostrud tempor occaecat amet nulla duis non amet. Ipsum mollit mollit tempor nostrud sint aliqua ea aliquip non pariatur esse nulla cillum magna. Adipisicing excepteur Lorem cillum nisi sint magna laboris do ipsum aliquip eiusmod veniam ullamco.\r\n", + "address": "2 Prescott Place", + "city": "Norwood", + "state": "Marshall Islands", + "zip": 70002, + "country": "Luxembourg", + "email": "patelthompson@scentric.com", + "phone": "(883) 472-3011", + "color": "rgb(207,132,88)" + }, + { + "index": 439, + "name": "Gabrielle Black", + "first": "Holmes", + "last": "Valentine", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "boolean": false, + "guid": "4bc9e815-0354-4c95-b76c-945cd74c26d0", + "integer": 40, + "date": "Mon May 10 2010 09:38:40 GMT-0700 (PDT)", + "shortText": "Lorem", + "mediumText": "Eiusmod velit ea exercitation voluptate qui labore voluptate amet proident. Ullamco nulla cupidatat id in anim. Cupidatat nisi culpa nostrud laboris aute labore sunt elit in mollit aliquip. Incididunt incididunt consequat aliqua ullamco velit.", + "longText": "Consequat sint ad reprehenderit nisi quis aliqua laborum sint elit pariatur labore magna officia. Occaecat culpa do laboris amet mollit ex velit. Proident fugiat sint laborum nostrud aute ex in veniam fugiat. Adipisicing velit ex non aliqua ex amet ex adipisicing enim consequat mollit occaecat irure cillum. Ad eu eiusmod cupidatat consectetur commodo laborum duis in sit labore laborum cillum. Enim qui cupidatat amet non fugiat.\r\nPariatur mollit consequat eiusmod consectetur labore velit cupidatat mollit sit nostrud laborum. Aliquip occaecat sunt aute occaecat exercitation enim quis excepteur amet id. Ullamco sunt est consequat do voluptate. Incididunt do anim do voluptate do ut deserunt minim enim non. Occaecat proident aute officia fugiat do sint in reprehenderit. Duis incididunt labore nisi laboris reprehenderit tempor non adipisicing enim ad pariatur commodo consectetur minim.\r\nTempor elit est et esse. Sit sint culpa laborum id et cupidatat qui cupidatat. Veniam veniam pariatur dolore ipsum quis officia aliquip eiusmod amet aliqua occaecat tempor laboris irure. Aute in pariatur cillum irure. Fugiat in nisi Lorem sit sint amet amet. Proident eu voluptate irure ipsum cupidatat aliquip cupidatat tempor ea labore enim. Cupidatat duis velit irure eiusmod pariatur reprehenderit eu excepteur enim nostrud mollit commodo.\r\nVelit mollit Lorem enim ullamco nostrud exercitation. Enim occaecat Lorem aliquip nulla velit fugiat. Ullamco voluptate non fugiat non minim voluptate velit. Duis dolor laborum qui est enim ut. Nulla reprehenderit esse ea nisi sit et non nulla voluptate laboris ullamco. Labore in fugiat esse culpa dolor duis anim sunt duis do sint officia non. Laborum dolor pariatur consequat ullamco fugiat.\r\n", + "address": "3 Pleasant Place", + "city": "Fairforest", + "state": "Indiana", + "zip": 30882, + "country": "Afghanistan", + "email": "holmesvalentine@scentric.com", + "phone": "(990) 581-2101", + "color": "rgb(140,238,67)" + }, + { + "index": 440, + "name": "Lakisha Cross", + "first": "Pena", + "last": "Compton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "boolean": false, + "guid": "cd35d1ad-004f-43fa-a754-2ab807d0ab4d", + "integer": 1, + "date": "Mon Feb 27 2012 17:16:59 GMT-0800 (PST)", + "shortText": "adipisicing anim velit esse", + "mediumText": "Dolor excepteur non id laboris. Consectetur in duis sint labore duis ut. Consequat elit adipisicing amet cillum non tempor pariatur.", + "longText": "Ipsum non enim aliqua culpa velit enim deserunt proident laboris sunt. Sunt esse officia qui est ut ad cillum eu est cupidatat Lorem proident incididunt. Officia duis culpa duis in exercitation irure officia quis aliquip. Tempor nulla consequat exercitation eu nulla.\r\nEu enim labore excepteur proident. Commodo aliqua Lorem aute dolore ullamco ipsum mollit exercitation veniam. Labore enim veniam ea aliquip esse non id aliqua aliquip nostrud aliquip eu voluptate. Do reprehenderit velit proident ad occaecat sit dolor. Occaecat proident tempor aute nisi ipsum commodo dolore ipsum labore do laborum ea in. Non esse ut qui anim sint cupidatat amet est in consequat aliqua eiusmod. Reprehenderit consectetur amet commodo incididunt do amet laboris.\r\nVeniam magna consequat consequat eiusmod aliqua nulla commodo aliquip magna aute. Excepteur culpa ea consectetur sint velit sunt nulla Lorem ex. Irure in amet cupidatat duis occaecat pariatur.\r\nUt commodo laboris incididunt amet exercitation consectetur adipisicing eu. Aliqua in ex cillum Lorem reprehenderit cillum esse non ut cupidatat. Dolore et dolore duis exercitation sunt fugiat. Irure commodo eiusmod est fugiat ipsum anim ullamco ut. Duis amet duis non sint. Fugiat excepteur dolore et aliqua veniam aute elit mollit sit eu. Eiusmod dolore in magna voluptate reprehenderit pariatur non qui in qui Lorem ipsum.\r\nConsequat mollit tempor do sunt Lorem do est reprehenderit. Lorem aliqua culpa irure duis laborum non ut elit ad. Ad ipsum cillum nisi est aute nisi ad et. Aliquip voluptate voluptate elit amet in laboris fugiat. Non voluptate amet ut cillum exercitation veniam. Ea Lorem nostrud aliquip ex.\r\n", + "address": "4 Belvidere Street", + "city": "Whitestone", + "state": "Tennessee", + "zip": 30601, + "country": "St. Pierre and Miquelon", + "email": "penacompton@scentric.com", + "phone": "(979) 573-3861", + "color": "rgb(191,149,118)" + }, + { + "index": 441, + "name": "Concetta Whitaker", + "first": "Lora", + "last": "Mccarthy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "boolean": false, + "guid": "4527d6de-ed39-4b47-8916-33b23feda2f9", + "integer": 64, + "date": "Tue Jul 24 2012 12:23:04 GMT-0700 (PDT)", + "shortText": "voluptate", + "mediumText": "Id pariatur aliqua ea id id duis qui sint mollit commodo.", + "longText": "Incididunt voluptate do id labore. Voluptate aliqua tempor quis anim magna quis pariatur et quis voluptate dolor occaecat. In veniam commodo sunt quis consectetur non minim. Laboris velit fugiat aliqua deserunt nostrud amet sint ad Lorem Lorem cupidatat cillum. Ullamco enim minim et eu non Lorem eu laborum magna duis velit esse reprehenderit laboris. Ad enim irure dolor laboris excepteur fugiat exercitation occaecat commodo aliqua ex.\r\nMinim ex est culpa ipsum cupidatat ullamco exercitation cupidatat exercitation veniam cillum. Proident enim elit cupidatat sunt aliqua non minim officia. Laboris veniam laboris id cillum labore occaecat quis cupidatat velit excepteur aute nostrud est anim. Non do ut dolore veniam dolor labore reprehenderit sunt velit officia.\r\n", + "address": "4 Remsen Avenue", + "city": "Northridge", + "state": "Palau", + "zip": 32997, + "country": "Montserrat", + "email": "loramccarthy@scentric.com", + "phone": "(878) 505-2614", + "color": "rgb(124,101,157)" + }, + { + "index": 442, + "name": "Tammie Juarez", + "first": "Liza", + "last": "Daniel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "boolean": false, + "guid": "0ed69dca-4d57-43c4-835b-b4f0d9654df4", + "integer": 11, + "date": "Sun Jul 08 2012 11:35:08 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Culpa nulla aliqua nulla adipisicing reprehenderit. Labore nisi non dolore deserunt ut elit anim ullamco ullamco eiusmod cupidatat. Nisi proident qui culpa deserunt velit aliquip cillum deserunt tempor exercitation dolore eu. Do non anim aliquip id dolore anim velit qui ut sunt consequat deserunt. Eiusmod ea proident culpa exercitation enim occaecat.", + "longText": "Minim ex labore Lorem eiusmod laboris voluptate irure est. Dolore occaecat excepteur commodo ullamco deserunt irure cillum. Nisi nostrud in sint sunt excepteur culpa sunt do eu aute deserunt. Irure pariatur proident sit proident exercitation ex aute aliquip eiusmod est Lorem adipisicing laborum officia. Aute consectetur dolor occaecat incididunt cillum eiusmod culpa anim cupidatat est exercitation est. Sunt culpa quis cillum et sint dolor pariatur enim non nostrud dolore sunt proident do.\r\nQui enim do qui aliqua velit ullamco irure culpa aliqua adipisicing velit in tempor aute. Amet consectetur officia do elit. Aute laborum esse ullamco dolore id ullamco velit Lorem. Fugiat dolore et velit velit ut.\r\nSunt non anim veniam proident id est magna ullamco exercitation consequat est. Laborum culpa eiusmod non eu ipsum occaecat excepteur minim occaecat velit magna. Voluptate aliquip tempor do excepteur est enim. Do tempor laboris ut laborum in tempor Lorem occaecat dolore. Est id veniam dolore dolor eiusmod enim ea adipisicing fugiat ad nostrud ullamco ex. Occaecat nisi et ea eiusmod duis Lorem labore enim non veniam labore.\r\nMagna occaecat dolor nisi sint est magna magna tempor sunt. Minim amet sunt exercitation incididunt ea dolore tempor tempor magna pariatur aliqua. Mollit amet et in veniam. Reprehenderit do ut cupidatat incididunt. Eu anim Lorem laboris qui cillum officia amet aute minim magna proident officia.\r\n", + "address": "2 Friel Place", + "city": "Waverly", + "state": "Virginia", + "zip": 15976, + "country": "Norway", + "email": "lizadaniel@scentric.com", + "phone": "(837) 444-2117", + "color": "rgb(169,145,105)" + }, + { + "index": 443, + "name": "Bettie Osborne", + "first": "Daugherty", + "last": "Randolph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "boolean": true, + "guid": "3d66fd94-2bfe-43f5-9b83-14c609449f27", + "integer": 7, + "date": "Sat Jan 20 2007 20:48:29 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Veniam quis ea ipsum adipisicing quis excepteur proident laboris fugiat id reprehenderit aute occaecat.", + "longText": "Sunt anim reprehenderit eu in sit culpa enim. Magna voluptate pariatur fugiat commodo fugiat ad voluptate ipsum ut elit ullamco dolor amet. Ut cupidatat consectetur velit velit est labore. Ex cillum ad duis excepteur irure officia eiusmod labore in culpa exercitation duis anim non. Deserunt ullamco consequat tempor tempor incididunt esse laboris.\r\nProident ex dolor anim laboris aliqua velit sit est. Aute aute velit eiusmod non irure nostrud pariatur anim tempor pariatur ipsum labore do. Lorem laborum ipsum minim eu nulla minim ullamco culpa in ex velit veniam aliqua cillum. Exercitation aliquip sit proident nostrud. Dolor ipsum aute nulla Lorem dolore amet dolor nisi enim irure.\r\nIpsum deserunt cupidatat ea nisi anim aliquip et excepteur pariatur nisi dolor. Quis exercitation ea pariatur eiusmod. Sint qui Lorem eu velit aute.\r\n", + "address": "3 Utica Avenue", + "city": "Glenbrook", + "state": "Wyoming", + "zip": 52525, + "country": "Guam", + "email": "daughertyrandolph@scentric.com", + "phone": "(978) 484-3479", + "color": "rgb(158,76,101)" + }, + { + "index": 444, + "name": "Valenzuela Swanson", + "first": "Buckner", + "last": "Dawson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "boolean": true, + "guid": "4fe81672-768e-44ba-b3d5-c57fbb9c3507", + "integer": 27, + "date": "Mon Feb 03 1975 20:36:41 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Eiusmod eu elit do in occaecat dolor consectetur non mollit. Officia eiusmod consectetur veniam laboris consequat velit commodo exercitation tempor officia commodo. Voluptate elit Lorem elit non elit. Dolor consequat exercitation cillum labore do cillum irure exercitation. Lorem et irure velit eiusmod sit ut.", + "longText": "Amet enim eiusmod anim culpa non ipsum dolor deserunt adipisicing fugiat. Ut irure ipsum et incididunt veniam proident ex veniam. Magna eu dolor do minim elit culpa labore. Commodo non amet qui nisi nisi anim ex. Sit ipsum nulla fugiat ea exercitation duis in sint ex ea. Minim est ut minim in laboris est esse culpa minim pariatur exercitation ex. Ex voluptate sint sunt velit in adipisicing.\r\n", + "address": "4 Bridge Street", + "city": "Byrnedale", + "state": "Colorado", + "zip": 22776, + "country": "Gibraltar", + "email": "bucknerdawson@scentric.com", + "phone": "(822) 533-3432", + "color": "rgb(72,149,99)" + }, + { + "index": 445, + "name": "Bernice Hood", + "first": "Dionne", + "last": "Russo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "boolean": true, + "guid": "604ff26f-12a6-4e76-bbcc-b8004c60fc12", + "integer": 25, + "date": "Sat Sep 15 2001 19:47:51 GMT-0700 (PDT)", + "shortText": "id commodo aute eu", + "mediumText": "Aliquip ut proident ad consequat proident velit magna. Non excepteur Lorem labore et fugiat quis laboris anim ut fugiat tempor consectetur laborum aute. Ullamco dolor nulla esse nisi aliquip fugiat fugiat dolor.", + "longText": "Elit ipsum voluptate laborum veniam cillum reprehenderit aliqua quis incididunt id excepteur. Reprehenderit qui fugiat nostrud quis. Ad nostrud amet do quis pariatur laborum in reprehenderit. Irure ipsum qui aute deserunt deserunt amet adipisicing eu dolor minim. Ad dolor aliquip quis sit nulla culpa nulla commodo aliqua non. Proident enim consequat elit tempor ut non est. Qui aliquip dolor ut consequat officia reprehenderit ea minim nisi cillum irure.\r\nCillum eu nisi consequat ipsum est aliqua cillum ad et laborum. Lorem incididunt occaecat ex ullamco et nostrud sint elit proident sunt adipisicing eu quis. Voluptate mollit sit sunt ad velit nisi commodo cupidatat. Nisi tempor nostrud minim magna id occaecat aliquip aute.\r\nEiusmod elit sit adipisicing reprehenderit nisi eiusmod incididunt eiusmod laboris mollit mollit do. Do aliqua adipisicing nostrud eu voluptate. Officia ut aliquip excepteur aute consequat sit pariatur amet id dolor.\r\nMagna cillum aliquip laborum anim aliquip in officia excepteur id dolore excepteur nostrud ullamco commodo. Excepteur enim anim esse occaecat quis cupidatat consectetur. Reprehenderit tempor fugiat laborum labore fugiat eiusmod quis.\r\n", + "address": "2 Verona Place", + "city": "Connerton", + "state": "Utah", + "zip": 18395, + "country": "Hungary", + "email": "dionnerusso@scentric.com", + "phone": "(890) 461-3250", + "color": "rgb(229,252,247)" + }, + { + "index": 446, + "name": "Schneider Small", + "first": "West", + "last": "Buckner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "boolean": true, + "guid": "4fdfdfc4-3a77-47b8-acab-91a565572331", + "integer": 44, + "date": "Fri Jul 16 2004 09:13:39 GMT-0700 (PDT)", + "shortText": "sunt esse Lorem", + "mediumText": "Irure dolor minim dolore voluptate ut laborum Lorem nostrud nostrud voluptate nisi sunt culpa. Proident pariatur sit id occaecat do qui reprehenderit laboris exercitation qui ad.", + "longText": "Labore nostrud consequat laboris amet do sint pariatur. Commodo incididunt amet reprehenderit laboris enim eu nostrud ea velit. In nisi proident ullamco in deserunt elit labore. Irure exercitation ipsum officia sint magna tempor do et sit.\r\nMollit nulla aliquip pariatur excepteur dolore sint ipsum mollit qui consectetur id. In amet laborum ea deserunt duis ipsum dolor magna aliquip non ea reprehenderit proident. Excepteur labore dolore reprehenderit elit. Est commodo esse est ea. Amet cupidatat exercitation eiusmod id sit.\r\nAliqua dolor anim est in esse ex id ad incididunt mollit occaecat ad sint. Lorem dolore ipsum ad amet cillum excepteur sint anim pariatur. Ipsum consectetur irure dolore fugiat duis anim id. Esse non est id mollit quis proident qui ex labore sit. Consequat mollit veniam nisi irure cupidatat nostrud.\r\n", + "address": "2 Fuller Place", + "city": "Felt", + "state": "Idaho", + "zip": 83579, + "country": "Kenya", + "email": "westbuckner@scentric.com", + "phone": "(972) 592-3400", + "color": "rgb(90,160,183)" + }, + { + "index": 447, + "name": "Jones Fields", + "first": "Trujillo", + "last": "Morales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "boolean": true, + "guid": "c09e1f92-8061-47f3-a5ae-13fe4589613e", + "integer": 97, + "date": "Wed Feb 14 2007 05:02:54 GMT-0800 (PST)", + "shortText": "tempor laborum commodo nostrud", + "mediumText": "Cillum nulla veniam ipsum exercitation nulla dolor anim in amet. Velit proident excepteur nisi et minim anim incididunt sit. Et sit eu eu est anim nulla. Ex consectetur fugiat cupidatat eiusmod in commodo cupidatat irure.", + "longText": "Aute ex exercitation nulla pariatur eu. Labore veniam amet voluptate occaecat consectetur consectetur nostrud laborum. Sit consequat nulla tempor culpa minim labore exercitation laboris incididunt sint. Dolor nisi quis id ullamco eu qui non ullamco esse amet irure dolor aute non. Ex exercitation irure ad laboris eiusmod non minim non anim ex in magna.\r\nCommodo ullamco excepteur culpa cillum incididunt. Ad nostrud est aliqua officia. Aliqua et laboris incididunt est. Irure reprehenderit ea ut minim culpa.\r\n", + "address": "3 Goodwin Place", + "city": "Lacomb", + "state": "Arkansas", + "zip": 64762, + "country": "Honduras", + "email": "trujillomorales@scentric.com", + "phone": "(908) 595-3540", + "color": "rgb(252,248,234)" + }, + { + "index": 448, + "name": "Ester Weber", + "first": "Eve", + "last": "Bonner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "boolean": true, + "guid": "daccfe7a-2e90-4485-b570-2ea85b7b196f", + "integer": 29, + "date": "Wed Aug 08 1979 00:51:20 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Magna dolore commodo aute ad excepteur ex proident non veniam proident irure dolore adipisicing deserunt. Anim mollit velit laboris velit labore pariatur. Non amet qui ut magna.", + "longText": "Cupidatat ea sit dolor eu sit tempor culpa magna. Ipsum excepteur nulla elit sit laboris dolor commodo. Deserunt aliquip officia minim sunt non sunt. Elit tempor consequat ullamco irure in ullamco. Ad do adipisicing sunt nisi eu veniam aliquip anim.\r\nAute ullamco incididunt dolore mollit fugiat deserunt adipisicing occaecat cupidatat sunt aute. Velit excepteur ullamco excepteur incididunt velit. Do adipisicing aute sint commodo qui adipisicing aliqua incididunt mollit. Adipisicing consectetur nulla consequat sunt nulla est sunt anim consequat ipsum ad dolor.\r\n", + "address": "4 Furman Avenue", + "city": "Devon", + "state": "Delaware", + "zip": 13560, + "country": "Eritrea", + "email": "evebonner@scentric.com", + "phone": "(993) 461-3721", + "color": "rgb(220,194,238)" + }, + { + "index": 449, + "name": "Jaclyn Bright", + "first": "Christy", + "last": "Graham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "boolean": true, + "guid": "3d5752b1-b775-4866-9151-376be7d53cdd", + "integer": 47, + "date": "Fri Oct 07 1994 14:59:41 GMT-0700 (PDT)", + "shortText": "ut minim in laboris officia", + "mediumText": "Esse mollit ad sunt incididunt labore dolore exercitation nostrud commodo minim nisi sit. Enim tempor tempor veniam culpa laboris incididunt sunt ex magna fugiat. Quis veniam adipisicing est sunt proident aliquip enim commodo sunt duis sint est nulla Lorem.", + "longText": "Sint aliquip qui aliqua ipsum magna eiusmod non ea exercitation non duis cupidatat officia. Proident esse mollit culpa excepteur irure consectetur consequat amet ipsum sit ut officia amet. Deserunt non in qui sit aliquip et irure et commodo mollit esse ullamco consequat. Commodo ea mollit incididunt ex anim labore sint eu sint sunt deserunt commodo irure ex. Magna reprehenderit voluptate anim commodo et excepteur amet nulla sint. Qui laboris qui et veniam eiusmod pariatur voluptate eiusmod ea occaecat cillum dolore velit magna.\r\nNostrud in esse est tempor minim ex fugiat qui Lorem. Non enim tempor amet consequat pariatur irure voluptate enim aliqua tempor exercitation. Lorem reprehenderit et deserunt velit deserunt pariatur elit et consectetur irure. Culpa velit aliquip sit sunt adipisicing exercitation. Eiusmod mollit consequat laboris non nostrud pariatur laborum quis anim consectetur veniam amet culpa esse. Consequat irure aute commodo incididunt tempor elit aliqua est reprehenderit sunt ex veniam id.\r\nProident eu cillum est eiusmod sint quis in eiusmod occaecat adipisicing quis tempor adipisicing ea. Adipisicing reprehenderit exercitation eu reprehenderit elit cupidatat nostrud pariatur. Veniam officia quis Lorem magna reprehenderit esse ipsum minim quis laborum reprehenderit.\r\n", + "address": "3 Kathleen Court", + "city": "Groveville", + "state": "Federated States Of Micronesia", + "zip": 97417, + "country": "Tajikistan", + "email": "christygraham@scentric.com", + "phone": "(943) 493-3287", + "color": "rgb(201,124,187)" + }, + { + "index": 450, + "name": "Burton Valdez", + "first": "Aurora", + "last": "Morse", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "boolean": true, + "guid": "7ea797c6-ef0a-49c2-b043-2ca76a30e148", + "integer": 66, + "date": "Mon Jul 09 1984 05:20:31 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Nulla ut eiusmod consequat sunt est proident mollit elit laboris nulla ex Lorem tempor culpa.", + "longText": "Laborum labore ad cupidatat fugiat laborum proident mollit elit Lorem elit. Voluptate ex magna voluptate ex incididunt eiusmod dolor anim sit. Aliquip sint reprehenderit officia ex irure veniam aliquip laborum eu exercitation magna veniam enim. Minim culpa Lorem et sit. Velit aute elit et incididunt do velit mollit qui.\r\n", + "address": "2 Sheffield Avenue", + "city": "Sheatown", + "state": "Guam", + "zip": 73715, + "country": "Brunei Darussalam", + "email": "auroramorse@scentric.com", + "phone": "(866) 493-3254", + "color": "rgb(60,132,78)" + }, + { + "index": 451, + "name": "Sharpe Mccall", + "first": "Leanna", + "last": "Day", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "boolean": false, + "guid": "241e6ae2-b23e-44bc-b8ed-aeb9d50f0395", + "integer": 7, + "date": "Sun Oct 27 2002 01:07:01 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Commodo commodo nostrud deserunt nostrud velit tempor culpa exercitation occaecat. Officia officia fugiat consectetur deserunt eu sunt ullamco commodo elit veniam nostrud dolore. Aute duis occaecat nisi culpa nulla laborum deserunt aliquip irure.", + "longText": "Qui do ex nostrud qui officia velit. Quis laborum aute nulla sint excepteur magna nisi est eu. Commodo qui id ex pariatur est sit. Do quis mollit minim consectetur exercitation. Elit reprehenderit labore minim laboris laborum adipisicing incididunt adipisicing. Ad reprehenderit enim reprehenderit sit.\r\nIpsum veniam nulla et enim. Consectetur sint laborum voluptate nulla non non eiusmod. Incididunt laborum voluptate voluptate cupidatat amet minim culpa sint laborum commodo. Ad mollit ea culpa sit fugiat.\r\nEx ex incididunt eu dolore laboris duis culpa duis magna eu minim sint. Ea sunt sunt mollit ut voluptate duis. Magna sit irure voluptate Lorem tempor consectetur eu aute sunt eiusmod deserunt laboris anim. Ut aliqua irure pariatur cillum eiusmod Lorem cupidatat qui mollit laborum excepteur irure. Officia voluptate aute officia incididunt deserunt velit enim sint anim mollit aliqua deserunt. Excepteur dolor irure sint quis nulla ipsum sint duis consectetur. Eiusmod id cillum exercitation veniam in anim tempor velit id culpa in.\r\nLabore amet non culpa ea in ullamco duis dolore cillum commodo laborum. In et elit ex aliqua commodo labore dolor proident et mollit. Dolor Lorem deserunt ipsum adipisicing sunt enim nulla ullamco. Enim ullamco ea irure sit elit cillum reprehenderit mollit voluptate enim aliquip ad officia.\r\nLaborum eiusmod esse sit excepteur duis. Quis magna cillum proident tempor qui ex sunt amet ex cillum id elit. Lorem sit cillum exercitation eu reprehenderit ea ex. Fugiat commodo irure elit est esse labore laboris do ullamco dolor. Adipisicing excepteur et culpa occaecat. Ea aute et deserunt quis laborum eiusmod et exercitation mollit excepteur duis nulla.\r\n", + "address": "2 Sapphire Street", + "city": "Delco", + "state": "Pennsylvania", + "zip": 99885, + "country": "Macedonia", + "email": "leannaday@scentric.com", + "phone": "(926) 463-2373", + "color": "rgb(219,81,203)" + }, + { + "index": 452, + "name": "Richmond Clayton", + "first": "Sherrie", + "last": "Robertson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "boolean": true, + "guid": "dd129f81-2042-434a-9563-8047b70bad0a", + "integer": 45, + "date": "Sat Apr 07 2001 06:49:07 GMT-0700 (PDT)", + "shortText": "in", + "mediumText": "Adipisicing excepteur ad proident id veniam consectetur sit.", + "longText": "Amet commodo do aliquip ipsum sunt dolor id magna officia officia commodo minim. Qui duis occaecat in cillum ipsum pariatur excepteur officia velit incididunt exercitation irure mollit quis. Et cillum id velit elit et fugiat qui nisi officia incididunt voluptate cupidatat duis. Ut fugiat dolore eiusmod non ad aliquip labore sit proident. Duis amet aliqua deserunt commodo do anim quis elit excepteur. Sunt dolore magna dolore enim labore minim do enim anim officia cupidatat cupidatat. Aliqua anim veniam tempor sit incididunt quis ex ex laboris reprehenderit Lorem.\r\nExercitation irure tempor proident culpa. Ut enim culpa nulla ipsum consectetur enim eu dolor fugiat occaecat pariatur ex. Fugiat aliqua anim veniam aliquip irure nostrud adipisicing id. Tempor laborum enim excepteur ipsum dolore pariatur anim sit id qui duis duis sit duis. Dolore deserunt do est irure consectetur consequat ea aliqua veniam enim qui Lorem. Ipsum et nulla eiusmod Lorem et id anim aliquip. Velit mollit dolor non ullamco do aliqua qui mollit excepteur qui amet.\r\n", + "address": "4 Opal Court", + "city": "Dawn", + "state": "New Hampshire", + "zip": 25154, + "country": "French Polynesia", + "email": "sherrierobertson@scentric.com", + "phone": "(950) 518-2372", + "color": "rgb(116,89,161)" + }, + { + "index": 453, + "name": "Small Church", + "first": "Sylvia", + "last": "Terrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "boolean": true, + "guid": "5653dcb2-2ec5-4de9-93a5-534b963da42d", + "integer": 32, + "date": "Sat Mar 10 2001 07:02:05 GMT-0800 (PST)", + "shortText": "velit et non in sint", + "mediumText": "Commodo aute irure cillum laboris aliquip aute aliqua consequat qui esse do Lorem deserunt adipisicing. Velit esse nulla in do ut aliquip proident ut qui occaecat reprehenderit nisi. Velit tempor eu non in officia cupidatat fugiat culpa. Proident nostrud irure cupidatat quis enim nisi reprehenderit qui deserunt tempor eiusmod cupidatat nulla. Proident exercitation esse sint esse sunt qui ad magna eu do magna esse sunt nulla.", + "longText": "Consequat proident id laboris id labore ipsum officia officia non consectetur dolore esse cupidatat. In commodo et amet qui in et exercitation non eiusmod dolore sunt nostrud. Non quis fugiat Lorem amet voluptate excepteur. Proident officia labore aliquip sunt Lorem ex nulla fugiat incididunt. In dolore aute enim esse cupidatat commodo cupidatat commodo ipsum nulla. Officia dolore dolore eu reprehenderit.\r\nAd occaecat consequat adipisicing do eiusmod voluptate proident. Eu dolore aute aliqua cillum enim incididunt non adipisicing ipsum laborum sunt Lorem Lorem. Ex ad excepteur occaecat quis aliqua do nostrud irure in sunt aliqua amet. Commodo ea voluptate sit mollit nisi excepteur reprehenderit incididunt. Do cillum aliquip in eu.\r\n", + "address": "2 Wolcott Street", + "city": "Salix", + "state": "North Dakota", + "zip": 11231, + "country": "Bahamas", + "email": "sylviaterrell@scentric.com", + "phone": "(823) 424-2163", + "color": "rgb(216,232,199)" + }, + { + "index": 454, + "name": "Alyson Dudley", + "first": "Mckay", + "last": "Holmes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "boolean": false, + "guid": "c1a70e93-2f1c-402a-aafb-f66c1441b471", + "integer": 36, + "date": "Fri May 18 2001 01:24:33 GMT-0700 (PDT)", + "shortText": "veniam ipsum ullamco", + "mediumText": "Sunt culpa in consectetur tempor consectetur non eu ex elit aliquip incididunt eu cillum quis. Dolor laborum pariatur nulla nostrud culpa quis dolor ipsum deserunt fugiat non amet non. Magna sint sint ea voluptate nostrud consequat labore elit.", + "longText": "Enim ex consequat quis proident ipsum commodo labore dolore esse fugiat. Commodo sit eu ullamco incididunt ipsum. Qui officia eiusmod adipisicing dolor exercitation. Laborum occaecat proident deserunt dolore labore est in. Exercitation enim sunt reprehenderit est est. Ullamco dolor laborum ea quis aute aliqua.\r\nNulla sint in aliqua do minim aliqua voluptate enim deserunt occaecat esse excepteur. Qui est veniam proident anim fugiat velit qui aliqua eiusmod proident mollit. Qui velit est in consectetur ad esse consequat aute laborum. Amet cupidatat cupidatat et amet.\r\nDeserunt qui labore veniam irure eiusmod ad nisi anim non aliqua culpa ea consequat ea. Id sunt mollit minim qui sunt consequat in aliquip eu consectetur. Et nostrud velit excepteur in magna dolor elit. Reprehenderit nisi enim dolor amet ipsum in voluptate veniam voluptate consectetur aliquip. Quis sint duis ut dolor ea. Magna deserunt sunt aute quis veniam laboris aute ea ex velit irure cupidatat.\r\nQui qui labore voluptate velit ad eu mollit sit cillum non exercitation cillum aliqua. Quis tempor consectetur eiusmod aliqua id. Qui duis elit ut do nisi nostrud et ullamco mollit. Labore officia fugiat nisi dolore. Adipisicing in voluptate aliquip occaecat mollit anim pariatur occaecat sint aliqua. Anim esse adipisicing aliqua tempor sit elit deserunt sunt. Eiusmod consectetur anim ipsum est elit laborum magna consectetur id aliquip Lorem.\r\n", + "address": "3 Walker Court", + "city": "Wattsville", + "state": "Northern Mariana Islands", + "zip": 63152, + "country": "Palau", + "email": "mckayholmes@scentric.com", + "phone": "(951) 589-2723", + "color": "rgb(163,183,107)" + }, + { + "index": 455, + "name": "Curry Webb", + "first": "Sheena", + "last": "Wilkerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "boolean": true, + "guid": "5fdb3b33-e4f6-42fd-9ef8-f5187a85f89a", + "integer": 86, + "date": "Sat Jun 12 1976 02:00:05 GMT-0700 (PDT)", + "shortText": "labore laborum", + "mediumText": "Nostrud nisi incididunt quis enim esse proident aliquip laboris. Velit officia quis amet cillum sint pariatur aliqua velit eiusmod. Adipisicing in nisi qui duis anim dolor laborum esse aute est ex amet sit.", + "longText": "Pariatur magna sit reprehenderit sint est non velit sint veniam. Laboris qui labore esse consequat tempor ut elit elit aliquip dolor duis tempor velit cupidatat. Consequat duis fugiat id excepteur. Duis veniam laboris est ut pariatur ullamco reprehenderit elit irure. Aute elit excepteur officia pariatur labore. Commodo sit officia ullamco reprehenderit sit exercitation ad consequat.\r\nEsse nostrud voluptate anim Lorem aute do tempor cupidatat do adipisicing magna commodo et dolore. Quis eiusmod velit est in laborum sit. Elit veniam ipsum id dolor. Labore eiusmod ex anim amet. Do velit cillum velit voluptate nostrud sint consequat ipsum ullamco do eiusmod sint. Reprehenderit minim reprehenderit et sunt aliqua nisi sint magna mollit aliquip. Esse esse labore minim cillum ut cupidatat dolor incididunt proident dolor.\r\nVoluptate aute anim commodo occaecat non voluptate magna. Laboris do quis laborum qui cillum qui commodo amet minim consectetur voluptate. Labore anim tempor sint ut. Tempor nisi sit officia Lorem.\r\nMinim consectetur ex velit nulla occaecat id sunt. Veniam laboris cupidatat reprehenderit ullamco eiusmod. Cupidatat velit non nulla amet aliqua fugiat aute ullamco nisi aliqua adipisicing exercitation quis proident. Ut ullamco dolor pariatur nisi excepteur occaecat commodo proident nisi minim est consequat.\r\nOccaecat aliquip duis duis deserunt cupidatat sint. Anim id et dolore labore nostrud ad Lorem sunt pariatur ad adipisicing. Qui enim nostrud officia adipisicing voluptate ea in nisi duis velit consectetur. Ut nisi voluptate dolor quis est anim in fugiat. Eu tempor dolore reprehenderit ut est aliqua elit in non velit velit. In adipisicing ullamco minim laboris incididunt enim voluptate ea minim sint dolor ut laborum amet. Aliquip est ut ipsum veniam.\r\n", + "address": "4 Lee Avenue", + "city": "Chamberino", + "state": "South Dakota", + "zip": 13592, + "country": "Tuvalu", + "email": "sheenawilkerson@scentric.com", + "phone": "(879) 403-2513", + "color": "rgb(118,194,142)" + }, + { + "index": 456, + "name": "Christian Snyder", + "first": "Lawanda", + "last": "Bradford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "boolean": true, + "guid": "bfb51aa2-d989-470d-97e5-64f04272b0ec", + "integer": 77, + "date": "Sat Jul 05 2014 23:12:53 GMT-0700 (PDT)", + "shortText": "quis ex et", + "mediumText": "Consectetur sit veniam excepteur Lorem commodo.", + "longText": "Qui dolor ut ipsum ex fugiat deserunt irure fugiat. Nisi anim culpa est non adipisicing ullamco dolore aute ex occaecat minim. Occaecat reprehenderit aliqua aute fugiat veniam officia cillum quis nostrud minim ullamco velit officia. Lorem ex labore magna qui velit commodo anim dolore veniam dolor et reprehenderit.\r\nDolor ad irure esse tempor commodo ullamco adipisicing dolore amet magna aliqua enim adipisicing. Laboris irure culpa est excepteur mollit magna consectetur id aliquip magna. Occaecat commodo elit pariatur reprehenderit eiusmod labore. Nisi aliquip minim est labore quis fugiat. Minim nulla Lorem dolore nostrud reprehenderit nulla mollit incididunt anim adipisicing.\r\n", + "address": "4 Newport Street", + "city": "Indio", + "state": "Alaska", + "zip": 48616, + "country": "Liechtenstein", + "email": "lawandabradford@scentric.com", + "phone": "(888) 481-3858", + "color": "rgb(247,122,60)" + }, + { + "index": 457, + "name": "Contreras Jenkins", + "first": "Lester", + "last": "Garrett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "boolean": true, + "guid": "0618babd-91c3-4050-8bf8-5d1f94383568", + "integer": 14, + "date": "Fri Mar 31 1972 00:34:05 GMT-0800 (PST)", + "shortText": "commodo aliqua", + "mediumText": "Ullamco commodo consequat id officia duis duis amet quis incididunt consectetur consequat laboris ex dolore. Aliquip dolore cupidatat sit aliqua dolore sit irure reprehenderit anim nulla adipisicing est. Cupidatat et fugiat minim exercitation eiusmod est esse eiusmod proident.", + "longText": "Qui cillum ipsum amet adipisicing veniam Lorem ullamco. Aute ea sunt veniam nisi laboris cupidatat officia minim. Consectetur deserunt cupidatat fugiat deserunt mollit mollit. Elit magna consequat qui tempor in non velit ea cillum tempor non. Consectetur est mollit aliqua adipisicing elit cillum consequat duis enim. Reprehenderit in et dolor nulla duis.\r\nEsse cillum Lorem veniam officia voluptate eu tempor. Consectetur dolore fugiat proident duis ullamco dolore occaecat dolore sit. Consequat commodo fugiat dolor minim elit elit laborum elit do. Exercitation occaecat exercitation cillum eu occaecat sit sit magna voluptate dolor aliqua ad commodo esse. Cillum fugiat excepteur sunt incididunt nisi.\r\nLabore aute eiusmod aute ullamco sunt sint nisi aute laboris reprehenderit duis qui incididunt labore. Sint occaecat sint id esse. Consectetur pariatur minim proident do magna mollit veniam dolore commodo et officia adipisicing commodo pariatur. Consequat eu id pariatur occaecat eu nostrud proident enim eu. Id cillum consequat aliquip reprehenderit. Adipisicing Lorem eu et veniam aliquip pariatur commodo culpa anim adipisicing commodo labore. Qui adipisicing incididunt in eiusmod.\r\n", + "address": "4 Morton Street", + "city": "Yonah", + "state": "Louisiana", + "zip": 53661, + "country": "Virgin Islands (US)", + "email": "lestergarrett@scentric.com", + "phone": "(972) 517-3113", + "color": "rgb(239,120,56)" + }, + { + "index": 458, + "name": "Holly Jackson", + "first": "Susie", + "last": "Watkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "boolean": true, + "guid": "2a001ee1-bb06-41ce-ba9b-334ce428a78e", + "integer": 45, + "date": "Tue Aug 24 1993 08:13:13 GMT-0700 (PDT)", + "shortText": "qui ex deserunt veniam enim", + "mediumText": "Dolore deserunt proident ex non ullamco amet esse cillum adipisicing adipisicing tempor sunt dolore. Amet mollit velit enim qui elit nostrud duis quis duis deserunt ut quis minim incididunt. Proident duis laboris sunt esse laborum duis officia esse irure esse. Cupidatat incididunt labore pariatur mollit. Sint officia aliquip adipisicing sint id et officia nulla.", + "longText": "Officia labore fugiat tempor sint est labore aliqua quis nisi labore adipisicing. Deserunt occaecat occaecat cupidatat occaecat. Minim consequat nisi non reprehenderit tempor. Irure nulla minim veniam laboris ut duis adipisicing. Occaecat culpa cillum magna sint nisi sit ex. Reprehenderit quis aliqua officia ipsum dolor irure nulla ipsum ex.\r\nIpsum proident esse tempor in ut proident reprehenderit reprehenderit fugiat pariatur reprehenderit cillum. Ipsum ipsum velit labore id do sint. Ea velit tempor cillum officia qui elit id excepteur. Fugiat laboris amet ullamco et dolor. Enim ut id fugiat qui. Sunt anim pariatur nisi fugiat ex. In ipsum nulla officia ipsum ex aliquip ad cupidatat aliqua amet adipisicing anim in amet.\r\nMagna pariatur nisi occaecat veniam reprehenderit esse dolor aliqua culpa labore. Elit do aliquip est magna culpa officia id pariatur id commodo non officia incididunt proident. Quis consequat laborum consectetur nostrud magna amet irure do irure ipsum culpa reprehenderit. Exercitation elit magna irure mollit cillum velit ullamco tempor ex.\r\nIpsum mollit reprehenderit elit aliqua nulla laborum dolor voluptate commodo ipsum laboris. Elit ut enim tempor elit nisi tempor ipsum. Ullamco velit incididunt elit aliqua amet commodo amet dolore dolore fugiat id.\r\n", + "address": "3 Beard Street", + "city": "Sterling", + "state": "Missouri", + "zip": 70724, + "country": "Svalbard and Jan Mayen Islands", + "email": "susiewatkins@scentric.com", + "phone": "(837) 537-2963", + "color": "rgb(172,67,201)" + }, + { + "index": 459, + "name": "Josefina Gonzales", + "first": "Erickson", + "last": "Bennett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "boolean": true, + "guid": "88320e02-8633-4df8-a096-8b6cd39d0786", + "integer": 31, + "date": "Tue Jul 27 2010 06:12:05 GMT-0700 (PDT)", + "shortText": "proident nostrud", + "mediumText": "Cupidatat officia duis do sunt veniam voluptate exercitation. Ea excepteur tempor magna fugiat Lorem adipisicing dolor sit amet sunt aute laboris. Ea sunt fugiat ad commodo amet elit elit minim nostrud occaecat magna. Incididunt ea do id id laboris magna do ea. Eu duis amet cupidatat proident culpa deserunt.", + "longText": "Lorem ipsum culpa voluptate labore consectetur reprehenderit anim duis fugiat anim consequat tempor officia. Occaecat culpa tempor ad ea excepteur ad enim incididunt. Adipisicing commodo elit nisi magna incididunt. Ea est occaecat et dolor reprehenderit fugiat est id dolore. Culpa commodo ullamco est voluptate ad mollit sunt deserunt. Pariatur tempor excepteur laborum ex ea ea consectetur enim ut ad sunt nulla.\r\n", + "address": "4 Malbone Street", + "city": "Eagletown", + "state": "Kentucky", + "zip": 72696, + "country": "Ethiopia", + "email": "ericksonbennett@scentric.com", + "phone": "(937) 528-2434", + "color": "rgb(132,110,89)" + }, + { + "index": 460, + "name": "Sybil Boyle", + "first": "Rosetta", + "last": "Joseph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "boolean": true, + "guid": "3cf8b3eb-9567-4dbe-ad09-b792ef4b7f81", + "integer": 86, + "date": "Thu Aug 06 1992 04:15:43 GMT-0700 (PDT)", + "shortText": "reprehenderit", + "mediumText": "Consectetur irure ut minim proident laboris. Ea est et mollit voluptate aliquip qui enim incididunt nisi magna sunt tempor nulla. Pariatur officia id velit laborum quis id tempor cillum aliquip dolore sunt eiusmod enim. Elit id cillum occaecat sit exercitation fugiat eiusmod fugiat sunt cillum. Incididunt magna aliqua cupidatat fugiat voluptate nostrud voluptate.", + "longText": "Qui sunt irure veniam occaecat commodo sint labore nostrud qui do mollit. Non enim anim elit aute incididunt. Voluptate qui ullamco in sit cillum consectetur voluptate commodo. Non laboris anim minim anim nisi duis consectetur ad aute nisi nostrud. Id quis dolor consequat consequat nostrud ullamco dolore enim labore ipsum ipsum do voluptate aute.\r\nNisi dolor dolor elit veniam sint nisi eu officia incididunt ut labore elit id eu. Fugiat magna ex esse consectetur excepteur occaecat deserunt eiusmod ullamco ullamco do incididunt. Labore ad anim occaecat ullamco pariatur proident duis commodo. Quis reprehenderit consectetur exercitation fugiat dolor anim laboris dolor eu cupidatat adipisicing adipisicing Lorem. Ad voluptate officia pariatur ipsum Lorem ex aute sit non officia officia sint. Veniam aliqua labore ut enim in incididunt sit aute culpa magna officia ex officia nisi.\r\nNostrud incididunt consectetur nulla voluptate pariatur qui excepteur amet incididunt cupidatat culpa laboris sint. Sunt Lorem aute proident in velit ipsum. Magna fugiat veniam excepteur esse eiusmod sint cillum aute deserunt. Mollit magna quis excepteur in ex irure sit ea proident magna enim.\r\nConsectetur nisi culpa mollit eu in do consectetur sunt ad aliqua. Esse laboris adipisicing Lorem aute reprehenderit Lorem excepteur nisi id cupidatat aliqua cupidatat occaecat sit. Lorem Lorem ad ullamco quis reprehenderit nostrud elit enim ullamco incididunt. Culpa tempor consectetur exercitation velit consequat consequat dolore excepteur elit qui tempor est excepteur.\r\n", + "address": "4 Harman Street", + "city": "Sylvanite", + "state": "American Samoa", + "zip": 13569, + "country": "Togo", + "email": "rosettajoseph@scentric.com", + "phone": "(981) 470-3813", + "color": "rgb(209,237,158)" + }, + { + "index": 461, + "name": "Case Decker", + "first": "Santos", + "last": "Rice", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "boolean": false, + "guid": "bf49a638-bbff-435c-9756-52b76f67815d", + "integer": 66, + "date": "Tue Apr 29 2003 07:40:21 GMT-0700 (PDT)", + "shortText": "ullamco aliqua sunt fugiat", + "mediumText": "Mollit Lorem exercitation cupidatat occaecat eiusmod qui. Magna et reprehenderit labore in. Excepteur ad enim aliqua aute ullamco cupidatat esse. Officia quis qui sunt nisi ipsum eu deserunt nulla fugiat magna sunt et quis pariatur. Voluptate cillum nostrud aliqua minim nulla minim dolore labore magna.", + "longText": "Laboris amet irure aute ipsum anim irure quis elit Lorem enim non id officia. Qui quis fugiat do esse. Eiusmod anim quis magna deserunt labore proident ullamco consequat cupidatat velit laboris ut aute. Quis excepteur ullamco officia ad reprehenderit. Irure occaecat reprehenderit ad consequat id laborum amet nisi tempor eu laboris. Irure sit cillum proident occaecat in ipsum. Quis esse officia sunt sunt anim ullamco ad amet ullamco Lorem.\r\nReprehenderit excepteur est officia consequat ea cupidatat excepteur sunt id ad adipisicing occaecat magna minim. Exercitation quis irure nostrud irure eiusmod laborum pariatur fugiat commodo id velit culpa reprehenderit id. Commodo mollit aute esse laboris fugiat pariatur mollit voluptate nulla. Commodo esse proident anim aliqua et duis exercitation cupidatat incididunt est laborum incididunt laborum. Aliqua est aute qui ullamco sunt ut cillum commodo cupidatat. Est sint est id consectetur ad duis duis culpa fugiat sit sit id aute. Dolor occaecat non cillum amet proident cupidatat laboris.\r\nIn sit non nostrud labore laboris commodo sit ea nisi commodo irure reprehenderit nostrud reprehenderit. Nostrud ad velit enim magna esse adipisicing. Labore occaecat anim irure magna sit duis ullamco exercitation ipsum mollit. Laboris irure ipsum occaecat ea anim id sunt irure deserunt eu et. Incididunt ex fugiat Lorem aliquip. Anim ea duis duis aliquip ex. Qui Lorem officia cillum nisi irure Lorem.\r\n", + "address": "3 Suydam Street", + "city": "Waumandee", + "state": "Minnesota", + "zip": 74848, + "country": "Zimbabwe", + "email": "santosrice@scentric.com", + "phone": "(890) 599-3600", + "color": "rgb(95,54,177)" + }, + { + "index": 462, + "name": "Snider Monroe", + "first": "Jensen", + "last": "Atkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "boolean": true, + "guid": "f24bb864-fe55-4bd6-9144-5bc756f08b1c", + "integer": 74, + "date": "Mon Sep 14 1981 09:51:33 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Laboris proident ullamco ipsum ea ullamco non minim id dolore ad labore. Culpa cillum nostrud deserunt ea in sunt eu ex. Est ullamco sint nulla irure anim velit in. Do sint id exercitation labore do adipisicing.", + "longText": "Non labore culpa laborum fugiat nostrud sunt labore id duis ullamco aliquip exercitation sint. Ex nisi duis nostrud consequat occaecat. Cupidatat dolore occaecat do ea ut ex amet duis mollit magna et commodo aliquip fugiat. Nostrud ut tempor est voluptate sunt enim. Labore commodo consequat ad fugiat.\r\nAute consequat enim ut esse laboris excepteur est nisi laboris veniam esse veniam Lorem Lorem. Aliquip aliquip laboris sit quis. Lorem id ipsum et eiusmod aliqua tempor ipsum cupidatat Lorem anim ipsum aute do consectetur.\r\n", + "address": "3 Boerum Street", + "city": "Crucible", + "state": "Hawaii", + "zip": 89416, + "country": "Azerbaijan", + "email": "jensenatkins@scentric.com", + "phone": "(839) 445-3763", + "color": "rgb(116,98,175)" + }, + { + "index": 463, + "name": "Calderon Pugh", + "first": "Monroe", + "last": "Travis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "boolean": true, + "guid": "c9c9f502-618c-4896-b09e-c4d5fb42384c", + "integer": 81, + "date": "Sat Jan 21 1978 16:37:46 GMT-0800 (PST)", + "shortText": "commodo aliqua ullamco mollit excepteur", + "mediumText": "Consequat et ad nulla id velit officia aliqua nulla eu anim sit magna. Enim in ad Lorem consequat amet nisi magna pariatur in in proident esse mollit sit.", + "longText": "In ut dolore enim ullamco non culpa ea voluptate. Enim Lorem est labore magna reprehenderit laboris amet aliqua sint eiusmod cupidatat amet. Non sit eu quis minim ut. Ex mollit qui aliqua quis adipisicing consectetur esse adipisicing sunt ex tempor. Ad mollit in laboris amet occaecat cupidatat eiusmod id. Aliqua sint pariatur proident ad laboris consequat nostrud quis dolore laborum. Excepteur ipsum ea veniam minim dolore nostrud veniam et voluptate cupidatat elit.\r\nEnim laborum dolore ullamco veniam. Mollit nostrud eu occaecat eu qui laborum sit reprehenderit excepteur amet magna tempor sunt et. Nostrud pariatur qui reprehenderit Lorem amet ullamco sint sint commodo cupidatat est sint officia ea. Ut ut dolore eiusmod magna occaecat incididunt minim consequat quis dolor et duis sunt.\r\n", + "address": "3 Hawthorne Street", + "city": "Coalmont", + "state": "Alabama", + "zip": 60080, + "country": "French Southern Territories", + "email": "monroetravis@scentric.com", + "phone": "(806) 479-3754", + "color": "rgb(93,63,172)" + }, + { + "index": 464, + "name": "Colleen Haley", + "first": "Conley", + "last": "Stanley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "boolean": false, + "guid": "05acd8c3-414b-4b60-ac92-b0b7eba4e0c3", + "integer": 42, + "date": "Mon Mar 02 2009 03:09:26 GMT-0800 (PST)", + "shortText": "enim ad", + "mediumText": "Esse tempor voluptate aliqua culpa laborum pariatur cillum sint reprehenderit adipisicing. Elit esse anim sint duis voluptate nostrud culpa proident esse fugiat Lorem velit ut. Nostrud officia dolore voluptate proident eu ex consequat ipsum ad velit nisi laborum ea. Laboris in consequat elit et in ut. Qui ex ea reprehenderit sit dolor eiusmod minim deserunt.", + "longText": "Est dolor Lorem consequat excepteur excepteur nisi enim velit. Tempor velit veniam tempor cillum ea dolore est deserunt anim ex. Enim non id proident officia fugiat amet laborum veniam ullamco dolor est consequat incididunt occaecat. Enim culpa qui ipsum est. Amet sunt consectetur reprehenderit aute excepteur quis consequat minim tempor ullamco.\r\nEt ad aute non ut magna mollit sunt dolore laborum. Elit voluptate anim mollit est consequat officia laborum ad officia eu. Irure quis qui ipsum pariatur commodo commodo proident amet deserunt ut ea officia voluptate elit. Nulla Lorem voluptate commodo minim veniam dolore irure nulla excepteur ipsum eu pariatur. Ipsum amet commodo velit cillum. Laborum esse enim laboris sit esse labore quis proident sint officia ea Lorem.\r\nEnim quis enim consectetur elit ex duis. Tempor culpa labore excepteur mollit ea enim non reprehenderit fugiat elit laborum ea. Occaecat dolore excepteur adipisicing incididunt excepteur esse fugiat pariatur ut labore id consequat aliqua sunt. Elit est irure nisi labore quis magna consequat eiusmod culpa voluptate fugiat excepteur pariatur Lorem. Laboris magna irure consequat enim incididunt consectetur aute. Amet aliquip occaecat laboris ea. Fugiat ea non qui culpa pariatur quis nostrud commodo.\r\nDolore non do dolor culpa enim. Elit reprehenderit voluptate cupidatat fugiat. Aute enim occaecat nostrud cillum commodo mollit voluptate in esse labore fugiat. In nulla sit ullamco nisi velit. Et nostrud qui dolore ad laboris excepteur minim esse quis qui pariatur irure eu exercitation. Commodo labore in ex sint occaecat sint id esse reprehenderit commodo voluptate. Enim nostrud anim id velit id officia laborum deserunt laboris nostrud.\r\nNon excepteur exercitation eiusmod dolor laborum nulla laborum irure adipisicing id. Lorem cillum aliqua eu enim exercitation. Proident incididunt irure exercitation amet ad occaecat.\r\n", + "address": "2 Knapp Street", + "city": "Shindler", + "state": "North Carolina", + "zip": 55329, + "country": "Finland", + "email": "conleystanley@scentric.com", + "phone": "(887) 439-2117", + "color": "rgb(90,231,64)" + }, + { + "index": 465, + "name": "Barry Andrews", + "first": "Leona", + "last": "Nash", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "boolean": false, + "guid": "d6109791-de8e-41c5-9d94-00e69ae0b6e5", + "integer": 45, + "date": "Sun Jan 10 2010 12:46:09 GMT-0800 (PST)", + "shortText": "laborum", + "mediumText": "Commodo eiusmod do fugiat nostrud laborum id incididunt nulla. Tempor amet nostrud commodo id occaecat veniam. Ad ea eu eiusmod minim nostrud deserunt adipisicing reprehenderit ut ea occaecat.", + "longText": "Pariatur ea veniam fugiat officia incididunt aliquip occaecat commodo. Enim anim officia aliquip eu. Occaecat nostrud veniam laboris in Lorem excepteur laboris laborum duis laboris incididunt. Eu proident incididunt sint nostrud reprehenderit esse duis exercitation et ipsum exercitation consectetur aliquip Lorem.\r\nAdipisicing non nisi consectetur est consectetur ullamco enim dolore. Commodo eu Lorem consectetur esse. Cillum eiusmod incididunt exercitation elit labore duis esse. Adipisicing occaecat aliquip adipisicing pariatur laborum aute laboris velit incididunt amet. Nulla aliqua id ex velit consequat ex mollit minim Lorem. Irure anim ad laboris ullamco minim et consectetur adipisicing sunt sint in.\r\nEx magna excepteur esse consequat ex commodo commodo. Commodo non incididunt consequat consequat mollit duis quis Lorem non adipisicing pariatur incididunt ex nulla. Ex ut in laboris labore consequat mollit. Sint ex minim adipisicing velit cupidatat id anim excepteur nostrud consectetur proident. Commodo minim eiusmod veniam pariatur laboris cupidatat. Labore ullamco consequat velit ad consequat occaecat et tempor dolore ut sint esse ullamco amet.\r\nQui officia laborum laborum laborum. Ipsum Lorem ipsum sunt tempor exercitation dolore. Dolore reprehenderit do sit nulla dolor ea incididunt do id esse. Consectetur nulla enim ipsum velit reprehenderit non irure non.\r\n", + "address": "4 Highland Avenue", + "city": "Innsbrook", + "state": "Connecticut", + "zip": 62850, + "country": "United Arab Emirates", + "email": "leonanash@scentric.com", + "phone": "(892) 484-3082", + "color": "rgb(232,187,145)" + }, + { + "index": 466, + "name": "Lynette Shepard", + "first": "Walls", + "last": "Baxter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "boolean": false, + "guid": "f477123a-40c0-4cb9-8d64-cbf4c127e7bf", + "integer": 54, + "date": "Tue May 06 2008 02:57:35 GMT-0700 (PDT)", + "shortText": "officia ea ullamco", + "mediumText": "Do deserunt aute duis non proident commodo occaecat do reprehenderit eu aliqua est aliqua dolor. Culpa do laboris eiusmod do eiusmod enim irure ex nostrud. Dolor eiusmod enim pariatur duis non sunt quis dolor. Cupidatat aliqua ut cillum adipisicing non. Eiusmod labore in aliquip dolore magna cillum aliqua mollit irure.", + "longText": "Sunt consequat eiusmod qui irure ex excepteur culpa. Consectetur nostrud exercitation aliquip ex dolore quis. Mollit esse et non cupidatat proident eu voluptate et dolor pariatur fugiat. Amet qui ut quis do voluptate eu dolor enim tempor adipisicing.\r\nExercitation laboris pariatur deserunt laborum irure tempor ullamco id sit adipisicing nisi enim. Do amet consectetur ullamco culpa laborum dolor ut amet sit. Exercitation magna incididunt consectetur laborum excepteur. Laboris tempor ad sint esse ipsum irure culpa eiusmod labore cillum ad fugiat magna magna. Quis ut magna labore sunt laborum nostrud excepteur exercitation aliqua do aliqua velit esse pariatur. Aliqua Lorem qui proident aliqua culpa voluptate non officia.\r\nIncididunt do sunt ex dolor aute ut anim nisi nisi et fugiat. Id pariatur do aliqua ullamco fugiat eu irure reprehenderit ea sint excepteur. Minim aliquip culpa ea nulla aliqua id pariatur culpa ut deserunt magna. Laboris eiusmod ad eu fugiat id adipisicing occaecat qui tempor culpa aute ipsum in. Ea sit veniam dolore consectetur non cupidatat velit fugiat cillum. Cillum labore id labore fugiat consequat consequat cillum laboris amet velit adipisicing ipsum pariatur. Pariatur in irure ipsum consectetur laborum esse labore sint esse occaecat irure.\r\nDolore dolor esse esse ut labore anim deserunt tempor id reprehenderit irure veniam pariatur exercitation. Proident incididunt non ad Lorem est eiusmod aute elit qui Lorem enim. Mollit magna Lorem laboris excepteur occaecat consectetur tempor commodo irure. Sunt in eiusmod ullamco ad commodo laboris Lorem Lorem ullamco cupidatat. Lorem culpa ea do voluptate voluptate exercitation nulla. Officia adipisicing ullamco nisi officia laboris reprehenderit et ipsum. Dolor excepteur duis anim exercitation quis culpa culpa anim eiusmod ex laborum cillum.\r\nDo pariatur ad laborum occaecat labore occaecat amet non. Consequat non sit ullamco nulla cupidatat officia qui duis. Laborum duis ad velit eiusmod ea eu. Tempor incididunt tempor eiusmod duis.\r\n", + "address": "2 Forest Place", + "city": "Sabillasville", + "state": "South Carolina", + "zip": 36003, + "country": "Portugal", + "email": "wallsbaxter@scentric.com", + "phone": "(910) 431-2449", + "color": "rgb(74,195,121)" + }, + { + "index": 467, + "name": "Vega Dickson", + "first": "Bishop", + "last": "Stout", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "boolean": true, + "guid": "c40dd867-a925-4993-a4f1-e7e411637845", + "integer": 69, + "date": "Sun May 04 2008 00:14:56 GMT-0700 (PDT)", + "shortText": "sit sunt", + "mediumText": "Adipisicing sit cillum nostrud nostrud commodo. Sunt labore veniam dolor enim nostrud deserunt. Consectetur est aute laboris aliqua. Sit velit ad dolore cupidatat nisi nisi nostrud minim in est.", + "longText": "Labore esse occaecat commodo pariatur consectetur Lorem. Et minim sint in laborum. Do laborum nulla culpa ex dolor ipsum ut excepteur id deserunt ad quis aliquip. Ipsum proident amet cupidatat labore veniam aliquip ipsum laboris. Incididunt sunt excepteur non ut pariatur aute. Duis exercitation cillum cillum do nostrud minim. Labore eiusmod eiusmod voluptate consectetur id.\r\n", + "address": "3 Seeley Street", + "city": "Westmoreland", + "state": "Michigan", + "zip": 41497, + "country": "Comoros", + "email": "bishopstout@scentric.com", + "phone": "(988) 498-2056", + "color": "rgb(228,157,219)" + }, + { + "index": 468, + "name": "Noelle Mosley", + "first": "Barnes", + "last": "Bowen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "boolean": false, + "guid": "987c2384-3ee6-442a-859a-8839de50f5b6", + "integer": 90, + "date": "Thu Feb 26 2009 03:38:03 GMT-0800 (PST)", + "shortText": "voluptate", + "mediumText": "Lorem enim in incididunt proident commodo adipisicing laborum ut. Magna velit nostrud ipsum velit occaecat. Laborum duis reprehenderit reprehenderit id elit aute est occaecat nostrud exercitation reprehenderit esse. Reprehenderit adipisicing laborum laboris culpa magna commodo ullamco amet dolore.", + "longText": "Commodo occaecat magna consectetur esse culpa. Sunt ea adipisicing dolore laboris adipisicing officia proident culpa adipisicing et. Duis reprehenderit sunt proident sint exercitation enim irure esse voluptate mollit irure sint. Occaecat non amet nisi nisi Lorem duis aute incididunt nostrud elit veniam adipisicing proident. Fugiat id nostrud Lorem veniam aliquip Lorem occaecat ea nulla veniam. Sit amet laboris consequat esse excepteur dolore minim.\r\nAliqua ut dolor ex esse laboris consectetur incididunt. Dolore in commodo duis et enim consectetur eiusmod anim sit officia. Eu ut excepteur labore mollit sunt aliqua culpa sunt deserunt eiusmod.\r\nVeniam occaecat reprehenderit magna nisi elit deserunt. Dolore ullamco nisi aute excepteur aliquip aliquip duis eu laboris eu exercitation tempor. Lorem anim commodo esse fugiat enim aliquip aliqua consequat ullamco non aute magna veniam qui. Esse enim eu dolor aliqua pariatur culpa ea.\r\n", + "address": "2 Barwell Terrace", + "city": "Norvelt", + "state": "Maine", + "zip": 82709, + "country": "Central African Republic", + "email": "barnesbowen@scentric.com", + "phone": "(874) 465-2581", + "color": "rgb(201,251,62)" + }, + { + "index": 469, + "name": "Parrish Fowler", + "first": "Glenna", + "last": "Gaines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "boolean": false, + "guid": "82d27516-08d2-4a84-9d5c-ed237bcbbee1", + "integer": 75, + "date": "Sun Oct 29 2000 13:21:37 GMT-0800 (PST)", + "shortText": "aliqua magna ad", + "mediumText": "In qui do velit aliquip voluptate duis eu in deserunt officia fugiat exercitation irure do.", + "longText": "Qui dolor nisi adipisicing mollit laboris velit ad sunt. Magna do esse nostrud excepteur aliqua duis ea cupidatat ut. Nostrud dolore laborum id incididunt duis consectetur sint amet aliqua aliquip elit laborum minim. Proident in anim sunt enim in commodo occaecat magna. Magna est excepteur duis laboris laborum anim esse aute Lorem adipisicing.\r\nAnim voluptate minim adipisicing irure sit ipsum. Dolor dolore velit quis eu. Ex sit ex consequat minim consequat nisi aliqua incididunt voluptate incididunt id anim irure. Velit sit aliquip incididunt do commodo officia enim excepteur ut nisi laborum culpa anim. Ea sint fugiat quis nulla do. Tempor deserunt reprehenderit veniam pariatur velit velit labore culpa ut consequat reprehenderit ipsum. Eu reprehenderit ut excepteur do velit occaecat duis.\r\n", + "address": "2 Dare Court", + "city": "Muse", + "state": "Kansas", + "zip": 37729, + "country": "Gabon", + "email": "glennagaines@scentric.com", + "phone": "(819) 430-2612", + "color": "rgb(196,125,143)" + }, + { + "index": 470, + "name": "Booth Goodman", + "first": "Kathrine", + "last": "Curtis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "boolean": false, + "guid": "15c7abe9-175a-412b-b120-6bd621022908", + "integer": 6, + "date": "Sat Mar 28 1992 21:26:09 GMT-0800 (PST)", + "shortText": "proident reprehenderit", + "mediumText": "Deserunt id occaecat reprehenderit sint ea reprehenderit mollit eiusmod ea. Sint velit voluptate non Lorem deserunt dolore voluptate enim sunt laborum ad ullamco reprehenderit enim. Excepteur pariatur veniam amet qui in culpa magna. Commodo sit ad veniam deserunt excepteur aute laborum incididunt laborum ut.", + "longText": "Dolor do est occaecat ut ipsum nulla est anim minim voluptate incididunt officia dolor. Adipisicing in id sunt cillum nisi laborum cillum amet laborum aute consectetur. Officia sit dolor elit consequat adipisicing magna magna eu do non pariatur velit dolore ipsum.\r\nReprehenderit Lorem mollit irure laborum voluptate aute. Tempor enim nulla aliquip Lorem id dolor exercitation Lorem minim cupidatat irure et ipsum. Aliqua aute mollit culpa non ex labore quis eu do esse. In laborum adipisicing voluptate culpa pariatur ad et adipisicing. Ut eiusmod esse proident reprehenderit magna ut in nisi cillum sunt consequat pariatur. Consequat enim eiusmod fugiat magna nulla veniam nostrud veniam Lorem adipisicing amet consequat labore. Occaecat duis ad esse sint et cupidatat consequat culpa sint pariatur officia quis.\r\nCulpa id sit qui ea incididunt laboris laboris nisi voluptate nostrud. Enim in voluptate cillum dolore irure occaecat cupidatat pariatur ad elit excepteur. Lorem anim reprehenderit aliqua ipsum officia esse quis incididunt sint sunt esse. Deserunt culpa cillum nulla eiusmod incididunt est exercitation do ea. Voluptate magna occaecat excepteur incididunt tempor occaecat exercitation ad incididunt cupidatat dolor occaecat voluptate.\r\n", + "address": "3 Interborough Parkway", + "city": "Bethany", + "state": "Iowa", + "zip": 27481, + "country": "Cambodia", + "email": "kathrinecurtis@scentric.com", + "phone": "(857) 508-2561", + "color": "rgb(174,52,167)" + }, + { + "index": 471, + "name": "Benton Waters", + "first": "Marietta", + "last": "Cantu", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "boolean": false, + "guid": "f166dfbf-b1f4-4bbf-8d31-7979b09bc29c", + "integer": 84, + "date": "Sat Aug 15 1970 03:51:29 GMT-0700 (PDT)", + "shortText": "ipsum", + "mediumText": "Commodo duis laborum ut aliqua et nostrud incididunt. Cillum et sint do pariatur quis non ex duis deserunt esse eiusmod nulla aliqua id. Consequat amet cupidatat ea non ea ipsum Lorem nulla ut ipsum aliqua eiusmod do nostrud. Quis elit est esse officia.", + "longText": "In magna quis duis et. Veniam consectetur dolor excepteur aute sit minim aute aute ipsum dolor id sint quis. Ex aute Lorem commodo sit et qui esse nulla excepteur tempor. Cillum consectetur nulla consequat nisi elit ex labore. Ex officia labore sunt exercitation aliquip culpa elit commodo fugiat aute ut. Id velit velit sunt qui aliquip laborum nulla ea sit in commodo.\r\nPariatur commodo excepteur aliquip voluptate esse do velit do deserunt. Laboris anim deserunt laborum duis cillum aliqua esse cillum sunt. Ad fugiat nostrud amet sunt ipsum. Laborum deserunt qui eiusmod consequat.\r\nIrure qui enim voluptate laboris ex ad esse irure sunt officia aliquip do elit esse. Eu do commodo in excepteur ad. Aliquip nulla Lorem nisi sunt quis ex in eu fugiat minim elit consectetur occaecat.\r\n", + "address": "3 Falmouth Street", + "city": "Manchester", + "state": "Vermont", + "zip": 34619, + "country": "New Zealand", + "email": "mariettacantu@scentric.com", + "phone": "(932) 598-2276", + "color": "rgb(156,114,200)" + }, + { + "index": 472, + "name": "Lambert Spears", + "first": "Harding", + "last": "Woodward", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "boolean": false, + "guid": "32d3c3aa-0997-4d88-b2e7-9b28713b91bd", + "integer": 85, + "date": "Fri Feb 10 2006 11:58:14 GMT-0800 (PST)", + "shortText": "ullamco enim aliquip amet veniam", + "mediumText": "Excepteur magna velit est et minim veniam.", + "longText": "Ut nostrud elit dolor eiusmod est id. Sit aliqua tempor incididunt quis magna aliquip irure in elit in. Exercitation pariatur deserunt irure ullamco laboris excepteur ea. Deserunt labore laboris fugiat reprehenderit laborum quis occaecat duis voluptate labore culpa nisi aliqua ea. Veniam ea duis sint quis anim do.\r\nFugiat reprehenderit proident minim irure aliqua sunt non quis sunt ut. Eiusmod et occaecat ad quis. Velit ipsum in amet qui aliquip consequat sit voluptate est consequat. Nostrud laborum proident incididunt proident voluptate do sint minim officia.\r\n", + "address": "3 Guernsey Street", + "city": "Magnolia", + "state": "Nebraska", + "zip": 56924, + "country": "Lebanon", + "email": "hardingwoodward@scentric.com", + "phone": "(852) 477-3706", + "color": "rgb(148,78,220)" + }, + { + "index": 473, + "name": "Ferrell Gallegos", + "first": "Marie", + "last": "Flowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "boolean": true, + "guid": "3b7ed12d-4299-4fd6-a79a-42a27d171c9e", + "integer": 92, + "date": "Sun Jun 07 1992 13:29:12 GMT-0700 (PDT)", + "shortText": "sunt non veniam", + "mediumText": "Lorem officia duis consequat minim occaecat enim incididunt et labore consequat esse amet. Ea incididunt dolore eiusmod dolor mollit veniam laborum et cupidatat proident. Mollit sint fugiat tempor consectetur veniam ad cupidatat.", + "longText": "Do et sint pariatur in ex consectetur esse. Sit deserunt sit pariatur Lorem laboris duis ex est Lorem sunt. Qui id occaecat proident irure non aliquip tempor velit voluptate dolor adipisicing ullamco enim irure.\r\n", + "address": "4 Harden Street", + "city": "Worton", + "state": "Florida", + "zip": 87914, + "country": "Armenia", + "email": "marieflowers@scentric.com", + "phone": "(867) 463-2219", + "color": "rgb(245,149,165)" + }, + { + "index": 474, + "name": "Elena Hale", + "first": "Leola", + "last": "Byers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "boolean": false, + "guid": "248816ef-ebc8-48b6-83b8-ddf059001caf", + "integer": 36, + "date": "Fri Nov 08 1974 22:54:38 GMT-0800 (PST)", + "shortText": "sint ea eu aliqua elit", + "mediumText": "Dolor velit ullamco ullamco dolor nostrud. Qui deserunt mollit ea id cillum eu. Consectetur dolor irure esse velit sunt nostrud nostrud voluptate cillum tempor ipsum mollit do. Laboris ea esse do laboris adipisicing nisi. Labore excepteur cupidatat nostrud sit aliqua ad labore Lorem do aliquip ea veniam veniam.", + "longText": "Et esse non incididunt sunt aliqua eiusmod. Enim id ullamco in ex dolor est non eiusmod reprehenderit. Quis velit pariatur irure labore id enim. Anim esse voluptate fugiat ipsum do amet nisi velit pariatur deserunt culpa. Duis ullamco anim quis deserunt labore id laboris. Minim laborum id ex ex. Nulla mollit id esse do reprehenderit eu velit eu dolor commodo dolore aute sit.\r\nMollit magna reprehenderit velit consequat pariatur officia dolore laborum. Do sit reprehenderit qui fugiat voluptate ut cupidatat sit magna mollit sit velit Lorem. Id anim veniam aliquip aliqua adipisicing.\r\n", + "address": "2 Elliott Walk", + "city": "Gwynn", + "state": "New Jersey", + "zip": 23849, + "country": "Cayman Islands", + "email": "leolabyers@scentric.com", + "phone": "(800) 419-2994", + "color": "rgb(62,183,119)" + }, + { + "index": 475, + "name": "Deloris Warren", + "first": "Lacy", + "last": "Elliott", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "boolean": true, + "guid": "75cda396-a179-4462-bd5f-c87f9cdcb07d", + "integer": 16, + "date": "Tue Mar 20 2012 21:38:59 GMT-0700 (PDT)", + "shortText": "labore fugiat et", + "mediumText": "Fugiat velit exercitation commodo dolor deserunt commodo cupidatat eiusmod excepteur ea. Voluptate est deserunt eiusmod nostrud.", + "longText": "Adipisicing qui esse voluptate aliqua magna aliquip esse. Tempor ad aliquip ullamco fugiat. Aliqua Lorem velit consectetur amet velit deserunt.\r\nIrure tempor anim cillum aliqua pariatur fugiat. Nostrud amet dolore nisi cillum qui sit excepteur magna fugiat aute fugiat. Irure culpa incididunt est velit non anim adipisicing culpa est qui. Pariatur est reprehenderit amet officia mollit eu.\r\nId anim exercitation ex culpa dolor amet culpa sint sint sint esse dolore ea cupidatat. Ut laborum ullamco elit proident. Sit aute id proident nulla et. Incididunt excepteur ut cupidatat reprehenderit. Labore qui laboris consequat pariatur do cillum.\r\n", + "address": "3 Ditmars Street", + "city": "Carrizo", + "state": "Wisconsin", + "zip": 21484, + "country": "Italy", + "email": "lacyelliott@scentric.com", + "phone": "(927) 422-3415", + "color": "rgb(69,169,92)" + }, + { + "index": 476, + "name": "Young Lee", + "first": "Kay", + "last": "Montgomery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "boolean": true, + "guid": "c41e7a43-d02b-4c42-9d72-38d7ba926b78", + "integer": 99, + "date": "Wed Sep 26 1979 16:42:55 GMT-0700 (PDT)", + "shortText": "Lorem consequat esse occaecat irure", + "mediumText": "Ex velit deserunt veniam dolor et fugiat. Mollit excepteur occaecat cupidatat mollit ut magna et. Nostrud magna esse consectetur exercitation irure magna Lorem do nulla. Sit laboris cupidatat ullamco eiusmod nisi ex.", + "longText": "Enim cupidatat magna sint velit cupidatat Lorem sint est eiusmod irure officia ea occaecat. Laborum qui officia voluptate anim enim velit cillum ipsum. Irure labore irure eiusmod Lorem sint minim laboris deserunt irure dolor. Anim quis laborum cupidatat ex ex in. Dolor ipsum fugiat ad mollit proident labore consectetur dolore labore laborum cillum sint dolore. Et ex mollit sit est. Anim incididunt deserunt incididunt proident ea velit enim anim laboris adipisicing.\r\nEa officia laborum veniam duis irure labore. Aliquip velit et quis officia veniam cillum dolor nostrud non ipsum sint sint fugiat. Occaecat tempor ea consequat consequat voluptate.\r\nNostrud officia aliquip est eu quis ex dolor sint commodo commodo reprehenderit laborum. Do deserunt voluptate laboris do. Velit fugiat incididunt fugiat proident cillum ad excepteur aute aliqua minim. Nulla voluptate fugiat sint ea incididunt esse laboris sint incididunt dolor cillum irure magna. Tempor culpa anim duis qui adipisicing culpa enim magna duis. Nisi mollit qui nisi excepteur ut ut. Dolor laboris ad in reprehenderit enim sint excepteur laborum irure aliquip.\r\nLorem sit ad excepteur cillum ad consequat fugiat aliqua mollit veniam labore sit aliquip aute. Laborum dolore proident in aute labore ad dolore duis pariatur culpa mollit commodo esse. Enim occaecat officia ipsum ad eiusmod exercitation tempor nisi proident irure ut ut. Elit amet ad ex irure enim laboris elit ex anim magna sint sunt tempor in. Et magna ipsum laborum Lorem incididunt. Amet cillum ut magna dolore elit aute.\r\nSit nulla sint non velit aliquip occaecat sint laborum. Aliqua tempor dolore velit nisi tempor magna labore sunt elit et. Occaecat nisi commodo sunt et tempor ut ullamco. Sint tempor adipisicing consequat commodo tempor deserunt voluptate ea Lorem exercitation id culpa.\r\n", + "address": "4 India Street", + "city": "Elliott", + "state": "Washington", + "zip": 78397, + "country": "Lesotho", + "email": "kaymontgomery@scentric.com", + "phone": "(803) 429-2640", + "color": "rgb(217,203,52)" + }, + { + "index": 477, + "name": "Lynn Kim", + "first": "Ericka", + "last": "Todd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "boolean": true, + "guid": "e055ce4f-15a9-429c-91eb-a66e77b390f4", + "integer": 98, + "date": "Tue Mar 14 1972 10:31:22 GMT-0800 (PST)", + "shortText": "ullamco excepteur", + "mediumText": "Tempor sunt aliqua aliquip labore nisi ad eu in et eu laboris deserunt commodo ex. Ipsum minim ex dolor reprehenderit magna ullamco eu quis.", + "longText": "Sint dolore ipsum eu nulla amet amet aute commodo exercitation duis sit occaecat id. Eiusmod ex occaecat consequat tempor fugiat non ad minim anim Lorem. Magna dolore duis exercitation cupidatat elit ipsum Lorem eu mollit sint nulla reprehenderit ullamco elit. Ea est ea commodo eu do. In dolor magna reprehenderit ad dolor dolor id amet tempor occaecat. In laboris do incididunt occaecat elit quis ad amet. Anim sint elit culpa ullamco enim anim officia reprehenderit sunt.\r\nOfficia mollit cupidatat aliquip in laborum consectetur ea. Exercitation voluptate sint labore sunt excepteur eiusmod nostrud voluptate quis pariatur nulla. Esse commodo excepteur pariatur sit tempor ea laborum reprehenderit irure ex tempor.\r\nQuis labore et ad fugiat nostrud id labore non excepteur ipsum elit. Ea nulla laboris dolore nostrud quis irure magna est. Eiusmod mollit voluptate non laborum nostrud voluptate nisi voluptate. Est veniam veniam ad elit nostrud proident adipisicing ullamco aliquip commodo aliquip laborum laborum ad. Amet incididunt esse consequat nisi et consectetur. Adipisicing sunt irure Lorem elit aliqua dolore quis nostrud. Ex magna nisi excepteur occaecat veniam non dolore minim nostrud.\r\n", + "address": "3 Irving Avenue", + "city": "Stonybrook", + "state": "Oregon", + "zip": 25156, + "country": "Mongolia", + "email": "erickatodd@scentric.com", + "phone": "(854) 460-2134", + "color": "rgb(88,191,173)" + }, + { + "index": 478, + "name": "Duran Rasmussen", + "first": "Irene", + "last": "Guy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "boolean": false, + "guid": "ebebb8d9-3261-4d1f-b04c-580c3537cf32", + "integer": 5, + "date": "Mon Dec 14 1992 15:07:33 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Aute ut nostrud cillum irure non veniam minim exercitation ex mollit sint veniam voluptate. Est culpa eiusmod aliquip anim. Nisi aliquip duis magna nulla est Lorem cupidatat nisi ut proident nostrud voluptate.", + "longText": "Aute consectetur qui sunt enim ad nulla velit et laborum culpa. Laboris officia exercitation nulla aute incididunt excepteur. Dolor et aliqua nulla mollit incididunt velit laborum nisi non ad excepteur. Exercitation ea dolore aliqua sunt minim dolore laboris Lorem culpa ex ut commodo.\r\nVoluptate occaecat et eu elit mollit commodo laboris eiusmod cillum mollit eiusmod est sunt labore. Ea commodo nisi culpa Lorem velit sit labore elit anim est sit sunt ex pariatur. Fugiat consectetur laborum deserunt sit excepteur exercitation qui veniam culpa sint.\r\nTempor aliquip excepteur consectetur commodo dolor magna. Aute elit esse mollit nisi dolore non laboris velit cillum cupidatat proident proident pariatur aute. Labore cillum ex magna anim voluptate esse deserunt consectetur anim est proident. Cillum Lorem sint aliqua fugiat eu qui. Aute eiusmod est qui aliqua incididunt cillum esse est laboris. Cillum et aute culpa excepteur nisi amet veniam incididunt do do sint esse in sint. Culpa ad ipsum ad nostrud id laborum.\r\n", + "address": "4 Dunham Place", + "city": "Vicksburg", + "state": "Illinois", + "zip": 21064, + "country": "Germany", + "email": "ireneguy@scentric.com", + "phone": "(895) 490-2069", + "color": "rgb(65,241,108)" + }, + { + "index": 479, + "name": "Gomez Kent", + "first": "Beverley", + "last": "Garrison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "boolean": false, + "guid": "1f6414f6-bcb1-4a8e-9bd3-1f4bd3657fb8", + "integer": 52, + "date": "Sun Nov 21 1982 20:33:30 GMT-0800 (PST)", + "shortText": "sint cillum non dolore sit", + "mediumText": "Aliquip ad elit nulla veniam quis.", + "longText": "Incididunt in veniam laboris laboris. Ipsum laboris Lorem ea cupidatat laboris deserunt cillum esse. Elit qui id dolor mollit incididunt veniam aute in eiusmod. Occaecat est adipisicing dolor velit enim. Ipsum laboris nulla Lorem ex ut exercitation nulla commodo nisi occaecat excepteur et Lorem ex. Proident eu exercitation exercitation aliqua enim. Tempor magna excepteur enim aliqua.\r\nMollit fugiat veniam minim esse reprehenderit. Cillum exercitation qui elit anim proident. Aliquip ullamco irure aliqua sit commodo veniam cillum adipisicing proident ad aliquip dolore minim.\r\nQuis pariatur sint commodo mollit reprehenderit et incididunt commodo aliqua sint. Sunt nulla deserunt ad nulla in sit incididunt laborum nulla magna culpa excepteur. Deserunt ad non ullamco in amet do elit qui excepteur.\r\nQui ut do ex pariatur tempor. Anim qui labore sunt nisi amet laborum occaecat adipisicing incididunt fugiat labore. Laborum nisi duis minim pariatur labore ea consequat exercitation. Cillum reprehenderit eiusmod aute cillum laborum labore dolor aliqua in magna.\r\n", + "address": "4 Lafayette Avenue", + "city": "Esmont", + "state": "West Virginia", + "zip": 45346, + "country": "Thailand", + "email": "beverleygarrison@scentric.com", + "phone": "(923) 547-3876", + "color": "rgb(69,99,135)" + }, + { + "index": 480, + "name": "Bowers Benson", + "first": "Cannon", + "last": "Cunningham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "boolean": false, + "guid": "de1acbb3-f26f-4448-8284-168962e64357", + "integer": 18, + "date": "Sat Jan 23 1988 03:15:57 GMT-0800 (PST)", + "shortText": "tempor dolore pariatur laboris", + "mediumText": "Cillum proident sint eiusmod qui ullamco dolore. Elit sit nisi et laboris labore Lorem tempor nulla. Dolore incididunt deserunt aute dolor ad elit nisi magna ad tempor.", + "longText": "Eiusmod id tempor id officia aliqua aliquip cillum est minim in. Est reprehenderit pariatur reprehenderit laborum nulla. Proident sit do anim minim anim minim in proident laborum pariatur laborum magna est.\r\nDolor exercitation ad enim est dolore excepteur consequat non pariatur. Eiusmod do et cupidatat ad esse do cillum elit in laboris. Labore consequat cupidatat officia do commodo sit consectetur ipsum irure consectetur. Ullamco commodo cillum officia cupidatat Lorem id.\r\nId anim culpa ex et reprehenderit do proident laboris reprehenderit. Proident quis irure duis irure ex ut velit mollit consectetur anim Lorem. Id consectetur laborum enim consectetur eiusmod excepteur id excepteur. In sunt anim magna duis ad occaecat cillum amet tempor pariatur sunt Lorem et proident. Officia in ipsum sunt aute Lorem.\r\n", + "address": "3 Eldert Lane", + "city": "Torboy", + "state": "Mississippi", + "zip": 21587, + "country": "Seychelles", + "email": "cannoncunningham@scentric.com", + "phone": "(922) 457-2557", + "color": "rgb(214,152,137)" + }, + { + "index": 481, + "name": "Duffy Moreno", + "first": "Combs", + "last": "Lamb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "boolean": false, + "guid": "cc6e70c6-d769-4d53-94c3-3f39685f92b0", + "integer": 62, + "date": "Sat May 08 1971 07:47:14 GMT-0700 (PDT)", + "shortText": "ipsum in sint id amet", + "mediumText": "Voluptate sit occaecat velit elit culpa pariatur deserunt minim tempor. Ipsum sint ad voluptate ipsum.", + "longText": "Non ex consectetur nostrud et incididunt et tempor laborum fugiat aliqua ex sunt. Consectetur velit cillum ea elit anim ut qui velit sit. Dolore cillum eu sint dolore consequat est enim minim sunt dolore dolor est ut aliqua. Tempor ullamco eiusmod incididunt esse quis adipisicing ut et voluptate aliqua ullamco in. Adipisicing irure dolor irure esse velit dolore. Ea ullamco consectetur anim et in quis laboris nulla nisi sint ipsum. Enim aliquip deserunt voluptate quis sint.\r\nCommodo cupidatat occaecat elit Lorem dolor excepteur aliquip est incididunt. Sit minim aute non dolore voluptate nisi. Id non sit nostrud ad.\r\nExercitation deserunt officia nostrud occaecat qui et veniam laborum nostrud dolor dolore id. Ullamco enim esse ex aute ad incididunt aliquip. Tempor id voluptate fugiat ex fugiat dolor.\r\nAd ipsum voluptate ipsum cillum id. Exercitation labore velit occaecat adipisicing non excepteur aute amet. Culpa exercitation deserunt aute excepteur sit enim eiusmod esse Lorem anim aliqua laborum et. Dolore deserunt minim dolore nulla cupidatat proident commodo nisi. Qui exercitation sit elit aliquip mollit aliqua. Proident cupidatat labore culpa ea.\r\n", + "address": "4 Rutledge Street", + "city": "Waterford", + "state": "Rhode Island", + "zip": 58081, + "country": "Chad", + "email": "combslamb@scentric.com", + "phone": "(880) 495-3320", + "color": "rgb(104,242,253)" + }, + { + "index": 482, + "name": "Leach Middleton", + "first": "Molina", + "last": "Parsons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "boolean": false, + "guid": "e824a101-32db-4fdd-98bc-f68a09cc9790", + "integer": 36, + "date": "Mon May 13 1996 08:23:43 GMT-0700 (PDT)", + "shortText": "est irure exercitation reprehenderit tempor", + "mediumText": "Cupidatat amet id duis occaecat ad elit quis ea consectetur consequat nostrud qui fugiat. Ea cupidatat est nisi reprehenderit in et sit et ad veniam do elit adipisicing sit. Non Lorem anim consequat velit occaecat excepteur. Officia esse magna veniam dolore ullamco fugiat enim.", + "longText": "In sunt in velit ipsum laborum minim enim sunt duis. Ut duis elit occaecat voluptate eiusmod. Cupidatat dolor laboris aliquip officia magna voluptate incididunt.\r\nFugiat irure ad quis ea aliqua proident ipsum quis ut incididunt. Aliquip culpa velit magna exercitation nostrud. Minim cupidatat irure exercitation excepteur cupidatat dolore. Excepteur amet laborum nulla adipisicing minim aliquip minim cillum nulla officia ut. Nostrud quis eu laboris quis qui minim ad quis ea reprehenderit. Proident ipsum aliquip cupidatat nisi.\r\nConsectetur sint magna id est cupidatat minim. Non cillum aliqua amet commodo aute eiusmod dolor et ad ut non culpa duis incididunt. Sint aliquip excepteur aliqua aliquip mollit commodo amet mollit. Irure minim nisi eu ea sit. Voluptate esse culpa adipisicing excepteur laborum proident laborum proident. Excepteur duis eu fugiat eiusmod labore velit do qui esse dolore labore enim. Esse quis ipsum Lorem voluptate tempor est fugiat enim reprehenderit duis.\r\nVeniam magna qui velit nulla velit incididunt aliqua qui dolore esse ex ad. Fugiat do nostrud do magna excepteur eiusmod et adipisicing aute aliquip cupidatat fugiat irure. Aliqua officia qui anim esse duis est minim excepteur est esse dolor id deserunt.\r\n", + "address": "2 Woods Place", + "city": "Leyner", + "state": "Georgia", + "zip": 45379, + "country": "Uruguay", + "email": "molinaparsons@scentric.com", + "phone": "(825) 403-3345", + "color": "rgb(74,223,146)" + }, + { + "index": 483, + "name": "Della Gomez", + "first": "Lamb", + "last": "Pierce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "boolean": false, + "guid": "19a7f089-3845-4441-b5ad-2b14bf2ca81a", + "integer": 50, + "date": "Mon Sep 28 1998 02:00:36 GMT-0700 (PDT)", + "shortText": "proident", + "mediumText": "Cupidatat in duis aliquip nisi consequat enim. Consectetur velit et nostrud et ea exercitation et aliquip pariatur aliqua velit eu ipsum reprehenderit.", + "longText": "Nulla nostrud ex eiusmod adipisicing. Exercitation ad dolore excepteur laborum quis non nisi duis dolor incididunt veniam fugiat laboris. Occaecat officia et eu proident ullamco dolor exercitation non laborum ea aliquip duis laborum. Exercitation voluptate ex aute nisi magna non laboris ea consequat. Est enim do tempor enim aute esse duis voluptate dolor. Aute enim minim cillum id.\r\nMollit eiusmod excepteur nisi est enim labore amet. Enim proident labore mollit dolor do incididunt deserunt irure exercitation irure magna. Incididunt irure officia consectetur magna fugiat quis fugiat voluptate nulla voluptate eu velit. Cupidatat qui proident deserunt reprehenderit veniam sunt non magna velit. Laboris labore consectetur ea et et. Non ex commodo amet enim.\r\nVeniam ex consequat minim ea adipisicing aute elit ea in in pariatur. Consequat nostrud sit non eiusmod voluptate consectetur velit cupidatat qui consectetur esse. Eu laboris cillum quis mollit minim id commodo quis laboris esse sint est irure.\r\nDolore pariatur officia sint qui consequat sunt minim culpa cillum amet qui. Anim adipisicing enim voluptate non nulla anim cupidatat ullamco consectetur elit qui culpa excepteur. Ad enim labore aliqua nulla sint consectetur ipsum occaecat occaecat ut cupidatat ad id ex. Mollit magna qui reprehenderit officia irure nisi ullamco excepteur consequat esse. Dolore commodo laboris ad culpa cillum eu laborum consectetur non occaecat. Sunt magna voluptate occaecat sunt occaecat exercitation magna sint sunt ullamco Lorem labore aliquip. Excepteur pariatur mollit ex incididunt.\r\n", + "address": "2 Dwight Street", + "city": "Newkirk", + "state": "New Mexico", + "zip": 24042, + "country": "Burkina Faso", + "email": "lambpierce@scentric.com", + "phone": "(996) 559-3096", + "color": "rgb(154,210,165)" + }, + { + "index": 484, + "name": "Holder Barker", + "first": "Patrick", + "last": "Best", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "boolean": true, + "guid": "c45e5d59-d200-42b3-9f8f-4ecba7a5c540", + "integer": 99, + "date": "Fri Nov 12 1971 21:30:45 GMT-0800 (PST)", + "shortText": "ea", + "mediumText": "Velit in qui nisi cupidatat qui deserunt. Quis pariatur nulla non cupidatat ad magna. Eu anim velit eu qui Lorem officia esse irure magna nulla eiusmod. Do adipisicing minim ad nulla.", + "longText": "Amet id duis eu tempor. Proident nisi pariatur id sit non adipisicing ex nostrud commodo consectetur sint sunt sunt exercitation. Eiusmod sunt est in eiusmod. Enim ut consectetur anim ea qui enim id irure deserunt eu. Tempor aute id nulla velit nostrud dolor veniam esse sint laborum ea. Non aliquip sunt nulla cupidatat amet aliqua non non.\r\nNisi ex ad ad enim eu sit proident aliquip ut incididunt reprehenderit nostrud pariatur. Sint dolor in veniam excepteur enim qui sit sunt cupidatat. Sunt velit magna culpa consectetur quis consectetur veniam do quis irure. Cupidatat aute laborum aute adipisicing amet mollit cillum amet ut. Nostrud magna adipisicing culpa sint esse ex pariatur cupidatat reprehenderit reprehenderit anim deserunt elit sunt. Ullamco minim consequat id in tempor.\r\nAmet veniam anim ullamco eu ea eiusmod est nulla velit. Aliqua nostrud laborum esse commodo laborum dolore. Pariatur magna officia eiusmod velit velit anim ad magna ipsum aliquip.\r\n", + "address": "4 Strauss Street", + "city": "Muir", + "state": "Arizona", + "zip": 26765, + "country": "Greenland", + "email": "patrickbest@scentric.com", + "phone": "(824) 579-3730", + "color": "rgb(171,74,141)" + }, + { + "index": 485, + "name": "Pitts Soto", + "first": "Vincent", + "last": "Hughes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "boolean": true, + "guid": "fe55de6c-660f-4642-8677-5fdea19e5504", + "integer": 34, + "date": "Mon Dec 20 1971 02:47:54 GMT-0800 (PST)", + "shortText": "dolore officia", + "mediumText": "Et in laboris tempor laborum eu nisi consequat adipisicing et eu aliqua anim sunt sint. Culpa est esse eu reprehenderit mollit dolore. Tempor esse laboris esse ea duis dolore in nulla excepteur sit veniam enim velit.", + "longText": "Quis nostrud exercitation ullamco eiusmod proident non officia do mollit laborum exercitation. Velit irure incididunt in nisi laboris consequat eu cupidatat velit cillum nisi pariatur nostrud. Laborum ex reprehenderit culpa dolor duis culpa ut amet deserunt tempor amet. Laborum labore officia dolor occaecat elit. Lorem ullamco consectetur commodo elit et commodo deserunt enim. Sunt consequat cillum proident irure. Pariatur adipisicing ad proident culpa pariatur in tempor irure id ex sint adipisicing nulla tempor.\r\nEu cupidatat culpa non Lorem minim aliqua qui. Non ex aliquip ut reprehenderit anim aute nulla duis sit sunt ut. Nulla cupidatat non commodo adipisicing. Nisi exercitation quis veniam velit cillum incididunt. Do exercitation ut nulla Lorem culpa qui minim laboris quis ipsum elit sunt irure nulla.\r\nEt aute aliquip adipisicing labore ad irure quis consequat occaecat sunt. Reprehenderit fugiat ea eiusmod pariatur Lorem laboris anim non quis labore nisi. Mollit exercitation pariatur incididunt consequat reprehenderit officia nostrud labore duis aute quis sint. Exercitation ipsum esse sit in nulla anim.\r\nIpsum minim tempor et culpa adipisicing nisi tempor nisi laborum anim. Labore enim in sint minim duis Lorem fugiat nisi adipisicing do est elit excepteur. Velit dolore ea aliqua quis qui sit aliquip anim quis velit occaecat. Officia adipisicing ipsum ullamco cillum pariatur ad officia consectetur voluptate aliquip. Est adipisicing incididunt exercitation sunt aliqua irure consectetur excepteur adipisicing sint. Aute non ut ea ea enim. Aliqua Lorem excepteur voluptate nostrud ad proident reprehenderit ad dolore labore sit excepteur excepteur.\r\nAd tempor et veniam consequat. Duis commodo labore eiusmod reprehenderit consectetur adipisicing sint cillum laboris aliquip laboris occaecat sit. Sunt officia mollit labore culpa ea ut. Sunt commodo ea non Lorem culpa incididunt incididunt esse labore et irure tempor ex. Dolor culpa ea amet laboris ad ad mollit qui.\r\n", + "address": "2 Battery Avenue", + "city": "Westphalia", + "state": "Texas", + "zip": 12235, + "country": "Fiji", + "email": "vincenthughes@scentric.com", + "phone": "(947) 521-2627", + "color": "rgb(241,60,119)" + }, + { + "index": 486, + "name": "Morrison Frye", + "first": "Mae", + "last": "Ramirez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "boolean": true, + "guid": "03d96011-46bd-43a9-8186-6b5a9c45ef96", + "integer": 94, + "date": "Sat Dec 29 2012 13:16:12 GMT-0800 (PST)", + "shortText": "duis reprehenderit", + "mediumText": "Sit fugiat exercitation ut laborum.", + "longText": "Ea proident aliqua aute quis Lorem sunt ad. Qui irure fugiat aute dolore sint non sit magna. Nostrud tempor nulla eiusmod fugiat nostrud ad pariatur elit ea laboris.\r\nElit eiusmod mollit anim pariatur ea duis commodo sit eu consectetur non. Officia nisi sunt eu voluptate eu dolor laborum et irure aliquip aliquip consequat sint exercitation. Aliqua anim eiusmod laboris pariatur sit proident irure excepteur amet sint culpa dolor commodo nisi. Quis laborum est occaecat aute quis aliqua proident minim. Cillum tempor occaecat dolore irure labore nisi labore ut mollit proident eu. Eu adipisicing labore elit esse proident proident.\r\nDolore velit do ullamco ad occaecat veniam fugiat. Nulla excepteur aliqua sit magna ipsum pariatur. Anim magna esse laboris eiusmod Lorem ex. Quis mollit nostrud voluptate aliqua ea aliqua sunt non. Quis sint dolor do eu voluptate ad laborum. Eiusmod occaecat elit est labore qui ad ullamco. Esse sit nisi occaecat esse ullamco aliquip cupidatat mollit occaecat esse anim aliqua ea id.\r\nLaborum nostrud anim non excepteur aliqua ullamco minim sunt esse. Consequat ipsum aute id culpa quis minim incididunt. Dolor duis cupidatat ea cupidatat sunt magna consequat in ullamco aliqua eu voluptate. Pariatur proident esse consectetur Lorem id aliquip dolor quis occaecat eiusmod. Ad laboris reprehenderit fugiat amet excepteur. Sunt sit eu qui ad tempor cillum.\r\n", + "address": "4 Willow Place", + "city": "Biehle", + "state": "District Of Columbia", + "zip": 30874, + "country": "Viet Nam", + "email": "maeramirez@scentric.com", + "phone": "(866) 481-3384", + "color": "rgb(104,176,225)" + }, + { + "index": 487, + "name": "Diane Patrick", + "first": "Esperanza", + "last": "Rivera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "boolean": false, + "guid": "7f120012-357d-44c7-8dbe-9cfee5ca1f70", + "integer": 30, + "date": "Fri Jun 30 2000 14:03:45 GMT-0700 (PDT)", + "shortText": "tempor elit cupidatat labore", + "mediumText": "Exercitation reprehenderit tempor tempor esse magna in voluptate ea. Incididunt quis voluptate pariatur irure. Aliquip duis duis velit ullamco consequat ullamco ut proident Lorem dolore proident. Est qui amet ut ad exercitation aute cillum. Pariatur sit ea in consectetur qui amet minim nisi eu.", + "longText": "Adipisicing sit ut duis est tempor incididunt fugiat deserunt ad do voluptate amet eu. Excepteur eiusmod in id amet minim. Anim non velit velit id. Consequat proident irure aliquip est mollit proident cillum commodo veniam exercitation irure nostrud non. Tempor aliquip id fugiat duis elit sint. Enim ea pariatur ex ipsum cupidatat. Nulla proident labore in irure qui.\r\n", + "address": "2 Monument Walk", + "city": "Newry", + "state": "Virgin Islands", + "zip": 40958, + "country": "France, Metropolitan", + "email": "esperanzarivera@scentric.com", + "phone": "(909) 486-2560", + "color": "rgb(164,161,80)" + }, + { + "index": 488, + "name": "Ellen Rich", + "first": "Chandra", + "last": "Cote", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "boolean": true, + "guid": "02e9640e-9e9f-4b08-85b4-cb797b3b3a9b", + "integer": 71, + "date": "Sat May 01 2004 01:19:45 GMT-0700 (PDT)", + "shortText": "veniam", + "mediumText": "Irure labore ea ex culpa reprehenderit. Et ad irure aute ut quis elit. Proident magna qui sint fugiat culpa commodo aute duis proident. Officia do enim id proident occaecat fugiat eiusmod sint sint laborum ea.", + "longText": "Sunt duis est et magna excepteur laboris culpa anim pariatur officia veniam proident et. Quis tempor excepteur labore eiusmod enim. Ipsum fugiat nisi nulla minim consequat anim aliqua aliqua laboris est labore. Occaecat est qui labore ut fugiat est magna quis esse magna ex irure proident non. In dolore voluptate minim veniam anim qui reprehenderit sit irure sint duis veniam nulla qui. Sunt minim ex consequat incididunt sit ipsum cupidatat esse fugiat.\r\nExercitation magna anim adipisicing minim qui esse eiusmod. Excepteur minim Lorem pariatur in incididunt pariatur sit ipsum deserunt irure laborum. Cillum irure elit nisi dolor cupidatat eiusmod officia eu incididunt aliqua sint excepteur deserunt laboris. Non sint et velit et in aute do cupidatat nostrud sunt excepteur. Aliqua aute voluptate et exercitation exercitation tempor quis aute.\r\nLaboris ut voluptate nisi dolore fugiat. Nulla deserunt cupidatat do quis excepteur reprehenderit nostrud aute laboris Lorem eiusmod sunt. Aliquip voluptate voluptate Lorem non qui adipisicing magna occaecat ad duis.\r\nSit magna amet laboris qui deserunt eu aliquip. Eu ad nulla adipisicing occaecat eu Lorem officia magna nulla amet labore proident minim voluptate. Laboris consequat sint amet cupidatat aute aute sit aliquip excepteur minim ad reprehenderit. Et et sit amet laboris reprehenderit incididunt esse. Non ipsum sit qui anim eiusmod.\r\n", + "address": "4 Ashford Street", + "city": "Dunnavant", + "state": "Puerto Rico", + "zip": 54991, + "country": "Uganda", + "email": "chandracote@scentric.com", + "phone": "(964) 526-3818", + "color": "rgb(172,172,60)" + }, + { + "index": 489, + "name": "Adele Stanton", + "first": "Allison", + "last": "Maxwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "boolean": false, + "guid": "94d8f372-ebe3-4cd7-8456-4b12af0dbc7f", + "integer": 45, + "date": "Sun Oct 28 1990 07:28:14 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Exercitation excepteur nisi duis est laboris ipsum sint est laboris enim ex officia nostrud. Nisi pariatur dolor elit irure aliqua.", + "longText": "Lorem ea id veniam proident exercitation culpa dolor deserunt do cillum dolor ullamco cillum id. Esse sit tempor consectetur elit consequat laborum. Enim ea fugiat ad Lorem aliqua pariatur exercitation ipsum incididunt elit Lorem ipsum amet. Est nisi id adipisicing deserunt dolore aliquip proident commodo. Dolor qui quis excepteur eu proident.\r\nNostrud dolor fugiat nisi dolore qui sunt. Velit ullamco anim do eu. Culpa Lorem id excepteur nostrud culpa Lorem cupidatat culpa ea eiusmod laborum ex. Excepteur veniam voluptate tempor eu ex amet incididunt aute veniam magna.\r\nLabore velit dolor est consectetur ad non officia. Tempor pariatur dolor amet tempor amet eu non anim. Voluptate in fugiat est duis ad est. Id id sit fugiat sunt. Tempor ipsum nisi ea non proident id duis non exercitation ipsum minim proident. Do deserunt sit aute deserunt. Enim quis pariatur ad velit culpa dolor.\r\n", + "address": "2 Bedford Avenue", + "city": "Woodlake", + "state": "Maryland", + "zip": 25064, + "country": "Antarctica", + "email": "allisonmaxwell@scentric.com", + "phone": "(899) 448-3606", + "color": "rgb(240,230,119)" + }, + { + "index": 490, + "name": "Ilene Alston", + "first": "Cecile", + "last": "Woods", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "boolean": false, + "guid": "1580bd0d-10e4-45df-8d7a-a7d5028512d8", + "integer": 95, + "date": "Sun Mar 29 2009 19:07:07 GMT-0700 (PDT)", + "shortText": "ullamco incididunt", + "mediumText": "Occaecat elit cillum laboris nulla culpa veniam sit non aliquip occaecat. Proident do aliquip exercitation quis proident culpa. Veniam et est incididunt reprehenderit reprehenderit sit elit eiusmod velit qui nulla tempor non. Eiusmod reprehenderit mollit non veniam nisi eiusmod mollit ullamco culpa.", + "longText": "Ea irure est pariatur est qui fugiat ut sit non enim mollit tempor. Aliquip sunt nulla pariatur dolore eu fugiat enim sunt est laboris. Aliquip reprehenderit exercitation id occaecat. Incididunt amet ex dolor sunt.\r\nDuis culpa occaecat deserunt dolore laborum. Sit non officia nisi exercitation do id minim. Voluptate esse velit do officia consectetur duis Lorem proident consequat duis laborum eiusmod officia amet.\r\nCupidatat adipisicing esse laborum sit nisi occaecat reprehenderit officia aute. Sit elit in nisi nulla ipsum mollit. Voluptate fugiat proident incididunt pariatur. Dolor consectetur occaecat est laborum id nisi minim consectetur occaecat. Minim duis occaecat commodo nulla pariatur ex.\r\n", + "address": "3 Gunnison Court", + "city": "Clara", + "state": "Massachusetts", + "zip": 31477, + "country": "Kiribati", + "email": "cecilewoods@scentric.com", + "phone": "(937) 412-3586", + "color": "rgb(218,151,77)" + }, + { + "index": 491, + "name": "Page Marsh", + "first": "Medina", + "last": "Wilson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "boolean": false, + "guid": "4dfb0026-3202-4699-aba7-d815792762f2", + "integer": 42, + "date": "Mon Nov 03 1975 16:09:28 GMT-0800 (PST)", + "shortText": "commodo ex", + "mediumText": "Do ex ullamco eu id consectetur est.", + "longText": "Non consectetur est amet dolore pariatur adipisicing et exercitation pariatur. Duis cillum reprehenderit magna ex esse. Ex incididunt aute in dolore duis. Nisi deserunt quis ex ipsum officia. Esse ea consectetur amet aliquip sunt incididunt.\r\nConsectetur enim aute ad commodo do. Veniam fugiat culpa voluptate minim exercitation eiusmod dolore qui excepteur in laboris incididunt. Ad tempor dolore consectetur ullamco. Ad officia enim laborum minim voluptate fugiat. Laboris eu deserunt ex est. Incididunt est nulla excepteur do ipsum occaecat deserunt esse et. Officia fugiat eiusmod ut sint enim laborum pariatur dolor labore.\r\n", + "address": "4 Lewis Avenue", + "city": "Venice", + "state": "Oklahoma", + "zip": 93431, + "country": "Ecuador", + "email": "medinawilson@scentric.com", + "phone": "(915) 547-2479", + "color": "rgb(97,200,182)" + }, + { + "index": 492, + "name": "Raquel Torres", + "first": "Winters", + "last": "Moon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "boolean": true, + "guid": "2b4cd0b5-6c14-4253-afd2-667d28e069e5", + "integer": 6, + "date": "Sat May 22 1993 08:02:57 GMT-0700 (PDT)", + "shortText": "commodo consectetur culpa aliquip", + "mediumText": "Anim voluptate Lorem laborum consequat ex cillum ipsum exercitation consectetur elit. Pariatur ex qui nostrud enim consectetur eu mollit qui esse irure magna. Reprehenderit aliquip magna sunt labore. Aliqua nisi Lorem ad cupidatat laborum commodo irure non. Ut cupidatat ipsum do adipisicing incididunt.", + "longText": "Magna dolor ut incididunt pariatur cupidatat ullamco. Nisi veniam nulla est est. Nulla ex minim non excepteur quis laborum excepteur ut deserunt eiusmod consequat adipisicing mollit excepteur. Duis id tempor et aliqua laborum.\r\nVoluptate aliquip commodo sit laboris ea nisi id minim consectetur qui. Magna culpa ullamco ea enim excepteur nisi. Anim cillum nostrud ex consectetur. Sint duis voluptate est voluptate eu eu.\r\nConsectetur eiusmod officia qui exercitation ad magna. Ipsum voluptate ex culpa qui fugiat irure magna mollit nisi duis. Non laboris sit adipisicing ipsum dolor eiusmod Lorem aliqua velit ea sit reprehenderit minim aliquip. Reprehenderit non esse voluptate non aute non. Exercitation ex cillum ex sunt incididunt reprehenderit ipsum deserunt ex aliquip. Consectetur esse ut minim duis tempor ex reprehenderit veniam in proident.\r\nLaboris magna labore sint irure. Sit amet cupidatat adipisicing exercitation deserunt sint ad incididunt. Fugiat culpa adipisicing magna est voluptate. Consequat consequat velit reprehenderit aliqua anim commodo fugiat adipisicing qui occaecat dolore sint proident. Ex et officia ullamco labore ipsum consequat magna labore laboris. Adipisicing laboris non non dolore magna tempor do dolore qui nostrud sint. Incididunt enim excepteur aliqua adipisicing culpa irure eiusmod ex ullamco aliquip id cillum commodo ex.\r\n", + "address": "2 Amber Street", + "city": "Masthope", + "state": "Ohio", + "zip": 34479, + "country": "Bulgaria", + "email": "wintersmoon@scentric.com", + "phone": "(812) 514-3427", + "color": "rgb(129,103,138)" + }, + { + "index": 493, + "name": "Sasha Kinney", + "first": "Nielsen", + "last": "Callahan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "boolean": false, + "guid": "8d605d34-eb11-4110-9917-e890666b46c9", + "integer": 25, + "date": "Sun Feb 25 1996 00:22:49 GMT-0800 (PST)", + "shortText": "dolor velit", + "mediumText": "Proident occaecat voluptate eiusmod nisi ea non duis. Nostrud fugiat aliquip est exercitation laboris ipsum in dolor nisi duis magna minim. Pariatur pariatur ipsum incididunt excepteur.", + "longText": "Ex duis tempor fugiat mollit sunt enim elit commodo. Laboris in velit magna dolor. Labore labore incididunt veniam eiusmod mollit irure proident voluptate incididunt quis deserunt ad. Eiusmod eiusmod non reprehenderit aute amet eiusmod consectetur magna ea.\r\nTempor ad in cupidatat sunt dolore consectetur sunt. Anim nostrud nulla nostrud consequat. Consequat ullamco enim reprehenderit eu eu ea do duis reprehenderit quis cillum laborum pariatur. Est laborum reprehenderit in commodo enim ullamco mollit. Aute laboris incididunt elit laborum incididunt id tempor.\r\nEt do nulla voluptate magna labore ea commodo ex deserunt. Nostrud pariatur ipsum voluptate do esse non aliqua sint elit laboris ad adipisicing Lorem. Ut fugiat officia nostrud reprehenderit nisi aliqua.\r\n", + "address": "3 Lorraine Street", + "city": "Kidder", + "state": "Nevada", + "zip": 69726, + "country": "American Samoa", + "email": "nielsencallahan@scentric.com", + "phone": "(897) 548-2921", + "color": "rgb(58,212,98)" + }, + { + "index": 494, + "name": "Justice Johnston", + "first": "Francis", + "last": "Walsh", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "boolean": false, + "guid": "93cc4a8b-fe24-4849-a976-a91a2adabb91", + "integer": 60, + "date": "Fri Feb 24 2006 00:14:57 GMT-0800 (PST)", + "shortText": "mollit magna anim exercitation amet", + "mediumText": "Consectetur proident id adipisicing incididunt commodo fugiat tempor amet cupidatat enim nostrud laboris. Non do adipisicing proident id et voluptate enim magna exercitation ut est aliqua pariatur. Enim aute voluptate non elit id commodo commodo aliqua nisi.", + "longText": "Qui aute sunt sint mollit ullamco nisi sunt elit ut cupidatat quis reprehenderit. Amet ullamco sit esse fugiat aliqua proident ut. Nisi ea magna occaecat labore amet fugiat eiusmod cupidatat nulla nostrud mollit et laborum commodo. Lorem commodo anim magna anim in sunt cillum elit deserunt do exercitation labore nisi. Nostrud dolore consequat amet esse deserunt in fugiat non dolore magna laborum.\r\n", + "address": "3 Bethel Loop", + "city": "Williams", + "state": "Montana", + "zip": 30034, + "country": "Angola", + "email": "franciswalsh@scentric.com", + "phone": "(922) 539-3195", + "color": "rgb(80,154,75)" + }, + { + "index": 495, + "name": "Leonard Hess", + "first": "Kate", + "last": "Mccoy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "boolean": true, + "guid": "0ef972c8-2eaa-4e56-baca-ec8204dee737", + "integer": 89, + "date": "Thu May 26 1988 06:59:06 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt quis minim magna consectetur ullamco.", + "longText": "Cupidatat incididunt minim laboris eiusmod et ex ad laboris ut commodo ex aliqua. Ea fugiat consectetur sit ut occaecat non est nostrud id in pariatur. Est amet Lorem reprehenderit adipisicing consectetur culpa sit sunt nisi.\r\n", + "address": "4 Caton Avenue", + "city": "Biddle", + "state": "California", + "zip": 25530, + "country": "Bhutan", + "email": "katemccoy@scentric.com", + "phone": "(843) 483-2519", + "color": "rgb(132,225,73)" + }, + { + "index": 496, + "name": "Weiss Malone", + "first": "Buchanan", + "last": "Austin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "boolean": false, + "guid": "cfc771a6-aeb0-47ec-a5a2-c5240c1b6768", + "integer": 6, + "date": "Fri Feb 14 2014 14:08:10 GMT-0800 (PST)", + "shortText": "id ipsum culpa occaecat reprehenderit", + "mediumText": "Fugiat pariatur in Lorem ipsum ex id. Ex commodo magna enim non ullamco nulla officia velit. Et et ipsum deserunt ex pariatur laboris aliqua in elit sunt excepteur quis exercitation consequat. Fugiat est eiusmod esse amet anim ex aliquip ipsum id aliquip dolor. Qui proident veniam enim enim exercitation deserunt ex voluptate consequat.", + "longText": "Fugiat consequat incididunt aute Lorem aliquip labore tempor consequat quis cillum. Incididunt sunt ullamco proident pariatur ad incididunt. Labore pariatur reprehenderit mollit duis proident incididunt do. Excepteur ullamco cupidatat nisi culpa Lorem sit ea ea sint et sint eu. Aliqua dolore amet nulla sit amet irure nostrud nulla non ex. Lorem deserunt sint commodo amet amet incididunt irure aliqua reprehenderit ea minim adipisicing proident. Irure duis enim non commodo ut adipisicing anim ad fugiat amet qui voluptate fugiat.\r\nEiusmod voluptate nulla anim tempor nulla est excepteur ut. Tempor sunt cillum et mollit mollit anim dolore laboris aute et duis consectetur. Proident quis aliqua nisi incididunt minim voluptate eiusmod id ea. Est labore pariatur nulla incididunt anim. Anim eu mollit voluptate pariatur cillum officia exercitation. Dolor amet mollit officia exercitation minim tempor do eu.\r\nProident est do aliqua eiusmod aliquip ex veniam culpa et occaecat. Et reprehenderit ad et nulla ullamco duis pariatur labore duis ex ea minim laboris nulla. Ex cillum nostrud consectetur dolor et esse.\r\n", + "address": "2 Stockholm Street", + "city": "Darrtown", + "state": "Marshall Islands", + "zip": 54123, + "country": "Dominica", + "email": "buchananaustin@scentric.com", + "phone": "(875) 459-2571", + "color": "rgb(115,116,180)" + }, + { + "index": 497, + "name": "Hawkins Parrish", + "first": "Sandy", + "last": "Poole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "boolean": true, + "guid": "00fdef08-9189-40f0-9960-6a59ab906f66", + "integer": 70, + "date": "Sun Apr 24 1994 02:10:50 GMT-0700 (PDT)", + "shortText": "deserunt non ex", + "mediumText": "Do eiusmod nostrud sint consectetur nulla elit est amet et qui voluptate consectetur ullamco elit. Voluptate enim nostrud consequat elit laboris non consequat. Consequat nulla veniam ea eiusmod nulla sunt consequat mollit.", + "longText": "Irure quis duis sint fugiat ut sunt proident esse ut. Aliquip aliqua ea ex magna mollit duis elit non elit labore veniam laborum. Deserunt ex cillum culpa qui non elit culpa ad laboris est.\r\nCillum exercitation ullamco adipisicing cillum irure ipsum sunt dolor irure ullamco. Lorem cupidatat cupidatat occaecat proident dolor sit irure quis do est non reprehenderit. Lorem elit dolore ea fugiat elit dolor. Excepteur est anim velit qui in. Minim sint adipisicing quis ullamco ipsum excepteur. Ullamco Lorem exercitation aute laboris fugiat incididunt.\r\nTempor aliqua cupidatat mollit anim Lorem irure exercitation magna non ullamco eu labore dolore velit. Aliqua enim reprehenderit consectetur est sunt labore aliqua consequat deserunt proident proident tempor mollit ad. Cupidatat velit culpa consequat ea incididunt. Pariatur irure dolore cillum voluptate ut amet sunt labore cillum laboris. Esse id aliquip labore consequat adipisicing culpa amet proident. Laborum voluptate nisi velit qui consectetur. Minim cillum duis pariatur est.\r\nCupidatat sunt consectetur laborum ex cupidatat quis ea ad sint aliqua non. Adipisicing ullamco voluptate mollit ullamco id irure proident ex culpa qui incididunt sint nostrud. Amet mollit occaecat non adipisicing tempor aliqua irure ex id. Velit dolore ea mollit fugiat velit elit eiusmod do exercitation.\r\n", + "address": "3 Manor Court", + "city": "Naomi", + "state": "Indiana", + "zip": 12933, + "country": "Egypt", + "email": "sandypoole@scentric.com", + "phone": "(945) 488-2696", + "color": "rgb(79,165,87)" + }, + { + "index": 498, + "name": "Dena Sweeney", + "first": "Kaitlin", + "last": "Brooks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "boolean": true, + "guid": "805425f6-7a36-4326-a622-fbd1a52bccca", + "integer": 37, + "date": "Thu Aug 03 1989 21:21:57 GMT-0700 (PDT)", + "shortText": "non in", + "mediumText": "Irure ullamco excepteur commodo aute magna dolore in reprehenderit commodo deserunt quis officia. Anim incididunt velit anim adipisicing dolore reprehenderit voluptate est nisi in amet.", + "longText": "Ea exercitation ipsum aliquip excepteur cillum ipsum cupidatat fugiat in do nostrud. Non culpa irure officia qui dolor esse velit. Sint officia proident occaecat laborum quis non ullamco dolor consectetur ipsum do nisi. Commodo adipisicing quis proident culpa.\r\nCupidatat adipisicing ipsum incididunt sunt consequat Lorem dolore. Aliquip adipisicing reprehenderit pariatur occaecat anim incididunt ad cillum. Voluptate cupidatat nostrud aliquip laborum esse irure duis ex culpa laborum laboris incididunt magna duis. Velit do commodo aute pariatur sunt ut voluptate quis minim. Eu mollit tempor excepteur nulla anim officia est dolor deserunt minim duis nostrud.\r\n", + "address": "4 Harrison Avenue", + "city": "Fairacres", + "state": "Tennessee", + "zip": 70961, + "country": "Chile", + "email": "kaitlinbrooks@scentric.com", + "phone": "(894) 591-3716", + "color": "rgb(131,63,152)" + }, + { + "index": 499, + "name": "Saundra Mcbride", + "first": "Rosemary", + "last": "Grimes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "boolean": true, + "guid": "824a5e8d-254c-4041-8370-00c4d28ce820", + "integer": 65, + "date": "Mon Aug 28 2006 02:30:47 GMT-0700 (PDT)", + "shortText": "laborum", + "mediumText": "Aliqua magna proident exercitation elit occaecat ut duis. Ad ipsum duis aliqua qui pariatur cupidatat sint pariatur eiusmod do.", + "longText": "Amet sint officia anim officia nisi reprehenderit. Incididunt magna esse nisi nostrud ipsum. Dolor qui eu enim ipsum commodo deserunt ex ad reprehenderit. Commodo commodo amet ullamco aliquip deserunt excepteur aliqua minim ipsum eu. Culpa minim sunt do dolor excepteur dolore id et culpa id aliquip.\r\nNon excepteur culpa nulla consequat velit amet id. Cupidatat qui id aute reprehenderit adipisicing. Duis consectetur nostrud voluptate laboris culpa ipsum labore irure magna.\r\nLorem mollit cillum velit non proident ex ea esse anim nulla sunt ad laboris. Officia nisi culpa exercitation qui pariatur adipisicing ea incididunt consectetur Lorem. Amet minim labore aliqua nostrud. Eu cillum nulla qui enim non occaecat. Laboris exercitation ea sint cillum velit officia velit officia adipisicing do esse dolore aliqua mollit.\r\nCommodo minim sint excepteur aliquip ex consequat veniam ea culpa reprehenderit consequat est amet dolore. Eu ex amet minim quis dolore voluptate deserunt aliquip consectetur consectetur aliqua officia consequat sunt. Duis ut ex consectetur fugiat laborum duis Lorem cupidatat cupidatat excepteur amet. Id consequat dolor mollit elit pariatur dolor occaecat. Consequat ullamco excepteur cillum eu veniam aliqua ex cupidatat labore ex veniam. Dolore ad et veniam sint eiusmod anim minim.\r\nSint pariatur est enim veniam laboris eu occaecat duis. Ad veniam voluptate occaecat aliquip nostrud culpa aliquip duis proident dolor. Consectetur esse ut laborum elit sunt irure ex duis. Ex laborum eu esse incididunt laborum dolore non aute anim elit deserunt. Non Lorem deserunt culpa do ea exercitation fugiat.\r\n", + "address": "4 Chestnut Street", + "city": "Joes", + "state": "Palau", + "zip": 62428, + "country": "Norfolk Island", + "email": "rosemarygrimes@scentric.com", + "phone": "(923) 453-2279", + "color": "rgb(171,145,136)" + } +] \ No newline at end of file diff --git a/static/bower_components/app-layout/demo/demo1.html b/static/bower_components/app-layout/demo/demo1.html new file mode 100644 index 00000000..c6a66232 --- /dev/null +++ b/static/bower_components/app-layout/demo/demo1.html @@ -0,0 +1,109 @@ + + + + + + + + + demo1 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/demo/demo2.html b/static/bower_components/app-layout/demo/demo2.html new file mode 100644 index 00000000..4d489d63 --- /dev/null +++ b/static/bower_components/app-layout/demo/demo2.html @@ -0,0 +1,76 @@ + + + + + + + + + demo2 + + + + + + + + + + + + + + + + + + + + + + + App name + + + + + + + +
My Drive
+
+
+ + + +
+ +
+ + + diff --git a/static/bower_components/app-layout/demo/demo3.html b/static/bower_components/app-layout/demo/demo3.html new file mode 100644 index 00000000..eb692827 --- /dev/null +++ b/static/bower_components/app-layout/demo/demo3.html @@ -0,0 +1,79 @@ + + + + + + + + + demo3 + + + + + + + + + + + + + + + + + + + + + + + App name + + + + + + + + + + +
My Drive
+
+
+ + + +
+ +
+ + + diff --git a/static/bower_components/app-layout/demo/demo4.html b/static/bower_components/app-layout/demo/demo4.html new file mode 100644 index 00000000..c5e1831e --- /dev/null +++ b/static/bower_components/app-layout/demo/demo4.html @@ -0,0 +1,173 @@ + + + + + + + + + demo4 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/demo/demo5.html b/static/bower_components/app-layout/demo/demo5.html new file mode 100644 index 00000000..1d720118 --- /dev/null +++ b/static/bower_components/app-layout/demo/demo5.html @@ -0,0 +1,127 @@ + + + + + + + + + demo5 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/demo/demo6.html b/static/bower_components/app-layout/demo/demo6.html new file mode 100644 index 00000000..7bb187f3 --- /dev/null +++ b/static/bower_components/app-layout/demo/demo6.html @@ -0,0 +1,126 @@ + + + + + + + + + demo6 + + + + + + + + + + + + + + + + + + + + + + + + + +
Inbox
+
+
+ + + + +
+ + Inbox + + + Snoozed + + + Done + + + Drafts + + + Sent + + + Trash + + + Spam + +
+
+ + + +
+ +
+ + + + + diff --git a/static/bower_components/app-layout/demo/demo7.html b/static/bower_components/app-layout/demo/demo7.html new file mode 100644 index 00000000..ae90ee3a --- /dev/null +++ b/static/bower_components/app-layout/demo/demo7.html @@ -0,0 +1,76 @@ + + + + + + + + + demo7 + + + + + + + + + + + + + + + + + + + + + + + + + +
My Drive
+ +
+
+ + + +
+ + + App name + + +
+ + + diff --git a/static/bower_components/app-layout/demo/sample-content.html b/static/bower_components/app-layout/demo/sample-content.html new file mode 100644 index 00000000..aea8865b --- /dev/null +++ b/static/bower_components/app-layout/demo/sample-content.html @@ -0,0 +1,102 @@ + + + + + + + + + diff --git a/static/bower_components/app-layout/docs.html b/static/bower_components/app-layout/docs.html new file mode 100644 index 00000000..4296757e --- /dev/null +++ b/static/bower_components/app-layout/docs.html @@ -0,0 +1,30 @@ + + + + + + + + + app-layout + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/helpers/helpers.html b/static/bower_components/app-layout/helpers/helpers.html new file mode 100644 index 00000000..3fa0529b --- /dev/null +++ b/static/bower_components/app-layout/helpers/helpers.html @@ -0,0 +1,130 @@ + + + + + diff --git a/static/bower_components/app-layout/helpers/test/index.html b/static/bower_components/app-layout/helpers/test/index.html new file mode 100644 index 00000000..d5b2d52f --- /dev/null +++ b/static/bower_components/app-layout/helpers/test/index.html @@ -0,0 +1,27 @@ + + + + + + helpers tests + + + + + + diff --git a/static/bower_components/app-layout/helpers/test/register-effect.html b/static/bower_components/app-layout/helpers/test/register-effect.html new file mode 100644 index 00000000..bbdcef9e --- /dev/null +++ b/static/bower_components/app-layout/helpers/test/register-effect.html @@ -0,0 +1,49 @@ + + + + + + registerEffect + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/helpers/test/scroll.html b/static/bower_components/app-layout/helpers/test/scroll.html new file mode 100644 index 00000000..2ecdde5e --- /dev/null +++ b/static/bower_components/app-layout/helpers/test/scroll.html @@ -0,0 +1,114 @@ + + + + + + scroll + + + + + + + + + + + + +
+
+
+
+ + + + + diff --git a/static/bower_components/app-layout/index.html b/static/bower_components/app-layout/index.html new file mode 100644 index 00000000..11073e04 --- /dev/null +++ b/static/bower_components/app-layout/index.html @@ -0,0 +1,428 @@ + + + + + + + + + App Layout + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/patterns/expand-card/index.html b/static/bower_components/app-layout/patterns/expand-card/index.html new file mode 100644 index 00000000..5b398b8e --- /dev/null +++ b/static/bower_components/app-layout/patterns/expand-card/index.html @@ -0,0 +1,73 @@ + + + + + + + Expand Card + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/static/bower_components/app-layout/patterns/transform-navigation/index.html b/static/bower_components/app-layout/patterns/transform-navigation/index.html new file mode 100644 index 00000000..07a694dd --- /dev/null +++ b/static/bower_components/app-layout/patterns/transform-navigation/index.html @@ -0,0 +1,39 @@ + + + + + + + Navigation transformation + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/bower_components/app-layout/patterns/transform-navigation/x-app.html b/static/bower_components/app-layout/patterns/transform-navigation/x-app.html new file mode 100644 index 00000000..60403464 --- /dev/null +++ b/static/bower_components/app-layout/patterns/transform-navigation/x-app.html @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/site/device-viewer/device-layout-viewer.html b/static/bower_components/app-layout/site/device-viewer/device-layout-viewer.html new file mode 100644 index 00000000..c603af2d --- /dev/null +++ b/static/bower_components/app-layout/site/device-viewer/device-layout-viewer.html @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/site/device-viewer/device-view.html b/static/bower_components/app-layout/site/device-viewer/device-view.html new file mode 100644 index 00000000..3af578de --- /dev/null +++ b/static/bower_components/app-layout/site/device-viewer/device-view.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/site/device-viewer/index.html b/static/bower_components/app-layout/site/device-viewer/index.html new file mode 100644 index 00000000..8fc334e9 --- /dev/null +++ b/static/bower_components/app-layout/site/device-viewer/index.html @@ -0,0 +1,42 @@ + + + + + + + + + Device Viewer + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/bower_components/app-layout/site/images/cds2015.png b/static/bower_components/app-layout/site/images/cds2015.png new file mode 100644 index 00000000..65f0851a Binary files /dev/null and b/static/bower_components/app-layout/site/images/cds2015.png differ diff --git a/static/bower_components/app-layout/site/images/getting-started.png b/static/bower_components/app-layout/site/images/getting-started.png new file mode 100644 index 00000000..2484c8c0 Binary files /dev/null and b/static/bower_components/app-layout/site/images/getting-started.png differ diff --git a/static/bower_components/app-layout/site/images/io2016.png b/static/bower_components/app-layout/site/images/io2016.png new file mode 100644 index 00000000..ae7950b8 Binary files /dev/null and b/static/bower_components/app-layout/site/images/io2016.png differ diff --git a/static/bower_components/app-layout/site/images/landing-page.png b/static/bower_components/app-layout/site/images/landing-page.png new file mode 100644 index 00000000..ed264cd0 Binary files /dev/null and b/static/bower_components/app-layout/site/images/landing-page.png differ diff --git a/static/bower_components/app-layout/site/images/pesto.png b/static/bower_components/app-layout/site/images/pesto.png new file mode 100644 index 00000000..3168cc65 Binary files /dev/null and b/static/bower_components/app-layout/site/images/pesto.png differ diff --git a/static/bower_components/app-layout/site/images/pica.png b/static/bower_components/app-layout/site/images/pica.png new file mode 100644 index 00000000..d5c45564 Binary files /dev/null and b/static/bower_components/app-layout/site/images/pica.png differ diff --git a/static/bower_components/app-layout/site/images/polymer-summit.png b/static/bower_components/app-layout/site/images/polymer-summit.png new file mode 100644 index 00000000..52e74091 Binary files /dev/null and b/static/bower_components/app-layout/site/images/polymer-summit.png differ diff --git a/static/bower_components/app-layout/site/images/polymer.svg b/static/bower_components/app-layout/site/images/polymer.svg new file mode 100644 index 00000000..a92331e8 --- /dev/null +++ b/static/bower_components/app-layout/site/images/polymer.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/site/images/publishing.png b/static/bower_components/app-layout/site/images/publishing.png new file mode 100644 index 00000000..9a394cdc Binary files /dev/null and b/static/bower_components/app-layout/site/images/publishing.png differ diff --git a/static/bower_components/app-layout/site/images/shrine.png b/static/bower_components/app-layout/site/images/shrine.png new file mode 100644 index 00000000..f85715c8 Binary files /dev/null and b/static/bower_components/app-layout/site/images/shrine.png differ diff --git a/static/bower_components/app-layout/site/images/test-drive.png b/static/bower_components/app-layout/site/images/test-drive.png new file mode 100644 index 00000000..923b47b0 Binary files /dev/null and b/static/bower_components/app-layout/site/images/test-drive.png differ diff --git a/static/bower_components/app-layout/site/resources.json b/static/bower_components/app-layout/site/resources.json new file mode 100644 index 00000000..dd5a1335 --- /dev/null +++ b/static/bower_components/app-layout/site/resources.json @@ -0,0 +1,76 @@ +{ + "templates": [ + { + "name": "GETTING STARTED", + "thumbnail": "site/images/getting-started.png", + "demoUrl": "templates/getting-started/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/getting-started" + }, + { + "name": "ZUPERKÜLBLOG", + "thumbnail": "site/images/publishing.png", + "demoUrl": "templates/publishing/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/publishing" + }, + { + "name": "PESTO", + "thumbnail": "site/images/pesto.png", + "demoUrl": "templates/pesto/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/pesto" + }, + { + "name": "SHRINE", + "thumbnail": "site/images/shrine.png", + "demoUrl": "templates/shrine/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/shrine" + }, + { + "name": "TEST DRIVE", + "thumbnail": "site/images/test-drive.png", + "demoUrl": "templates/test-drive/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/test-drive" + }, + { + "name": "LANDING PAGE", + "thumbnail": "site/images/landing-page.png", + "demoUrl": "templates/landing-page/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/templates/landing-page" + } + ], + "patterns": [ + { + "name": "Transform Navigation", + "desc": "As more screen space is available, side navigation can transform into tabs.", + "demoUrl": "patterns/transform-navigation/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/patterns/transform-navigation/x-app.html" + }, + { + "name": "Expand Card", + "desc": "Content cards may expand to take up more horizontal space.", + "demoUrl": "patterns/expand-card/", + "sourceUrl": "https://github.com/PolymerElements/app-layout/tree/master/patterns/expand-card/index.html" + } + ], + "apps": [ + { + "name": "Google I/O 2016", + "thumbnail": "site/images/io2016.png", + "demoUrl": "https://events.google.com/io2016/" + }, + { + "name": "Polymer Summit 2015", + "thumbnail": "site/images/polymer-summit.png", + "demoUrl": "https://www.polymer-project.org/summit" + }, + { + "name": "Chrome Dev Summit 2015", + "thumbnail": "site/images/cds2015.png", + "demoUrl": "https://developer.chrome.com/devsummit" + }, + { + "name": "PICA", + "thumbnail": "site/images/pica.png", + "demoUrl": "https://frankiefu.github.io/pica/" + } + ] +} diff --git a/static/bower_components/app-layout/templates/getting-started/bower.json b/static/bower_components/app-layout/templates/getting-started/bower.json new file mode 100644 index 00000000..330cf5bb --- /dev/null +++ b/static/bower_components/app-layout/templates/getting-started/bower.json @@ -0,0 +1,13 @@ +{ + "name": "getting-started", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/getting-started/index.html b/static/bower_components/app-layout/templates/getting-started/index.html new file mode 100644 index 00000000..d088f244 --- /dev/null +++ b/static/bower_components/app-layout/templates/getting-started/index.html @@ -0,0 +1,39 @@ + + + + + + + + + Getting Started + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/getting-started/x-app.html b/static/bower_components/app-layout/templates/getting-started/x-app.html new file mode 100644 index 00000000..59d06ab3 --- /dev/null +++ b/static/bower_components/app-layout/templates/getting-started/x-app.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/landing-page/bower.json b/static/bower_components/app-layout/templates/landing-page/bower.json new file mode 100644 index 00000000..7ff2bde3 --- /dev/null +++ b/static/bower_components/app-layout/templates/landing-page/bower.json @@ -0,0 +1,14 @@ +{ + "name": "landing-page", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/landing-page/index.html b/static/bower_components/app-layout/templates/landing-page/index.html new file mode 100644 index 00000000..817c1f53 --- /dev/null +++ b/static/bower_components/app-layout/templates/landing-page/index.html @@ -0,0 +1,39 @@ + + + + + + + + + Landing Page + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/landing-page/x-app.html b/static/bower_components/app-layout/templates/landing-page/x-app.html new file mode 100644 index 00000000..cd13efc9 --- /dev/null +++ b/static/bower_components/app-layout/templates/landing-page/x-app.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/pesto/bower.json b/static/bower_components/app-layout/templates/pesto/bower.json new file mode 100644 index 00000000..49ec9e05 --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/bower.json @@ -0,0 +1,24 @@ +{ + "name": "pesto", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "app-route": "polymerelements/app-route#^0.9.1", + "iron-ajax": "polymerelements/iron-ajax#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-pages": "polymerelements/iron-pages#^1.0.0", + "iron-selector": "polymerelements/iron-selector#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "paper-card": "PolymerElements/paper-card#^1.0.0", + "paper-fab": "PolymerElements/paper-fab#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-listbox": "PolymerElements/paper-listbox#^1.0.0", + "paper-menu-button": "PolymerElements/paper-menu-button#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/pesto/data/recipes.json b/static/bower_components/app-layout/templates/pesto/data/recipes.json new file mode 100644 index 00000000..5d71240f --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/data/recipes.json @@ -0,0 +1,402 @@ +[ + { + + "id": "1", + "name": "Pesto Bruchetta", + "author": "Peter Carlsson", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/image2-01.png", + "description": "Bask in greens this season by trying this delightful take on traditional bruschetta. Top with a dollop of homemade pesto, and season with freshly ground sea salt and pepper.", + "ingredients": [{ + "amount": "6 pieces", + "description": "Mozzarella cheese" + }, { + "amount": "6 pieces", + "description": "Toasts" + }, { + "amount": "⅔ cup", + "description": "Homemade pesto" + }, { + "amount": "1tbsp", + "description": "Freshly ground pepper" + }, { + "amount": "1 tsp", + "description": "Salt" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "2", + "name": "Rustic purple mash", + "author": "Trevor Hansen", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/blue-potato.jpg", + "description": "Abundant in color, and healthy, delicious goodness, cooking with these South American purple potatoes is a treat. Boil, mash, bake, or roast them. For taste cook with chicken stock, and a dash of extra virgin olive oil.", + "ingredients": [{ + "amount": "2 lbs", + "description": "Purple potatoes, skin on" + }, { + "amount": "1 tsp", + "description": "Salt" + }, { + "amount": "2 tsp", + "description": "Lemon" + }, { + "amount": "4 cups", + "description": "Chicken stock" + }, { + "amount": "1tbsp", + "description": "Extra virgin olive oil" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "3", + "name": "Bacon Sprouts", + "author": "Ali Connors", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/image1-01.png", + "description": "This beautiful sprouts recipe is the most glorious side dish on a cold winter’s night. Construct it with bacon or fake-on, but always make sure the sprouts are deliciously seasoned and appropriately sautéed.", + "ingredients": [{ + "amount": "2 lbs", + "description": "Brussel sprouts" + }, { + "amount": "3 lbs", + "description": "Bacon" + }, { + "amount": "⅔ cup", + "description": "Shaved parmesan cheese" + }, { + "amount": "1tbsp", + "description": "Extra virgin olive oil" + }, { + "amount": "1 tsp", + "description": "Lemon juice" + }, { + "amount": "1/2 cup", + "description": "Sun dried tomatoes" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "4", + "name": "Oven Sausage", + "author": "Sandra Adams", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/sausage.jpg", + "description": "Robust cuts of portuguese sausage add layers of flavour. Bake or fry until sausages are slightly browned and with a crispy skin. Serve warm and with cuts of pineapple for a delightful mix of sweet and savory flavour. This is the perfect dish after a swim in the sea.", + "ingredients": [{ + "amount": "1 1/2 lbs", + "description": "Linguisa" + }, { + "amount": "1 lbs", + "description": "Pineapple or other fresh citrus fruit" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "5", + "name": "Chicken tostadas", + "author": "Peter Carlsson", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/image5.png", + "description": "Crisp flavours and a bit of spice make this roasted chicken dish an easy go to when cooking for large groups. Top with Baja sauce for an extra kick of spice.", + "ingredients": [{ + "amount": "4-6", + "description": "Small corn tortillas" + }, { + "amount": "½ cup", + "description": "Chopped onion" + }, { + "amount": "⅔", + "description": "Cream" + }, { + "amount": "3-4oz", + "description": "Roasted, shredded chicken breast" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "6", + "name": "Coconut rice", + "author": "Ali Connors", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/white-rice.jpg", + "description": "This dish is a terrific pairing to almost any main. Bonus- it’s quick, easy to make, and turns even the simplest of dishes into a delicacy. Sweet coconut cream will leave your mouth watering, with yummy caramelized flecks of rice adding an extra bit of taste. Fluff with fork before serving for best results.", + "ingredients": [{ + "amount": "2 cups", + "description": "Jasmine rice" + }, { + "amount": "1 1/2 cups", + "description": "Water" + }, { + "amount": "1 cup", + "description": "Coconut milk" + }, { + "amount": "1 1/2 tbsp", + "description": "Sugar" + }, { + "amount": "1tsp", + "description": "Salt" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "7", + "name": "Gin basil cocktail", + "author": "Trevor Hansen", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/IMG_5447.jpg", + "description": "This mellow and herb filled blending of simple ingredients is easy enough to mix that a novice host will feel like a seasoned bartender. Top with crushed basil, shake or stir.", + "ingredients": [{ + "amount": "3 parts", + "description": "Gin" + }, { + "amount": "1 part", + "description": "Fresh lemon juice" + }, { + "amount": "½ part", + "description": "Simple syrup" + }, { + "amount": "5", + "description": "Basil leaves, crushed" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "8", + "name": "Seared sesame fish", + "author": "Ali Connors", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/fish-steaks.jpg", + "description": "Cuts of fish like this are perfect for simple searing with bright flavours. Try Sesame seeds on these fillets for crusty skin filled with crunch. For added flavour try dipping in a homemade ponzu sauce - delicious.", + "ingredients": [{ + "amount": "1 ½ lbs", + "description": "Thin fish fillets" + }, { + "amount": "1 lb", + "description": "Salt and black pepper to taste" + }, { + "amount": "3/4 cup", + "description": "Sesame seeds" + }, { + "amount": "2tbsp", + "description": "Sesame oil" + }, { + "amount": "1tbsp", + "description": "Lime juice" + }, { + "amount": "2 tbsp", + "description": "Soy sauce" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "9", + "name": "Herb artichoke", + "author": "Sandra Adams", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/IMG_5438.png", + "description": "This tasty and healthy veggie is a favorite. Artichoke like this can be paired with a hearty main or works well as a small meal with some white wine on the side. Simple and fresh, all foodies love tasty artichoke.", + "ingredients": [{ + "amount": "1", + "description": "Small garlic clove, peeled" + }, { + "amount": "2", + "description": "Whole artichokes" + }, { + "amount": "4 tbsp", + "description": "Fresh lemon juice" + }, { + "amount": "4 tbsp", + "description": "Unsalted butter" + }, { + "amount": "2 tbsp", + "description": "Extra-virgin olive oil" + }, { + "amount": "1⁄4 tsp", + "description": "Freshly ground black pepper" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "10", + "name": "Pesto bruschetta", + "author": "Trevor Hansen", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/IMG_5332.png", + "description": "Life is good when you add amazingly warm bread, fresh pesto sauce, and roasted tomatoes to the table. This a classic starter to break out in a pinch. It’s easy to make and extra tasty.", + "ingredients": [{ + "amount": "1 loaf", + "description": "Sliced French bread" + }, { + "amount": "½ cup", + "description": "Cheese" + }, { + "amount": "1 cup", + "description": "Heirloom tomatoes" + }, { + "amount": "1 cup", + "description": "Fresh basil" + }, { + "amount": "1 clove", + "description": "Garlic " + }, { + "amount": "½ tbsp", + "description": "Olive oil" + }, { + "amount": "3tsp", + "description": "White wine vinegar" + }, { + "amount": "¼ tsp", + "description": "Sea salt" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "11", + "name": "Garlic bok choy", + "author": "Sandra Adams", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/bok-choy.jpg", + "description": "Great stir-fried bok choy starts at the market. For me, nothing says tasty like garlic and baby bok choy. Choose fresh, crisp greens. Once home, wash, chop, and then ready for the wok. No family style spread is complete without these greens.", + "ingredients": [{ + "amount": "1/2 cup", + "description": "Chick broth" + }, { + "amount": "1 tbsp", + "description": "Soy sauce" + }, { + "amount": "¼ cup", + "description": "Sliced garlic" + }, { + "amount": "2-3 lbs", + "description": "Bok choy" + }, { + "amount": "2 tsp", + "description": "Sesame oil" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "12", + "name": "Fresh Fettuccine", + "author": "Ali Connors", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/pasta.png", + "description": "Satisfy a need for rich, creamy homemade goodness with this classic. Creamy fettuccine alfredo will have you hitting the gym the next day, but it’s so good it’s worth it.", + "ingredients": [{ + "amount": "¾ cup", + "description": "Milk" + }, { + "amount": "1 ½ tsp", + "description": "Salt" + }, { + "amount": "1 tbsp", + "description": "Olive oil" + }, { + "amount": "8oz", + "description": "Fettuccine" + }, { + "amount": "½ cup", + "description": "Fresh basil" + }, { + "amount": "½ cup", + "description": "Fresh ground pepper" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + }, + { + "id": "13", + "name": "Sicilian-Style sardines", + "author": "Peter Carlsson", + "imageUrl": "https://app-layout-assets.appspot.com/assets/pesto/food/IMG_0575.jpg", + "description": "My go to way to eat sardines is with a splash of tangy lemon and fresh fennel drizzled on top. The best thing about this dish is the flavour it packs. Prepaid with wild caught sardines or canned.", + "ingredients": [{ + "amount": "1/4 cup", + "description": "Dry white wine" + }, { + "amount": "1", + "description": "Finely chopped shallot" + }, { + "amount": "2 tbsp", + "description": "Fresh lemon juice" + }, { + "amount": "1 tbsp", + "description": "Fennel seeds, crushed" + }, { + "amount": "4 tbsp", + "description": "Extra virgin olive oil, to taste" + }, { + "amount": "2 cans", + "description": "Sardines in oil, drained" + }], + "steps": [{ + "duration": "3 min", + "description": "Stir" + }, { + "duration": "45 min", + "description": "Cook" + }] + } +] diff --git a/static/bower_components/app-layout/templates/pesto/index.html b/static/bower_components/app-layout/templates/pesto/index.html new file mode 100644 index 00000000..e9855a50 --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/index.html @@ -0,0 +1,55 @@ + + + + + + + + + + Pesto by Polymer + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/pesto/manifest.json b/static/bower_components/app-layout/templates/pesto/manifest.json new file mode 100644 index 00000000..afb1283a --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Pesto", + "name": "Pesto by Polymer", + "display": "standalone", + "icons": [{ + "src": "https://app-layout-assets.appspot.com/assets/pesto/icon-144.png", + "sizes": "144x144", + "type": "image/png" + }, { + "src": "https://app-layout-assets.appspot.com/assets/pesto/icon-256.png", + "sizes": "256x256", + "type": "image/png" + }], + "start_url": "index.html" +} diff --git a/static/bower_components/app-layout/templates/pesto/src/app-icons.html b/static/bower_components/app-layout/templates/pesto/src/app-icons.html new file mode 100644 index 00000000..c3946e0c --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/src/app-icons.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/pesto/src/recipe-app.html b/static/bower_components/app-layout/templates/pesto/src/recipe-app.html new file mode 100644 index 00000000..2a74a2da --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/src/recipe-app.html @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/pesto/src/recipe-detail.html b/static/bower_components/app-layout/templates/pesto/src/recipe-detail.html new file mode 100644 index 00000000..bea096b4 --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/src/recipe-detail.html @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/pesto/src/recipe-list.html b/static/bower_components/app-layout/templates/pesto/src/recipe-list.html new file mode 100644 index 00000000..b7158aa1 --- /dev/null +++ b/static/bower_components/app-layout/templates/pesto/src/recipe-list.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/bower.json b/static/bower_components/app-layout/templates/publishing/bower.json new file mode 100644 index 00000000..c9393e56 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/bower.json @@ -0,0 +1,23 @@ +{ + "name": "publishing", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "app-route": "polymerelements/app-route#^0.9.1", + "font-roboto": "polymerelements/font-roboto#^1.0.0", + "iron-ajax": "polymerelements/iron-ajax#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-pages": "polymerelements/iron-pages#^1.0.0", + "iron-selector": "polymerelements/iron-selector#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "iron-media-query": "polymerelements/iron-media-query#^1.0.0", + "paper-fab": "PolymerElements/paper-fab#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/publishing/data/articles.json b/static/bower_components/app-layout/templates/publishing/data/articles.json new file mode 100644 index 00000000..e1eba51d --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/data/articles.json @@ -0,0 +1,111 @@ +[ + { + "name":"art", + "title":"Art", + "items":[ + { + "id": "1", + "title":"Tooling Up", + "author":"Amber Bravo", + "date":"June 14 2015", + "primaryColor":"#5a7785", + "secondaryColor":"#455a64", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/tooling-up-header-a13cfd9a.svg", + "desc":"How a new generation of prototyping tools at Google will help designers build better software.", + "content":"The road from design to production is often hard-won, filled with well-intended design detours, steep learning curves, and the occasional road block. Here’s a common scenario: A team of designers begins building wireframes for a new product. Several weeks, revisions, and pin-ups later, they emerge with a “final,” “shippable” file, which they hand off to the development team. The engineers poke holes in the design, deeming several elements “unbuildable,” and begin rendering out some semblance of the design in code. Several weeks later, they deliver a staging site. The designers are thrilled—this is the first time they’ve seen their design IRL—but are quickly deflated when they realize how much of the design has been lost in translation. The typography is wonky. The animations and interactive elements need to be re-tuned. A volley of annotated emails with screenshots ensues, until finally, the designer and developer sit side-by-side, and visually adjust the design directly in code." + }, + { + "id": "2", + "title":"Expressing Brand in Material", + "author":"Viktor Persson & Rachel Been", + "date":"July 4 2015", + "primaryColor":"#202226", + "secondaryColor":"#333", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/article_brand_2x1_202226-fc539618.svg", + "desc":"Material design offers a system for designing functional and elegant software. How does your brand fit into the framework? We’ve created a step-by-step guide to staying on-brand while going material.", + "content":"Nobody knows your brand better than you do. This is why when we set out to create the framework for material design, we were sensitive to the ways in which third-party developers might leverage the system. We wanted material design to give comprehensive guidance for designing effective and elegant UIs — taking a strong position on motion, dimensionality, color, and graphic hierarchy — but with enough latitude to allow for various levels of engagement. You don’t have to adopt every element of the material design system in order for it to be beneficial to your identity system. Whether it’s a custom font, a unique color story, or distinct voice, everything that provides stylistic distinction in a product should be celebrated and supported in the material design framework. We’ve laid out the top brand touchpoints to help illustrate the system’s flexibility and give designers and developers a road map for showcasing their brand identity." + }, + { + "id": "3", + "title":"New Design Tools", + "author":"Amber Bravo", + "date":"July 29 2015", + "primaryColor":"#3e50b4", + "secondaryColor":"#303fc3", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/150727_GD_Article_ToolingUpFurther_1x1Tile-01-86c8e03e.svg", + "desc":"See Also: (More) thoughts on design tools", + "content":"This week on Google Design, we published a roundtable discussion with Matias Duarte and the founders of Pixate and RelativeWave, Paul Colton and Max Wiesel. To prepare for the interview, I turned to my design brethren on Medium (and beyond!) to learn more about their experiences working with some of the more popular prototyping tools available today, as well as their hopes and dreams for the next generation of design software. Here are a few of the stories I found helpful for framing the discussion. A thorough account of using Form (pre 1.3) for the first time, from the perspective of a designer who is less familiar with Quarz Composer, with built prototypes to help synthesize the material covered in each section. Also worth reading: Ces’ great tutorial exploring material design in Origami." + } + ] + }, + { + "name":"film", + "title":"Film", + "items":[ + { + "id": "1", + "title":"Design from iOS to Android (and Back Again)", + "author":"Roman Nurik & Viltor Persson", + "date":"Aug 20 2015", + "primaryColor":"#3e50b4", + "secondaryColor":"#303F9F", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/renditions/Article_iOS_to_Android_Header_3e50b4-f064882f-1240.png", + "desc":"A practical guide to designing across platforms", + "content":"Designing and developing between platforms is a lot like traveling through different countries. You go through the same motions — sleeping, eating, sightseeing, regardless of where you are — but the customs of the country you’re visiting dictate how you go about doing them. In some countries, it’s ok to push people into the train, or eat a burger with a knife and fork. Similarly, if you developed your product first for iOS, you shouldn’t simply expect that you can port it into Android without issue, because your app will feel lost in translation. It’s important to understand the idioms and behaviors of each platform before you start design and development. That way your users will be able to use and easily understand your app on the platform that is native to them, and you will have the most clear and true version of your product — no matter where it’s used. This guide will walk you through some practical tips for moving from iOS to Android (and back again) without suffering a cultural divide." + }, + { + "id": "2", + "title":"Demystifying Density", + "author":"Sebastien Gabriel", + "date":"July 10 2015", + "primaryColor":"#00ccb8", + "secondaryColor":"#00b7a5", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/article_dpi_00ccb8-34fdd39e.svg", + "desc":"Sebastien Gabriel takes one for the team with his exhaustive guide to DPI & PPI", + "content":"Dots Per Inch and Pixels Per Inch, DPI and PPI respectively, are units for measuring the tiny bits of color that come together to form a printed image or an image on a screen. The higher the density of those dots or pixels, the higher the resolution. For most, a rudimentary understanding of DPI or PPI amounts to knowing whether or not an image is clear but small enough to print, email, or post to social media. However, for designers, understanding screen density and ratio is essential to delivering delightful user experiences across devices. Designing for phones, tablets, laptops, watches, and hybrids without a proper knowledge of dpi and ratio is a lot like building a house using the wrong measurement — things are going to look very weird very quickly (and good luck getting through the door!)." + }, + { + "id": "3", + "title":"Pixate and Form 1.3", + "author":"Google Design", + "date":"May 30 2015", + "primaryColor":"#eeeeee", + "secondaryColor":"#9e9e9e", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/pixate-and-form-1-3-header-2061f19f.svg", + "desc":"Discover the latest features and start designing native prototypes on your device.", + "content":"We’re thrilled to announce that Pixate has joined Google! Pixate adds to our ongoing effort to develop new design and prototyping tools, including Form 1.3. Explore the latest features of both products below, and check out our roundtable conversation with Matias Duarte, VP Design at Google, and the the founders of Pixate and Form. A visual prototyping platform that allows designers to create sophisticated, fluid mobile prototypes that run natively on iOS and Android devices. Creating complete app prototypes or crafting carefully choreographed interactions that look and feel completely real, and sharing them so entire product teams or clients can experience them right on their device." + }, + { + "id": "4", + "title":"Welcome to the New Google Design", + "author":"Google Design", + "date":"Sep 10 2015", + "primaryColor":"#3367d6", + "secondaryColor":"#2755CC", + "image":"https://g-design.storage.googleapis.com/production/v5/assets/Article_Welcome_Header_2880-ce3ec22d.svg", + "desc":"More design, all the time", + "content":"Much has happened in the year since we launched Google Design and introduced our material design framework at Google I/O 2014. We hosted FORM, Google’s first-ever design conference in San Francisco and engaged in numerous outreach efforts through workshops, design sprints, and online discussions. We’ve continued to improve and expand on the material design guidelines and have witnessed countless teams both inside and outside Google adopt the framework and ship beautiful, materialized products across platforms. To better capture all this great design work happening at Google and around the community, we’ve completely reconceived Google Design. In addition to all the guidelines and resources you’ve come to rely on, we’ve also released guides for TV, Auto, and Cardboard, our virtual reality product. Our new Icon Library allows you to download our icon font and source from the over 800 material system icons. We’ve also added a whole new layer of written and video content — everything from tutorials, case-studies, interviews, and essays, to a listing of job opportunities and design-related events, like our upcoming FORM conference. The goal is to provide a new perspective on our design process and ample opportunity for cross pollination. Now you can watch an animated color tutorial before you dive into the nitty gritty details in our material design guidelines, or get some practical guidance around designing between platforms. Our Making Material Design series takes you behind-the-scenes to find out what it takes to create a new visual framework for Google. Additionally, we’ve launched new Dribbble and YouTube channels to complement our active Twitter and Google+ presence and can share even more real-time content from our design teams. We hope you enjoy the the new Google Design, and we look forward to hearing your feedback on Twitter and Google+. After all, good design is never done." + } + ] + }, + { + "name":"photography", + "title":"Photography", + "items":[] + }, + { + "name":"design", + "title":"Design", + "items":[] + }, + { + "name":"topten", + "title":"Top Ten", + "items":[] + }, + { + "name":"aday", + "title":"A Day in the Life", + "items":[] + } +] \ No newline at end of file diff --git a/static/bower_components/app-layout/templates/publishing/index.html b/static/bower_components/app-layout/templates/publishing/index.html new file mode 100644 index 00000000..6b34bdd5 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/index.html @@ -0,0 +1,49 @@ + + + + + + + + + + ZUPERKÜLBLOG + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/manifest.json b/static/bower_components/app-layout/templates/publishing/manifest.json new file mode 100644 index 00000000..2ccb9479 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Zuperkülblog", + "short_name": "Zuperkülblog", + "icons": [{ + "src": "//app-layout-assets.appspot.com/assets/zuperkulblog/launcher-icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, { + "src": "//app-layout-assets.appspot.com/assets/zuperkulblog/launcher-icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + },{ + "src": "//app-layout-assets.appspot.com/assets/zuperkulblog/launcher-icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }], + "start_url": "index.html", + "background_color": "#fafafa", + "display": "standalone", + "theme_color": "#fafafa" +} diff --git a/static/bower_components/app-layout/templates/publishing/src/app-icons.html b/static/bower_components/app-layout/templates/publishing/src/app-icons.html new file mode 100644 index 00000000..94ef2c91 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/src/app-icons.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/src/article-detail.html b/static/bower_components/app-layout/templates/publishing/src/article-detail.html new file mode 100644 index 00000000..8bd61d5b --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/src/article-detail.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/src/article-headline.html b/static/bower_components/app-layout/templates/publishing/src/article-headline.html new file mode 100644 index 00000000..e63f12f5 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/src/article-headline.html @@ -0,0 +1,69 @@ + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/src/blog-app.html b/static/bower_components/app-layout/templates/publishing/src/blog-app.html new file mode 100644 index 00000000..2eec1a37 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/src/blog-app.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/publishing/src/two-columns-grid.html b/static/bower_components/app-layout/templates/publishing/src/two-columns-grid.html new file mode 100644 index 00000000..9a7d4b16 --- /dev/null +++ b/static/bower_components/app-layout/templates/publishing/src/two-columns-grid.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/bower.json b/static/bower_components/app-layout/templates/shrine/bower.json new file mode 100644 index 00000000..91403a44 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/bower.json @@ -0,0 +1,21 @@ +{ + "name": "shrine", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "app-route": "polymerelements/app-route#^0.9.1", + "iron-ajax": "polymerelements/iron-ajax#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-pages": "polymerelements/iron-pages#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-media-query": "polymerelements/iron-media-query#^1.0.0", + "paper-fab": "PolymerElements/paper-fab#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-tabs": "PolymerElements/paper-tabs#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/shrine/data/featured.json b/static/bower_components/app-layout/templates/shrine/data/featured.json new file mode 100644 index 00000000..a2092b32 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/data/featured.json @@ -0,0 +1,72 @@ +[ + { + "id": 16, + "title": "Green comfort chair", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/chair.png", + "storeName": "Ali’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/ali-connors.png", + "price": "$300", + "category": "Feature" + }, + { + "id": 12, + "title": "Beautiful little teapot", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/beachball.png", + "storeName": "Trevor’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/zach.jpg", + "price": "$300", + "category": "Latest" + }, + { + "id": 6, + "title": "Original Sunnies For U", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/chucks.png", + "storeName": "Sandra’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sandra-adams.jpg", + "price": "$300", + "category": "Fashion" + }, + { + "id": 17, + "title": "Folding Chair", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/lawn_chair.png", + "storeName": "Stella’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/16c477b.jpg", + "price": "$300", + "category": "Furniture" + }, + { + "id": 18, + "title": "Better wearing heels", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/heels.png", + "storeName": "Peter’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/peter-carlsson.png", + "price": "$300", + "category": "Beauty" + }, + { + "id": 3, + "title": "Red Popsicle", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/popsicle.png", + "storeName": "Trevor’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/zach.jpg", + "price": "$300", + "category": "Food" + }, + { + "id": 10, + "title": "Best gift for the traveler", + "quote": "Leave the tunnel and the rain is fallin amazing things happen when you wait", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/backpack.png", + "storeName": "Sandra’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sandra-adams.jpg", + "price": "$300", + "category": "Travel" + } +] \ No newline at end of file diff --git a/static/bower_components/app-layout/templates/shrine/data/items.json b/static/bower_components/app-layout/templates/shrine/data/items.json new file mode 100644 index 00000000..52e5af9c --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/data/items.json @@ -0,0 +1,192 @@ +[{ + "id": 0, + "title": "Vintage Bluetooth Radio", + "description": "Isn’t it cool when things look old, but their not. Looks Old But Not makes awesome vintage goods that are super smart. This ol’ radio just got an upgrade. Connect to it with an app and jam out to some top forty.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/radio.png", + "price": "$300", + "storeName": "Sandra’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sandra-adams.jpg", + "storeDescription": "Sandra specializes in furniture, beauty and travel products with a classic vibe. Custom orders are available if you’re looking for a certain color or material.", + "featured": false +}, +{ + + "id": 1, + "title": "Sunglasses", + "description": "Be an optimist. Carry Sunglasses with you at all times. All Tints and Shades products come with polarized lenses and super duper UV protection so you can look at the sun for however long you want. Sunglasses make you look cool, wear them.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sunnies.png", + "price": "$70", + "storeName": "Trevor’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/zach.jpg", + "storeDescription": "Trevor Hanson sources housewares and styles from just about everywhere. Super cool and extra awesome all of his shop’s goods are handmade with love.", + "featured": false +}, +{ + + "id": 2, + "title": "Clock", + "description": "Timekeeper Co makes clocks that tell time precisely. Clock is very simple to use, set the time using your phone, hang it, and viola! You’ll never be late again.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/clock.png", + "price": "$120", + "storeName": "Trevor’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/zach.jpg", + "storeDescription": "Trevor Hanson sources housewares and styles from just about everywhere. Super cool and extra awesome all of his shop’s goods are handmade with love.", + "featured": false +}, +{ + + "id": 3, + "title": "Red Popsicle", + "description": "Looks can be deceiving. This Red Popsicle comes in a wide variety of flavors, including strawberry, that burst as soon as it hits the mouth. Red Popsicles melt slow, so savor the flavor.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/popsicle.png", + "price": "$300", + "storeName": "Stella’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/16c477b.jpg", + "storeDescription": "Stella sells awesome stuff at lovely prices. made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 4, + "title": "Green Slip-ons", + "description": "Feetsy has been making extraordinary slip-ons for decades. With each pair of shoes purchased Feetsy donates a pair to those in need. Buy yourself a pair, buy someone else a pair. Very Comfortable.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/green-shoes.png", + "price": "$75", + "storeName": "Sandra’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sandra-adams.jpg", + "storeDescription": "Sandra specializes in furniture, beauty and travel products with a classic vibe. Custom orders are available if you’re looking for a certain color or material.", + "featured": false +}, +{ + + "id": 5, + "title": "Teapot", + "description": "Impress your guests with Teapot by Kitchen Stuff. Teapot holds extremely hot liquids and pours them from the spout. Use the handle, shown on the left, so your fingers don’t get burnt while pouring.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/teapot.png", + "price": "$210", + "storeName": "Ali’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/ali-connors.png", + "storeDescription": "Ali Connor’s makes custom goods for folks of all shapes and sizes made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 6, + "title": "Blue suede shoes", + "description": "Who needs pants when you have shoes! Blue suede shoes were meant to go dancing in, so you may want to pick up a few of these. These things are stylish.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/chucks.png", + "price": "$89", + "storeName": "Trevor’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/zach.jpg", + "storeDescription": "Trevor Hanson sources housewares and styles from just about everywhere. Super cool and extra awesome all of his shop’s goods are handmade with love.", + "featured": true +}, +{ + + "id": 7, + "title": "Dipped Brush", + "description": "WeDipIt does it again. This handle dipped 4 inch brush is a perfect for painting 4 inch lines, or coloring in big areas with paint. Just be sure you don’t drop it in a bucket of red paint, then it won’t look dipped anymore.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/brush.png", + "price": "$25", + "storeName": "Stella’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/16c477b.jpg", + "storeDescription": "Stella sells awesome stuff at lovely prices. made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": true +}, +{ + + "id": 8, + "title": "Perfect Goldfish Bowl", + "description": "The Perfect Bowl Co makes the best bowls for just about anything you can think of. This Perfect Goldfish Bowl holds water and fish perfectly. Looks great in living rooms. Keep out of reach from cats.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/fish_bowl.png", + "price": "$25", + "storeName": "Ali’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/ali-connors.png", + "storeDescription": "Ali Connor’s makes custom goods for folks of all shapes and sizes made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 9, + "title": "Red Lipstick Set", + "description": "Trying to find the perfect shade to match your mood? Try no longer. Red Lipstick Set by StickLips has you covered for those nights when you need to get out, or even if you’re just headed to work.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/lipstick.png", + "price": "$25", + "storeName": "Sandra’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/sandra-adams.jpg", + "storeDescription": "Sandra specializes in furniture, beauty and travel products with a classic vibe. Custom orders are available if you’re looking for a certain color or material.", + "featured": false +}, +{ + + "id": 10, + "title": "Backpack", + "description": "This backpack by Bags ‘n’ stuff can hold just about anything: a laptop, a pen, a protractor, notebooks, small animals, plugs for your devices, sunglasses, gym clothes, shoes, gloves, two kittens, and even lunch!", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/backpack.png", + "price": "$25", + "storeName": "Peter’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/peter-carlsson.png", + "storeDescription": "Peter makes great stuff for awesome people like you. Super cool and extra awesome all of his shop’s goods are handmade with love. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 11, + "title": "Half Shield Helmet", + "description": "Half Shield is the right helmet for those warm summer days on the road. Dot approved, these helmets have been rigorously tested. Keep that noggin protected.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/helmet.png", + "price": "$25", + "storeName": "Ali’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/ali-connors.png", + "storeDescription": "Ali Connor’s makes custom goods for folks of all shapes and sizes made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 12, + "title": "Beachball", + "description": "Are you at a baseball game and feeling bored? At a pool party and looking for a laugh? Do you need something to take your anger out on? Beachball, by inflatable fun, is the perfect outlet.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/beachball.png", + "price": "$25", + "storeName": "Peter’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/peter-carlsson.png", + "storeDescription": "Peter makes great stuff for awesome people like you. Super cool and extra awesome all of his shop’s goods are handmade with love. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 13, + "title": "Old Binoculars", + "description": "These Binoculars by See Through are amazing and can make things that are really far away seem like they’re right in front of you. Bring them to the beach. Now you can buy the cheap seats at the big game and feel like you’re right in the action.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/binoculars.png", + "price": "$25", + "storeName": "Stella’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/16c477b.jpg", + "storeDescription": "Stella sells awesome stuff at lovely prices. made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": false +}, +{ + + "id": 14, + "title": "Lime Flippers", + "description": "Flippers are a nice tool to have when you’re being chased by an oversized sea turtle. Never get caught again with these fast water shoes. You’re like a fish, but more graceful.", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/flippers.png", + "price": "$25", + "storeName": "Peter’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/peter-carlsson.png", + "storeDescription": "Peter makes great stuff for awesome people like you. Super cool and extra awesome all of his shop’s goods are handmade with love. Custom orders are available upon request if you need something extra special.", + "featured": true +}, +{ + + "id": 15, + "title": "Surfboard", + "description": "Who says you can’t walk on water? With Surfboard, by Surfboard Supply, you can fly on water. This beast is fast and handles like a porsche. Hang Ten Bro!", + "imageUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/surfboard.png", + "price": "$25", + "storeName": "Stella’s shop", + "storeAvatarUrl": "https://www.gstatic.com/angular/material-adaptive/shrine/16c477b.jpg", + "storeDescription": "Stella sells awesome stuff at lovely prices. made by hand and sometimes by machine, but always with love and care. Custom orders are available upon request if you need something extra special.", + "featured": true +} +] \ No newline at end of file diff --git a/static/bower_components/app-layout/templates/shrine/index.html b/static/bower_components/app-layout/templates/shrine/index.html new file mode 100644 index 00000000..a08d2d02 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/index.html @@ -0,0 +1,48 @@ + + + + + + + + + + Shrine + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/manifest.json b/static/bower_components/app-layout/templates/shrine/manifest.json new file mode 100644 index 00000000..48f3cad3 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Shrine", + "short_name": "Shrine by Polymer", + "icons": [{ + "src": "//app-layout-assets.appspot.com/assets/shrine/launcher-icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, { + "src": "//app-layout-assets.appspot.com/assets/shrine/launcher-icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + },{ + "src": "//app-layout-assets.appspot.com/assets/shrine/launcher-icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }], + "start_url": "index.html", + "background_color": "#fff", + "display": "standalone", + "theme_color": "#fff" +} + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-app.html b/static/bower_components/app-layout/templates/shrine/src/shrine-app.html new file mode 100644 index 00000000..dd94eb2f --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-app.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-detail.html b/static/bower_components/app-layout/templates/shrine/src/shrine-detail.html new file mode 100644 index 00000000..cf40b091 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-detail.html @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-featured-item.html b/static/bower_components/app-layout/templates/shrine/src/shrine-featured-item.html new file mode 100644 index 00000000..3d43b8eb --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-featured-item.html @@ -0,0 +1,210 @@ + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-item.html b/static/bower_components/app-layout/templates/shrine/src/shrine-item.html new file mode 100644 index 00000000..106a72ee --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-item.html @@ -0,0 +1,136 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-list.html b/static/bower_components/app-layout/templates/shrine/src/shrine-list.html new file mode 100644 index 00000000..c98c2ac5 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-list.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/shrine/src/shrine-simple-item.html b/static/bower_components/app-layout/templates/shrine/src/shrine-simple-item.html new file mode 100644 index 00000000..de268307 --- /dev/null +++ b/static/bower_components/app-layout/templates/shrine/src/shrine-simple-item.html @@ -0,0 +1,82 @@ + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/test-drive/bower.json b/static/bower_components/app-layout/templates/test-drive/bower.json new file mode 100644 index 00000000..b3a0dcef --- /dev/null +++ b/static/bower_components/app-layout/templates/test-drive/bower.json @@ -0,0 +1,14 @@ +{ + "name": "test-drive", + "authors": [ + "The Polymer Authors" + ], + "private": true, + "dependencies": { + "app-layout": "polymerelements/app-layout#^0.9.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "polymer": "polymer/polymer#^1.4.0" + } +} diff --git a/static/bower_components/app-layout/templates/test-drive/index.html b/static/bower_components/app-layout/templates/test-drive/index.html new file mode 100644 index 00000000..ffe363c7 --- /dev/null +++ b/static/bower_components/app-layout/templates/test-drive/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + Test Drive + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/templates/test-drive/test-app.html b/static/bower_components/app-layout/templates/test-drive/test-app.html new file mode 100644 index 00000000..5adbfbea --- /dev/null +++ b/static/bower_components/app-layout/templates/test-drive/test-app.html @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/app-layout/test/index.html b/static/bower_components/app-layout/test/index.html new file mode 100644 index 00000000..c467ba09 --- /dev/null +++ b/static/bower_components/app-layout/test/index.html @@ -0,0 +1,33 @@ + + + + + + + Tests + + + + + + diff --git a/static/bower_components/font-roboto/README.md b/static/bower_components/font-roboto/README.md new file mode 100644 index 00000000..61c6394c --- /dev/null +++ b/static/bower_components/font-roboto/README.md @@ -0,0 +1 @@ +# font-roboto diff --git a/static/bower_components/font-roboto/bower.json b/static/bower_components/font-roboto/bower.json new file mode 100644 index 00000000..977cf2d4 --- /dev/null +++ b/static/bower_components/font-roboto/bower.json @@ -0,0 +1,22 @@ +{ + "name": "font-roboto", + "version": "1.0.1", + "description": "An HTML import for Roboto", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "font", + "roboto" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/font-roboto.git" + }, + "main": "roboto.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/font-roboto/", + "ignore": [ + "/.*" + ] +} diff --git a/static/bower_components/font-roboto/roboto.html b/static/bower_components/font-roboto/roboto.html new file mode 100644 index 00000000..7a24999f --- /dev/null +++ b/static/bower_components/font-roboto/roboto.html @@ -0,0 +1,11 @@ + + + diff --git a/static/bower_components/google-codelab-elements/.drone.yml b/static/bower_components/google-codelab-elements/.drone.yml new file mode 100644 index 00000000..b988fab0 --- /dev/null +++ b/static/bower_components/google-codelab-elements/.drone.yml @@ -0,0 +1,20 @@ +clone: + depth: 1 +build: + image: crhym3/ci-image:node6-go16 + environment: + - CHROME=https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + commands: + # use custom version of wct-local + # until https://github.com/Polymer/wct-local/pull/17 is merged + - npm i web-component-tester crhym3/wct-local#args --only=prod --no-optional + - bower install --allow-root + - curl -sSLo chrome.deb $CHROME && dpkg -i chrome.deb + - > + xvfb-run -a ./node_modules/.bin/wct + --skip-plugin sauce + --plugin local + --verbose + -l chrome + --skip-selenium-install + --selenium-arg=-Djava.security.egd=file:///dev/urandom diff --git a/static/bower_components/google-codelab-elements/.gitignore b/static/bower_components/google-codelab-elements/.gitignore new file mode 100644 index 00000000..7bf6eb18 --- /dev/null +++ b/static/bower_components/google-codelab-elements/.gitignore @@ -0,0 +1,2 @@ +bower_components +node_modules diff --git a/static/bower_components/google-codelab-elements/CONTRIBUTING.md b/static/bower_components/google-codelab-elements/CONTRIBUTING.md new file mode 100644 index 00000000..2827b7d3 --- /dev/null +++ b/static/bower_components/google-codelab-elements/CONTRIBUTING.md @@ -0,0 +1,27 @@ +Want to contribute? Great! First, read this page (including the small print at the end). + +### Before you contribute +Before we can use your code, you must sign the +[Google Individual Contributor License Agreement] +(https://cla.developers.google.com/about/google-individual) +(CLA), which you can do online. The CLA is necessary mainly because you own the +copyright to your changes, even after your contribution becomes part of our +codebase, so we need your permission to use and distribute your code. We also +need to be sure of various other things—for instance that you'll tell us if you +know that your code infringes on other people's patents. You don't have to sign +the CLA until after you've submitted your code for review and a member has +approved it, but you must do it before we can put your code into our codebase. +Before you start working on a larger contribution, you should get in touch with +us first through the issue tracker with your idea so that we can help out and +possibly guide you. Coordinating up front makes it much easier to avoid +frustration later on. + +### Code reviews +All submissions, including submissions by project members, require review. We +use Github pull requests for this purpose. + +### The small print +Contributions made by corporations are covered by a different agreement than +the one above, the +[Software Grant and Corporate Contributor License Agreement] +(https://cla.developers.google.com/about/google-corporate). diff --git a/static/bower_components/google-codelab-elements/LICENSE b/static/bower_components/google-codelab-elements/LICENSE new file mode 100644 index 00000000..1ae1e113 --- /dev/null +++ b/static/bower_components/google-codelab-elements/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 Google Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/static/bower_components/google-codelab-elements/README.md b/static/bower_components/google-codelab-elements/README.md new file mode 100644 index 00000000..fba2edf1 --- /dev/null +++ b/static/bower_components/google-codelab-elements/README.md @@ -0,0 +1,19 @@ +# Google Codelab Components + +A set of Polymer elements, core of the Google Codelabs platform. + +## Dev setup + +`bower install` is the obvious first thing to do. + +To play with the demos, an easy thing would be to use +[polyserve](https://github.com/PolymerLabs/polyserve): +`npm install -g polyserve`. + +Fire up the server with `polyserve` command and point your browser to: + + http://localhost:8080/components/codelab-components/ + +Use [web-component-tester](https://github.com/Polymer/web-component-tester) to run tests. +Can be installed with `npm install -g web-component-tester`, or just fire up `polyserve` +and navigate to `/components/codelab_components/test/`. diff --git a/static/bower_components/google-codelab-elements/analytics-behavior.html b/static/bower_components/google-codelab-elements/analytics-behavior.html new file mode 100644 index 00000000..3338fa7a --- /dev/null +++ b/static/bower_components/google-codelab-elements/analytics-behavior.html @@ -0,0 +1,92 @@ + + + diff --git a/static/bower_components/google-codelab-elements/bower.json b/static/bower_components/google-codelab-elements/bower.json new file mode 100644 index 00000000..70ea50f1 --- /dev/null +++ b/static/bower_components/google-codelab-elements/bower.json @@ -0,0 +1,31 @@ +{ + "name": "codelab-components", + "version": "2.0.2", + "private": true, + "main": "google-codelab-elements.html", + "license": "Apache2", + "dependencies": { + "app-layout": "PolymerElements/app-layout#^0.10.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.5", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.3", + "iron-icons": "PolymerElements/iron-icons#^1.0.3", + "iron-localstorage": "PolymerElements/iron-localstorage#^1.0.4", + "neon-animation": "PolymerElements/neon-animation#^1.2.2", + "paper-button": "PolymerElements/paper-button#^1.0.3", + "paper-dialog": "PolymerElements/paper-dialog#^1.0.1", + "paper-fab": "PolymerElements/paper-fab#^1.0.3", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.3", + "paper-item": "PolymerElements/paper-item#^1.0.2", + "paper-menu": "PolymerElements/paper-menu#^1.1.0", + "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.6", + "paper-radio-group": "PolymerElements/paper-radio-group#^1.0.4", + "paper-styles": "PolymerElements/paper-styles#^1.0.11", + "google-prettify": "google/code-prettify" + }, + "devDependencies": { + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.2", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.8" + } +} diff --git a/static/bower_components/google-codelab-elements/codelab-style.html b/static/bower_components/google-codelab-elements/codelab-style.html new file mode 100644 index 00000000..50b24028 --- /dev/null +++ b/static/bower_components/google-codelab-elements/codelab-style.html @@ -0,0 +1,257 @@ + + + + + + + diff --git a/static/bower_components/google-codelab-elements/demo/codelab.html b/static/bower_components/google-codelab-elements/demo/codelab.html new file mode 100644 index 00000000..2429e9e4 --- /dev/null +++ b/static/bower_components/google-codelab-elements/demo/codelab.html @@ -0,0 +1,168 @@ + + + + + + + + codelab demo + + + + + + + + + + + + + + +

In this codelab, You'll create a fully working Google Maps app using elements in Polymer's Google Web Components collection. The app will be responsive, include driving directions, and transit a mode. Along the way, you'll also learn about Polymer's data-binding features and iron element set.

+

What you'll learn

+
    +
  • How to start a new Polymer-based project using Chrome Dev Editor
  • +
  • How to use elements in Polymer's iron, paper, and Google Web Component sets.
  • +
  • How to use Polymer's data binding features to reduce boilerplate code.
  • +
+

What you'll need

+
    +
  • Basic understanding of HTML, CSS, and web development.
  • +
  • Install Chrome Dev Editor or use your own editor of choice.
  • +
+

How would rate your experience with Polymer?

+NoviceIntermediateAdvanced
+ +
+ + + +

Create a new project

+ + +

The first time you run Chrome Dev Editor it will ask you to setup your workspace environment.

Fire up Chrome Dev Editor and start a new project:

    +
  1. Click to start a new project.
  2. +
  3. Enter "PolymerMapsCodelab" as the Project name.
  4. +
  5. In the Project type dropdown, select "JavaScript web app (using Polymer paper elements)".
  6. +
  7. Click the Create button.
  8. +

Chrome Dev Editor creates a basic scaffold for your Polymer app. In the background, it also uses Bower to download and install a list of dependencies (including the Polymer core library) into the bower_components/ folder. Fetching the components make take some time if your internet connection is slow. You'll learn more about using Bower in the next step.

+

bower.json

+ +
PolymerMapsCodelab/
+  bower_components/ <!-- installed dependencies from Bower -->
+  bower.json  <!-- Bower metadata files used for managing deps -->
+  index.html  <!-- your app -->
+  main.js
+  styles.css
+ +

Preview the app

+

At any point, select the index.html file and hit the  button in the top toolbar to run the app. Chrome Dev Editor fires up a web server and navigates to the index.html page. This is great way to preview changes as you make them.

+

Next up

+

At this point the app doesn't do much. Let's add a map!

+ +
+ + + +

The Google Web Components provide the <google-map> element for declaratively rendering a Google Map. To use it, you first need to install it using Bower.

+ + +

Install the element

+

Normally, you'd run bower install GoogleWebComponents/google-map --save on the command line to install <google-map> and save it as a dependency. However, Chrome Dev Editor does not have a command line for running Bower commands. Instead, you need to manually edit bower.json to include google-map, then run Chrome Dev Editor's Bower Update feature. Bower Update checks the dependencies in bower.json and installs any missing ones.

  1. Edit bower.json and add google-map to the dependencies object:
+
"dependencies": {
+  "iron-elements": "PolymerElements/iron-elements#^1.0.0",
+  "paper-elements": "PolymerElements/paper-elements#^1.0.1",
+  "google-map": "GoogleWebComponents/google-map#^1.0.3"
+}
+
    +
  1. Right-click the bower.json filename in the editor.
  2. +
  3. Select Bower Update from the context menu.
  4. +

The download may take few seconds. You can verify that <google-map> (and any dependencies) were installed by checking that bower_components/google-map/ was created and populated.

+

Use the element

+

To employ <google-map>, you need to:

    +
  1. Use an HTML Import to load it in index.html.
  2. +
  3. Declare an instance of the element on the page.
  4. +

In index.html, remove all other HTML imports in the <head> and replace them with a single import that loads google-map.html:

+

index.html

+ +
<head>
+  ....
+  <script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+  <link rel="import" href="bower_components/google-map/google-map.html">
+</head>
+ + +

Next, replace the contents of <body> with an instance of <google-map>:

+

index.html

+ +
<body unresolved>
+  <google-map latitude="37.779" longitude="-122.3892" zoom="13"></google-map>
+</body>
+

As you can see, using <google-map> is completely declarative! The map is centered using the latitude and longitude attributes and its zoom level is set by the zoom attribute.

+

Style the map

+

If you run the app right now, nothing will display. In order for the map to properly display itself, you need to set its container (in this case, <body>) to have a fixed height.

Open styles.css and replace its contents with default styling:

+

styles.css

+ +
body, html {
+  font-family: 'Roboto', Arial, sans-serif;
+  height: 100%;
+  margin: 0;
+}
+ +

Add a marker

+

<google-map> supports adding map markers to the map by declaring <google-map-marker> elements as children. The marker locations are also set using latitude and longitude attributes.

Back in index.html, add a draggable <google-map-marker> to the map:

+

index.html

+ +
<google-map latitude="37.779" longitude="-122.3892" zoom="13" disable-default-ui>
+  <google-map-marker latitude="37.779" longitude="-122.3892"
+      title="Go Giants!" draggable="true"></google-map-marker>
+</google-map>
+

Notice that we've also disabled the map's controls by setting disableDefaultUi to true. Since it's a boolean property, its presence as an HTML attribute makes it truthy.

+

Run the app

+

If you haven't already done so, hit the  button. At this point, you should see a map that takes up the entire viewport and has a single marker pin.

+

Frequently Asked Questions

+ + +
+ +
+ + + diff --git a/static/bower_components/google-codelab-elements/demo/embed.html b/static/bower_components/google-codelab-elements/demo/embed.html new file mode 100644 index 00000000..43a21cae --- /dev/null +++ b/static/bower_components/google-codelab-elements/demo/embed.html @@ -0,0 +1,191 @@ + + + + + + + + Embeddable codelab demo + + + + + + + + + + + + +
+ +

Codelabs > Build Google Maps Using Web Components & No Code!

+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur quis dolor vel arcu blandit tristique. Proin vestibulum nec felis non fringilla. Pellentesque vulputate dui ut risus bibendum, sed egestas arcu ullamcorper. Quisque eget eros pellentesque, aliquet tortor placerat, vehicula lectus. Fusce sit amet mattis turpis, et tempus orci. Vestibulum mauris velit, vulputate a risus quis, imperdiet hendrerit ante. Nunc sollicitudin risus tortor, ac venenatis sem volutpat malesuada. Mauris neque metus, ornare eget porta id, tincidunt vitae magna. In scelerisque quam auctor maximus pellentesque. Sed laoreet ex mi, vel lacinia urna consectetur id. Sed est quam, finibus eget orci in, vulputate tempus diam

+ + + + + +

In this codelab, You'll create a fully working Google Maps app using elements in Polymer's Google Web Components collection. The app will be responsive, include driving directions, and transit a mode. Along the way, you'll also learn about Polymer's data-binding features and iron element set.

+

What you'll learn

+
    +
  • How to start a new Polymer-based project using Chrome Dev Editor
  • +
  • How to use elements in Polymer's iron, paper, and Google Web Component sets.
  • +
  • How to use Polymer's data binding features to reduce boilerplate code.
  • +
+

What you'll need

+
    +
  • Basic understanding of HTML, CSS, and web development.
  • +
  • Install Chrome Dev Editor or use your own editor of choice.
  • +
+

How would rate your experience with Polymer?

+NoviceIntermediateAdvanced
+ +
+ + + +

Create a new project

+ + +

The first time you run Chrome Dev Editor it will ask you to setup your workspace environment.

Fire up Chrome Dev Editor and start a new project:

    +
  1. Click to start a new project.
  2. +
  3. Enter "PolymerMapsCodelab" as the Project name.
  4. +
  5. In the Project type dropdown, select "JavaScript web app (using Polymer paper elements)".
  6. +
  7. Click the Create button.
  8. +

Chrome Dev Editor creates a basic scaffold for your Polymer app. In the background, it also uses Bower to download and install a list of dependencies (including the Polymer core library) into the bower_components/ folder. Fetching the components make take some time if your internet connection is slow. You'll learn more about using Bower in the next step.

+

bower.json

+ +
PolymerMapsCodelab/
+  bower_components/ <!-- installed dependencies from Bower -->
+  bower.json  <!-- Bower metadata files used for managing deps -->
+  index.html  <!-- your app -->
+  main.js
+  styles.css
+ +

Preview the app

+

At any point, select the index.html file and hit the  button in the top toolbar to run the app. Chrome Dev Editor fires up a web server and navigates to the index.html page. This is great way to preview changes as you make them.

+

Next up

+

At this point the app doesn't do much. Let's add a map!

+ +
+ + + +

The Google Web Components provide the <google-map> element for declaratively rendering a Google Map. To use it, you first need to install it using Bower.

+ + +

Install the element

+

Normally, you'd run bower install GoogleWebComponents/google-map --save on the command line to install <google-map> and save it as a dependency. However, Chrome Dev Editor does not have a command line for running Bower commands. Instead, you need to manually edit bower.json to include google-map, then run Chrome Dev Editor's Bower Update feature. Bower Update checks the dependencies in bower.json and installs any missing ones.

  1. Edit bower.json and add google-map to the dependencies object:
+
"dependencies": {
+  "iron-elements": "PolymerElements/iron-elements#^1.0.0",
+  "paper-elements": "PolymerElements/paper-elements#^1.0.1",
+  "google-map": "GoogleWebComponents/google-map#^1.0.3"
+}
+
    +
  1. Right-click the bower.json filename in the editor.
  2. +
  3. Select Bower Update from the context menu.
  4. +

The download may take few seconds. You can verify that <google-map> (and any dependencies) were installed by checking that bower_components/google-map/ was created and populated.

+

Use the element

+

To employ <google-map>, you need to:

    +
  1. Use an HTML Import to load it in index.html.
  2. +
  3. Declare an instance of the element on the page.
  4. +

In index.html, remove all other HTML imports in the <head> and replace them with a single import that loads google-map.html:

+

index.html

+ +
<head>
+  ....
+  <script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+  <link rel="import" href="bower_components/google-map/google-map.html">
+</head>
+ + +

Next, replace the contents of <body> with an instance of <google-map>:

+

index.html

+ +
<body unresolved>
+  <google-map latitude="37.779" longitude="-122.3892" zoom="13"></google-map>
+</body>
+

As you can see, using <google-map> is completely declarative! The map is centered using the latitude and longitude attributes and its zoom level is set by the zoom attribute.

+

Style the map

+

If you run the app right now, nothing will display. In order for the map to properly display itself, you need to set its container (in this case, <body>) to have a fixed height.

Open styles.css and replace its contents with default styling:

+

styles.css

+ +
body, html {
+  font-family: 'Roboto', Arial, sans-serif;
+  height: 100%;
+  margin: 0;
+}
+ +

Add a marker

+

<google-map> supports adding map markers to the map by declaring <google-map-marker> elements as children. The marker locations are also set using latitude and longitude attributes.

Back in index.html, add a draggable <google-map-marker> to the map:

+

index.html

+ +
<google-map latitude="37.779" longitude="-122.3892" zoom="13" disable-default-ui>
+  <google-map-marker latitude="37.779" longitude="-122.3892"
+      title="Go Giants!" draggable="true"></google-map-marker>
+</google-map>
+

Notice that we've also disabled the map's controls by setting disableDefaultUi to true. Since it's a boolean property, its presence as an HTML attribute makes it truthy.

+

Run the app

+

If you haven't already done so, hit the  button. At this point, you should see a map that takes up the entire viewport and has a single marker pin.

+

Frequently Asked Questions

+ + +
+ +
+ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur quis dolor vel arcu blandit tristique. Proin vestibulum nec felis non fringilla. Pellentesque vulputate dui ut risus bibendum, sed egestas arcu ullamcorper. Quisque eget eros pellentesque, aliquet tortor placerat, vehicula lectus. Fusce sit amet mattis turpis, et tempus orci. Vestibulum mauris velit, vulputate a risus quis, imperdiet hendrerit ante. Nunc sollicitudin risus tortor, ac venenatis sem volutpat malesuada. Mauris neque metus, ornare eget porta id, tincidunt vitae magna. In scelerisque quam auctor maximus pellentesque. Sed laoreet ex mi, vel lacinia urna consectetur id. Sed est quam, finibus eget orci in, vulputate tempus diam

+ +
+ + + diff --git a/static/bower_components/google-codelab-elements/demo/img-1.png b/static/bower_components/google-codelab-elements/demo/img-1.png new file mode 100644 index 00000000..2022f14c Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-1.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-2.png b/static/bower_components/google-codelab-elements/demo/img-2.png new file mode 100644 index 00000000..fd55e914 Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-2.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-3.png b/static/bower_components/google-codelab-elements/demo/img-3.png new file mode 100644 index 00000000..f84246a8 Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-3.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-4.png b/static/bower_components/google-codelab-elements/demo/img-4.png new file mode 100644 index 00000000..410e2f10 Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-4.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-5.png b/static/bower_components/google-codelab-elements/demo/img-5.png new file mode 100644 index 00000000..bede887c Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-5.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-6.png b/static/bower_components/google-codelab-elements/demo/img-6.png new file mode 100644 index 00000000..8bce8912 Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-6.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-7.png b/static/bower_components/google-codelab-elements/demo/img-7.png new file mode 100644 index 00000000..410e2f10 Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-7.png differ diff --git a/static/bower_components/google-codelab-elements/demo/img-8.png b/static/bower_components/google-codelab-elements/demo/img-8.png new file mode 100644 index 00000000..4e52a57c Binary files /dev/null and b/static/bower_components/google-codelab-elements/demo/img-8.png differ diff --git a/static/bower_components/google-codelab-elements/demo/step.html b/static/bower_components/google-codelab-elements/demo/step.html new file mode 100644 index 00000000..e4854753 --- /dev/null +++ b/static/bower_components/google-codelab-elements/demo/step.html @@ -0,0 +1,181 @@ + + + + + + + + step demo + + + + + + + + + + +

An example of <google-codelab-step>

+ + + + + + + diff --git a/static/bower_components/google-codelab-elements/demo/survey.html b/static/bower_components/google-codelab-elements/demo/survey.html new file mode 100644 index 00000000..d4b35d75 --- /dev/null +++ b/static/bower_components/google-codelab-elements/demo/survey.html @@ -0,0 +1,82 @@ + + + + + + + + survey demo + + + + + + + + +

An example of <google-codelab-survey>

+ + + + + + + diff --git a/static/bower_components/google-codelab-elements/font-source-code-pro.html b/static/bower_components/google-codelab-elements/font-source-code-pro.html new file mode 100644 index 00000000..ceb0d9e0 --- /dev/null +++ b/static/bower_components/google-codelab-elements/font-source-code-pro.html @@ -0,0 +1 @@ + diff --git a/static/bower_components/google-codelab-elements/google-codelab-elements.html b/static/bower_components/google-codelab-elements/google-codelab-elements.html new file mode 100644 index 00000000..7e811e6a --- /dev/null +++ b/static/bower_components/google-codelab-elements/google-codelab-elements.html @@ -0,0 +1,3 @@ + + + diff --git a/static/bower_components/google-codelab-elements/google-codelab-step.html b/static/bower_components/google-codelab-elements/google-codelab-step.html new file mode 100644 index 00000000..21e12354 --- /dev/null +++ b/static/bower_components/google-codelab-elements/google-codelab-step.html @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/google-codelab-survey.html b/static/bower_components/google-codelab-elements/google-codelab-survey.html new file mode 100644 index 00000000..df9be8e0 --- /dev/null +++ b/static/bower_components/google-codelab-elements/google-codelab-survey.html @@ -0,0 +1,187 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/google-codelab.html b/static/bower_components/google-codelab-elements/google-codelab.html new file mode 100644 index 00000000..2ba1bde5 --- /dev/null +++ b/static/bower_components/google-codelab-elements/google-codelab.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/index.html b/static/bower_components/google-codelab-elements/index.html new file mode 100644 index 00000000..cb467d59 --- /dev/null +++ b/static/bower_components/google-codelab-elements/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/layout-style.html b/static/bower_components/google-codelab-elements/layout-style.html new file mode 100644 index 00000000..1d5da786 --- /dev/null +++ b/static/bower_components/google-codelab-elements/layout-style.html @@ -0,0 +1,61 @@ + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/shared-style.html b/static/bower_components/google-codelab-elements/shared-style.html new file mode 100644 index 00000000..b0f32c9c --- /dev/null +++ b/static/bower_components/google-codelab-elements/shared-style.html @@ -0,0 +1,28 @@ + + + + + diff --git a/static/bower_components/google-codelab-elements/step-style.html b/static/bower_components/google-codelab-elements/step-style.html new file mode 100644 index 00000000..17dfeb8a --- /dev/null +++ b/static/bower_components/google-codelab-elements/step-style.html @@ -0,0 +1,269 @@ + + + + + diff --git a/static/bower_components/google-codelab-elements/syntax-style.html b/static/bower_components/google-codelab-elements/syntax-style.html new file mode 100644 index 00000000..201fcef9 --- /dev/null +++ b/static/bower_components/google-codelab-elements/syntax-style.html @@ -0,0 +1,67 @@ + + + + + + + diff --git a/static/bower_components/google-codelab-elements/test/codelab.html b/static/bower_components/google-codelab-elements/test/codelab.html new file mode 100644 index 00000000..b9a12000 --- /dev/null +++ b/static/bower_components/google-codelab-elements/test/codelab.html @@ -0,0 +1,299 @@ + + + + + + + survey tests + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/test/embed.html b/static/bower_components/google-codelab-elements/test/embed.html new file mode 100644 index 00000000..4113ac09 --- /dev/null +++ b/static/bower_components/google-codelab-elements/test/embed.html @@ -0,0 +1,75 @@ + + + + + + + embed tests + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/test/ga.html b/static/bower_components/google-codelab-elements/test/ga.html new file mode 100644 index 00000000..00d4b70b --- /dev/null +++ b/static/bower_components/google-codelab-elements/test/ga.html @@ -0,0 +1,128 @@ + + + + + + + survey tests + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/test/step.html b/static/bower_components/google-codelab-elements/test/step.html new file mode 100644 index 00000000..d91de653 --- /dev/null +++ b/static/bower_components/google-codelab-elements/test/step.html @@ -0,0 +1,85 @@ + + + + + + + step tests + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/google-codelab-elements/test/survey.html b/static/bower_components/google-codelab-elements/test/survey.html new file mode 100644 index 00000000..d40999b9 --- /dev/null +++ b/static/bower_components/google-codelab-elements/test/survey.html @@ -0,0 +1,102 @@ + + + + + + + survey tests + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/google-prettify/.gitignore b/static/bower_components/google-prettify/.gitignore new file mode 100644 index 00000000..433f78b2 --- /dev/null +++ b/static/bower_components/google-prettify/.gitignore @@ -0,0 +1,18 @@ +# temporary files +*~ +*.swp +.DS_Store + +# package managers +/node_modules/ +/bower_components/ +npm-debug.log +.bower.json + +# generated files +#/src/prettify.js +#/src/run_prettify.js +#/loader/*.js +#/loader/*.css +#/loader/skins/*.css +#/distrib/*.zip diff --git a/static/bower_components/google-prettify/CHANGES.md b/static/bower_components/google-prettify/CHANGES.md new file mode 100644 index 00000000..a4a5bdc5 --- /dev/null +++ b/static/bower_components/google-prettify/CHANGES.md @@ -0,0 +1,137 @@ +# Known Issues + + * Perl formatting is really crappy. Partly because the author is lazy and partly + because Perl is [hard](http://www.perlmonks.org/?node_id=663393) to parse. + * On some browsers, `` elements with newlines in the text which use CSS + to specify `white-space:pre` will have the newlines improperly stripped if + the element is not attached to the document at the time the stripping is done. + Also, on IE6, all newlines will be stripped from `` elements because + of the way IE6 produces `innerHTML`. Workaround: use `
` for code with
+   newlines.
+
+# Change Log
+
+## 29 March 2007
+
+ * Added [tests](https://rawgit.com/google/code-prettify/master/tests/prettify_test.html#PHP)
+   for PHP support to address issue [#3](https://github.com/google/code-prettify/issues/3).
+ * Fixed bug [#6](https://github.com/google/code-prettify/issues/6): `prettyPrintOne`
+   was not halting. This was not reachable through the normal entry point.
+ * Fixed bug [#4](https://github.com/google/code-prettify/issues/4): recursing into a
+   script block or PHP tag that was not properly closed would not silently drop the content.
+   ([test](https://rawgit.com/google/code-prettify/master/tests/prettify_test.html#issue4))
+ * Fixed bug [#8](https://github.com/google/code-prettify/issues/8): was eating tabs
+   ([test](https://rawgit.com/google/code-prettify/master/tests/prettify_test.html#issue8))
+ * Fixed entity handling so that the caveat
+
+   > Caveats: please properly escape less-thans. `x<y` instead of `x and use `"` instead of `"` for string delimiters.
+
+   is no longer applicable.
+ * Added *noisefree*'s C# patch [#7](https://github.com/google/code-prettify/issues/7)
+ * Added a [distribution](http://google-code-prettify.googlecode.com/files/prettify-small.zip)
+   that has comments and whitespace removed to reduce download size from 45.5kB
+   to 12.8kB.
+
+## 4 Jul 2008
+
+ * Added [#17](https://github.com/google/code-prettify/issues/17) language specific
+   formatters that are triggered by the presence of a `lang-`
+ * Fixed bug [#29](https://github.com/google/code-prettify/issues/29): python
+   handling of `'''string'''`
+ * Fixed bug: `/` in regex `[charsets] should not end regex`
+
+## 5 Jul 2008
+
+ * Defined language extensions for Lisp and Lua
+
+## 14 Jul 2008
+
+ * Language handlers for F#, OCAML, SQL
+ * Support for `nocode` spans to allow embedding of line numbers and code
+   annotations which should not be styled or otherwise affect the tokenization
+   of prettified code. See the issue [#22](https://github.com/google/code-prettify/issues/22)
+   [testcase](https://rawgit.com/google/code-prettify/master/tests/prettify_test.html#issue22).
+
+## 6 Jan 2009
+
+ * Language handlers for Visual Basic, Haskell, CSS, and WikiText
+ * Added `.mxml` extension to the markup style handler for
+   Flex [MXML files](http://en.wikipedia.org/wiki/MXML).
+   See issue [#37](https://github.com/google/code-prettify/issues/37).
+ * Added `.m` extension to the C style handler so that Objective C source files
+   properly highlight. See issue [#58](https://github.com/google/code-prettify/issues/58).
+ * Changed HTML lexer to use the same embedded source mechanism as the wiki
+   language handler, and changed to use the registered CSS handler for STYLE
+   element content.
+
+## 21 May 2009
+
+ * Rewrote to improve performance on large files.
+   See [benchmarks](http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html).
+ * Fixed bugs with highlighting of Haskell line comments, Lisp number literals,
+   Lua strings, C preprocessor directives, newlines in Wiki code on Windows, and
+   newlines in IE6.
+
+## 14 August 2009
+
+ * Fixed prettifying of `` blocks with embedded newlines.
+
+## 3 October 2009
+
+ * Fixed prettifying of XML/HTML tags that contain uppercase letters.
+
+## 19 July 2010
+
+ * Added support for line numbers. Bug [#22](https://github.com/google/code-prettify/issues/22)
+ * Added YAML support. Bug [#123](https://github.com/google/code-prettify/issues/123)
+ * Added VHDL support courtesy *Le Poussin*.
+ * IE performance improvements. Bug [#102](https://github.com/google/code-prettify/issues/102)
+   courtesy *jacobly*.
+ * A variety of markup formatting fixes courtesy *smain* and *thezbyg*.
+ * Fixed copy and paste in IE 6, 7, 8.
+ * Changed output to use ` ` instead of ` ` so that the output works
+   when embedded in XML. Bug [#108](https://github.com/google/code-prettify/issues/108).
+
+## 7 September 2010
+
+ * Added support for coffeescript courtesy *Cezary Bartoszuk*.
+
+## 4 March 2011
+
+ * Added a [themes gallery](https://rawgit.com/google/code-prettify/master/styles/index.html)
+   to showcase contributed styles.
+ * Added support for XQuery courtesy *Patrick Wied*, Nemerle courtesy *Zimin A.V.*,
+   and Latex support courtesy *Martin S*.
+
+## 29 March 2011
+
+ * Fixed IE newline issues, and copying/pasting of prettified source code from IE.
+   This required significant internal changes but involves no API changes.
+   **Caveat**: `prettyPrintOne` injects the HTML passed to it into a `
` element.
+   If the HTML comes from a trusted source, this may allow XSS. Do not do this.
+   This should not be a problem for existing apps since the standard usage is to
+   rewrite the HTML and then inject it, so anyone doing that with untrusted HTML
+   already has an XSS vulnerability. If you sanitize and prettify HTML from an
+   untrusted source, sanitize first.
+
+## 4 February 2013
+
+ * Language handlers for Dart, Erlang, Mumps, TCL, R, S., and others
+ * Bug fix: VB REM style comments.
+ * Bug fix: CSS color literals / ID selector confusion.
+ * Bug fix: IE8 line breaks.
+
+## 24 February 2013
+
+ * Added a one script autoload&run mechanism and a way to embed hints in
+   processing instructions/comments. See
+   [example](https://rawgit.com/google/code-prettify/master/examples/quine.html).
+
+## 4 March 2013
+
+ * Matlab language handler courtesy *Amro³*
+
+## 28 Apr 2015
+
+ * Migrated to Github
diff --git a/static/bower_components/google-prettify/COPYING b/static/bower_components/google-prettify/COPYING
new file mode 100644
index 00000000..b7f86df2
--- /dev/null
+++ b/static/bower_components/google-prettify/COPYING
@@ -0,0 +1,191 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   Copyright 2011 Mike Samuel et al
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/static/bower_components/google-prettify/Gruntfile.js b/static/bower_components/google-prettify/Gruntfile.js
new file mode 100644
index 00000000..918a6b05
--- /dev/null
+++ b/static/bower_components/google-prettify/Gruntfile.js
@@ -0,0 +1,263 @@
+/**
+ * google-code-prettify
+ * https://github.com/google/code-prettify
+ *
+ * Copyright (C) 2017 Google Inc.
+ * Licensed under Apache 2.0 license.
+ */
+
+module.exports = function (grunt) {
+  'use strict';
+
+  // project configuration
+  grunt.initConfig({
+    // metadata
+    pkg: grunt.file.readJSON('package.json'),
+
+    // grunt-preprocess
+    preprocess: {
+      // https://github.com/jsoverson/preprocess#optionstype
+      options: {
+        // renders @include directives (similar to SSI server-side includes)
+        // where JS files are resolved relative to this directory
+        srcDir: 'js-modules',
+        type: 'js'
+      },
+      prettify: {
+        src: 'js-modules/prettify.js',
+        dest: 'src/prettify.js'
+      },
+      runprettify: {
+        options: {
+          context: {
+            // to control where defs.js is included (top level)
+            RUN_PRETTIFY: true
+          }
+        },
+        src: 'js-modules/run_prettify.js',
+        dest: 'src/run_prettify.js'
+      },
+      nodeprettify: {
+        options: {
+          context: {
+            RUN_PRETTIFY: true
+          }
+        },
+        src: 'js-modules/node_prettify.js',
+        dest: 'src/node_prettify.js'
+      }
+    },
+
+    // grunt-contrib-copy
+    copy: {
+      prettify: {
+        options: {
+          process: function (content) {
+            // trim trailing whitespaces in blank lines added by preprocess
+            return content.replace(/[ \f\t\v]+$/gm, '');
+          }
+        },
+        files: [
+          {src: 'src/prettify.js', dest: 'src/prettify.js'},
+          {src: 'src/run_prettify.js', dest: 'src/run_prettify.js'},
+          {src: 'src/node_prettify.js', dest: 'src/node_prettify.js'}
+        ]
+      },
+      langs: {
+        options: {
+          process: function (content) {
+            // replace PR.PR_* token names with inlined strings
+            return content
+              .replace(/\bPR\.PR_ATTRIB_NAME\b/g,  '"atn"')
+              .replace(/\bPR\.PR_ATTRIB_VALUE\b/g, '"atv"')
+              .replace(/\bPR\.PR_COMMENT\b/g,      '"com"')
+              .replace(/\bPR\.PR_DECLARATION\b/g,  '"dec"')
+              .replace(/\bPR\.PR_KEYWORD\b/g,      '"kwd"')
+              .replace(/\bPR\.PR_LITERAL\b/g,      '"lit"')
+              .replace(/\bPR\.PR_NOCODE\b/g,       '"nocode"')
+              .replace(/\bPR\.PR_PLAIN\b/g,        '"pln"')
+              .replace(/\bPR\.PR_PUNCTUATION\b/g,  '"pun"')
+              .replace(/\bPR\.PR_SOURCE\b/g,       '"src"')
+              .replace(/\bPR\.PR_STRING\b/g,       '"str"')
+              .replace(/\bPR\.PR_TAG\b/g,          '"tag"')
+              .replace(/\bPR\.PR_TYPE\b/g,         '"typ"');
+          }
+        },
+        files: [{
+          expand: true,
+          cwd: 'loader/',
+          src: ['lang-*.js'],
+          dest: 'loader/'
+        }]
+      }
+    },
+
+    // ./tasks/aliases.js
+    aliases: {
+      langs: {
+        src: 'loader/lang-*.js',
+        filter: function (src) {
+          // skip files that are themselves aliases created in previous runs
+          return grunt.file.exists(src.replace(/^loader/, 'src'));
+        }
+      }
+    },
+
+    // grunt-contrib-uglify
+    uglify: {
+      // https://github.com/mishoo/UglifyJS2#usage
+      options: {
+        report: 'gzip',
+        ASCIIOnly: true,
+        maxLineLen: 500,
+        screwIE8: false
+      },
+      prettify: {
+        options: {
+          compress: {
+            global_defs: {'IN_GLOBAL_SCOPE': true}
+          },
+          wrap: true
+        },
+        src: 'src/prettify.js',
+        dest: 'loader/prettify.js'
+      },
+      runprettify: {
+        options: {
+          compress: {
+            global_defs: {'IN_GLOBAL_SCOPE': false}
+          },
+          wrap: true
+        },
+        src: 'src/run_prettify.js',
+        dest: 'loader/run_prettify.js'
+      },
+      langs: {
+        files: [{
+          expand: true,
+          cwd: 'src/',
+          src: ['lang-*.js'],
+          dest: 'loader/',
+          ext: '.js'
+        }]
+      }
+    },
+
+    // google-closure-compiler
+    'closure-compiler': {
+      // https://github.com/google/closure-compiler/wiki
+      options: {
+        // Don't specify --charset=UTF-8.  If we do, then non-ascii
+        // codepoints that do not correspond to line terminators are
+        // converted to UTF-8 sequences instead of being emitted as
+        // ASCII. This makes the resulting JavaScript less portable.
+        warning_level: 'VERBOSE',
+        language_in: 'ECMASCRIPT5',
+        compilation_level: 'ADVANCED',
+        charset: 'US-ASCII'
+      },
+      prettify: {
+        options: {
+          externs: 'tools/closure-compiler/amd-externs.js',
+          define: 'IN_GLOBAL_SCOPE=true',
+          output_wrapper: '!function(){%output%}()'
+        },
+        src: '<%= uglify.prettify.src %>',
+        dest: '<%= uglify.prettify.dest %>'
+      },
+      runprettify: {
+        options: {
+          externs: 'tools/closure-compiler/amd-externs.js',
+          define: 'IN_GLOBAL_SCOPE=false',
+          output_wrapper: '!function(){%output%}()'
+        },
+        src: '<%= uglify.runprettify.src %>',
+        dest: '<%= uglify.runprettify.dest %>'
+      },
+      langs: {
+        options: {
+          externs: 'js-modules/externs.js'
+        },
+        files: '<%= uglify.langs.files %>'
+      }
+    },
+
+    // ./tasks/gcc.js
+    gcc: {
+      // same as 'closure-compiler:langs'
+      langs: {
+        options: {
+          externs: 'js-modules/externs.js'
+        },
+        files: '<%= uglify.langs.files %>'
+      }
+    },
+
+    // grunt-contrib-cssmin
+    cssmin: {
+      // https://github.com/jakubpawlowicz/clean-css#how-to-use-clean-css-api
+      options: {
+        report: 'gzip'
+      },
+      prettify: {
+        src: 'src/prettify.css',
+        dest: 'loader/prettify.css'
+      },
+      skins: {
+        files: [{
+          expand: true,
+          cwd: 'styles/',
+          src: ['*.css'],
+          dest: 'loader/skins/',
+          ext: '.css'
+        }]
+      }
+    },
+
+    // grunt-contrib-compress
+    compress: {
+      zip: {
+        options: {
+          archive: 'distrib/prettify-small.zip',
+          mode: 'zip',
+          level: 9
+        },
+        files: [{
+          expand: true,
+          cwd: 'loader/',
+          src: ['*.js', '*.css', 'skins/*.css'],
+          dest: 'google-code-prettify/'
+        }]
+      }
+    },
+
+    // grunt-contrib-clean
+    clean: {
+      js: ['src/prettify.js', 'src/run_prettify.js', 'loader/*.js'],
+      css: ['loader/*.css', 'loader/skins/*.css'],
+      zip: ['distrib/*.zip']
+    }
+  });
+
+  // load plugins that provide tasks
+  require('google-closure-compiler').grunt(grunt);
+  grunt.loadTasks('./tasks');
+  grunt.loadNpmTasks('grunt-preprocess');
+  grunt.loadNpmTasks('grunt-contrib-copy');
+  grunt.loadNpmTasks('grunt-contrib-uglify');
+  grunt.loadNpmTasks('grunt-contrib-cssmin');
+  grunt.loadNpmTasks('grunt-contrib-compress');
+  grunt.loadNpmTasks('grunt-contrib-clean');
+
+  // register task aliases
+  grunt.registerTask('default', [
+    //'clean',
+    'preprocess',
+    'copy:prettify',
+    'gcc',
+    'copy:langs',
+    'aliases',
+    'cssmin',
+    'compress'
+  ]);
+};
diff --git a/static/bower_components/google-prettify/README.md b/static/bower_components/google-prettify/README.md
new file mode 100644
index 00000000..774adaab
--- /dev/null
+++ b/static/bower_components/google-prettify/README.md
@@ -0,0 +1,238 @@
+# JavaScript code prettifier
+
+An embeddable script that makes source-code snippets in HTML prettier.
+
+* Works on HTML pages.
+* Works even if code contains embedded links, line numbers, etc.
+* Simple API: include some JS & CSS and add an onload handler.
+* Lightweights: small download and does not block page from loading while
+  running.
+* Customizable styles via CSS. See the [themes gallery][1].
+* Supports all C-like, Bash-like, and XML-like languages. No need to specify
+  the language.
+* Extensible language handlers for other languages. You can specify the
+  language.
+* Widely used with good cross-browser support. Powers https://code.google.com/
+  and http://stackoverflow.com/
+
+[See an example][2].
+
+## Setup
+
+ * Include the script tag below in your document:
+```HTML
+
+```
+ * See [Getting Started](docs/getting_started.md) to configure that URL with
+   options you need.
+ * Look at the [skin gallery][1] and pick styles that suit you.
+
+## Usage
+
+Put code snippets in `
...
` or +`...` and it will automatically be +pretty-printed. + +```HTML +
class Voila {
+public:
+  // Voila
+  static const string VOILA = "Voila";
+
+  // will not interfere with embedded tags.
+}
+``` + +## FAQ + +### For which languages does it work? + +The comments in `prettify.js` are authoritative but the lexer should work on a +number of languages including C and friends, Java, Python, Bash, SQL, HTML, +XML, CSS, JavaScript, Makefile, and Rust. + +It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl and +Ruby, but because of commenting conventions, doesn't work on Smalltalk, OCaml, +etc. without a language extension. + +Other languages are supported via extensions: + +[Apollo](src/lang-apollo.js); +[Basic](src/lang-basic.js); +[Clojure](src/lang-clj.js); +[CSS](src/lang-css.js); +[Dart](src/lang-dart.js); +[Erlang](src/lang-erlang.js); +[Go](src/lang-go.js); +[Haskell](src/lang-hs.js); +[Lasso](src/lang-lasso.js); +[Lisp, Scheme](src/lang-lisp.js); +[LLVM](src/lang-llvm.js); +[Logtalk](src/lang-logtalk.js); +[Lua](src/lang-lua.js); +[MATLAB](src/lang-matlab.js); +[MLs: F#, Ocaml,SML](src/lang-ml.js); +[Mumps](src/lang-mumps.js); +[Nemerle](src/lang-n.js); +[Pascal](src/lang-pascal.js); +[Protocol buffers](src/lang-proto.js); +[R, S](src/lang-r.js); +[RD](src/lang-rd.js); +[Rust](src/lang-rust.js); +[Scala](src/lang-scala.js); +[SQL](src/lang-sql.js); +[Swift](src/lang-swift.js); +[TCL](src/lang-tcl.js); +[LaTeX](src/lang-tex.js); +[Visual Basic](src/lang-vb.js); +[VHDL](src/lang-vhdl.js); +[Wiki](src/lang-wiki.js); +[XQ](src/lang-xq.js); +[YAML](src/lang-yaml.js) + +If you'd like to add an extension for your favorite language, please look at +`src/lang-lisp.js` and submit a pull request. + +### How do I specify the language of my code? + +You don't need to specify the language since `PR.prettyPrint()` will guess. +You can specify a language by specifying the language extension along with the +`prettyprint` class: + +```HTML +
+  The lang-* class specifies the language file extensions.
+  File extensions supported by default include:
+    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java",
+    "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml",
+    "xsl".
+
+``` + +You may also use the [HTML 5][3] convention of embedding a `` element +inside the `
` and using `language-java` style classes:
+
+```HTML
+
...
+``` + +### It doesn't work on "obfuscated code sample"? + +Yes. Prettifying obfuscated code is like putting lipstick on a pig — +i.e. outside the scope of this tool. + +### Which browsers does it work with? + +It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. Look at +[the tests][4] to see if it works in your browser. + +### What's changed? + +See the [changelog](CHANGES.md). + +### Why doesn't Prettyprinting of strings work on WordPress? + +Apparently wordpress does "smart quoting" which changes close quotes. This +causes end quotes to not match up with open quotes. + +This breaks prettifying as well as copying and pasting of code samples. See +[WordPress's help center][5] for info on how to stop smart quoting of code +snippets. + +### How do I put line numbers in my code? + +You can use the `linenums` class to turn on line numbering. If your code +doesn't start at line number `1`, you can add a colon and a line number to the +end of that class as in `linenums:52`. For example: + +```HTML +
// This is line 4.
+foo();
+bar();
+baz();
+boo();
+far();
+faz();
+
+``` + +### How do I prevent a portion of markup from being marked as code? + +You can use the `nocode` class to identify a span of markup that is not code: + +```HTML +
+int x = foo();  /* This is a comment  This is not code
+  Continuation of comment */
+int y = bar();
+
+``` + +For a more complete example see the [issue #22 testcase][6]. + +### I get an error message "a is not a function" or "opt_whenDone is not a function" + +If you are calling `prettyPrint` via an event handler, wrap it in a function. +Instead of doing: + +```JavaScript +addEventListener('load', PR.prettyPrint, false); +``` + +wrap it in a closure like: + +```JavaScript +addEventListener('load', function(event) { PR.prettyPrint(); }, false); +``` + +so that the browser does not pass an event object to `PR.prettyPrint` +which will confuse it. + +### How can I customize the colors and styles of my code? + +Prettify adds `` with `class`es describing the kind of code. You can +create CSS styles to matches these classes. + +See the [theme gallery][1] for examples. + +### I can't add classes to my code (because it comes from Markdown, etc.) + +Instead of `
` you can use a comment or processing
+instructions that survives processing instructions: `` works
+as explained in [Getting Started](docs/getting_started.md).
+
+### How can I put line numbers on every line instead of just every fifth line?
+
+Prettify puts lines into an HTML list element so that line numbers aren't
+caught by copy/paste, and the line numbering is controlled by CSS in the
+default stylesheet, `prettify.css`.
+
+The following should turn line numbering back on for the other lines:
+
+```HTML
+
+```
+
+## Discussion
+
+Please use the official [support group][7] for discussions, suggestions, and
+general feedback.
+
+## License
+
+[Apache License 2.0](COPYING)
+
+
+[1]: https://rawgit.com/google/code-prettify/master/styles/index.html
+[2]: https://rawgit.com/google/code-prettify/master/examples/quine.html
+[3]: http://dev.w3.org/html5/spec-author-view/the-code-element.html#the-code-element
+[4]: https://rawgit.com/google/code-prettify/master/tests/prettify_test.html
+[5]: http://wordpress.org/support/topic/125038
+[6]: https://rawgit.com/google/code-prettify/master/tests/prettify_test.html#issue22
+[7]: http://groups.google.com/group/js-code-prettifier
diff --git a/static/bower_components/google-prettify/bower.json b/static/bower_components/google-prettify/bower.json
new file mode 100644
index 00000000..27b13817
--- /dev/null
+++ b/static/bower_components/google-prettify/bower.json
@@ -0,0 +1,40 @@
+{
+  "name": "code-prettify",
+  "description": "Google Code Prettify",
+  "authors": [
+    "Google"
+  ],
+  "license": "Apache-2.0",
+  "homepage": "https://github.com/google/code-prettify",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/google/code-prettify.git"
+  },
+  "keywords": [
+    "syntax",
+    "highlight",
+    "highlighting",
+    "source",
+    "code",
+    "prettify",
+    "google"
+  ],
+  "main": [
+    "src/prettify.js",
+    "src/prettify.css"
+  ],
+  "moduleType": [
+    "globals",
+    "amd"
+  ],
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "distrib",
+    "js-modules",
+    "tasks",
+    "tests",
+    "tools"
+  ]
+}
diff --git a/static/bower_components/google-prettify/distrib/prettify-small.zip b/static/bower_components/google-prettify/distrib/prettify-small.zip
new file mode 100644
index 00000000..94a69b92
Binary files /dev/null and b/static/bower_components/google-prettify/distrib/prettify-small.zip differ
diff --git a/static/bower_components/google-prettify/docs/getting_started.md b/static/bower_components/google-prettify/docs/getting_started.md
new file mode 100644
index 00000000..ad256667
--- /dev/null
+++ b/static/bower_components/google-prettify/docs/getting_started.md
@@ -0,0 +1,138 @@
+# Getting Started
+
+You can load the Prettify script to highlight code in your web pages.
+
+It adds styles to code snippets so that token boundaries stand out and your
+readers can get the gist of your code without having to mentally perform a
+left-to-right parse.
+
+## Marking code sections
+
+The prettyprinter looks for `
`, ``, or `` elements with the
+*prettyprint* class, and adds `<span>`s to colorize keywords, strings,
+comments, and other token types.
+
+```HTML
+<pre class="prettyprint">
+source code here
+</pre>
+```
+
+If you're using Markdown or some other HTML generator that does not add
+classes, you can alternatively ask the prettifier to target your code by
+preceding it with a processing instruction thus:
+
+```HTML
+<?prettify?>
+<pre class="prettyprint">
+code here
+</pre>
+```
+
+[Larger example](https://rawgit.com/google/code-prettify/master/examples/quine.html)
+
+## Auto-Loader
+
+You can load the JavaScript and CSS for prettify via one URL:
+
+```HTML
+<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
+```
+
+This will load the entire system and schedule the prettifier to run on page
+load.  There are a variety of additional options you can specify (as CGI
+arguments) to configure the runner.
+
+| CGI parameter         | default | meaning                        |
+| --------------------- | ------- | ------------------------------ |
+| autorun=(true, false) | true    | run automatically on page load |
+| lang=...              | none    | Loads the language handler for the given language which is usually the file extension for source files for that language.  See the [index of language handlers](../src).  If specified multiple times (`?lang=css&lang=ml`) then all are loaded. |
+| skin=...              | none    | See the [skin gallery](https://cdn.rawgit.com/google/code-prettify/master/styles/index.html).  If specified multiple times, the first one to successfully load is used. |
+| callback=js_ident     |         | `window.exports["js_ident"]` will be called when prettyprinting finishes.  If specified multiple times, all are called. |
+
+For example:
+
+```HTML
+<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?lang=css&amp;skin=sunburst"></script>
+```
+
+The above specifies the `lang` parameter to also load the CSS language
+extension and the `skin` parameter to load the
+[*sunburst*](https://cdn.rawgit.com/google/code-prettify/master/styles/index.html#sunburst)
+skin.
+
+## Serving your own JS & CSS
+
+You can
+[download](https://github.com/google/code-prettify/raw/master/distrib/prettify-small.zip)
+the scripts and styles and serve them yourself.  Make sure to include both the
+script and a stylesheet:
+
+```HTML
+<link rel="stylesheet" type="text/css" href="prettify.css">
+<script type="text/javascript" src="prettify.js"></script>
+```
+
+Then run the `PR.prettyPrint()` function once your page has finished loading.
+One way to do this is via the `onload` handler thus:
+
+```HTML
+<body onload="PR.prettyPrint()">
+```
+
+## Styling
+
+The prettifier only adds `class`es; it does not specify exact colors or fonts,
+so you can swap in a different stylesheet to change the way code is
+prettified.
+
+The easiest way to create your own stylesheet is by starting with one from the
+[style gallery](https://cdn.rawgit.com/google/code-prettify/master/styles/index.html)
+and tweaking it.
+
+You can use CSS `@media` rules to specify styles that work well with printers
+(for example, dark text on a white background) when someone tries to print it.
+
+## Language Hints
+
+Prettify makes a best effort to guess the language but works best with C-like
+and HTML-like languages.  For others, there are special language handlers that
+are chosen based on language hints.
+
+For example, set the `lang-scm` hint to specify that the code is Scheme code:
+
+```HTML
+<pre class="prettyprint lang-scm">(friends 'of '(parentheses))</pre>
+```
+
+It can also be specified as:
+
+```HTML
+<?prettify lang=scm?>
+<pre>(friends 'of '(parentheses))</pre>
+```
+
+## Line Numbering
+
+```HTML
+<pre class="prettyprint linenums">
+Many
+lines
+of
+code
+</pre>
+```
+
+The `linenums` class in the above code tells the prettyprinter to insert an
+`<ol>` element and `<li>` elements around each line so that you get line
+numbers.
+
+Most stylesheets then hide the line numbers except for every fifth line.
+
+The class `linenums:40` makes line numbering start at line 40 if you're
+excerpting a larger chunk of code.  The following also works:
+
+```HTML
+<?prettify linenums=40?>
+<pre>lots of code</pre>
+```
diff --git a/static/bower_components/google-prettify/examples/quine.html b/static/bower_components/google-prettify/examples/quine.html
new file mode 100644
index 00000000..158753b2
--- /dev/null
+++ b/static/bower_components/google-prettify/examples/quine.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Making Quines Prettier</title>
+<!-- The defer attribute is not necessary for autoloading, but is necessary
+     for the script at the bottom to work as a Quine. -->
+<script src="https://rawgit.com/google/code-prettify/master/loader/run_prettify.js?autoload=true&amp;skin=sunburst&amp;lang=css" defer></script>
+<style type="text/css">
+.operative { font-weight: bold; border: 1px solid yellow; }
+#quine { border: 4px solid #88c; }
+</style>
+</head>
+
+<body>
+<h1>Making Quines Prettier</h1>
+
+<p>
+Below is the content of this page prettified.  The <code>&lt;pre&gt;</code>
+element is prettified because it has <code>class="prettyprint"</code> and
+because the sourced script loads a JavaScript library that styles source
+code.
+</p>
+
+<p>
+The line numbers to the left appear because the preceding comment
+<code>&lt;?prettify lang=html linenums=true?&gt;</code> turns on
+line-numbering and the
+<a href="https://rawgit.com/google/code-prettify/master/styles/index.html">stylesheet</a>
+(see <code>skin=sunburst</code> in the <code>&lt;script src&gt;</code>)
+specifies that every fifth line should be numbered.
+</p>
+
+<!-- Language hints can be put in XML application directive style comments. -->
+<?prettify lang=html linenums=true?>
+<pre class="prettyprint" id="quine"></pre>
+
+<script type="text/javascript">//<![CDATA[
+(function () {
+  function htmlEscape(s) {
+    return s
+      .replace(/&/g, '&amp;')
+      .replace(/</g, '&lt;')
+      .replace(/>/g, '&gt;');
+  }
+
+  // this page's own source code
+  var quineHtml = htmlEscape(
+    '<!DOCTYPE html>\n<html>\n' +
+    document.documentElement.innerHTML +
+    '\n<\/html>\n');
+
+  // Highlight the operative parts:
+  quineHtml = quineHtml.replace(
+    /&lt;script src[\s\S]*?&gt;&lt;\/script&gt;|&lt;!--\?[\s\S]*?--&gt;|&lt;pre\b[\s\S]*?&lt;\/pre&gt;/g,
+    '<span class="operative">$&<\/span>');
+
+  // insert into PRE
+  document.getElementById("quine").innerHTML = quineHtml;
+})();
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/static/bower_components/google-prettify/js-modules/combinePrefixPatterns.js b/static/bower_components/google-prettify/js-modules/combinePrefixPatterns.js
new file mode 100644
index 00000000..d7b87b6f
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/combinePrefixPatterns.js
@@ -0,0 +1,240 @@
+/**
+ * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+ * matches the union of the sets of strings matched by the input RegExp.
+ * Since it matches globally, if the input strings have a start-of-input
+ * anchor (/^.../), it is ignored for the purposes of unioning.
+ * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
+ * @return {RegExp} a global regex.
+ */
+function combinePrefixPatterns(regexs) {
+  var capturedGroupIndex = 0;
+
+  var needToFoldCase = false;
+  var ignoreCase = false;
+  for (var i = 0, n = regexs.length; i < n; ++i) {
+    var regex = regexs[i];
+    if (regex.ignoreCase) {
+      ignoreCase = true;
+    } else if (/[a-z]/i.test(regex.source.replace(
+                   /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+      needToFoldCase = true;
+      ignoreCase = false;
+      break;
+    }
+  }
+
+  var escapeCharToCodeUnit = {
+    'b': 8,
+    't': 9,
+    'n': 0xa,
+    'v': 0xb,
+    'f': 0xc,
+    'r': 0xd
+  };
+
+  function decodeEscape(charsetPart) {
+    var cc0 = charsetPart.charCodeAt(0);
+    if (cc0 !== 92 /* \\ */) {
+      return cc0;
+    }
+    var c1 = charsetPart.charAt(1);
+    cc0 = escapeCharToCodeUnit[c1];
+    if (cc0) {
+      return cc0;
+    } else if ('0' <= c1 && c1 <= '7') {
+      return parseInt(charsetPart.substring(1), 8);
+    } else if (c1 === 'u' || c1 === 'x') {
+      return parseInt(charsetPart.substring(2), 16);
+    } else {
+      return charsetPart.charCodeAt(1);
+    }
+  }
+
+  function encodeEscape(charCode) {
+    if (charCode < 0x20) {
+      return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+    }
+    var ch = String.fromCharCode(charCode);
+    return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
+        ? "\\" + ch : ch;
+  }
+
+  function caseFoldCharset(charSet) {
+    var charsetParts = charSet.substring(1, charSet.length - 1).match(
+        new RegExp(
+            '\\\\u[0-9A-Fa-f]{4}'
+            + '|\\\\x[0-9A-Fa-f]{2}'
+            + '|\\\\[0-3][0-7]{0,2}'
+            + '|\\\\[0-7]{1,2}'
+            + '|\\\\[\\s\\S]'
+            + '|-'
+            + '|[^-\\\\]',
+            'g'));
+    var ranges = [];
+    var inverse = charsetParts[0] === '^';
+
+    var out = ['['];
+    if (inverse) { out.push('^'); }
+
+    for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+      var p = charsetParts[i];
+      if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
+        out.push(p);
+      } else {
+        var start = decodeEscape(p);
+        var end;
+        if (i + 2 < n && '-' === charsetParts[i + 1]) {
+          end = decodeEscape(charsetParts[i + 2]);
+          i += 2;
+        } else {
+          end = start;
+        }
+        ranges.push([start, end]);
+        // If the range might intersect letters, then expand it.
+        // This case handling is too simplistic.
+        // It does not deal with non-latin case folding.
+        // It works for latin source code identifiers though.
+        if (!(end < 65 || start > 122)) {
+          if (!(end < 65 || start > 90)) {
+            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+          }
+          if (!(end < 97 || start > 122)) {
+            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+          }
+        }
+      }
+    }
+
+    // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+    // -> [[1, 12], [14, 14], [16, 17]]
+    ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
+    var consolidatedRanges = [];
+    var lastRange = [];
+    for (var i = 0; i < ranges.length; ++i) {
+      var range = ranges[i];
+      if (range[0] <= lastRange[1] + 1) {
+        lastRange[1] = Math.max(lastRange[1], range[1]);
+      } else {
+        consolidatedRanges.push(lastRange = range);
+      }
+    }
+
+    for (var i = 0; i < consolidatedRanges.length; ++i) {
+      var range = consolidatedRanges[i];
+      out.push(encodeEscape(range[0]));
+      if (range[1] > range[0]) {
+        if (range[1] + 1 > range[0]) { out.push('-'); }
+        out.push(encodeEscape(range[1]));
+      }
+    }
+    out.push(']');
+    return out.join('');
+  }
+
+  function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+    // Split into character sets, escape sequences, punctuation strings
+    // like ('(', '(?:', ')', '^'), and runs of characters that do not
+    // include any of the above.
+    var parts = regex.source.match(
+        new RegExp(
+            '(?:'
+            + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
+            + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
+            + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
+            + '|\\\\[0-9]+'  // a back-reference or octal escape
+            + '|\\\\[^ux0-9]'  // other escape sequence
+            + '|\\(\\?[:!=]'  // start of a non-capturing group
+            + '|[\\(\\)\\^]'  // start/end of a group, or line start
+            + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
+            + ')',
+            'g'));
+    var n = parts.length;
+
+    // Maps captured group numbers to the number they will occupy in
+    // the output or to -1 if that has not been determined, or to
+    // undefined if they need not be capturing in the output.
+    var capturedGroups = [];
+
+    // Walk over and identify back references to build the capturedGroups
+    // mapping.
+    for (var i = 0, groupIndex = 0; i < n; ++i) {
+      var p = parts[i];
+      if (p === '(') {
+        // groups are 1-indexed, so max group index is count of '('
+        ++groupIndex;
+      } else if ('\\' === p.charAt(0)) {
+        var decimalValue = +p.substring(1);
+        if (decimalValue) {
+          if (decimalValue <= groupIndex) {
+            capturedGroups[decimalValue] = -1;
+          } else {
+            // Replace with an unambiguous escape sequence so that
+            // an octal escape sequence does not turn into a backreference
+            // to a capturing group from an earlier regex.
+            parts[i] = encodeEscape(decimalValue);
+          }
+        }
+      }
+    }
+
+    // Renumber groups and reduce capturing groups to non-capturing groups
+    // where possible.
+    for (var i = 1; i < capturedGroups.length; ++i) {
+      if (-1 === capturedGroups[i]) {
+        capturedGroups[i] = ++capturedGroupIndex;
+      }
+    }
+    for (var i = 0, groupIndex = 0; i < n; ++i) {
+      var p = parts[i];
+      if (p === '(') {
+        ++groupIndex;
+        if (!capturedGroups[groupIndex]) {
+          parts[i] = '(?:';
+        }
+      } else if ('\\' === p.charAt(0)) {
+        var decimalValue = +p.substring(1);
+        if (decimalValue && decimalValue <= groupIndex) {
+          parts[i] = '\\' + capturedGroups[decimalValue];
+        }
+      }
+    }
+
+    // Remove any prefix anchors so that the output will match anywhere.
+    // ^^ really does mean an anchored match though.
+    for (var i = 0; i < n; ++i) {
+      if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+    }
+
+    // Expand letters to groups to handle mixing of case-sensitive and
+    // case-insensitive patterns if necessary.
+    if (regex.ignoreCase && needToFoldCase) {
+      for (var i = 0; i < n; ++i) {
+        var p = parts[i];
+        var ch0 = p.charAt(0);
+        if (p.length >= 2 && ch0 === '[') {
+          parts[i] = caseFoldCharset(p);
+        } else if (ch0 !== '\\') {
+          // TODO: handle letters in numeric escapes.
+          parts[i] = p.replace(
+              /[a-zA-Z]/g,
+              function (ch) {
+                var cc = ch.charCodeAt(0);
+                return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+              });
+        }
+      }
+    }
+
+    return parts.join('');
+  }
+
+  var rewritten = [];
+  for (var i = 0, n = regexs.length; i < n; ++i) {
+    var regex = regexs[i];
+    if (regex.global || regex.multiline) { throw new Error('' + regex); }
+    rewritten.push(
+        '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+  }
+
+  return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+}
diff --git a/static/bower_components/google-prettify/js-modules/defs.js b/static/bower_components/google-prettify/js-modules/defs.js
new file mode 100644
index 00000000..18f3e4aa
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/defs.js
@@ -0,0 +1,55 @@
+/**
+ * @typedef {!Array.<number|string>}
+ * Alternating indices and the decorations that should be inserted there.
+ * The indices are monotonically increasing.
+ */
+var DecorationsT;
+
+/**
+ * @typedef {!{
+ *   sourceNode: !Element,
+ *   pre: !(number|boolean),
+ *   langExtension: ?string,
+ *   numberLines: ?(number|boolean),
+ *   sourceCode: ?string,
+ *   spans: ?(Array.<number|Node>),
+ *   basePos: ?number,
+ *   decorations: ?DecorationsT
+ * }}
+ * <dl>
+ *  <dt>sourceNode<dd>the element containing the source
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>pre<dd>truthy if white-space in text nodes
+ *     should be considered significant.
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ *  <dt>decorations<dd>an array of style classes preceded
+ *     by the position at which they start in job.sourceCode in order
+ *  <dt>basePos<dd>integer position of this.sourceCode in the larger chunk of
+ *     source.
+ * </dl>
+ */
+var JobT;
+
+/**
+ * @typedef {!{
+ *   sourceCode: string,
+ *   spans: !(Array.<number|Node>)
+ * }}
+ * <dl>
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ * </dl>
+ */
+var SourceSpansT;
+
+/** @define {boolean} */
+/* @ifndef RUN_PRETTIFY */
+var IN_GLOBAL_SCOPE = true;
+/* @endif */
+/* @ifdef RUN_PRETTIFY */
+var IN_GLOBAL_SCOPE = false;
+/* @endif */
diff --git a/static/bower_components/google-prettify/js-modules/externs.js b/static/bower_components/google-prettify/js-modules/externs.js
new file mode 100644
index 00000000..d962f53c
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/externs.js
@@ -0,0 +1,65 @@
+/**
+ * @license
+ * Copyright (C) 2015 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/**
+ *
+ * @fileoverview
+ * This file allows separate compilation of language handlers and the
+ * core library.
+ * @externs 
+ */
+
+
+var PR = {};
+
+/**
+ * @param {function (Object)} handler
+ * @param {Array.<string>} fileExtensions
+ */
+PR.registerLangHandler = function registerLangHandler(handler, fileExtensions) {};
+
+/**
+ * @param {Array} shortcutStylePatterns
+ * @param {Array} fallthroughStylePatterns
+ * @return {function (Object)}
+ */
+PR.createSimpleLexer = function createSimpleLexer(
+  shortcutStylePatterns, fallthroughStylePatterns) {};
+
+/**
+ * @param {Object} options a set of optional parameters.
+ * @return {function (Object)} a function that examines the source code
+ *     in the input job and builds the decoration list.
+ */
+PR.sourceDecorator = function sourceDecorator(options) {};
+
+
+PR.PR_ATTRIB_NAME = 'atn';
+PR.PR_ATTRIB_VALUE = 'atv';
+PR.PR_COMMENT = 'com';
+PR.PR_DECLARATION = 'dec';
+PR.PR_KEYWORD = 'kwd';
+PR.PR_LITERAL = 'lit';
+PR.PR_NOCODE = 'nocode';
+PR.PR_PLAIN = 'pln';
+PR.PR_PUNCTUATION = 'pun';
+PR.PR_SOURCE = 'src';
+PR.PR_STRING = 'str';
+PR.PR_TAG = 'tag';
+PR.PR_TYPE = 'typ';
+
diff --git a/static/bower_components/google-prettify/js-modules/extractSourceSpans.js b/static/bower_components/google-prettify/js-modules/extractSourceSpans.js
new file mode 100644
index 00000000..220ae0f2
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/extractSourceSpans.js
@@ -0,0 +1,90 @@
+/**
+ * Split markup into a string of source code and an array mapping ranges in
+ * that string to the text nodes in which they appear.
+ *
+ * <p>
+ * The HTML DOM structure:</p>
+ * <pre>
+ * (Element   "p"
+ *   (Element "b"
+ *     (Text  "print "))       ; #1
+ *   (Text    "'Hello '")      ; #2
+ *   (Element "br")            ; #3
+ *   (Text    "  + 'World';")) ; #4
+ * </pre>
+ * <p>
+ * corresponds to the HTML
+ * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
+ *
+ * <p>
+ * It will produce the output:</p>
+ * <pre>
+ * {
+ *   sourceCode: "print 'Hello '\n  + 'World';",
+ *   //                     1          2
+ *   //           012345678901234 5678901234567
+ *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
+ * }
+ * </pre>
+ * <p>
+ * where #1 is a reference to the {@code "print "} text node above, and so
+ * on for the other text nodes.
+ * </p>
+ *
+ * <p>
+ * The {@code} spans array is an array of pairs.  Even elements are the start
+ * indices of substrings, and odd elements are the text nodes (or BR elements)
+ * that contain the text for those substrings.
+ * Substrings continue until the next index or the end of the source.
+ * </p>
+ *
+ * @param {Node} node an HTML DOM subtree containing source-code.
+ * @param {boolean|number} isPreformatted truthy if white-space in
+ *    text nodes should be considered significant.
+ * @return {SourceSpansT} source code and the nodes in which they occur.
+ */
+function extractSourceSpans(node, isPreformatted) {
+  var nocode = /(?:^|\s)nocode(?:\s|$)/;
+
+  var chunks = [];
+  var length = 0;
+  var spans = [];
+  var k = 0;
+
+  function walk(node) {
+    var type = node.nodeType;
+    if (type == 1) {  // Element
+      if (nocode.test(node.className)) { return; }
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        walk(child);
+      }
+      var nodeName = node.nodeName.toLowerCase();
+      if ('br' === nodeName || 'li' === nodeName) {
+        chunks[k] = '\n';
+        spans[k << 1] = length++;
+        spans[(k++ << 1) | 1] = node;
+      }
+    } else if (type == 3 || type == 4) {  // Text
+      var text = node.nodeValue;
+      if (text.length) {
+        if (!isPreformatted) {
+          text = text.replace(/[ \t\r\n]+/g, ' ');
+        } else {
+          text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
+        }
+        // TODO: handle tabs here?
+        chunks[k] = text;
+        spans[k << 1] = length;
+        length += text.length;
+        spans[(k++ << 1) | 1] = node;
+      }
+    }
+  }
+
+  walk(node);
+
+  return {
+    sourceCode: chunks.join('').replace(/\n$/, ''),
+    spans: spans
+  };
+}
diff --git a/static/bower_components/google-prettify/js-modules/node_prettify.js b/static/bower_components/google-prettify/js-modules/node_prettify.js
new file mode 100644
index 00000000..7262a48e
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/node_prettify.js
@@ -0,0 +1,16 @@
+
+var IN_GLOBAL_SCOPE = false;
+
+/* @include prettify.js */
+
+var path = require('path');
+
+module.exports = {
+  prettyPrint: prettyPrint,
+  prettyPrintOne: prettyPrintOne,
+  // include paths for css preprocessor support
+  includePaths: [
+    __dirname,
+    path.resolve(__dirname, '../styles')
+  ]
+};
diff --git a/static/bower_components/google-prettify/js-modules/numberLines.js b/static/bower_components/google-prettify/js-modules/numberLines.js
new file mode 100644
index 00000000..e7ee3a42
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/numberLines.js
@@ -0,0 +1,137 @@
+/**
+ * Given a DOM subtree, wraps it in a list, and puts each line into its own
+ * list item.
+ *
+ * @param {Node} node modified in place.  Its content is pulled into an
+ *     HTMLOListElement, and each line is moved into a separate list item.
+ *     This requires cloning elements, so the input might not have unique
+ *     IDs after numbering.
+ * @param {number|null|boolean} startLineNum
+ *     If truthy, coerced to an integer which is the 1-indexed line number
+ *     of the first line of code.  The number of the first line will be
+ *     attached to the list.
+ * @param {boolean} isPreformatted true iff white-space in text nodes should
+ *     be treated as significant.
+ */
+function numberLines(node, startLineNum, isPreformatted) {
+  var nocode = /(?:^|\s)nocode(?:\s|$)/;
+  var lineBreak = /\r\n?|\n/;
+
+  var document = node.ownerDocument;
+
+  var li = document.createElement('li');
+  while (node.firstChild) {
+    li.appendChild(node.firstChild);
+  }
+  // An array of lines.  We split below, so this is initialized to one
+  // un-split line.
+  var listItems = [li];
+
+  function walk(node) {
+    var type = node.nodeType;
+    if (type == 1 && !nocode.test(node.className)) {  // Element
+      if ('br' === node.nodeName.toLowerCase()) {
+        breakAfter(node);
+        // Discard the <BR> since it is now flush against a </LI>.
+        if (node.parentNode) {
+          node.parentNode.removeChild(node);
+        }
+      } else {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          walk(child);
+        }
+      }
+    } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
+      var text = node.nodeValue;
+      var match = text.match(lineBreak);
+      if (match) {
+        var firstLine = text.substring(0, match.index);
+        node.nodeValue = firstLine;
+        var tail = text.substring(match.index + match[0].length);
+        if (tail) {
+          var parent = node.parentNode;
+          parent.insertBefore(
+            document.createTextNode(tail), node.nextSibling);
+        }
+        breakAfter(node);
+        if (!firstLine) {
+          // Don't leave blank text nodes in the DOM.
+          node.parentNode.removeChild(node);
+        }
+      }
+    }
+  }
+
+  // Split a line after the given node.
+  function breakAfter(lineEndNode) {
+    // If there's nothing to the right, then we can skip ending the line
+    // here, and move root-wards since splitting just before an end-tag
+    // would require us to create a bunch of empty copies.
+    while (!lineEndNode.nextSibling) {
+      lineEndNode = lineEndNode.parentNode;
+      if (!lineEndNode) { return; }
+    }
+
+    function breakLeftOf(limit, copy) {
+      // Clone shallowly if this node needs to be on both sides of the break.
+      var rightSide = copy ? limit.cloneNode(false) : limit;
+      var parent = limit.parentNode;
+      if (parent) {
+        // We clone the parent chain.
+        // This helps us resurrect important styling elements that cross lines.
+        // E.g. in <i>Foo<br>Bar</i>
+        // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
+        var parentClone = breakLeftOf(parent, 1);
+        // Move the clone and everything to the right of the original
+        // onto the cloned parent.
+        var next = limit.nextSibling;
+        parentClone.appendChild(rightSide);
+        for (var sibling = next; sibling; sibling = next) {
+          next = sibling.nextSibling;
+          parentClone.appendChild(sibling);
+        }
+      }
+      return rightSide;
+    }
+
+    var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
+
+    // Walk the parent chain until we reach an unattached LI.
+    for (var parent;
+         // Check nodeType since IE invents document fragments.
+         (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
+      copiedListItem = parent;
+    }
+    // Put it on the list of lines for later processing.
+    listItems.push(copiedListItem);
+  }
+
+  // Split lines while there are lines left to split.
+  for (var i = 0;  // Number of lines that have been split so far.
+       i < listItems.length;  // length updated by breakAfter calls.
+       ++i) {
+    walk(listItems[i]);
+  }
+
+  // Make sure numeric indices show correctly.
+  if (startLineNum === (startLineNum|0)) {
+    listItems[0].setAttribute('value', startLineNum);
+  }
+
+  var ol = document.createElement('ol');
+  ol.className = 'linenums';
+  var offset = Math.max(0, ((startLineNum - 1 /* zero index */)) | 0) || 0;
+  for (var i = 0, n = listItems.length; i < n; ++i) {
+    li = listItems[i];
+    // Stick a class on the LIs so that stylesheets can
+    // color odd/even rows, or any other row pattern that
+    // is co-prime with 10.
+    li.className = 'L' + ((i + offset) % 10);
+    if (!li.firstChild) {
+      li.appendChild(document.createTextNode('\xA0'));
+    }
+    ol.appendChild(li);
+  }
+
+  node.appendChild(ol);
+}
diff --git a/static/bower_components/google-prettify/js-modules/prettify.js b/static/bower_components/google-prettify/js-modules/prettify.js
new file mode 100644
index 00000000..872c44b7
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/prettify.js
@@ -0,0 +1,1089 @@
+/**
+ * @license
+ * Copyright (C) 2006 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * some functions for browser-side pretty printing of code contained in html.
+ *
+ * <p>
+ * For a fairly comprehensive set of languages see the
+ * <a href="https://github.com/google/code-prettify#for-which-languages-does-it-work">README</a>
+ * file that came with this source.  At a minimum, the lexer should work on a
+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+ * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+ * <p>
+ * Usage: <ol>
+ * <li> include this source file in an html page via
+ *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
+ * <li> define style rules.  See the example page for examples.
+ * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
+ *    {@code class=prettyprint.}
+ *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
+ *    printer needs to do more substantial DOM manipulations to support that, so
+ *    some css styles may not be preserved.
+ * </ol>
+ * That's it.  I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in, but if you wish, you can add
+ * another class to the {@code <pre>} or {@code <code>} element to specify the
+ * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
+ * starts with "lang-" followed by a file extension, specifies the file type.
+ * See the "lang-*.js" files in this directory for code that implements
+ * per-language file handlers.
+ * <p>
+ * Change log:<br>
+ * cbeust, 2006/08/22
+ * <blockquote>
+ *   Java annotations (start with "@") are now captured as literals ("lit")
+ * </blockquote>
+ * @requires console
+ */
+
+// JSLint declarations
+/*global console, document, navigator, setTimeout, window, define */
+
+/* @ifndef RUN_PRETTIFY */
+/* @include defs.js */
+/* @endif */
+
+/**
+ * {@type !{
+ *   'createSimpleLexer': function (Array, Array): (function (JobT)),
+ *   'registerLangHandler': function (function (JobT), Array.<string>),
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_VALUE': string,
+ *   'PR_COMMENT': string,
+ *   'PR_DECLARATION': string,
+ *   'PR_KEYWORD': string,
+ *   'PR_LITERAL': string,
+ *   'PR_NOCODE': string,
+ *   'PR_PLAIN': string,
+ *   'PR_PUNCTUATION': string,
+ *   'PR_SOURCE': string,
+ *   'PR_STRING': string,
+ *   'PR_TAG': string,
+ *   'PR_TYPE': string,
+ *   'prettyPrintOne': function (string, string, number|boolean),
+ *   'prettyPrint': function (?function, ?(HTMLElement|HTMLDocument))
+ * }}
+ * @const
+ */
+var PR;
+
+/**
+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+ * UI events.
+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
+ */
+var PR_SHOULD_USE_CONTINUATION = true
+if (typeof window !== 'undefined') {
+  window['PR_SHOULD_USE_CONTINUATION'] = PR_SHOULD_USE_CONTINUATION;
+}
+
+/**
+ * Pretty print a chunk of code.
+ * @param {string} sourceCodeHtml The HTML to pretty print.
+ * @param {string} opt_langExtension The language name to use.
+ *     Typically, a filename extension like 'cpp' or 'java'.
+ * @param {number|boolean} opt_numberLines True to number lines,
+ *     or the 1-indexed number of the first line in sourceCodeHtml.
+ * @return {string} code as html, but prettier
+ */
+var prettyPrintOne;
+/**
+ * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+ * {@code class=prettyprint} and prettify them.
+ *
+ * @param {Function} opt_whenDone called when prettifying is done.
+ * @param {HTMLElement|HTMLDocument} opt_root an element or document
+ *   containing all the elements to pretty print.
+ *   Defaults to {@code document.body}.
+ */
+var prettyPrint;
+
+
+(function () {
+  var win = (typeof window !== 'undefined') ? window : {};
+  // Keyword lists for various languages.
+  // We use things that coerce to strings to make them compact when minified
+  // and to defeat aggressive optimizers that fold large string constants.
+  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
+  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
+      "double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed," +
+      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
+  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
+      "new,operator,private,protected,public,this,throw,true,try,typeof"];
+  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignas,alignof,align_union,asm,axiom,bool," +
+      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
+      "dynamic_cast,explicit,export,friend,generic,late_check," +
+      "mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert," +
+      "static_cast,template,typeid,typename,using,virtual,where"];
+  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,assert,boolean,byte,extends,finally,final,implements,import," +
+      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
+      "throws,transient"];
+  var CSHARP_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending," +
+      "dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface," +
+      "internal,into,is,join,let,lock,null,object,out,override,orderby,params," +
+      "partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong," +
+      "unchecked,unsafe,ushort,value,var,virtual,where,yield"];
+  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
+      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
+      "throw,true,try,unless,until,when,while,yes";
+  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,async,await,constructor,debugger,enum,eval,export,from,function," +
+      "get,import,implements,instanceof,interface,let,null,of,set,undefined," +
+      "var,with,yield,Infinity,NaN"];
+  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
+      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
+      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
+  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
+      "elif,except,exec,finally,from,global,import,in,is,lambda," +
+      "nonlocal,not,or,pass,print,raise,try,with,yield," +
+      "False,True,None"];
+  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
+      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
+      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
+      "BEGIN,END"];
+  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
+      "function,in,local,set,then,until"];
+  var ALL_KEYWORDS = [
+      CPP_KEYWORDS, CSHARP_KEYWORDS, JAVA_KEYWORDS, JSCRIPT_KEYWORDS,
+      PERL_KEYWORDS, PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
+  var C_TYPES = /^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
+
+  // token style names.  correspond to css classes
+  /**
+   * token style for a string literal
+   * @const
+   */
+  var PR_STRING = 'str';
+  /**
+   * token style for a keyword
+   * @const
+   */
+  var PR_KEYWORD = 'kwd';
+  /**
+   * token style for a comment
+   * @const
+   */
+  var PR_COMMENT = 'com';
+  /**
+   * token style for a type
+   * @const
+   */
+  var PR_TYPE = 'typ';
+  /**
+   * token style for a literal value.  e.g. 1, null, true.
+   * @const
+   */
+  var PR_LITERAL = 'lit';
+  /**
+   * token style for a punctuation string.
+   * @const
+   */
+  var PR_PUNCTUATION = 'pun';
+  /**
+   * token style for plain text.
+   * @const
+   */
+  var PR_PLAIN = 'pln';
+
+  /**
+   * token style for an sgml tag.
+   * @const
+   */
+  var PR_TAG = 'tag';
+  /**
+   * token style for a markup declaration such as a DOCTYPE.
+   * @const
+   */
+  var PR_DECLARATION = 'dec';
+  /**
+   * token style for embedded source.
+   * @const
+   */
+  var PR_SOURCE = 'src';
+  /**
+   * token style for an sgml attribute name.
+   * @const
+   */
+  var PR_ATTRIB_NAME = 'atn';
+  /**
+   * token style for an sgml attribute value.
+   * @const
+   */
+  var PR_ATTRIB_VALUE = 'atv';
+
+  /**
+   * A class that indicates a section of markup that is not code, e.g. to allow
+   * embedding of line numbers within code listings.
+   * @const
+   */
+  var PR_NOCODE = 'nocode';
+
+  /* @include regexpPrecederPatterns.js */
+
+  /* @include combinePrefixPatterns.js */
+
+  /* @include extractSourceSpans.js */
+
+  /**
+   * Apply the given language handler to sourceCode and add the resulting
+   * decorations to out.
+   * @param {!Element} sourceNode
+   * @param {number} basePos the index of sourceCode within the chunk of source
+   *    whose decorations are already present on out.
+   * @param {string} sourceCode
+   * @param {function(JobT)} langHandler
+   * @param {DecorationsT} out
+   */
+  function appendDecorations(
+      sourceNode, basePos, sourceCode, langHandler, out) {
+    if (!sourceCode) { return; }
+    /** @type {JobT} */
+    var job = {
+      sourceNode: sourceNode,
+      pre: 1,
+      langExtension: null,
+      numberLines: null,
+      sourceCode: sourceCode,
+      spans: null,
+      basePos: basePos,
+      decorations: null
+    };
+    langHandler(job);
+    out.push.apply(out, job.decorations);
+  }
+
+  var notWs = /\S/;
+
+  /**
+   * Given an element, if it contains only one child element and any text nodes
+   * it contains contain only space characters, return the sole child element.
+   * Otherwise returns undefined.
+   * <p>
+   * This is meant to return the CODE element in {@code <pre><code ...>} when
+   * there is a single child element that contains all the non-space textual
+   * content, but not to return anything where there are multiple child elements
+   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
+   * is textual content.
+   */
+  function childContentWrapper(element) {
+    var wrapper = undefined;
+    for (var c = element.firstChild; c; c = c.nextSibling) {
+      var type = c.nodeType;
+      wrapper = (type === 1)  // Element Node
+          ? (wrapper ? element : c)
+          : (type === 3)  // Text Node
+          ? (notWs.test(c.nodeValue) ? element : wrapper)
+          : wrapper;
+    }
+    return wrapper === element ? undefined : wrapper;
+  }
+
+  /** Given triples of [style, pattern, context] returns a lexing function,
+    * The lexing function interprets the patterns to find token boundaries and
+    * returns a decoration list of the form
+    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+    * where index_n is an index into the sourceCode, and style_n is a style
+    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
+    * all characters in sourceCode[index_n-1:index_n].
+    *
+    * The stylePatterns is a list whose elements have the form
+    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+    *
+    * Style is a style constant like PR_PLAIN, or can be a string of the
+    * form 'lang-FOO', where FOO is a language extension describing the
+    * language of the portion of the token in $1 after pattern executes.
+    * E.g., if style is 'lang-lisp', and group 1 contains the text
+    * '(hello (world))', then that portion of the token will be passed to the
+    * registered lisp handler for formatting.
+    * The text before and after group 1 will be restyled using this decorator
+    * so decorators should take care that this doesn't result in infinite
+    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
+    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
+    * '<script>foo()<\/script>', which would cause the current decorator to
+    * be called with '<script>' which would not match the same rule since
+    * group 1 must not be empty, so it would be instead styled as PR_TAG by
+    * the generic tag rule.  The handler registered for the 'js' extension would
+    * then be called with 'foo()', and finally, the current decorator would
+    * be called with '<\/script>' which would not match the original rule and
+    * so the generic tag rule would identify it as a tag.
+    *
+    * Pattern must only match prefixes, and if it matches a prefix, then that
+    * match is considered a token with the same style.
+    *
+    * Context is applied to the last non-whitespace, non-comment token
+    * recognized.
+    *
+    * Shortcut is an optional string of characters, any of which, if the first
+    * character, gurantee that this pattern and only this pattern matches.
+    *
+    * @param {Array} shortcutStylePatterns patterns that always start with
+    *   a known character.  Must have a shortcut string.
+    * @param {Array} fallthroughStylePatterns patterns that will be tried in
+    *   order if the shortcut ones fail.  May have shortcuts.
+    *
+    * @return {function (JobT)} a function that takes an undecorated job and
+    *   attaches a list of decorations.
+    */
+  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
+    var shortcuts = {};
+    var tokenizer;
+    (function () {
+      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
+      var allRegexs = [];
+      var regexKeys = {};
+      for (var i = 0, n = allPatterns.length; i < n; ++i) {
+        var patternParts = allPatterns[i];
+        var shortcutChars = patternParts[3];
+        if (shortcutChars) {
+          for (var c = shortcutChars.length; --c >= 0;) {
+            shortcuts[shortcutChars.charAt(c)] = patternParts;
+          }
+        }
+        var regex = patternParts[1];
+        var k = '' + regex;
+        if (!regexKeys.hasOwnProperty(k)) {
+          allRegexs.push(regex);
+          regexKeys[k] = null;
+        }
+      }
+      allRegexs.push(/[\0-\uffff]/);
+      tokenizer = combinePrefixPatterns(allRegexs);
+    })();
+
+    var nPatterns = fallthroughStylePatterns.length;
+
+    /**
+     * Lexes job.sourceCode and attaches an output array job.decorations of
+     * style classes preceded by the position at which they start in
+     * job.sourceCode in order.
+     *
+     * @type{function (JobT)}
+     */
+    var decorate = function (job) {
+      var sourceCode = job.sourceCode, basePos = job.basePos;
+      var sourceNode = job.sourceNode;
+      /** Even entries are positions in source in ascending order.  Odd enties
+        * are style markers (e.g., PR_COMMENT) that run from that position until
+        * the end.
+        * @type {DecorationsT}
+        */
+      var decorations = [basePos, PR_PLAIN];
+      var pos = 0;  // index into sourceCode
+      var tokens = sourceCode.match(tokenizer) || [];
+      var styleCache = {};
+
+      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
+        var token = tokens[ti];
+        var style = styleCache[token];
+        var match = void 0;
+
+        var isEmbedded;
+        if (typeof style === 'string') {
+          isEmbedded = false;
+        } else {
+          var patternParts = shortcuts[token.charAt(0)];
+          if (patternParts) {
+            match = token.match(patternParts[1]);
+            style = patternParts[0];
+          } else {
+            for (var i = 0; i < nPatterns; ++i) {
+              patternParts = fallthroughStylePatterns[i];
+              match = token.match(patternParts[1]);
+              if (match) {
+                style = patternParts[0];
+                break;
+              }
+            }
+
+            if (!match) {  // make sure that we make progress
+              style = PR_PLAIN;
+            }
+          }
+
+          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
+          if (isEmbedded && !(match && typeof match[1] === 'string')) {
+            isEmbedded = false;
+            style = PR_SOURCE;
+          }
+
+          if (!isEmbedded) { styleCache[token] = style; }
+        }
+
+        var tokenStart = pos;
+        pos += token.length;
+
+        if (!isEmbedded) {
+          decorations.push(basePos + tokenStart, style);
+        } else {  // Treat group 1 as an embedded block of source code.
+          var embeddedSource = match[1];
+          var embeddedSourceStart = token.indexOf(embeddedSource);
+          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
+          if (match[2]) {
+            // If embeddedSource can be blank, then it would match at the
+            // beginning which would cause us to infinitely recurse on the
+            // entire token, so we catch the right context in match[2].
+            embeddedSourceEnd = token.length - match[2].length;
+            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
+          }
+          var lang = style.substring(5);
+          // Decorate the left of the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart,
+              token.substring(0, embeddedSourceStart),
+              decorate, decorations);
+          // Decorate the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceStart,
+              embeddedSource,
+              langHandlerForExtension(lang, embeddedSource),
+              decorations);
+          // Decorate the right of the embedded section
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceEnd,
+              token.substring(embeddedSourceEnd),
+              decorate, decorations);
+        }
+      }
+      job.decorations = decorations;
+    };
+    return decorate;
+  }
+
+  /** returns a function that produces a list of decorations from source text.
+    *
+    * This code treats ", ', and ` as string delimiters, and \ as a string
+    * escape.  It does not recognize perl's qq() style strings.
+    * It has no special handling for double delimiter escapes as in basic, or
+    * the tripled delimiters used in python, but should work on those regardless
+    * although in those cases a single string literal may be broken up into
+    * multiple adjacent string literals.
+    *
+    * It recognizes C, C++, and shell style comments.
+    *
+    * @param {Object} options a set of optional parameters.
+    * @return {function (JobT)} a function that examines the source code
+    *     in the input job and builds a decoration list which it attaches to
+    *     the job.
+    */
+  function sourceDecorator(options) {
+    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
+    if (options['tripleQuotedStrings']) {
+      // '''multi-line-string''', 'single-line-string', and double-quoted
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
+           null, '\'"']);
+    } else if (options['multiLineStrings']) {
+      // 'multi-line-string', "multi-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
+           null, '\'"`']);
+    } else {
+      // 'single-line-string', "single-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,
+           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
+           null, '"\'']);
+    }
+    if (options['verbatimStrings']) {
+      // verbatim-string-literal production from the C# grammar.  See issue 93.
+      fallthroughStylePatterns.push(
+          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
+    }
+    var hc = options['hashComments'];
+    if (hc) {
+      if (options['cStyleComments']) {
+        if (hc > 1) {  // multiline hash comments
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
+        } else {
+          // Stop C preprocessor declarations at an unclosed open comment
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
+               null, '#']);
+        }
+        // #include <stdio.h>
+        fallthroughStylePatterns.push(
+            [PR_STRING,
+             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
+             null]);
+      } else {
+        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
+      }
+    }
+    if (options['cStyleComments']) {
+      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
+      fallthroughStylePatterns.push(
+          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
+    }
+    var regexLiterals = options['regexLiterals'];
+    if (regexLiterals) {
+      /**
+       * @const
+       */
+      var regexExcls = regexLiterals > 1
+        ? ''  // Multiline regex literals
+        : '\n\r';
+      /**
+       * @const
+       */
+      var regexAny = regexExcls ? '.' : '[\\S\\s]';
+      /**
+       * @const
+       */
+      var REGEX_LITERAL = (
+          // A regular expression literal starts with a slash that is
+          // not followed by * or / so that it is not confused with
+          // comments.
+          '/(?=[^/*' + regexExcls + '])'
+          // and then contains any number of raw characters,
+          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
+          // escape sequences (\x5C),
+          +    '|\\x5C' + regexAny
+          // or non-nesting character sets (\x5B\x5D);
+          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
+          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
+          // finally closed by a /.
+          + '/');
+      fallthroughStylePatterns.push(
+          ['lang-regex',
+           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
+           ]);
+    }
+
+    var types = options['types'];
+    if (types) {
+      fallthroughStylePatterns.push([PR_TYPE, types]);
+    }
+
+    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
+    if (keywords.length) {
+      fallthroughStylePatterns.push(
+          [PR_KEYWORD,
+           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
+           null]);
+    }
+
+    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
+
+    var punctuation =
+      // The Bash man page says
+
+      // A word is a sequence of characters considered as a single
+      // unit by GRUB. Words are separated by metacharacters,
+      // which are the following plus space, tab, and newline: { }
+      // | & $ ; < >
+      // ...
+
+      // A word beginning with # causes that word and all remaining
+      // characters on that line to be ignored.
+
+      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
+      // comment but empirically
+      // $ echo {#}
+      // {#}
+      // $ echo \$#
+      // $#
+      // $ echo }#
+      // }#
+
+      // so /(?:^|[|&;<>\s])/ is more appropriate.
+
+      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
+      // suggests that this definition is compatible with a
+      // default mode that tries to use a single token definition
+      // to recognize both bash/python style comments and C
+      // preprocessor directives.
+
+      // This definition of punctuation does not include # in the list of
+      // follow-on exclusions, so # will not be broken before if preceeded
+      // by a punctuation character.  We could try to exclude # after
+      // [|&;<>] but that doesn't seem to cause many major problems.
+      // If that does turn out to be a problem, we should change the below
+      // when hc is truthy to include # in the run of punctuation characters
+      // only when not followint [|&;<>].
+      '^.[^\\s\\w.$@\'"`/\\\\]*';
+    if (options['regexLiterals']) {
+      punctuation += '(?!\s*\/)';
+    }
+
+    fallthroughStylePatterns.push(
+        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
+        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
+        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_LITERAL,
+         new RegExp(
+             '^(?:'
+             // A hex number
+             + '0x[a-f0-9]+'
+             // or an octal or decimal number,
+             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
+             // possibly in scientific notation
+             + '(?:e[+\\-]?\\d+)?'
+             + ')'
+             // with an optional modifier like UL for unsigned long
+             + '[a-z]*', 'i'),
+         null, '0123456789'],
+        // Don't treat escaped quotes in bash as starting strings.
+        // See issue 144.
+        [PR_PLAIN,       /^\\[\s\S]?/, null],
+        [PR_PUNCTUATION, new RegExp(punctuation), null]);
+
+    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
+  }
+
+  var decorateSource = sourceDecorator({
+        'keywords': ALL_KEYWORDS,
+        'hashComments': true,
+        'cStyleComments': true,
+        'multiLineStrings': true,
+        'regexLiterals': true
+      });
+
+  /* @include numberLines.js */
+
+  /* @include recombineTagsAndDecorations.js */
+
+  /** Maps language-specific file extensions to handlers. */
+  var langHandlerRegistry = {};
+  /** Register a language handler for the given file extensions.
+    * @param {function (JobT)} handler a function from source code to a list
+    *      of decorations.  Takes a single argument job which describes the
+    *      state of the computation and attaches the decorations to it.
+    * @param {Array.<string>} fileExtensions
+    */
+  function registerLangHandler(handler, fileExtensions) {
+    for (var i = fileExtensions.length; --i >= 0;) {
+      var ext = fileExtensions[i];
+      if (!langHandlerRegistry.hasOwnProperty(ext)) {
+        langHandlerRegistry[ext] = handler;
+      } else if (win['console']) {
+        console['warn']('cannot override language handler %s', ext);
+      }
+    }
+  }
+  function langHandlerForExtension(extension, source) {
+    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
+      // Treat it as markup if the first non whitespace character is a < and
+      // the last non-whitespace character is a >.
+      extension = /^\s*</.test(source)
+          ? 'default-markup'
+          : 'default-code';
+    }
+    return langHandlerRegistry[extension];
+  }
+  registerLangHandler(decorateSource, ['default-code']);
+  registerLangHandler(
+      createSimpleLexer(
+          [],
+          [
+           [PR_PLAIN,       /^[^<?]+/],
+           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
+           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
+           // Unescaped content in an unknown language
+           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
+           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
+           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
+           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
+           // Unescaped content in javascript.  (Or possibly vbscript).
+           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
+           // Contains unescaped stylesheet content
+           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
+           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
+          ]),
+      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
+  registerLangHandler(
+      createSimpleLexer(
+          [
+           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
+           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
+           ],
+          [
+           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
+           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
+           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+           [PR_PUNCTUATION,  /^[=<>\/]+/],
+           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
+           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
+           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
+           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
+           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
+           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
+           ]),
+      ['in.tag']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CPP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'types': C_TYPES
+        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': 'null,true,false'
+        }), ['json']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CSHARP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'verbatimStrings': true,
+          'types': C_TYPES
+        }), ['cs']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JAVA_KEYWORDS,
+          'cStyleComments': true
+        }), ['java']);
+  registerLangHandler(sourceDecorator({
+          'keywords': SH_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true
+        }), ['bash', 'bsh', 'csh', 'sh']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PYTHON_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'tripleQuotedStrings': true
+        }), ['cv', 'py', 'python']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PERL_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': 2  // multiline regex literals
+        }), ['perl', 'pl', 'pm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': RUBY_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': true
+        }), ['rb', 'ruby']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JSCRIPT_KEYWORDS,
+          'cStyleComments': true,
+          'regexLiterals': true
+        }), ['javascript', 'js', 'ts', 'typescript']);
+  registerLangHandler(sourceDecorator({
+          'keywords': COFFEE_KEYWORDS,
+          'hashComments': 3,  // ### style block comments
+          'cStyleComments': true,
+          'multilineStrings': true,
+          'tripleQuotedStrings': true,
+          'regexLiterals': true
+        }), ['coffee']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
+
+  /** @param {JobT} job */
+  function applyDecorator(job) {
+    var opt_langExtension = job.langExtension;
+
+    try {
+      // Extract tags, and convert the source code to plain text.
+      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
+      /** Plain text. @type {string} */
+      var source = sourceAndSpans.sourceCode;
+      job.sourceCode = source;
+      job.spans = sourceAndSpans.spans;
+      job.basePos = 0;
+
+      // Apply the appropriate language handler
+      langHandlerForExtension(opt_langExtension, source)(job);
+
+      // Integrate the decorations and tags back into the source code,
+      // modifying the sourceNode in place.
+      recombineTagsAndDecorations(job);
+    } catch (e) {
+      if (win['console']) {
+        console['log'](e && e['stack'] || e);
+      }
+    }
+  }
+
+  /**
+   * Pretty print a chunk of code.
+   * @param sourceCodeHtml {string} The HTML to pretty print.
+   * @param opt_langExtension {string} The language name to use.
+   *     Typically, a filename extension like 'cpp' or 'java'.
+   * @param opt_numberLines {number|boolean} True to number lines,
+   *     or the 1-indexed number of the first line in sourceCodeHtml.
+   */
+  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
+    /** @type{number|boolean} */
+    var nl = opt_numberLines || false;
+    /** @type{string|null} */
+    var langExtension = opt_langExtension || null;
+    /** @type{!Element} */
+    var container = document.createElement('div');
+    // This could cause images to load and onload listeners to fire.
+    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
+    // We assume that the inner HTML is from a trusted source.
+    // The pre-tag is required for IE8 which strips newlines from innerHTML
+    // when it is injected into a <pre> tag.
+    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
+    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
+    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
+    container = /** @type{!Element} */(container.firstChild);
+    if (nl) {
+      numberLines(container, nl, true);
+    }
+
+    /** @type{JobT} */
+    var job = {
+      langExtension: langExtension,
+      numberLines: nl,
+      sourceNode: container,
+      pre: 1,
+      sourceCode: null,
+      basePos: null,
+      spans: null,
+      decorations: null
+    };
+    applyDecorator(job);
+    return container.innerHTML;
+  }
+
+   /**
+    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+    * {@code class=prettyprint} and prettify them.
+    *
+    * @param {Function} opt_whenDone called when prettifying is done.
+    * @param {HTMLElement|HTMLDocument} opt_root an element or document
+    *   containing all the elements to pretty print.
+    *   Defaults to {@code document.body}.
+    */
+  function $prettyPrint(opt_whenDone, opt_root) {
+    var root = opt_root || document.body;
+    var doc = root.ownerDocument || document;
+    function byTagName(tn) { return root.getElementsByTagName(tn); }
+    // fetch a list of nodes to rewrite
+    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
+    var elements = [];
+    for (var i = 0; i < codeSegments.length; ++i) {
+      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
+        elements.push(codeSegments[i][j]);
+      }
+    }
+    codeSegments = null;
+
+    var clock = Date;
+    if (!clock['now']) {
+      clock = { 'now': function () { return +(new Date); } };
+    }
+
+    // The loop is broken into a series of continuations to make sure that we
+    // don't make the browser unresponsive when rewriting a large page.
+    var k = 0;
+
+    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
+    var prettyPrintRe = /\bprettyprint\b/;
+    var prettyPrintedRe = /\bprettyprinted\b/;
+    var preformattedTagNameRe = /pre|xmp/i;
+    var codeRe = /^code$/i;
+    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
+    var EMPTY = {};
+
+    function doWork() {
+      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
+                     clock['now']() + 250 /* ms */ :
+                     Infinity);
+      for (; k < elements.length && clock['now']() < endTime; k++) {
+        var cs = elements[k];
+
+        // Look for a preceding comment like
+        // <?prettify lang="..." linenums="..."?>
+        var attrs = EMPTY;
+        {
+          for (var preceder = cs; (preceder = preceder.previousSibling);) {
+            var nt = preceder.nodeType;
+            // <?foo?> is parsed by HTML 5 to a comment node (8)
+            // like <!--?foo?-->, but in XML is a processing instruction
+            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
+            if (value
+                ? !/^\??prettify\b/.test(value)
+                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
+              // Skip over white-space text nodes but not others.
+              break;
+            }
+            if (value) {
+              attrs = {};
+              value.replace(
+                  /\b(\w+)=([\w:.%+-]+)/g,
+                function (_, name, value) { attrs[name] = value; });
+              break;
+            }
+          }
+        }
+
+        var className = cs.className;
+        if ((attrs !== EMPTY || prettyPrintRe.test(className))
+            // Don't redo this if we've already done it.
+            // This allows recalling pretty print to just prettyprint elements
+            // that have been added to the page since last call.
+            && !prettyPrintedRe.test(className)) {
+
+          // make sure this is not nested in an already prettified element
+          var nested = false;
+          for (var p = cs.parentNode; p; p = p.parentNode) {
+            var tn = p.tagName;
+            if (preCodeXmpRe.test(tn)
+                && p.className && prettyPrintRe.test(p.className)) {
+              nested = true;
+              break;
+            }
+          }
+          if (!nested) {
+            // Mark done.  If we fail to prettyprint for whatever reason,
+            // we shouldn't try again.
+            cs.className += ' prettyprinted';
+
+            // If the classes includes a language extensions, use it.
+            // Language extensions can be specified like
+            //     <pre class="prettyprint lang-cpp">
+            // the language extension "cpp" is used to find a language handler
+            // as passed to PR.registerLangHandler.
+            // HTML5 recommends that a language be specified using "language-"
+            // as the prefix instead.  Google Code Prettify supports both.
+            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
+            var langExtension = attrs['lang'];
+            if (!langExtension) {
+              langExtension = className.match(langExtensionRe);
+              // Support <pre class="prettyprint"><code class="language-c">
+              var wrapper;
+              if (!langExtension && (wrapper = childContentWrapper(cs))
+                  && codeRe.test(wrapper.tagName)) {
+                langExtension = wrapper.className.match(langExtensionRe);
+              }
+
+              if (langExtension) { langExtension = langExtension[1]; }
+            }
+
+            var preformatted;
+            if (preformattedTagNameRe.test(cs.tagName)) {
+              preformatted = 1;
+            } else {
+              var currentStyle = cs['currentStyle'];
+              var defaultView = doc.defaultView;
+              var whitespace = (
+                  currentStyle
+                  ? currentStyle['whiteSpace']
+                  : (defaultView
+                     && defaultView.getComputedStyle)
+                  ? defaultView.getComputedStyle(cs, null)
+                  .getPropertyValue('white-space')
+                  : 0);
+              preformatted = whitespace
+                  && 'pre' === whitespace.substring(0, 3);
+            }
+
+            // Look for a class like linenums or linenums:<n> where <n> is the
+            // 1-indexed number of the first line.
+            var lineNums = attrs['linenums'];
+            if (!(lineNums = lineNums === 'true' || +lineNums)) {
+              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
+              lineNums =
+                lineNums
+                ? lineNums[1] && lineNums[1].length
+                  ? +lineNums[1] : true
+                : false;
+            }
+            if (lineNums) { numberLines(cs, lineNums, preformatted); }
+
+            // do the pretty printing
+            var prettyPrintingJob = {
+              langExtension: langExtension,
+              sourceNode: cs,
+              numberLines: lineNums,
+              pre: preformatted,
+              sourceCode: null,
+              basePos: null,
+              spans: null,
+              decorations: null
+            };
+            applyDecorator(prettyPrintingJob);
+          }
+        }
+      }
+      if (k < elements.length) {
+        // finish up in a continuation
+        win.setTimeout(doWork, 250);
+      } else if ('function' === typeof opt_whenDone) {
+        opt_whenDone();
+      }
+    }
+
+    doWork();
+  }
+
+  /**
+   * Contains functions for creating and registering new language handlers.
+   * @type {Object}
+   */
+  var PR = win['PR'] = {
+        'createSimpleLexer': createSimpleLexer,
+        'registerLangHandler': registerLangHandler,
+        'sourceDecorator': sourceDecorator,
+        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
+        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
+        'PR_COMMENT': PR_COMMENT,
+        'PR_DECLARATION': PR_DECLARATION,
+        'PR_KEYWORD': PR_KEYWORD,
+        'PR_LITERAL': PR_LITERAL,
+        'PR_NOCODE': PR_NOCODE,
+        'PR_PLAIN': PR_PLAIN,
+        'PR_PUNCTUATION': PR_PUNCTUATION,
+        'PR_SOURCE': PR_SOURCE,
+        'PR_STRING': PR_STRING,
+        'PR_TAG': PR_TAG,
+        'PR_TYPE': PR_TYPE,
+        'prettyPrintOne':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrintOne'] = $prettyPrintOne)
+             : (prettyPrintOne = $prettyPrintOne),
+        'prettyPrint':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrint'] = $prettyPrint)
+             : (prettyPrint = $prettyPrint)
+      };
+
+  // Make PR available via the Asynchronous Module Definition (AMD) API.
+  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
+  // The Asynchronous Module Definition (AMD) API specifies a
+  // mechanism for defining modules such that the module and its
+  // dependencies can be asynchronously loaded.
+  // ...
+  // To allow a clear indicator that a global define function (as
+  // needed for script src browser loading) conforms to the AMD API,
+  // any global define function SHOULD have a property called "amd"
+  // whose value is an object. This helps avoid conflict with any
+  // other existing JavaScript code that could have defined a define()
+  // function that does not conform to the AMD API.
+  var define = win['define'];
+  if (typeof define === "function" && define['amd']) {
+    define("google-code-prettify", [], function () {
+      return PR;
+    });
+  }
+})();
diff --git a/static/bower_components/google-prettify/js-modules/recombineTagsAndDecorations.js b/static/bower_components/google-prettify/js-modules/recombineTagsAndDecorations.js
new file mode 100644
index 00000000..69b1a8f0
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/recombineTagsAndDecorations.js
@@ -0,0 +1,116 @@
+/**
+ * Breaks {@code job.sourceCode} around style boundaries in
+ * {@code job.decorations} and modifies {@code job.sourceNode} in place.
+ * @param {JobT} job
+ * @private
+ */
+function recombineTagsAndDecorations(job) {
+  var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
+  isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
+  var newlineRe = /\n/g;
+
+  var source = job.sourceCode;
+  var sourceLength = source.length;
+  // Index into source after the last code-unit recombined.
+  var sourceIndex = 0;
+
+  var spans = job.spans;
+  var nSpans = spans.length;
+  // Index into spans after the last span which ends at or before sourceIndex.
+  var spanIndex = 0;
+
+  var decorations = job.decorations;
+  var nDecorations = decorations.length;
+  // Index into decorations after the last decoration which ends at or before
+  // sourceIndex.
+  var decorationIndex = 0;
+
+  // Remove all zero-length decorations.
+  decorations[nDecorations] = sourceLength;
+  var decPos, i;
+  for (i = decPos = 0; i < nDecorations;) {
+    if (decorations[i] !== decorations[i + 2]) {
+      decorations[decPos++] = decorations[i++];
+      decorations[decPos++] = decorations[i++];
+    } else {
+      i += 2;
+    }
+  }
+  nDecorations = decPos;
+
+  // Simplify decorations.
+  for (i = decPos = 0; i < nDecorations;) {
+    var startPos = decorations[i];
+    // Conflate all adjacent decorations that use the same style.
+    var startDec = decorations[i + 1];
+    var end = i + 2;
+    while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
+      end += 2;
+    }
+    decorations[decPos++] = startPos;
+    decorations[decPos++] = startDec;
+    i = end;
+  }
+
+  nDecorations = decorations.length = decPos;
+
+  var sourceNode = job.sourceNode;
+  var oldDisplay = "";
+  if (sourceNode) {
+    oldDisplay = sourceNode.style.display;
+    sourceNode.style.display = 'none';
+  }
+  try {
+    var decoration = null;
+    while (spanIndex < nSpans) {
+      var spanStart = spans[spanIndex];
+      var spanEnd = /** @type{number} */ (spans[spanIndex + 2])
+          || sourceLength;
+
+      var decEnd = decorations[decorationIndex + 2] || sourceLength;
+
+      var end = Math.min(spanEnd, decEnd);
+
+      var textNode = /** @type{Node} */ (spans[spanIndex + 1]);
+      var styledText;
+      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
+          // Don't introduce spans around empty text nodes.
+          && (styledText = source.substring(sourceIndex, end))) {
+        // This may seem bizarre, and it is.  Emitting LF on IE causes the
+        // code to display with spaces instead of line breaks.
+        // Emitting Windows standard issue linebreaks (CRLF) causes a blank
+        // space to appear at the beginning of every line but the first.
+        // Emitting an old Mac OS 9 line separator makes everything spiffy.
+        if (isIE8OrEarlier) {
+          styledText = styledText.replace(newlineRe, '\r');
+        }
+        textNode.nodeValue = styledText;
+        var document = textNode.ownerDocument;
+        var span = document.createElement('span');
+        span.className = decorations[decorationIndex + 1];
+        var parentNode = textNode.parentNode;
+        parentNode.replaceChild(span, textNode);
+        span.appendChild(textNode);
+        if (sourceIndex < spanEnd) {  // Split off a text node.
+          spans[spanIndex + 1] = textNode
+              // TODO: Possibly optimize by using '' if there's no flicker.
+              = document.createTextNode(source.substring(end, spanEnd));
+          parentNode.insertBefore(textNode, span.nextSibling);
+        }
+      }
+
+      sourceIndex = end;
+
+      if (sourceIndex >= spanEnd) {
+        spanIndex += 2;
+      }
+      if (sourceIndex >= decEnd) {
+        decorationIndex += 2;
+      }
+    }
+  } finally {
+    if (sourceNode) {
+      sourceNode.style.display = oldDisplay;
+    }
+  }
+}
diff --git a/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.js b/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.js
new file mode 100644
index 00000000..65d3de53
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.js
@@ -0,0 +1,30 @@
+
+// Regex pattern below is automatically generated by regexpPrecederPatterns.pl
+// Do not modify, your changes will be erased.
+
+// CAVEAT: this does not properly handle the case where a regular
+// expression immediately follows another since a regular expression may
+// have flags for case-sensitivity and the like.  Having regexp tokens
+// adjacent is not valid in any language I'm aware of, so I'm punting.
+// TODO: maybe style special characters inside a regexp as punctuation.
+
+/**
+ * A set of tokens that can precede a regular expression literal in
+ * javascript
+ * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+ * has the full list, but I've removed ones that might be problematic when
+ * seen in languages that don't support regular expression literals.
+ *
+ * Specifically, I've removed any keywords that can't precede a regexp
+ * literal in a syntactically legal javascript program, and I've removed the
+ * "in" keyword since it's not a keyword in many languages, and might be used
+ * as a count of inches.
+ *
+ * The link above does not accurately describe EcmaScript rules since
+ * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+ * very well in practice.
+ *
+ * @private
+ * @const
+ */
+var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
diff --git a/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.pl b/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.pl
new file mode 100644
index 00000000..0f1e1d59
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/regexpPrecederPatterns.pl
@@ -0,0 +1,68 @@
+use strict;
+
+print "
+// Regex pattern below is automatically generated by regexpPrecederPatterns.pl
+// Do not modify, your changes will be erased.
+
+// CAVEAT: this does not properly handle the case where a regular
+// expression immediately follows another since a regular expression may
+// have flags for case-sensitivity and the like.  Having regexp tokens
+// adjacent is not valid in any language I'm aware of, so I'm punting.
+// TODO: maybe style special characters inside a regexp as punctuation.
+
+/**
+ * A set of tokens that can precede a regular expression literal in
+ * javascript
+ * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+ * has the full list, but I've removed ones that might be problematic when
+ * seen in languages that don't support regular expression literals.
+ *
+ * Specifically, I've removed any keywords that can't precede a regexp
+ * literal in a syntactically legal javascript program, and I've removed the
+ * \"in\" keyword since it's not a keyword in many languages, and might be used
+ * as a count of inches.
+ *
+ * The link above does not accurately describe EcmaScript rules since
+ * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+ * very well in practice.
+ *
+ * \@private
+ * \@const
+ */
+var REGEXP_PRECEDER_PATTERN = ";
+
+my @preceders = (
+                 "[!=]=?=?",   # "!", "!=", "!==", "=", "==", "===",
+                 "\\#",
+                 "%=?",        # "%", "%=",
+                 "&&?=?",      # "&", "&&", "&&=", "&=",
+                 "\\(",
+                 "\\*=?",      # "*", "*=",
+                 "[+\\-]=",    # +=, -=.  + and - handled below.
+                 "->",
+                 "\\/=?",      # "/", "/=",
+                 "::?",        # ":", "::",
+                 "<<?=?",      # "<", "<<", "<<=", "<=",
+                 ">>?>?=?",    # ">", ">=", ">>", ">>=", ">>>", ">>>=",
+                 ",",
+                 ";",          # ";"
+                 "\\?",
+                 "@",
+                 "\\[",
+                 "~",          # handles =~ and !~
+                 "{",
+                 "\\^\\^?=?",  # "^", "^=", "^^", "^^=",
+                 "\\|\\|?=?",  # "|", "|=", "||", "||=",
+                 "break", "case", "continue", "delete",
+                 "do", "else", "finally", "instanceof",
+                 "return", "throw", "try", "typeof"
+                );
+# match at beginning, a dot that is not part of a number, or sign.
+my $pattern = "'(?:^^\\\\.?|[+-]";
+foreach my $preceder (@preceders) {
+  $preceder =~ s/\\/\\\\/g;
+  $pattern .= "|$preceder";
+}
+$pattern .= ")\\\\s*'";  # matches at end, and matches empty string
+
+print "$pattern;\n";
diff --git a/static/bower_components/google-prettify/js-modules/run_prettify.js b/static/bower_components/google-prettify/js-modules/run_prettify.js
new file mode 100644
index 00000000..5fec41ad
--- /dev/null
+++ b/static/bower_components/google-prettify/js-modules/run_prettify.js
@@ -0,0 +1,261 @@
+/**
+ * @license
+ * Copyright (C) 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * <div style="white-space: pre">
+ * Looks at query parameters to decide which language handlers and style-sheets
+ * to load.
+ *
+ * Query Parameter     Format           Effect                        Default
+ * +------------------+---------------+------------------------------+--------+
+ * | autorun=         | true | false  | If true then prettyPrint()   | "true" |
+ * |                  |               | is called on page load.      |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | lang=            | language name | Loads the language handler   | Can    |
+ * |                  |               | named "lang-<NAME>.js".      | appear |
+ * |                  |               | See available handlers at    | many   |
+ * |                  |               | https://github.com/google/   | times. |
+ * |                  |               | code-prettify/tree/master/   |        |
+ * |                  |               | src                          |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | skin=            | skin name     | Loads the skin stylesheet    | none.  |
+ * |                  |               | named "<NAME>.css".          |        |
+ * |                  |               | https://cdn.rawgit.com/      |        |
+ * |                  |               | google/code-prettify/master/ |        |
+ * |                  |               | styles/index.html            |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | callback=        | JS identifier | When "prettyPrint" finishes  | none   |
+ * |                  |               | window.exports[js_ident] is  |        |
+ * |                  |               | called.                      |        |
+ * |                  |               | The callback must be under   |        |
+ * |                  |               | exports to reduce the risk   |        |
+ * |                  |               | of XSS via query parameter   |        |
+ * |                  |               | injection.                   |        |
+ * +------------------+---------------+------------------------------+--------+
+ *
+ * Examples
+ * .../run_prettify.js?lang=css&skin=sunburst
+ *   1. Loads the CSS language handler which can be used to prettify CSS
+ *      stylesheets, HTML <style> element bodies and style="..." attributes
+ *      values.
+ *   2. Loads the sunburst.css stylesheet instead of the default prettify.css
+ *      stylesheet.
+ *      A gallery of stylesheets is available at
+ *      https://cdn.rawgit.com/google/code-prettify/master/styles/index.html
+ *   3. Since autorun=false is not specified, calls prettyPrint() on page load.
+ * </div>
+ */
+
+/* @ifdef RUN_PRETTIFY */
+/* @include defs.js */
+/* @endif */
+
+(function () {
+  "use strict";
+
+  var win = window;
+  var doc = document;
+  var root = doc.documentElement;
+  var head = doc['head'] || doc.getElementsByTagName("head")[0] || root;
+
+  // From http://javascript.nwbox.com/ContentLoaded/contentloaded.js
+  // Author: Diego Perini (diego.perini at gmail.com)
+  // Summary: cross-browser wrapper for DOMContentLoaded
+  // Updated: 20101020
+  // License: MIT
+  // Version: 1.2
+  function contentLoaded(callback) {
+    var addEventListener = doc['addEventListener'];
+    var done = false, top = true,
+        add = addEventListener ? 'addEventListener' : 'attachEvent',
+        rem = addEventListener ? 'removeEventListener' : 'detachEvent',
+        pre = addEventListener ? '' : 'on',
+
+        init = function(e) {
+          if (e.type == 'readystatechange' && doc.readyState != 'complete') {
+            return;
+          }
+          (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);
+          if (!done && (done = true)) { callback.call(win, e.type || e); }
+        },
+
+        poll = function() {
+          try {
+            root.doScroll('left');
+          } catch(e) {
+            win.setTimeout(poll, 50);
+            return;
+          }
+          init('poll');
+        };
+
+    if (doc.readyState == 'complete') {
+      callback.call(win, 'lazy');
+    } else {
+      if (doc.createEventObject && root.doScroll) {
+        try { top = !win.frameElement; } catch(e) { }
+        if (top) { poll(); }
+      }
+      doc[add](pre + 'DOMContentLoaded', init, false);
+      doc[add](pre + 'readystatechange', init, false);
+      win[add](pre + 'load', init, false);
+    }
+  }
+
+  // Given a list of URLs to stylesheets, loads the first that loads without
+  // triggering an error event.
+  function loadStylesheetsFallingBack(stylesheets) {
+    var n = stylesheets.length;
+    function load(i) {
+      if (i === n) { return; }
+      var link = doc.createElement('link');
+      link.rel = 'stylesheet';
+      link.type = 'text/css';
+      if (i + 1 < n) {
+        // http://pieisgood.org/test/script-link-events/ indicates that many
+        // versions of IE do not support onerror on <link>s, though
+        // http://msdn.microsoft.com/en-us/library/ie/ms535848(v=vs.85).aspx
+        // indicates that recent IEs do support error.
+        link.error = link.onerror = function () { load(i + 1); };
+      }
+      link.href = stylesheets[i];
+      head.appendChild(link);
+    }
+    load(0);
+  }
+
+  var scriptQuery = '';
+  // Look for the <script> node that loads this script to get its parameters.
+  // This starts looking at the end instead of just considering the last
+  // because deferred and async scripts run out of order.
+  // If the script is loaded twice, then this will run in reverse order.
+  var scripts = doc.getElementsByTagName('script');
+  for (var i = scripts.length; --i >= 0;) {
+    var script = scripts[i];
+    var match = script.src.match(
+        /^[^?#]*\/run_prettify\.js(\?[^#]*)?(?:#.*)?$/);
+    if (match) {
+      scriptQuery = match[1] || '';
+      // Remove the script from the DOM so that multiple runs at least run
+      // multiple times even if parameter sets are interpreted in reverse
+      // order.
+      script.parentNode.removeChild(script);
+      break;
+    }
+  }
+
+  // Pull parameters into local variables.
+  var autorun = true;
+  var langs = [];
+  var skins = [];
+  var callbacks = [];
+  scriptQuery.replace(
+      /[?&]([^&=]+)=([^&]+)/g,
+      function (_, name, value) {
+        value = decodeURIComponent(value);
+        name = decodeURIComponent(name);
+        if (name == 'autorun')   { autorun = !/^[0fn]/i.test(value); } else
+        if (name == 'lang')      { langs.push(value);                } else
+        if (name == 'skin')      { skins.push(value);                } else
+        if (name == 'callback')  { callbacks.push(value);            }
+      });
+
+  // Use https to avoid mixed content warnings in client pages and to
+  // prevent a MITM from rewrite prettify mid-flight.
+  // This only works if this script is loaded via https : something
+  // over which we exercise no control.
+  var LOADER_BASE_URL =
+     'https://cdn.rawgit.com/google/code-prettify/master/loader';
+
+  for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {
+    var script = doc.createElement("script");
+
+    // Excerpted from jQuery.ajaxTransport("script") to fire events when
+    // a script is finished loading.
+    // Attach handlers for each script
+    script.onload = script.onerror = script.onreadystatechange = function () {
+      if (script && (
+            !script.readyState || /loaded|complete/.test(script.readyState))) {
+        // Handle memory leak in IE
+        script.onerror = script.onload = script.onreadystatechange = null;
+
+        --pendingLanguages;
+        checkPendingLanguages();
+
+        // Remove the script
+        if (script.parentNode) {
+          script.parentNode.removeChild(script);
+        }
+
+        script = null;
+      }
+    };
+
+    script.type = 'text/javascript';
+    script.src = LOADER_BASE_URL
+      + '/lang-' + encodeURIComponent(langs[i]) + '.js';
+
+    // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+    head.insertBefore(script, head.firstChild);
+  })(langs[i]);
+
+  var pendingLanguages = langs.length;
+  function checkPendingLanguages() {
+    if (!pendingLanguages) {
+      win.setTimeout(onLangsLoaded, 0);
+    }
+  }
+
+  var skinUrls = [];
+  for (var i = 0, n = skins.length; i < n; ++i) {
+    skinUrls.push(LOADER_BASE_URL
+        + '/skins/' + encodeURIComponent(skins[i]) + '.css');
+  }
+  skinUrls.push(LOADER_BASE_URL + '/prettify.css');
+  loadStylesheetsFallingBack(skinUrls);
+
+  var prettyPrint = (function () {
+    /* @include prettify.js */
+    return prettyPrint;
+  })();
+
+  // If this script is deferred or async and the document is already
+  // loaded we need to wait for language handlers to load before performing
+  // any autorun.
+  function onLangsLoaded() {
+    if (autorun) {
+      contentLoaded(
+        function () {
+          var n = callbacks.length;
+          var callback = n ? function () {
+            for (var i = 0; i < n; ++i) {
+              (function (i) {
+                win.setTimeout(
+                   function () {
+                     win['exports'][callbacks[i]].apply(win, arguments);
+                   }, 0);
+               })(i);
+            }
+          } : void 0;
+          prettyPrint(callback);
+        });
+    }
+  }
+  checkPendingLanguages();
+
+}());
diff --git a/static/bower_components/google-prettify/loader/lang-Splus.js b/static/bower_components/google-prettify/loader/lang-Splus.js
new file mode 100644
index 00000000..6ce16e8a
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-Splus.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2012 Jeffrey B. Arnold
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"'],["str",/^\'(?:[^\'\\]|\\[\s\S])*(?:\'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],["lit",/^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],["lit",/^[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|[0-9]+))(?![A-Za-z0-9_.])/],
+["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\*|\+|\^|\/|!|%.*?%|=|~|\$|@|:{1,3}|[\[\](){};,?])/],["pln",/^(?:[A-Za-z]+[A-Za-z0-9_.]*|\.[a-zA-Z_][0-9a-zA-Z\._]*)(?![A-Za-z0-9_.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]);
diff --git a/static/bower_components/google-prettify/loader/lang-aea.js b/static/bower_components/google-prettify/loader/lang-aea.js
new file mode 100644
index 00000000..784ebb29
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-aea.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Onno Hommes.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\r\n]*/,null,"#"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,
+null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["apollo","agc","aea"]);
diff --git a/static/bower_components/google-prettify/loader/lang-agc.js b/static/bower_components/google-prettify/loader/lang-agc.js
new file mode 100644
index 00000000..784ebb29
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-agc.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Onno Hommes.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\r\n]*/,null,"#"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,
+null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["apollo","agc","aea"]);
diff --git a/static/bower_components/google-prettify/loader/lang-apollo.js b/static/bower_components/google-prettify/loader/lang-apollo.js
new file mode 100644
index 00000000..784ebb29
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-apollo.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Onno Hommes.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\r\n]*/,null,"#"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,
+null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["apollo","agc","aea"]);
diff --git a/static/bower_components/google-prettify/loader/lang-basic.js b/static/bower_components/google-prettify/loader/lang-basic.js
new file mode 100644
index 00000000..2d6151dc
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-basic.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2013 Peter Kofler
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:"(?:[^\\"\r\n]|\\.)*(?:"|$))/,null,'"'],["pln",/^\s+/,null," \r\n\t\u00a0"]],[["com",/^REM[^\r\n]*/,null],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,null],["pln",/^[A-Z][A-Z0-9]?(?:\$|%)?/i,null],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?/i,
+null,"0123456789"],["pun",/^.[^\s\w\.$%"]*/,null]]),["basic","cbm"]);
diff --git a/static/bower_components/google-prettify/loader/lang-cbm.js b/static/bower_components/google-prettify/loader/lang-cbm.js
new file mode 100644
index 00000000..2d6151dc
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-cbm.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2013 Peter Kofler
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:"(?:[^\\"\r\n]|\\.)*(?:"|$))/,null,'"'],["pln",/^\s+/,null," \r\n\t\u00a0"]],[["com",/^REM[^\r\n]*/,null],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,null],["pln",/^[A-Z][A-Z0-9]?(?:\$|%)?/i,null],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?/i,
+null,"0123456789"],["pun",/^.[^\s\w\.$%"]*/,null]]),["basic","cbm"]);
diff --git a/static/bower_components/google-prettify/loader/lang-cl.js b/static/bower_components/google-prettify/loader/lang-cl.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-cl.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-clj.js b/static/bower_components/google-prettify/loader/lang-clj.js
new file mode 100644
index 00000000..d1173b1e
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-clj.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (C) 2011 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[\(\{\[]+/,null,"([{"],["clo",/^[\)\}\]]+/,null,")]}"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,
+null],["typ",/^:[0-9a-zA-Z\-]+/]]),["clj"]);
diff --git a/static/bower_components/google-prettify/loader/lang-css.js b/static/bower_components/google-prettify/loader/lang-css.js
new file mode 100644
index 00000000..90d175da
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-css.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[["str",/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],["str",/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']+)\)/i],["kwd",/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
+["com",/^(?:\x3c!--|--\x3e)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#(?:[0-9a-f]{3}){1,2}\b/i],["pln",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],["pun",/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^\)\"\']+/]]),["css-str"]);
diff --git a/static/bower_components/google-prettify/loader/lang-dart.js b/static/bower_components/google-prettify/loader/lang-dart.js
new file mode 100644
index 00000000..da142a4e
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-dart.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2013 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"]],[["com",/^#!(?:.*)/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/(?:.*)/],["com",/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|async|await|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|sync|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],
+["typ",/^\b(?:bool|double|Dynamic|int|num|Object|String|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?[\']{3}[\s|\S]*?[^\\][\']{3}/],["str",/^r?[\"]{3}[\s|\S]*?[^\\][\"]{3}/],["str",/^r?\'(\'|(?:[^\n\r\f])*?[^\\]\')/],["str",/^r?\"(\"|(?:[^\n\r\f])*?[^\\]\")/],["typ",/^[A-Z]\w*/],["pln",/^[a-z_$][a-z0-9_]*/i],["pun",/^[~!%^&*+=|?:<>/-]/],["lit",/^\b0x[0-9a-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",
+/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(){}\[\],.;]/]]),["dart"]);
diff --git a/static/bower_components/google-prettify/loader/lang-el.js b/static/bower_components/google-prettify/loader/lang-el.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-el.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-erl.js b/static/bower_components/google-prettify/loader/lang-erl.js
new file mode 100644
index 00000000..e7da9b04
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-erl.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2013 Andrew Allen
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\x0B\x0C\r ]+/,null,"\t\n\x0B\f\r "],["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["lit",/^[a-z][a-zA-Z0-9_]*/],["lit",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/,null,"'"],["lit",/^\?[^ \t\n({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],
+["kwd",/^-[a-z_]+/],["typ",/^[A-Z_][a-zA-Z0-9_]*/],["pun",/^[.,;]/]]),["erlang","erl"]);
diff --git a/static/bower_components/google-prettify/loader/lang-erlang.js b/static/bower_components/google-prettify/loader/lang-erlang.js
new file mode 100644
index 00000000..e7da9b04
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-erlang.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2013 Andrew Allen
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\x0B\x0C\r ]+/,null,"\t\n\x0B\f\r "],["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["lit",/^[a-z][a-zA-Z0-9_]*/],["lit",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/,null,"'"],["lit",/^\?[^ \t\n({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],
+["kwd",/^-[a-z_]+/],["typ",/^[A-Z_][a-zA-Z0-9_]*/],["pun",/^[.,;]/]]),["erlang","erl"]);
diff --git a/static/bower_components/google-prettify/loader/lang-ex.js b/static/bower_components/google-prettify/loader/lang-ex.js
new file mode 100644
index 00000000..08ff1c51
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-ex.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2017 Jacek Kr??likowski
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^#.*/,null,"#"],["lit",/^'(?:[^'\\]|\\(?:.|\n|\r))*'?/,null,"'"],["atn",/^@\w+/,null,"@"],["pun",/^[!%&()*+,\-;<=>?\[\\\]^{|}]+/,null,"!%&()*+,-;<=>?[\\]^{|}"],["lit",/^(?:0o[0-7](?:[0-7]|_[0-7])*|0x[\da-fA-F](?:[\da-fA-F]|_[\da-fA-F])*|\d(?:\d|_\d)*(?:\.\d(?:\d|_\d)*)?(?:[eE][+\-]?\d(?:\d|_\d)*)?)/,null,"0123456789"]],[["atn",/^iex(?:\(\d+\))?> /],
+["pun",/^::/],["lit",/^:(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"?)/],["atn",/^(?:__(?:CALLER|ENV|MODULE|DIR)__)/],["kwd",/^(?:alias|case|catch|def(?:delegate|exception|impl|macrop?|module|overridable|p?|protocol|struct)|do|else|end|fn|for|if|in|import|quote|raise|require|rescue|super|throw|try|unless|unquote(?:_splicing)?|use|when|with|yield)\b/],["lit",/^(?:true|false|nil)\b/],["lit",/^(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"):(?!:)/],["str",/^"""\s*(\r|\n)+(?:""?(?!")|[^\\"]|\\(?:.|\n|\r))*"{0,3}/],
+["str",/^"(?:[^"\\]|\\(?:.|\n|\r))*"?(?!")/],["typ",/^[A-Z]\w*/],["com",/^_\w*/],["pln",/^[$a-z]\w*[\!\?]?/],["atv",/^~[A-Z](?:\/(?:[^\/\r\n\\]|\\.)+\/|\|(?:[^\|\r\n\\]|\\.)+\||"(?:[^"\r\n\\]|\\.)+"|'(?:[^'\r\n\\]|\\.)+')[A-Z]*/i],["atv",/^~[A-Z](?:\((?:[^\)\r\n\\]|\\.)+\)|\[(?:[^\]\r\n\\]|\\.)+\]|\{(?:[^\}\r\n\\]|\\.)+\}|\<(?:[^\>\r\n\\]|\\.)+\>)[A-Z]*/i],["pun",/^(?:\.+|\/|[:~])/]]),["ex","exs"]);
diff --git a/static/bower_components/google-prettify/loader/lang-exs.js b/static/bower_components/google-prettify/loader/lang-exs.js
new file mode 100644
index 00000000..08ff1c51
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-exs.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2017 Jacek Kr??likowski
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^#.*/,null,"#"],["lit",/^'(?:[^'\\]|\\(?:.|\n|\r))*'?/,null,"'"],["atn",/^@\w+/,null,"@"],["pun",/^[!%&()*+,\-;<=>?\[\\\]^{|}]+/,null,"!%&()*+,-;<=>?[\\]^{|}"],["lit",/^(?:0o[0-7](?:[0-7]|_[0-7])*|0x[\da-fA-F](?:[\da-fA-F]|_[\da-fA-F])*|\d(?:\d|_\d)*(?:\.\d(?:\d|_\d)*)?(?:[eE][+\-]?\d(?:\d|_\d)*)?)/,null,"0123456789"]],[["atn",/^iex(?:\(\d+\))?> /],
+["pun",/^::/],["lit",/^:(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"?)/],["atn",/^(?:__(?:CALLER|ENV|MODULE|DIR)__)/],["kwd",/^(?:alias|case|catch|def(?:delegate|exception|impl|macrop?|module|overridable|p?|protocol|struct)|do|else|end|fn|for|if|in|import|quote|raise|require|rescue|super|throw|try|unless|unquote(?:_splicing)?|use|when|with|yield)\b/],["lit",/^(?:true|false|nil)\b/],["lit",/^(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"):(?!:)/],["str",/^"""\s*(\r|\n)+(?:""?(?!")|[^\\"]|\\(?:.|\n|\r))*"{0,3}/],
+["str",/^"(?:[^"\\]|\\(?:.|\n|\r))*"?(?!")/],["typ",/^[A-Z]\w*/],["com",/^_\w*/],["pln",/^[$a-z]\w*[\!\?]?/],["atv",/^~[A-Z](?:\/(?:[^\/\r\n\\]|\\.)+\/|\|(?:[^\|\r\n\\]|\\.)+\||"(?:[^"\r\n\\]|\\.)+"|'(?:[^'\r\n\\]|\\.)+')[A-Z]*/i],["atv",/^~[A-Z](?:\((?:[^\)\r\n\\]|\\.)+\)|\[(?:[^\]\r\n\\]|\\.)+\]|\{(?:[^\}\r\n\\]|\\.)+\}|\<(?:[^\>\r\n\\]|\\.)+\>)[A-Z]*/i],["pun",/^(?:\.+|\/|[:~])/]]),["ex","exs"]);
diff --git a/static/bower_components/google-prettify/loader/lang-fs.js b/static/bower_components/google-prettify/loader/lang-fs.js
new file mode 100644
index 00000000..c012a3ff
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-fs.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
+["lit",/^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],["pln",/^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],["pun",/^[^\t\n\r \xA0\"\'\w]+/]]),["fs","ml"]);
diff --git a/static/bower_components/google-prettify/loader/lang-go.js b/static/bower_components/google-prettify/loader/lang-go.js
new file mode 100644
index 00000000..1f6934a4
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-go.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2010 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["pln",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])+(?:\'|$)|`[^`]*(?:`|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\r\n]*|\/\*[\s\S]*?\*\/)/],["pln",/^(?:[^\/\"\'`]|\/(?![\/\*]))+/i]]),["go"]);
diff --git a/static/bower_components/google-prettify/loader/lang-hs.js b/static/bower_components/google-prettify/loader/lang-hs.js
new file mode 100644
index 00000000..2002221e
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-hs.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\x0B\x0C\r ]+/,null,"\t\n\x0B\f\r "],["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["str",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/,
+null],["pln",/^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],["pun",/^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]]),["hs"]);
diff --git a/static/bower_components/google-prettify/loader/lang-kotlin.js b/static/bower_components/google-prettify/loader/lang-kotlin.js
new file mode 100644
index 00000000..c784f10b
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-kotlin.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2017 Micha?? B??czkowski
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["pun",/^[.!%&()*+,\-;<=>?\[\\\]^{|}:]+/,null,".!%&()*+,-;<=>?[\\]^{|}:"]],[["kwd",/^\b(package|public|protected|private|open|abstract|constructor|final|override|import|for|while|as|typealias|get|set|((data|enum|annotation|sealed) )?class|this|super|val|var|fun|is|in|throw|return|break|continue|(companion )?object|if|try|else|do|when|init|interface|typeof)\b/],["lit",/^(?:true|false|null)\b/],
+["lit",/^(0[xX][0-9a-fA-F_]+L?|0[bB][0-1]+L?|[0-9_.]+([eE]-?[0-9]+)?[fFL]?)/],["typ",/^(\b[A-Z]+[a-z][a-zA-Z0-9_$@]*|`.*`)/,null],["com",/^\/\/.*/],["com",/^\/\*[\s\S]*?(?:\*\/|$)/],["str",/'.'/],["str",/^"([^"\\]|\\[\s\S])*"/],["str",/^"{3}[\s\S]*?[^\\]"{3}/],["lit",/^@([a-zA-Z0-9_$@]*|`.*`)/],["lit",/^[a-zA-Z0-9_]+@/]]),["kotlin"]);
diff --git a/static/bower_components/google-prettify/loader/lang-lasso.js b/static/bower_components/google-prettify/loader/lang-lasso.js
new file mode 100644
index 00000000..12cb2e12
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lasso.js
@@ -0,0 +1,20 @@
+/*
+
+ Copyright (C) 2013 Eric Knibbe
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\'[^\'\\]*(?:\\[\s\S][^\'\\]*)*(?:\'|$)/,null,"'"],["str",/^\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*(?:\"|$)/,null,'"'],["str",/^\`[^\`]*(?:\`|$)/,null,"`"],["lit",/^0x[\da-f]+|\d+/i,null,"0123456789"],["atn",/^[#$][a-z_][\w.]*|#\d+\b|#![ \S]+lasso9\b/i,null,"#$"]],[["tag",/^[[\]]|<\?(?:lasso(?:script)?|=)|\?>|(no_square_brackets|noprocess)\b/i],["com",
+/^\/\/[^\r\n]*|\/\*[\s\S]*?\*\//],["atn",/^-(?!infinity)[a-z_][\w.]*|\.\s*'[a-z_][\w.]*'|\.{3}/i],["lit",/^\d*\.\d+(?:e[-+]?\d+)?|(infinity|NaN)\b/i],["atv",/^::\s*[a-z_][\w.]*/i],["lit",/^(?:true|false|none|minimal|full|all|void|and|or|not|bw|nbw|ew|new|cn|ncn|lt|lte|gt|gte|eq|neq|rx|nrx|ft)\b/i],["typ",/^(?:array|date|decimal|duration|integer|map|pair|string|tag|xml|null|boolean|bytes|keyword|list|locale|queue|set|stack|staticarray|local|var|variable|global|data|self|inherited|currentcapture|givenblock)\b|^\.\.?/i],
+["kwd",/^(?:cache|database_names|database_schemanames|database_tablenames|define_tag|define_type|email_batch|encode_set|html_comment|handle|handle_error|header|if|inline|iterate|ljax_target|link|link_currentaction|link_currentgroup|link_currentrecord|link_detail|link_firstgroup|link_firstrecord|link_lastgroup|link_lastrecord|link_nextgroup|link_nextrecord|link_prevgroup|link_prevrecord|log|loop|namespace_using|output_none|portal|private|protect|records|referer|referrer|repeating|resultset|rows|search_args|search_arguments|select|sort_args|sort_arguments|thread_atomic|value_list|while|abort|case|else|fail_if|fail_ifnot|fail|if_empty|if_false|if_null|if_true|loop_abort|loop_continue|loop_count|params|params_up|return|return_value|run_children|soap_definetag|soap_lastrequest|soap_lastresponse|tag_name|ascending|average|by|define|descending|do|equals|frozen|group|handle_failure|import|in|into|join|let|match|max|min|on|order|parent|protected|provide|public|require|returnhome|skip|split_thread|sum|take|thread|to|trait|type|where|with|yield|yieldhome)\b/i],
+["pln",/^[a-z_][\w.]*(?:=\s*(?=\())?/i],["pun",/^:=|[-+*\/%=<>&|!?\\]+/]]),["lasso","ls","lassoscript"]);
diff --git a/static/bower_components/google-prettify/loader/lang-lassoscript.js b/static/bower_components/google-prettify/loader/lang-lassoscript.js
new file mode 100644
index 00000000..12cb2e12
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lassoscript.js
@@ -0,0 +1,20 @@
+/*
+
+ Copyright (C) 2013 Eric Knibbe
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\'[^\'\\]*(?:\\[\s\S][^\'\\]*)*(?:\'|$)/,null,"'"],["str",/^\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*(?:\"|$)/,null,'"'],["str",/^\`[^\`]*(?:\`|$)/,null,"`"],["lit",/^0x[\da-f]+|\d+/i,null,"0123456789"],["atn",/^[#$][a-z_][\w.]*|#\d+\b|#![ \S]+lasso9\b/i,null,"#$"]],[["tag",/^[[\]]|<\?(?:lasso(?:script)?|=)|\?>|(no_square_brackets|noprocess)\b/i],["com",
+/^\/\/[^\r\n]*|\/\*[\s\S]*?\*\//],["atn",/^-(?!infinity)[a-z_][\w.]*|\.\s*'[a-z_][\w.]*'|\.{3}/i],["lit",/^\d*\.\d+(?:e[-+]?\d+)?|(infinity|NaN)\b/i],["atv",/^::\s*[a-z_][\w.]*/i],["lit",/^(?:true|false|none|minimal|full|all|void|and|or|not|bw|nbw|ew|new|cn|ncn|lt|lte|gt|gte|eq|neq|rx|nrx|ft)\b/i],["typ",/^(?:array|date|decimal|duration|integer|map|pair|string|tag|xml|null|boolean|bytes|keyword|list|locale|queue|set|stack|staticarray|local|var|variable|global|data|self|inherited|currentcapture|givenblock)\b|^\.\.?/i],
+["kwd",/^(?:cache|database_names|database_schemanames|database_tablenames|define_tag|define_type|email_batch|encode_set|html_comment|handle|handle_error|header|if|inline|iterate|ljax_target|link|link_currentaction|link_currentgroup|link_currentrecord|link_detail|link_firstgroup|link_firstrecord|link_lastgroup|link_lastrecord|link_nextgroup|link_nextrecord|link_prevgroup|link_prevrecord|log|loop|namespace_using|output_none|portal|private|protect|records|referer|referrer|repeating|resultset|rows|search_args|search_arguments|select|sort_args|sort_arguments|thread_atomic|value_list|while|abort|case|else|fail_if|fail_ifnot|fail|if_empty|if_false|if_null|if_true|loop_abort|loop_continue|loop_count|params|params_up|return|return_value|run_children|soap_definetag|soap_lastrequest|soap_lastresponse|tag_name|ascending|average|by|define|descending|do|equals|frozen|group|handle_failure|import|in|into|join|let|match|max|min|on|order|parent|protected|provide|public|require|returnhome|skip|split_thread|sum|take|thread|to|trait|type|where|with|yield|yieldhome)\b/i],
+["pln",/^[a-z_][\w.]*(?:=\s*(?=\())?/i],["pun",/^:=|[-+*\/%=<>&|!?\\]+/]]),["lasso","ls","lassoscript"]);
diff --git a/static/bower_components/google-prettify/loader/lang-latex.js b/static/bower_components/google-prettify/loader/lang-latex.js
new file mode 100644
index 00000000..efc758cd
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-latex.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2011 Martin S.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\r\n]*/,null,"%"]],[["kwd",/^\\[a-zA-Z@]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[{}()\[\]=]+/]]),["latex","tex"]);
diff --git a/static/bower_components/google-prettify/loader/lang-lgt.js b/static/bower_components/google-prettify/loader/lang-lgt.js
new file mode 100644
index 00000000..2959d759
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lgt.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2014 Paulo Moura
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["lit",/^[a-z][a-zA-Z0-9_]*/],["lit",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/,null,"'"],["lit",/^(?:0'.|0b[0-1]+|0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\r\n]*/,null,"%"],["com",/^\/\*[\s\S]*?\*\//],["kwd",/^\s*:-\s(c(a(lls|tegory)|oinductive)|p(ublic|r(ot(ocol|ected)|ivate))|e(l(if|se)|n(coding|sure_loaded)|xport)|i(f|n(clude|itialization|fo))|alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|od(e|ule)|ultifile)|reexport|s(et_(logtalk|prolog)_flag|ynchronized)|o(bject|p)|use(s|_module))/],
+["kwd",/^\s*:-\s(e(lse|nd(if|_(category|object|protocol)))|built_in|dynamic|synchronized|threaded)/],["typ",/^[A-Z_][a-zA-Z0-9_]*/],["pun",/^[.,;{}:^<>=\\/+*?#!-]/]]),["logtalk","lgt"]);
diff --git a/static/bower_components/google-prettify/loader/lang-lisp.js b/static/bower_components/google-prettify/loader/lang-lisp.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lisp.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-ll.js b/static/bower_components/google-prettify/loader/lang-ll.js
new file mode 100644
index 00000000..7604d962
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-ll.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2013 Nikhil Dabas
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^!?\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"'],["com",/^;[^\r\n]*/,null,";"]],[["pln",/^[%@!](?:[-a-zA-Z$._][-a-zA-Z$._0-9]*|\d+)/],["kwd",/^[A-Za-z_][0-9A-Za-z_]*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[xX][a-fA-F0-9]+)/],["pun",/^[()\[\]{},=*<>:]|\.\.\.$/]]),["llvm","ll"]);
diff --git a/static/bower_components/google-prettify/loader/lang-llvm.js b/static/bower_components/google-prettify/loader/lang-llvm.js
new file mode 100644
index 00000000..7604d962
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-llvm.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2013 Nikhil Dabas
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^!?\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"'],["com",/^;[^\r\n]*/,null,";"]],[["pln",/^[%@!](?:[-a-zA-Z$._][-a-zA-Z$._0-9]*|\d+)/],["kwd",/^[A-Za-z_][0-9A-Za-z_]*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[xX][a-fA-F0-9]+)/],["pun",/^[()\[\]{},=*<>:]|\.\.\.$/]]),["llvm","ll"]);
diff --git a/static/bower_components/google-prettify/loader/lang-logtalk.js b/static/bower_components/google-prettify/loader/lang-logtalk.js
new file mode 100644
index 00000000..2959d759
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-logtalk.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2014 Paulo Moura
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["lit",/^[a-z][a-zA-Z0-9_]*/],["lit",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/,null,"'"],["lit",/^(?:0'.|0b[0-1]+|0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\r\n]*/,null,"%"],["com",/^\/\*[\s\S]*?\*\//],["kwd",/^\s*:-\s(c(a(lls|tegory)|oinductive)|p(ublic|r(ot(ocol|ected)|ivate))|e(l(if|se)|n(coding|sure_loaded)|xport)|i(f|n(clude|itialization|fo))|alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|od(e|ule)|ultifile)|reexport|s(et_(logtalk|prolog)_flag|ynchronized)|o(bject|p)|use(s|_module))/],
+["kwd",/^\s*:-\s(e(lse|nd(if|_(category|object|protocol)))|built_in|dynamic|synchronized|threaded)/],["typ",/^[A-Z_][a-zA-Z0-9_]*/],["pun",/^[.,;{}:^<>=\\/+*?#!-]/]]),["logtalk","lgt"]);
diff --git a/static/bower_components/google-prettify/loader/lang-ls.js b/static/bower_components/google-prettify/loader/lang-ls.js
new file mode 100644
index 00000000..12cb2e12
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-ls.js
@@ -0,0 +1,20 @@
+/*
+
+ Copyright (C) 2013 Eric Knibbe
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\'[^\'\\]*(?:\\[\s\S][^\'\\]*)*(?:\'|$)/,null,"'"],["str",/^\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*(?:\"|$)/,null,'"'],["str",/^\`[^\`]*(?:\`|$)/,null,"`"],["lit",/^0x[\da-f]+|\d+/i,null,"0123456789"],["atn",/^[#$][a-z_][\w.]*|#\d+\b|#![ \S]+lasso9\b/i,null,"#$"]],[["tag",/^[[\]]|<\?(?:lasso(?:script)?|=)|\?>|(no_square_brackets|noprocess)\b/i],["com",
+/^\/\/[^\r\n]*|\/\*[\s\S]*?\*\//],["atn",/^-(?!infinity)[a-z_][\w.]*|\.\s*'[a-z_][\w.]*'|\.{3}/i],["lit",/^\d*\.\d+(?:e[-+]?\d+)?|(infinity|NaN)\b/i],["atv",/^::\s*[a-z_][\w.]*/i],["lit",/^(?:true|false|none|minimal|full|all|void|and|or|not|bw|nbw|ew|new|cn|ncn|lt|lte|gt|gte|eq|neq|rx|nrx|ft)\b/i],["typ",/^(?:array|date|decimal|duration|integer|map|pair|string|tag|xml|null|boolean|bytes|keyword|list|locale|queue|set|stack|staticarray|local|var|variable|global|data|self|inherited|currentcapture|givenblock)\b|^\.\.?/i],
+["kwd",/^(?:cache|database_names|database_schemanames|database_tablenames|define_tag|define_type|email_batch|encode_set|html_comment|handle|handle_error|header|if|inline|iterate|ljax_target|link|link_currentaction|link_currentgroup|link_currentrecord|link_detail|link_firstgroup|link_firstrecord|link_lastgroup|link_lastrecord|link_nextgroup|link_nextrecord|link_prevgroup|link_prevrecord|log|loop|namespace_using|output_none|portal|private|protect|records|referer|referrer|repeating|resultset|rows|search_args|search_arguments|select|sort_args|sort_arguments|thread_atomic|value_list|while|abort|case|else|fail_if|fail_ifnot|fail|if_empty|if_false|if_null|if_true|loop_abort|loop_continue|loop_count|params|params_up|return|return_value|run_children|soap_definetag|soap_lastrequest|soap_lastresponse|tag_name|ascending|average|by|define|descending|do|equals|frozen|group|handle_failure|import|in|into|join|let|match|max|min|on|order|parent|protected|provide|public|require|returnhome|skip|split_thread|sum|take|thread|to|trait|type|where|with|yield|yieldhome)\b/i],
+["pln",/^[a-z_][\w.]*(?:=\s*(?=\())?/i],["pun",/^:=|[-+*\/%=<>&|!?\\]+/]]),["lasso","ls","lassoscript"]);
diff --git a/static/bower_components/google-prettify/loader/lang-lsp.js b/static/bower_components/google-prettify/loader/lang-lsp.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lsp.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-lua.js b/static/bower_components/google-prettify/loader/lang-lua.js
new file mode 100644
index 00000000..afb2901e
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-lua.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],["str",/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
+["pln",/^[a-z_]\w*/i],["pun",/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),["lua"]);
diff --git a/static/bower_components/google-prettify/loader/lang-matlab.js b/static/bower_components/google-prettify/loader/lang-matlab.js
new file mode 100644
index 00000000..a0522a5a
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-matlab.js
@@ -0,0 +1,29 @@
+/*
+
+ Copyright (c) 2013 by Amro <amroamroamro@gmail.com>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+var a=window.PR,b=[[a.PR_PLAIN,/^[ \t\r\n\v\f\xA0]+/,null," \t\r\n\x0B\f\u00a0"],[a.PR_COMMENT,/^%\{[^%]*%+(?:[^\}%][^%]*%+)*\}/,null],[a.PR_COMMENT,/^%[^\r\n]*/,null,"%"],["syscmd",/^![^\r\n]*/,null,"!"]],c=[["linecont",/^\.\.\.\s*[\r\n]/,null],["err",/^\?\?\? [^\r\n]*/,null],["wrn",/^Warning: [^\r\n]*/,null],["codeoutput",/^>>\s+/,null],["codeoutput",/^octave:\d+>\s+/,null],["lang-matlab-operators",/^((?:[a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*|\)|\]|\}|\.)')/,null],["lang-matlab-identifiers",
+/^([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)(?!')/,null],[a.PR_STRING,/^'(?:[^']|'')*'/,null],[a.PR_LITERAL,/^[+\-]?\.?\d+(?:\.\d*)?(?:[Ee][+\-]?\d+)?[ij]?/,null],[a.PR_TAG,/^(?:\{|\}|\(|\)|\[|\])/,null],[a.PR_PUNCTUATION,/^(?:<|>|=|~|@|&|;|,|:|!|\-|\+|\*|\^|\.|\||\\|\/)/,null]],d=[["lang-matlab-identifiers",/^([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)/,null],[a.PR_TAG,/^(?:\{|\}|\(|\)|\[|\])/,null],[a.PR_PUNCTUATION,/^(?:<|>|=|~|@|&|;|,|:|!|\-|\+|\*|\^|\.|\||\\|\/)/,null],["transpose",
+/^'/,null]];
+a.registerLangHandler(a.createSimpleLexer([],[[a.PR_KEYWORD,/^\b(?:break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while)\b/,null],["const",/^\b(?:true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout)\b/,null],[a.PR_TYPE,/^\b(?:cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse)\b/,null],["fun",/^\b(?:abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:.(?:close|closeVar|computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab.io.MatFile|matlab.mixin.(?:Copyable|Heterogeneous(?:.getDefaultScalarElement)?)|matlabrc|matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta.(?:class(?:.fromName)?|DynamicProperty|EnumeratedValue|event|MetaData|method|package(?:.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|ncwriteschema|ndgrid|ndims|ne|NET(?:.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|NetException|setStaticProperty))?|netcdf.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:.(?:create|getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:.isPlatformSupported)?|VideoWriter(?:.getProfiles)?|view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|ylabel|ylim|zeros|zip|zlabel|zlim|zoom)\b/,null],
+["fun_tbx",/^\b(?:addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|cholcov|Classification(?:BaggedEnsemble|Discriminant(?:.(?:fit|make|template))?|Ensemble|KNN(?:.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:.fit)?|geo(?:cdf|inv|mean|pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|LinearModel(?:.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:.fit)?|nan(?:cov|max|mean|median|min|std|sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|template))?)|regstats|relieff|ridge|robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest)\b/,
+null],["fun_tbx",/^\b(?:adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|reflect|regionprops|registration.metric.(?:MattesMutualInformation|MeanSquares)|registration.optimizer.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb)\b/,
+null],["fun_tbx",/^\b(?:bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog)\b/,null],["ident",/^[a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*/,null]]),["matlab-identifiers"]);a.registerLangHandler(a.createSimpleLexer([],d),["matlab-operators"]);a.registerLangHandler(a.createSimpleLexer(b,c),["matlab"]);
diff --git a/static/bower_components/google-prettify/loader/lang-ml.js b/static/bower_components/google-prettify/loader/lang-ml.js
new file mode 100644
index 00000000..c012a3ff
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-ml.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
+["lit",/^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],["pln",/^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],["pun",/^[^\t\n\r \xA0\"\'\w]+/]]),["fs","ml"]);
diff --git a/static/bower_components/google-prettify/loader/lang-mumps.js b/static/bower_components/google-prettify/loader/lang-mumps.js
new file mode 100644
index 00000000..6d512589
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-mumps.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2011 Kitware Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"]|\\.)*")/,null,'"']],[["com",/^;[^\r\n]*/,null,";"],["dec",/^(?:\$(?:D|DEVICE|EC|ECODE|ES|ESTACK|ET|ETRAP|H|HOROLOG|I|IO|J|JOB|K|KEY|P|PRINCIPAL|Q|QUIT|ST|STACK|S|STORAGE|SY|SYSTEM|T|TEST|TL|TLEVEL|TR|TRESTART|X|Y|Z[A-Z]*|A|ASCII|C|CHAR|D|DATA|E|EXTRACT|F|FIND|FN|FNUMBER|G|GET|J|JUSTIFY|L|LENGTH|NA|NAME|O|ORDER|P|PIECE|QL|QLENGTH|QS|QSUBSCRIPT|Q|QUERY|R|RANDOM|RE|REVERSE|S|SELECT|ST|STACK|T|TEXT|TR|TRANSLATE|NaN))\b/i,
+null],["kwd",/^(?:[^\$]B|BREAK|C|CLOSE|D|DO|E|ELSE|F|FOR|G|GOTO|H|HALT|H|HANG|I|IF|J|JOB|K|KILL|L|LOCK|M|MERGE|N|NEW|O|OPEN|Q|QUIT|R|READ|S|SET|TC|TCOMMIT|TRE|TRESTART|TRO|TROLLBACK|TS|TSTART|U|USE|V|VIEW|W|WRITE|X|XECUTE)\b/i,null],["lit",/^[+-]?(?:(?:\.\d+|\d+(?:\.\d*)?)(?:E[+\-]?\d+)?)/i],["pln",/^[a-z][a-zA-Z0-9]*/i],["pun",/^[^\w\t\n\r\xA0\"\$;%\^]|_/]]),["mumps"]);
diff --git a/static/bower_components/google-prettify/loader/lang-n.js b/static/bower_components/google-prettify/loader/lang-n.js
new file mode 100644
index 00000000..9b3910c9
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-n.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2011 Zimin A.V.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*\'|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"],["pln",/^\s+/,null," \r\n\t\u00a0"]],[["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null],["str",/^<#(?:[^#>])*(?:#>|$)/,null],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null],["com",/^\/\/[^\r\n]*/,
+null],["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,
+null],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,null],["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^@[A-Z]+[a-z][A-Za-z_$@0-9]*/,null],["pln",/^'?[A-Za-z_$][a-z_$@0-9]*/i,null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pun",/^.[^\s\w\.$@\'\"\`\/\#]*/,null]]),["n","nemerle"]);
diff --git a/static/bower_components/google-prettify/loader/lang-nemerle.js b/static/bower_components/google-prettify/loader/lang-nemerle.js
new file mode 100644
index 00000000..9b3910c9
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-nemerle.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2011 Zimin A.V.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*\'|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"],["pln",/^\s+/,null," \r\n\t\u00a0"]],[["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null],["str",/^<#(?:[^#>])*(?:#>|$)/,null],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null],["com",/^\/\/[^\r\n]*/,
+null],["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,
+null],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,null],["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^@[A-Z]+[a-z][A-Za-z_$@0-9]*/,null],["pln",/^'?[A-Za-z_$][a-z_$@0-9]*/i,null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pun",/^.[^\s\w\.$@\'\"\`\/\#]*/,null]]),["n","nemerle"]);
diff --git a/static/bower_components/google-prettify/loader/lang-pascal.js b/static/bower_components/google-prettify/loader/lang-pascal.js
new file mode 100644
index 00000000..c76a11cf
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-pascal.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2013 Peter Kofler
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$))/,null,"'"],["pln",/^\s+/,null," \r\n\t\u00a0"]],[["com",/^\(\*[\s\S]*?(?:\*\)|$)|^\{[\s\S]*?(?:\}|$)/,null],["kwd",/^(?:ABSOLUTE|AND|ARRAY|ASM|ASSEMBLER|BEGIN|CASE|CONST|CONSTRUCTOR|DESTRUCTOR|DIV|DO|DOWNTO|ELSE|END|EXTERNAL|FOR|FORWARD|FUNCTION|GOTO|IF|IMPLEMENTATION|IN|INLINE|INTERFACE|INTERRUPT|LABEL|MOD|NOT|OBJECT|OF|OR|PACKED|PROCEDURE|PROGRAM|RECORD|REPEAT|SET|SHL|SHR|THEN|TO|TYPE|UNIT|UNTIL|USES|VAR|VIRTUAL|WHILE|WITH|XOR)\b/i,
+null],["lit",/^(?:true|false|self|nil)/i,null],["pln",/^[a-z][a-z0-9]*/i,null],["lit",/^(?:\$[a-f0-9]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?)/i,null,"0123456789"],["pun",/^.[^\s\w\.$@\'\/]*/,null]]),["pascal"]);
diff --git a/static/bower_components/google-prettify/loader/lang-proto.js b/static/bower_components/google-prettify/loader/lang-proto.js
new file mode 100644
index 00000000..3215ff6d
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-proto.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2006 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]);
diff --git a/static/bower_components/google-prettify/loader/lang-r.js b/static/bower_components/google-prettify/loader/lang-r.js
new file mode 100644
index 00000000..6ce16e8a
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-r.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2012 Jeffrey B. Arnold
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"'],["str",/^\'(?:[^\'\\]|\\[\s\S])*(?:\'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],["lit",/^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],["lit",/^[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|[0-9]+))(?![A-Za-z0-9_.])/],
+["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\*|\+|\^|\/|!|%.*?%|=|~|\$|@|:{1,3}|[\[\](){};,?])/],["pln",/^(?:[A-Za-z]+[A-Za-z0-9_.]*|\.[a-zA-Z_][0-9a-zA-Z\._]*)(?![A-Za-z0-9_.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]);
diff --git a/static/bower_components/google-prettify/loader/lang-rd.js b/static/bower_components/google-prettify/loader/lang-rd.js
new file mode 100644
index 00000000..113141c9
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-rd.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2012 Jeffrey Arnold
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\r\n]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[a-zA-Z@]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[{}()\[\]]+/]]),["Rd","rd"]);
diff --git a/static/bower_components/google-prettify/loader/lang-rkt.js b/static/bower_components/google-prettify/loader/lang-rkt.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-rkt.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-rust.js b/static/bower_components/google-prettify/loader/lang-rust.js
new file mode 100644
index 00000000..e42c62df
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-rust.js
@@ -0,0 +1,20 @@
+/*
+
+ Copyright (C) 2015 Chris Morgan
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([],[["pln",/^[\t\n\r \xA0]+/],["com",/^\/\/.*/],["com",/^\/\*[\s\S]*?(?:\*\/|$)/],["str",/^b"(?:[^\\]|\\(?:.|x[\da-fA-F]{2}))*?"/],["str",/^"(?:[^\\]|\\(?:.|x[\da-fA-F]{2}|u\{\[\da-fA-F]{1,6}\}))*?"/],["str",/^b?r(#*)\"[\s\S]*?\"\1/],["str",/^b'([^\\]|\\(.|x[\da-fA-F]{2}))'/],["str",/^'([^\\]|\\(.|x[\da-fA-F]{2}|u\{[\da-fA-F]{1,6}\}))'/],["tag",/^'\w+?\b/],["kwd",/^(?:match|if|else|as|break|box|continue|extern|fn|for|in|if|impl|let|loop|pub|return|super|unsafe|where|while|use|mod|trait|struct|enum|type|move|mut|ref|static|const|crate)\b/],
+["kwd",/^(?:alignof|become|do|offsetof|priv|pure|sizeof|typeof|unsized|yield|abstract|virtual|final|override|macro)\b/],["typ",/^(?:[iu](8|16|32|64|128|size)|char|bool|f32|f64|str|Self)\b/],["typ",/^(?:Copy|Send|Sized|Sync|Drop|Fn|FnMut|FnOnce|Box|ToOwned|Clone|PartialEq|PartialOrd|Eq|Ord|AsRef|AsMut|Into|From|Default|Iterator|Extend|IntoIterator|DoubleEndedIterator|ExactSizeIterator|Option|Some|None|Result|Ok|Err|SliceConcatExt|String|ToString|Vec)\b/],["lit",/^(self|true|false|null)\b/],
+["lit",/^\d[0-9_]*(?:[iu](?:size|8|16|32|64|128))?/],["lit",/^0x[a-fA-F0-9_]+(?:[iu](?:size|8|16|32|64|128))?/],["lit",/^0o[0-7_]+(?:[iu](?:size|8|16|32|64|128))?/],["lit",/^0b[01_]+(?:[iu](?:size|8|16|32|64|128))?/],["lit",/^\d[0-9_]*\.(?![^\s\d.])/],["lit",/^\d[0-9_]*(?:\.\d[0-9_]*)(?:[eE][+-]?[0-9_]+)?(?:f32|f64)?/],["lit",/^\d[0-9_]*(?:\.\d[0-9_]*)?(?:[eE][+-]?[0-9_]+)(?:f32|f64)?/],["lit",/^\d[0-9_]*(?:\.\d[0-9_]*)?(?:[eE][+-]?[0-9_]+)?(?:f32|f64)/],
+["atn",/^[a-z_]\w*!/i],["pln",/^[a-z_]\w*/i],["atv",/^#!?\[[\s\S]*?\]/],["pun",/^[+\-/*=^&|!<>%[\](){}?:.,;]/],["pln",/./]]),["rust"]);
diff --git a/static/bower_components/google-prettify/loader/lang-s.js b/static/bower_components/google-prettify/loader/lang-s.js
new file mode 100644
index 00000000..6ce16e8a
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-s.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2012 Jeffrey B. Arnold
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"'],["str",/^\'(?:[^\'\\]|\\[\s\S])*(?:\'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],["lit",/^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],["lit",/^[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|[0-9]+))(?![A-Za-z0-9_.])/],
+["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\*|\+|\^|\/|!|%.*?%|=|~|\$|@|:{1,3}|[\[\](){};,?])/],["pln",/^(?:[A-Za-z]+[A-Za-z0-9_.]*|\.[a-zA-Z_][0-9a-zA-Z\._]*)(?![A-Za-z0-9_.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]);
diff --git a/static/bower_components/google-prettify/loader/lang-scala.js b/static/bower_components/google-prettify/loader/lang-scala.js
new file mode 100644
index 00000000..3347dd60
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-scala.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2010 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,null,'"'],["lit",/^`(?:[^\r\n\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],["lit",/^'[a-zA-Z_$][\w$]*(?!['$\w])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],["typ",/^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],["pln",/^[$a-zA-Z_][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/static/bower_components/google-prettify/loader/lang-scm.js b/static/bower_components/google-prettify/loader/lang-scm.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-scm.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-sql.js b/static/bower_components/google-prettify/loader/lang-sql.js
new file mode 100644
index 00000000..a7d292cb
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-sql.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],["kwd",/^(?:ADD|ALL|ALTER|AND|ANY|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONNECT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOLLOWING|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|MATCH|MATCHED|MERGE|NATURAL|NATIONAL|NOCHECK|NONCLUSTERED|NOCYCLE|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PARTITION|PERCENT|PIVOT|PLAN|PRECEDING|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|ROWS?|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|START|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNBOUNDED|UNION|UNIQUE|UNPIVOT|UPDATE|UPDATETEXT|USE|USER|USING|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WITHIN|WRITETEXT|XML)(?=[^\w-]|$)/i,
+null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],["pln",/^[a-z_][\w-]*/i],["pun",/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]]),["sql"]);
diff --git a/static/bower_components/google-prettify/loader/lang-ss.js b/static/bower_components/google-prettify/loader/lang-ss.js
new file mode 100644
index 00000000..2f18c967
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-ss.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2008 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,
+null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),"cl el lisp lsp scm ss rkt".split(" "));
diff --git a/static/bower_components/google-prettify/loader/lang-swift.js b/static/bower_components/google-prettify/loader/lang-swift.js
new file mode 100644
index 00000000..01d7b868
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-swift.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2015 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[ \n\r\t\v\f\0]+/,null," \n\r\t\v\f\x00"],["str",/^"(?:[^"\\]|(?:\\.)|(?:\\\((?:[^"\\)]|\\.)*\)))*"/,null,'"']],[["lit",/^(?:(?:0x[\da-fA-F][\da-fA-F_]*\.[\da-fA-F][\da-fA-F_]*[pP]?)|(?:\d[\d_]*\.\d[\d_]*[eE]?))[+-]?\d[\d_]*/,null],["lit",/^-?(?:(?:0(?:(?:b[01][01_]*)|(?:o[0-7][0-7_]*)|(?:x[\da-fA-F][\da-fA-F_]*)))|(?:\d[\d_]*))/,null],["lit",/^(?:_|Any|true|false|nil)\b/,null],["kwd",/^\b(?:__COLUMN__|__FILE__|__FUNCTION__|__LINE__|#available|#colorLiteral|#column|#else|#elseif|#endif|#file|#fileLiteral|#function|#if|#imageLiteral|#line|#selector|#sourceLocation|arch|arm|arm64|associatedtype|associativity|as|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|dynamicType|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|import|indirect|infix|init|inout|internal|i386|if|in|iOS|iOSApplicationExtension|is|lazy|left|let|mutating|none|nonmutating|open|operator|optional|OSX|OSXApplicationExtension|override|postfix|precedence|prefix|private|protocol|Protocol|public|repeat|required|rethrows|return|right|safe|Self|self|set|static|struct|subscript|super|switch|throw|throws|try|Type|typealias|unowned|unsafe|var|weak|watchOS|where|while|willSet|x86_64)\b/,
+null],["com",/^\/\/.*?[\n\r]/,null],["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null],["pun",/^<<=|<=|<<|>>=|>=|>>|===|==|\.\.\.|&&=|\.\.<|!==|!=|&=|~=|~|\(|\)|\[|\]|{|}|@|#|;|\.|,|:|\|\|=|\?\?|\|\||&&|&\*|&\+|&-|&=|\+=|-=|\/=|\*=|\^=|%=|\|=|->|`|==|\+\+|--|\/|\+|!|\*|%|<|>|&|\||\^|\?|=|-|_/,null],["typ",/^\b(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null]]),["swift"]);
diff --git a/static/bower_components/google-prettify/loader/lang-tcl.js b/static/bower_components/google-prettify/loader/lang-tcl.js
new file mode 100644
index 00000000..1d75c3f0
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-tcl.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2012 Pyrios
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\{+/,null,"{"],["clo",/^\}+/,null,"}"],["com",/^#[^\r\n]*/,null,"#"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,null],["lit",/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],
+["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["tcl"]);
diff --git a/static/bower_components/google-prettify/loader/lang-tex.js b/static/bower_components/google-prettify/loader/lang-tex.js
new file mode 100644
index 00000000..efc758cd
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-tex.js
@@ -0,0 +1,17 @@
+/*
+
+ Copyright (C) 2011 Martin S.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\r\n]*/,null,"%"]],[["kwd",/^\\[a-zA-Z@]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[{}()\[\]=]+/]]),["latex","tex"]);
diff --git a/static/bower_components/google-prettify/loader/lang-vb.js b/static/bower_components/google-prettify/loader/lang-vb.js
new file mode 100644
index 00000000..e34086fe
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-vb.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2009 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i,null,'"\u201c\u201d'],["com",/^[\'\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\r\n_\u2028\u2029])*/,null,"'\u2018\u2019"]],[["kwd",/^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i,
+null],["com",/^REM\b[^\r\n\u2028\u2029]*/i],["lit",/^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[%&@!#]+\])?|\[(?:[a-z]|_\w)\w*\])/i],["pun",/^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],["pun",/^(?:\[|\])/]]),["vb",
+"vbs"]);
diff --git a/static/bower_components/google-prettify/loader/lang-vbs.js b/static/bower_components/google-prettify/loader/lang-vbs.js
new file mode 100644
index 00000000..e34086fe
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-vbs.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2009 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i,null,'"\u201c\u201d'],["com",/^[\'\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\r\n_\u2028\u2029])*/,null,"'\u2018\u2019"]],[["kwd",/^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i,
+null],["com",/^REM\b[^\r\n\u2028\u2029]*/i],["lit",/^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[%&@!#]+\])?|\[(?:[a-z]|_\w)\w*\])/i],["pun",/^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],["pun",/^(?:\[|\])/]]),["vb",
+"vbs"]);
diff --git a/static/bower_components/google-prettify/loader/lang-vhd.js b/static/bower_components/google-prettify/loader/lang-vhd.js
new file mode 100644
index 00000000..f67a4a39
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-vhd.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2010 benoit@ryder.fr
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"]],[["str",/^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],["com",/^--[^\r\n]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,
+null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i],
+["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]]),["vhdl","vhd"]);
diff --git a/static/bower_components/google-prettify/loader/lang-vhdl.js b/static/bower_components/google-prettify/loader/lang-vhdl.js
new file mode 100644
index 00000000..f67a4a39
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-vhdl.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2010 benoit@ryder.fr
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"]],[["str",/^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],["com",/^--[^\r\n]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,
+null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i],
+["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]]),["vhdl","vhd"]);
diff --git a/static/bower_components/google-prettify/loader/lang-wiki.js b/static/bower_components/google-prettify/loader/lang-wiki.js
new file mode 100644
index 00000000..d03fccd2
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-wiki.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2009 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t \xA0a-gi-z0-9]+/,null,"\t \u00a0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[=*~\^\[\]]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\b/],["lang-",/^\{\{\{([\s\S]+?)\}\}\}/],["lang-",/^`([^\r\n`]+)`/],["str",/^https?:\/\/[^\/?#\s]*(?:\/[^?#\s]*)?(?:\?[^#\s]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\s\S])[^#=*~^A-Zh\{`\[\r\n]*/]]),["wiki"]);
+PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);
diff --git a/static/bower_components/google-prettify/loader/lang-xq.js b/static/bower_components/google-prettify/loader/lang-xq.js
new file mode 100644
index 00000000..a6d85372
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-xq.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2011 Patrick Wied
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["var pln",/^\$[A-Za-z0-9_\-]+/,null,"$"]],[["pln",/^[\s=][<>][\s=]/],["lit",/^\@[\w-]+/],["tag",/^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["com",/^\(:[\s\S]*?:\)/],["pln",/^[\/\{\};,\[\]\(\)]$/],["str",/^(?:\"(?:[^\"\\\{]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\\{]|\\[\s\S])*(?:\'|$))/,null,"\"'"],["kwd",/^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\b/],
+["typ",/^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\b/,null],["fun pln",/^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\b/],
+["pln",/^[A-Za-z0-9_\-\:]+/],["pln",/^[\t\n\r \xA0]+/]]),["xq","xquery"]);
diff --git a/static/bower_components/google-prettify/loader/lang-xquery.js b/static/bower_components/google-prettify/loader/lang-xquery.js
new file mode 100644
index 00000000..a6d85372
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-xquery.js
@@ -0,0 +1,19 @@
+/*
+
+ Copyright (C) 2011 Patrick Wied
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["var pln",/^\$[A-Za-z0-9_\-]+/,null,"$"]],[["pln",/^[\s=][<>][\s=]/],["lit",/^\@[\w-]+/],["tag",/^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["com",/^\(:[\s\S]*?:\)/],["pln",/^[\/\{\};,\[\]\(\)]$/],["str",/^(?:\"(?:[^\"\\\{]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\\{]|\\[\s\S])*(?:\'|$))/,null,"\"'"],["kwd",/^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\b/],
+["typ",/^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\b/,null],["fun pln",/^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\b/],
+["pln",/^[A-Za-z0-9_\-\:]+/],["pln",/^[\t\n\r \xA0]+/]]),["xq","xquery"]);
diff --git a/static/bower_components/google-prettify/loader/lang-yaml.js b/static/bower_components/google-prettify/loader/lang-yaml.js
new file mode 100644
index 00000000..a2b4b079
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-yaml.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2015 ribrdb @ code.google.com
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:|>?]+/,null,":|>?"],["dec",/^%(?:YAML|TAG)[^#\r\n]+/,null,"%"],["typ",/^[&]\S+/,null,"&"],["typ",/^!\S*/,null,"!"],["str",/^"(?:[^\\"]|\\.)*(?:"|$)/,null,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,null,"'"],["com",/^#[^\r\n]*/,null,"#"],["pln",/^\s+/,null," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\r\n]|$)/],["pun",/^-/],["kwd",/^[\w-]+:[ \r\n]/],["pln",
+/^\w+/]]),["yaml","yml"]);
diff --git a/static/bower_components/google-prettify/loader/lang-yml.js b/static/bower_components/google-prettify/loader/lang-yml.js
new file mode 100644
index 00000000..a2b4b079
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/lang-yml.js
@@ -0,0 +1,18 @@
+/*
+
+ Copyright (C) 2015 ribrdb @ code.google.com
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:|>?]+/,null,":|>?"],["dec",/^%(?:YAML|TAG)[^#\r\n]+/,null,"%"],["typ",/^[&]\S+/,null,"&"],["typ",/^!\S*/,null,"!"],["str",/^"(?:[^\\"]|\\.)*(?:"|$)/,null,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,null,"'"],["com",/^#[^\r\n]*/,null,"#"],["pln",/^\s+/,null," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\r\n]|$)/],["pun",/^-/],["kwd",/^[\w-]+:[ \r\n]/],["pln",
+/^\w+/]]),["yaml","yml"]);
diff --git a/static/bower_components/google-prettify/loader/prettify.css b/static/bower_components/google-prettify/loader/prettify.css
new file mode 100644
index 00000000..e6fe342f
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
\ No newline at end of file
diff --git a/static/bower_components/google-prettify/loader/prettify.js b/static/bower_components/google-prettify/loader/prettify.js
new file mode 100644
index 00000000..477f03d5
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/prettify.js
@@ -0,0 +1,46 @@
+!function(){/*
+
+ Copyright (C) 2006 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+"undefined"!==typeof window&&(window.PR_SHOULD_USE_CONTINUATION=!0);
+(function(){function T(a){function d(e){var a=e.charCodeAt(0);if(92!==a)return a;var c=e.charAt(1);return(a=w[c])?a:"0"<=c&&"7">=c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));
+e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,g=c.length;a<g;++a){var h=c[a];if(/\\[bdsw]/i.test(h))b.push(h);else{var h=d(h),k;a+2<g&&"-"===c[a+1]?(k=d(c[a+2]),a+=2):k=h;e.push([h,k]);65>k||122<h||(65>k||90<h||e.push([Math.max(65,h)|32,Math.min(k,90)|32]),97>k||122<h||e.push([Math.max(97,h)&-33,Math.min(k,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});c=[];g=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=g[1]+1?g[1]=Math.max(g[1],h[1]):c.push(g=h);for(a=0;a<c.length;++a)h=
+c[a],b.push(f(h[0])),h[1]>h[0]&&(h[1]+1>h[0]&&b.push("-"),b.push(f(h[1])));b.push("]");return b.join("")}function m(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=a.length,d=[],g=0,h=0;g<b;++g){var k=a[g];"("===k?++h:"\\"===k.charAt(0)&&(k=+k.substring(1))&&(k<=h?d[k]=-1:a[g]=f(k))}for(g=1;g<d.length;++g)-1===d[g]&&(d[g]=++E);for(h=g=0;g<b;++g)k=a[g],
+"("===k?(++h,d[h]||(a[g]="(?:")):"\\"===k.charAt(0)&&(k=+k.substring(1))&&k<=h&&(a[g]="\\"+d[k]);for(g=0;g<b;++g)"^"===a[g]&&"^"!==a[g+1]&&(a[g]="");if(e.ignoreCase&&q)for(g=0;g<b;++g)k=a[g],e=k.charAt(0),2<=k.length&&"["===e?a[g]=c(k):"\\"!==e&&(a[g]=k.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var E=0,q=!1,l=!1,n=0,b=a.length;n<b;++n){var p=a[n];if(p.ignoreCase)l=!0;else if(/[a-z]/i.test(p.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,
+""))){q=!0;l=!1;break}}for(var w={b:8,t:9,n:10,v:11,f:12,r:13},r=[],n=0,b=a.length;n<b;++n){p=a[n];if(p.global||p.multiline)throw Error(""+p);r.push("(?:"+m(p)+")")}return new RegExp(r.join("|"),l?"gi":"g")}function U(a,d){function f(a){var b=a.nodeType;if(1==b){if(!c.test(a.className)){for(b=a.firstChild;b;b=b.nextSibling)f(b);b=a.nodeName.toLowerCase();if("br"===b||"li"===b)m[l]="\n",q[l<<1]=E++,q[l++<<1|1]=a}}else if(3==b||4==b)b=a.nodeValue,b.length&&(b=d?b.replace(/\r\n?/g,"\n"):b.replace(/[ \t\r\n]+/g,
+" "),m[l]=b,q[l<<1]=E,E+=b.length,q[l++<<1|1]=a)}var c=/(?:^|\s)nocode(?:\s|$)/,m=[],E=0,q=[],l=0;f(a);return{a:m.join("").replace(/\n$/,""),c:q}}function J(a,d,f,c,m){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},c(a),m.push.apply(m,a.g))}function V(a){for(var d=void 0,f=a.firstChild;f;f=f.nextSibling)var c=f.nodeType,d=1===c?d?a:f:3===c?W.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function G(a,d){function f(a){for(var l=a.i,n=a.h,b=[l,"pln"],p=0,q=a.a.match(m)||[],r={},e=0,t=q.length;e<
+t;++e){var z=q[e],v=r[z],g=void 0,h;if("string"===typeof v)h=!1;else{var k=c[z.charAt(0)];if(k)g=z.match(k[1]),v=k[0];else{for(h=0;h<E;++h)if(k=d[h],g=z.match(k[1])){v=k[0];break}g||(v="pln")}!(h=5<=v.length&&"lang-"===v.substring(0,5))||g&&"string"===typeof g[1]||(h=!1,v="src");h||(r[z]=v)}k=p;p+=z.length;if(h){h=g[1];var A=z.indexOf(h),C=A+h.length;g[2]&&(C=z.length-g[2].length,A=C-h.length);v=v.substring(5);J(n,l+k,z.substring(0,A),f,b);J(n,l+k+A,h,K(v,h),b);J(n,l+k+C,z.substring(C),f,b)}else b.push(l+
+k,v)}a.g=b}var c={},m;(function(){for(var f=a.concat(d),l=[],n={},b=0,p=f.length;b<p;++b){var w=f[b],r=w[3];if(r)for(var e=r.length;0<=--e;)c[r.charAt(e)]=w;w=w[1];r=""+w;n.hasOwnProperty(r)||(l.push(w),n[r]=null)}l.push(/[\0-\uffff]/);m=T(l)})();var E=d.length;return f}function x(a){var d=[],f=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
+null,"'\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):d.push(["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);a.verbatimStrings&&f.push(["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);var c=a.hashComments;c&&(a.cStyleComments?(1<c?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
+null,"#"]),f.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]));if(c=a.regexLiterals){var m=(c=1<c?"":"\n\r")?".":"[\\S\\s]";f.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+
+("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+m+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+m+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i,
+null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return G(d,f)}function L(a,d,f){function c(a){var b=a.nodeType;if(1==b&&!t.test(a.className))if("br"===a.nodeName.toLowerCase())m(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(q);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+
+d[0].length))&&a.parentNode.insertBefore(l.createTextNode(e),a.nextSibling),m(a),b||a.parentNode.removeChild(a))}}function m(a){function c(a,b){var e=b?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=c(k,1),d=a.nextSibling;k.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,k.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var t=/(?:^|\s)nocode(?:\s|$)/,q=/\r\n?|\n/,l=a.ownerDocument,n=l.createElement("li");a.firstChild;)n.appendChild(a.firstChild);
+for(var b=[n],p=0;p<b.length;++p)c(b[p]);d===(d|0)&&b[0].setAttribute("value",d);var w=l.createElement("ol");w.className="linenums";d=Math.max(0,d-1|0)||0;for(var p=0,r=b.length;p<r;++p)n=b[p],n.className="L"+(p+d)%10,n.firstChild||n.appendChild(l.createTextNode("\u00a0")),w.appendChild(n);a.appendChild(w)}function t(a,d){for(var f=d.length;0<=--f;){var c=d[f];I.hasOwnProperty(c)?D.console&&console.warn("cannot override language handler %s",c):I[c]=a}}function K(a,d){a&&I.hasOwnProperty(a)||(a=/^\s*</.test(d)?
+"default-markup":"default-code");return I[a]}function M(a){var d=a.j;try{var f=U(a.h,a.l),c=f.a;a.a=c;a.c=f.c;a.i=0;K(d,c)(a);var m=/\bMSIE\s(\d+)/.exec(navigator.userAgent),m=m&&8>=+m[1],d=/\n/g,t=a.a,q=t.length,f=0,l=a.c,n=l.length,c=0,b=a.g,p=b.length,w=0;b[p]=q;var r,e;for(e=r=0;e<p;)b[e]!==b[e+2]?(b[r++]=b[e++],b[r++]=b[e++]):e+=2;p=r;for(e=r=0;e<p;){for(var x=b[e],z=b[e+1],v=e+2;v+2<=p&&b[v+1]===z;)v+=2;b[r++]=x;b[r++]=z;e=v}b.length=r;var g=a.h;a="";g&&(a=g.style.display,g.style.display="none");
+try{for(;c<n;){var h=l[c+2]||q,k=b[w+2]||q,v=Math.min(h,k),A=l[c+1],C;if(1!==A.nodeType&&(C=t.substring(f,v))){m&&(C=C.replace(d,"\r"));A.nodeValue=C;var N=A.ownerDocument,u=N.createElement("span");u.className=b[w+1];var B=A.parentNode;B.replaceChild(u,A);u.appendChild(A);f<h&&(l[c+1]=A=N.createTextNode(t.substring(v,h)),B.insertBefore(A,u.nextSibling))}f=v;f>=h&&(c+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(y){D.console&&console.log(y&&y.stack||y)}}var D="undefined"!==typeof window?
+window:{},B=["break,continue,do,else,for,if,return,while"],F=[[B,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],H=[F,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],
+O=[F,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],P=[F,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"],
+F=[F,"abstract,async,await,constructor,debugger,enum,eval,export,from,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],Q=[B,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],R=[B,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],
+B=[B,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],S=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,W=/\S/,X=x({keywords:[H,P,O,F,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",Q,R,B],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),
+I={};t(X,["default-code"]);t(G([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));t(G([["pln",/^[\s]+/,
+null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);
+t(G([],[["atv",/^[\s\S]+/]]),["uq.val"]);t(x({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),"c cc cpp cxx cyc m".split(" "));t(x({keywords:"null,true,false"}),["json"]);t(x({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),["cs"]);t(x({keywords:O,cStyleComments:!0}),["java"]);t(x({keywords:B,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);t(x({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);t(x({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",
+hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);t(x({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);t(x({keywords:F,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);t(x({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,
+regexLiterals:!0}),["coffee"]);t(G([],[["str",/^[\s\S]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="<pre>"+a+"</pre>";
+c=c.firstChild;f&&L(c,f,!0);M({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});return c.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function f(){for(var c=D.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;p<x.length&&b.now()<c;p++){for(var d=x[p],l=g,n=d;n=n.previousSibling;){var m=n.nodeType,u=(7===m||8===m)&&n.nodeValue;if(u?!/^\??prettify\b/.test(u):3!==m||/\S/.test(n.nodeValue))break;if(u){l={};u.replace(/\b(\w+)=([\w:.%+-]+)/g,function(a,b,c){l[b]=c});break}}n=d.className;if((l!==g||r.test(n))&&
+!e.test(n)){m=!1;for(u=d.parentNode;u;u=u.parentNode)if(v.test(u.tagName)&&u.className&&r.test(u.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=l.lang;if(!m){var m=n.match(w),q;!m&&(q=V(d))&&z.test(q.tagName)&&(m=q.className.match(w));m&&(m=m[1])}if(B.test(d.tagName))u=1;else var u=d.currentStyle,y=t.defaultView,u=(u=u?u.whiteSpace:y&&y.getComputedStyle?y.getComputedStyle(d,null).getPropertyValue("white-space"):0)&&"pre"===u.substring(0,3);y=l.linenums;(y="true"===y||+y)||(y=(y=n.match(/\blinenums\b(?::(\d+))?/))?
+y[1]&&y[1].length?+y[1]:!0:!1);y&&L(d,y,u);M({j:m,h:d,m:y,l:u,a:null,i:null,c:null,g:null})}}}p<x.length?D.setTimeout(f,250):"function"===typeof a&&a()}for(var c=d||document.body,t=c.ownerDocument||document,c=[c.getElementsByTagName("pre"),c.getElementsByTagName("code"),c.getElementsByTagName("xmp")],x=[],q=0;q<c.length;++q)for(var l=0,n=c[q].length;l<n;++l)x.push(c[q][l]);var c=null,b=Date;b.now||(b={now:function(){return+new Date}});var p=0,w=/\blang(?:uage)?-([\w.]+)(?!\S)/,r=/\bprettyprint\b/,
+e=/\bprettyprinted\b/,B=/pre|xmp/i,z=/^code$/i,v=/^(?:pre|code|xmp)$/i,g={};f()}},H=D.define;"function"===typeof H&&H.amd&&H("google-code-prettify",[],function(){return Y})})();}()
diff --git a/static/bower_components/google-prettify/loader/run_prettify.js b/static/bower_components/google-prettify/loader/run_prettify.js
new file mode 100644
index 00000000..7c907b6d
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/run_prettify.js
@@ -0,0 +1,64 @@
+!function(){/*
+
+ Copyright (C) 2013 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ Copyright (C) 2006 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+(function(){function aa(g){function r(){try{L.doScroll("left")}catch(ba){k.setTimeout(r,50);return}x("poll")}function x(r){if("readystatechange"!=r.type||"complete"==z.readyState)("load"==r.type?k:z)[B](n+r.type,x,!1),!l&&(l=!0)&&g.call(k,r.type||r)}var X=z.addEventListener,l=!1,E=!0,v=X?"addEventListener":"attachEvent",B=X?"removeEventListener":"detachEvent",n=X?"":"on";if("complete"==z.readyState)g.call(k,"lazy");else{if(z.createEventObject&&L.doScroll){try{E=!k.frameElement}catch(ba){}E&&r()}z[v](n+
+"DOMContentLoaded",x,!1);z[v](n+"readystatechange",x,!1);k[v](n+"load",x,!1)}}function T(){U&&aa(function(){var g=M.length;ca(g?function(){for(var r=0;r<g;++r)(function(g){k.setTimeout(function(){k.exports[M[g]].apply(k,arguments)},0)})(r)}:void 0)})}for(var k=window,z=document,L=z.documentElement,N=z.head||z.getElementsByTagName("head")[0]||L,B="",F=z.getElementsByTagName("script"),l=F.length;0<=--l;){var O=F[l],Y=O.src.match(/^[^?#]*\/run_prettify\.js(\?[^#]*)?(?:#.*)?$/);if(Y){B=Y[1]||"";O.parentNode.removeChild(O);
+break}}var U=!0,H=[],P=[],M=[];B.replace(/[?&]([^&=]+)=([^&]+)/g,function(g,r,x){x=decodeURIComponent(x);r=decodeURIComponent(r);"autorun"==r?U=!/^[0fn]/i.test(x):"lang"==r?H.push(x):"skin"==r?P.push(x):"callback"==r&&M.push(x)});l=0;for(B=H.length;l<B;++l)(function(){var g=z.createElement("script");g.onload=g.onerror=g.onreadystatechange=function(){!g||g.readyState&&!/loaded|complete/.test(g.readyState)||(g.onerror=g.onload=g.onreadystatechange=null,--S,S||k.setTimeout(T,0),g.parentNode&&g.parentNode.removeChild(g),
+g=null)};g.type="text/javascript";g.src="https://cdn.rawgit.com/google/code-prettify/master/loader/lang-"+encodeURIComponent(H[l])+".js";N.insertBefore(g,N.firstChild)})(H[l]);for(var S=H.length,F=[],l=0,B=P.length;l<B;++l)F.push("https://cdn.rawgit.com/google/code-prettify/master/loader/skins/"+encodeURIComponent(P[l])+".css");F.push("https://cdn.rawgit.com/google/code-prettify/master/loader/prettify.css");(function(g){function r(l){if(l!==x){var k=z.createElement("link");k.rel="stylesheet";k.type=
+"text/css";l+1<x&&(k.error=k.onerror=function(){r(l+1)});k.href=g[l];N.appendChild(k)}}var x=g.length;r(0)})(F);var ca=function(){"undefined"!==typeof window&&(window.PR_SHOULD_USE_CONTINUATION=!0);var g;(function(){function r(a){function d(e){var a=e.charCodeAt(0);if(92!==a)return a;var c=e.charAt(1);return(a=k[c])?a:"0"<=c&&"7">=c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);
+return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,h=c.length;a<h;++a){var m=c[a];if(/\\[bdsw]/i.test(m))b.push(m);else{var m=d(m),p;a+2<h&&"-"===c[a+1]?(p=d(c[a+2]),a+=2):p=m;e.push([m,p]);65>p||122<m||(65>p||90<m||e.push([Math.max(65,m)|32,Math.min(p,90)|32]),97>p||122<m||
+e.push([Math.max(97,m)&-33,Math.min(p,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});c=[];h=[];for(a=0;a<e.length;++a)m=e[a],m[0]<=h[1]+1?h[1]=Math.max(h[1],m[1]):c.push(h=m);for(a=0;a<c.length;++a)m=c[a],b.push(f(m[0])),m[1]>m[0]&&(m[1]+1>m[0]&&b.push("-"),b.push(f(m[1])));b.push("]");return b.join("")}function g(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)",
+"g")),b=a.length,d=[],h=0,m=0;h<b;++h){var p=a[h];"("===p?++m:"\\"===p.charAt(0)&&(p=+p.substring(1))&&(p<=m?d[p]=-1:a[h]=f(p))}for(h=1;h<d.length;++h)-1===d[h]&&(d[h]=++r);for(m=h=0;h<b;++h)p=a[h],"("===p?(++m,d[m]||(a[h]="(?:")):"\\"===p.charAt(0)&&(p=+p.substring(1))&&p<=m&&(a[h]="\\"+d[p]);for(h=0;h<b;++h)"^"===a[h]&&"^"!==a[h+1]&&(a[h]="");if(e.ignoreCase&&A)for(h=0;h<b;++h)p=a[h],e=p.charAt(0),2<=p.length&&"["===e?a[h]=c(p):"\\"!==e&&(a[h]=p.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);
+return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var r=0,A=!1,q=!1,I=0,b=a.length;I<b;++I){var t=a[I];if(t.ignoreCase)q=!0;else if(/[a-z]/i.test(t.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){A=!0;q=!1;break}}for(var k={b:8,t:9,n:10,v:11,f:12,r:13},u=[],I=0,b=a.length;I<b;++I){t=a[I];if(t.global||t.multiline)throw Error(""+t);u.push("(?:"+g(t)+")")}return new RegExp(u.join("|"),q?"gi":"g")}function l(a,d){function f(a){var b=a.nodeType;if(1==b){if(!c.test(a.className)){for(b=
+a.firstChild;b;b=b.nextSibling)f(b);b=a.nodeName.toLowerCase();if("br"===b||"li"===b)g[q]="\n",A[q<<1]=r++,A[q++<<1|1]=a}}else if(3==b||4==b)b=a.nodeValue,b.length&&(b=d?b.replace(/\r\n?/g,"\n"):b.replace(/[ \t\r\n]+/g," "),g[q]=b,A[q<<1]=r,r+=b.length,A[q++<<1|1]=a)}var c=/(?:^|\s)nocode(?:\s|$)/,g=[],r=0,A=[],q=0;f(a);return{a:g.join("").replace(/\n$/,""),c:A}}function k(a,d,f,c,g){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},c(a),g.push.apply(g,a.g))}function z(a){for(var d=void 0,f=a.firstChild;f;f=
+f.nextSibling)var c=f.nodeType,d=1===c?d?a:f:3===c?S.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function E(a,d){function f(a){for(var q=a.i,r=a.h,b=[q,"pln"],t=0,A=a.a.match(g)||[],u={},e=0,l=A.length;e<l;++e){var D=A[e],w=u[D],h=void 0,m;if("string"===typeof w)m=!1;else{var p=c[D.charAt(0)];if(p)h=D.match(p[1]),w=p[0];else{for(m=0;m<n;++m)if(p=d[m],h=D.match(p[1])){w=p[0];break}h||(w="pln")}!(m=5<=w.length&&"lang-"===w.substring(0,5))||h&&"string"===typeof h[1]||(m=!1,w="src");m||(u[D]=w)}p=t;
+t+=D.length;if(m){m=h[1];var C=D.indexOf(m),G=C+m.length;h[2]&&(G=D.length-h[2].length,C=G-m.length);w=w.substring(5);k(r,q+p,D.substring(0,C),f,b);k(r,q+p+C,m,F(w,m),b);k(r,q+p+G,D.substring(G),f,b)}else b.push(q+p,w)}a.g=b}var c={},g;(function(){for(var f=a.concat(d),q=[],k={},b=0,t=f.length;b<t;++b){var n=f[b],u=n[3];if(u)for(var e=u.length;0<=--e;)c[u.charAt(e)]=n;n=n[1];u=""+n;k.hasOwnProperty(u)||(q.push(n),k[u]=null)}q.push(/[\0-\uffff]/);g=r(q)})();var n=d.length;return f}function v(a){var d=
+[],f=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):d.push(["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);a.verbatimStrings&&
+f.push(["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);var c=a.hashComments;c&&(a.cStyleComments?(1<c?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"]),f.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,
+null]));if(c=a.regexLiterals){var g=(c=1<c?"":"\n\r")?".":"[\\S\\s]";f.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+g+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+g+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",
+new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i,null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return E(d,f)}function B(a,d,f){function c(a){var b=
+a.nodeType;if(1==b&&!r.test(a.className))if("br"===a.nodeName.toLowerCase())g(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(n);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+d[0].length))&&a.parentNode.insertBefore(q.createTextNode(e),a.nextSibling),g(a),b||a.parentNode.removeChild(a))}}function g(a){function c(a,b){var e=b?a.cloneNode(!1):a,p=a.parentNode;if(p){var p=c(p,1),d=a.nextSibling;
+p.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,p.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var r=/(?:^|\s)nocode(?:\s|$)/,n=/\r\n?|\n/,q=a.ownerDocument,k=q.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var b=[k],t=0;t<b.length;++t)c(b[t]);d===(d|0)&&b[0].setAttribute("value",d);var l=q.createElement("ol");l.className="linenums";d=Math.max(0,d-1|0)||0;for(var t=
+0,u=b.length;t<u;++t)k=b[t],k.className="L"+(t+d)%10,k.firstChild||k.appendChild(q.createTextNode("\u00a0")),l.appendChild(k);a.appendChild(l)}function n(a,d){for(var f=d.length;0<=--f;){var c=d[f];V.hasOwnProperty(c)?Q.console&&console.warn("cannot override language handler %s",c):V[c]=a}}function F(a,d){a&&V.hasOwnProperty(a)||(a=/^\s*</.test(d)?"default-markup":"default-code");return V[a]}function H(a){var d=a.j;try{var f=l(a.h,a.l),c=f.a;a.a=c;a.c=f.c;a.i=0;F(d,c)(a);var g=/\bMSIE\s(\d+)/.exec(navigator.userAgent),
+g=g&&8>=+g[1],d=/\n/g,r=a.a,k=r.length,f=0,q=a.c,n=q.length,c=0,b=a.g,t=b.length,v=0;b[t]=k;var u,e;for(e=u=0;e<t;)b[e]!==b[e+2]?(b[u++]=b[e++],b[u++]=b[e++]):e+=2;t=u;for(e=u=0;e<t;){for(var x=b[e],z=b[e+1],w=e+2;w+2<=t&&b[w+1]===z;)w+=2;b[u++]=x;b[u++]=z;e=w}b.length=u;var h=a.h;a="";h&&(a=h.style.display,h.style.display="none");try{for(;c<n;){var m=q[c+2]||k,p=b[v+2]||k,w=Math.min(m,p),C=q[c+1],G;if(1!==C.nodeType&&(G=r.substring(f,w))){g&&(G=G.replace(d,"\r"));C.nodeValue=G;var Z=C.ownerDocument,
+W=Z.createElement("span");W.className=b[v+1];var B=C.parentNode;B.replaceChild(W,C);W.appendChild(C);f<m&&(q[c+1]=C=Z.createTextNode(r.substring(w,m)),B.insertBefore(C,W.nextSibling))}f=w;f>=m&&(c+=2);f>=p&&(v+=2)}}finally{h&&(h.style.display=a)}}catch(y){Q.console&&console.log(y&&y.stack||y)}}var Q="undefined"!==typeof window?window:{},J=["break,continue,do,else,for,if,return,while"],K=[[J,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],R=[K,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],L=[K,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
+M=[K,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"],K=[K,"abstract,async,await,constructor,debugger,enum,eval,export,from,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],
+N=[J,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],O=[J,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],J=[J,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],P=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
+S=/\S/,T=v({keywords:[R,M,L,K,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",N,O,J],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),V={};n(T,["default-code"]);n(E([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
+/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));n(E([["pln",/^[\s]+/,null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);n(E([],[["atv",/^[\s\S]+/]]),["uq.val"]);n(v({keywords:R,hashComments:!0,cStyleComments:!0,types:P}),"c cc cpp cxx cyc m".split(" "));n(v({keywords:"null,true,false"}),["json"]);n(v({keywords:M,hashComments:!0,cStyleComments:!0,
+verbatimStrings:!0,types:P}),["cs"]);n(v({keywords:L,cStyleComments:!0}),["java"]);n(v({keywords:J,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);n(v({keywords:N,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);n(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),
+["perl","pl","pm"]);n(v({keywords:O,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);n(v({keywords:K,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);n(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);n(E([],[["str",/^[\s\S]+/]]),
+["regex"]);var U=Q.PR={createSimpleLexer:E,registerLangHandler:n,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="<pre>"+a+"</pre>";c=c.firstChild;f&&B(c,f,!0);H({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});
+return c.innerHTML},prettyPrint:g=function(a,d){function f(){for(var c=Q.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;t<r.length&&b.now()<c;t++){for(var d=r[t],k=h,n=d;n=n.previousSibling;){var q=n.nodeType,l=(7===q||8===q)&&n.nodeValue;if(l?!/^\??prettify\b/.test(l):3!==q||/\S/.test(n.nodeValue))break;if(l){k={};l.replace(/\b(\w+)=([\w:.%+-]+)/g,function(a,b,c){k[b]=c});break}}n=d.className;if((k!==h||u.test(n))&&!e.test(n)){q=!1;for(l=d.parentNode;l;l=l.parentNode)if(w.test(l.tagName)&&l.className&&
+u.test(l.className)){q=!0;break}if(!q){d.className+=" prettyprinted";q=k.lang;if(!q){var q=n.match(v),A;!q&&(A=z(d))&&D.test(A.tagName)&&(q=A.className.match(v));q&&(q=q[1])}if(x.test(d.tagName))l=1;else var l=d.currentStyle,y=g.defaultView,l=(l=l?l.whiteSpace:y&&y.getComputedStyle?y.getComputedStyle(d,null).getPropertyValue("white-space"):0)&&"pre"===l.substring(0,3);y=k.linenums;(y="true"===y||+y)||(y=(y=n.match(/\blinenums\b(?::(\d+))?/))?y[1]&&y[1].length?+y[1]:!0:!1);y&&B(d,y,l);H({j:q,h:d,m:y,
+l:l,a:null,i:null,c:null,g:null})}}}t<r.length?Q.setTimeout(f,250):"function"===typeof a&&a()}for(var c=d||document.body,g=c.ownerDocument||document,c=[c.getElementsByTagName("pre"),c.getElementsByTagName("code"),c.getElementsByTagName("xmp")],r=[],k=0;k<c.length;++k)for(var n=0,l=c[k].length;n<l;++n)r.push(c[k][n]);var c=null,b=Date;b.now||(b={now:function(){return+new Date}});var t=0,v=/\blang(?:uage)?-([\w.]+)(?!\S)/,u=/\bprettyprint\b/,e=/\bprettyprinted\b/,x=/pre|xmp/i,D=/^code$/i,w=/^(?:pre|code|xmp)$/i,
+h={};f()}},R=Q.define;"function"===typeof R&&R.amd&&R("google-code-prettify",[],function(){return U})})();return g}();S||k.setTimeout(T,0)})();}()
diff --git a/static/bower_components/google-prettify/loader/skins/desert.css b/static/bower_components/google-prettify/loader/skins/desert.css
new file mode 100644
index 00000000..138debe9
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/skins/desert.css
@@ -0,0 +1 @@
+pre .atn,pre .kwd,pre .tag{font-weight:700}pre.prettyprint{display:block;background-color:#333}pre .nocode{background-color:none;color:#000}pre .str{color:#ffa0a0}pre .kwd{color:khaki}pre .com{color:#87ceeb}pre .typ{color:#98fb98}pre .lit{color:#cd5c5c}pre .pln,pre .pun{color:#fff}pre .tag{color:khaki}pre .atn{color:#bdb76b}pre .atv{color:#ffa0a0}pre .dec{color:#98fb98}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint{background-color:none}code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}}
\ No newline at end of file
diff --git a/static/bower_components/google-prettify/loader/skins/doxy.css b/static/bower_components/google-prettify/loader/skins/doxy.css
new file mode 100644
index 00000000..8494b449
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/skins/doxy.css
@@ -0,0 +1 @@
+a,code.prettyprint a,pre.prettyprint a{text-decoration:none}code .str,pre .str{color:#fec243}code .kwd,pre .kwd{color:#8470FF}code .com,pre .com{color:#32cd32;font-style:italic}code .typ,pre .typ{color:#6ecbcc}code .lit,pre .lit{color:#d06}code .pun,pre .pun{color:#8B8970}code .pln,pre .pln{color:#f0f0f0}code .tag,pre .tag{color:#9c9cff}code .htm,pre .htm{color:plum}code .xsl,pre .xsl{color:#d0a0d0}code .atn,pre .atn{color:#46eeee;font-weight:400}code .atv,pre .atv{color:#EEB4B4}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';font-weight:700;font-size:9pt;background-color:#0f0f0f;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#8B8970}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code.prettyprint,pre.prettyprint{background-color:#fff}code .str,pre .str{color:#088}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#oc3;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#b66ff7;font-weight:700}code .htm,code .xsl,pre .htm,pre .xsl{color:#606;font-weight:700}code .atn,pre .atn{color:#c71585;font-weight:400}code .atv,pre .atv{color:#088;font-weight:400}}
\ No newline at end of file
diff --git a/static/bower_components/google-prettify/loader/skins/sons-of-obsidian.css b/static/bower_components/google-prettify/loader/skins/sons-of-obsidian.css
new file mode 100644
index 00000000..aa078a68
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/skins/sons-of-obsidian.css
@@ -0,0 +1 @@
+.str{color:#EC7600}.kwd{color:#93C763}.com{color:#66747B}.typ{color:#678CB1}.lit{color:#FACD22}.pln,.pun{color:#F1F2F3}.tag{color:#8AC763}.atn{color:#E0E2E4}.atv{color:#EC7600}.dec{color:purple}pre.prettyprint{border:0 solid #888}ol.linenums{margin-top:0;margin-bottom:0}.prettyprint{background:#000}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{color:#555;list-style-type:decimal}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}@media print{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006}.atn{color:#404}.atv{color:#060}}
\ No newline at end of file
diff --git a/static/bower_components/google-prettify/loader/skins/sunburst.css b/static/bower_components/google-prettify/loader/skins/sunburst.css
new file mode 100644
index 00000000..8eb58781
--- /dev/null
+++ b/static/bower_components/google-prettify/loader/skins/sunburst.css
@@ -0,0 +1 @@
+code .str,pre .str{color:#65B042}code .kwd,pre .kwd{color:#E28964}code .com,pre .com{color:#AEAEAE;font-style:italic}code .typ,pre .typ{color:#89bdff}code .lit,pre .lit{color:#3387CC}code .pln,code .pun,pre .pln,pre .pun{color:#fff}code .tag,pre .tag{color:#89bdff}code .atn,pre .atn{color:#bdb76b}code .atv,pre .atv{color:#65B042}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{background-color:#000;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}}
\ No newline at end of file
diff --git a/static/bower_components/google-prettify/package.json b/static/bower_components/google-prettify/package.json
new file mode 100644
index 00000000..beeb5744
--- /dev/null
+++ b/static/bower_components/google-prettify/package.json
@@ -0,0 +1,59 @@
+{
+  "name": "code-prettify",
+  "version": "1.0.0",
+  "description": "Google Code Prettify",
+  "license": "Apache-2.0",
+  "homepage": "https://github.com/google/code-prettify",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/google/code-prettify.git"
+  },
+  "bugs": {
+    "url": "https://github.com/google/code-prettify/issues"
+  },
+  "keywords": [
+    "syntax",
+    "highlight",
+    "highlighting",
+    "source",
+    "code",
+    "prettify",
+    "google"
+  ],
+  "author": "Google",
+  "maintainers": [
+    "Mike Samuel <mikesamuel@gmail.com>"
+  ],
+  "contributors": [
+    "Amro <amroamroamro@gmail.com>"
+  ],
+  "main": "src/node_prettify.js",
+  "directories": {
+    "lib": "src",
+    "doc": "docs",
+    "example": "examples",
+    "test": "tests"
+  },
+  "files": [
+    "loader/",
+    "src/",
+    "styles/*.css",
+    "COPYING"
+  ],
+  "scripts": {
+    "grunt": "grunt",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "devDependencies": {
+    "google-closure-compiler": "^20161201.0.0",
+    "grunt": "^1.0.1",
+    "grunt-contrib-clean": "^1.0.0",
+    "grunt-contrib-compress": "^1.3.0",
+    "grunt-contrib-copy": "^1.0.0",
+    "grunt-contrib-cssmin": "^1.0.2",
+    "grunt-contrib-uglify": "^2.0.0",
+    "grunt-preprocess": "^5.1.0",
+    "html-to-text": "^3.0.0",
+    "zombie": "^5.0.5"
+  }
+}
diff --git a/static/bower_components/google-prettify/src/lang-apollo.js b/static/bower_components/google-prettify/src/lang-apollo.js
new file mode 100644
index 00000000..10df8cde
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-apollo.js
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright (C) 2009 Onno Hommes.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for the AGC/AEA Assembly Language as described
+ * at http://virtualagc.googlecode.com
+ * <p>
+ * This file could be used by goodle code to allow syntax highlight for
+ * Virtual AGC SVN repository or if you don't want to commonize
+ * the header for the agc/aea html assembly listing.
+ *
+ * @author ohommes@alumni.cmu.edu
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // A line comment that starts with ;
+         [PR['PR_COMMENT'],     /^#[^\r\n]*/, null, '#'],
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
+        ],
+        [
+         [PR['PR_KEYWORD'], /^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null],
+         [PR['PR_TYPE'], /^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],
+         // A single quote possibly followed by a word that optionally ends with
+         // = ! or ?.
+         [PR['PR_LITERAL'],
+          /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
+         // Any word including labels that optionally ends with = ! or ?.
+         [PR['PR_PLAIN'],
+          /^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
+         // A printable non-space non-special character
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
+        ]),
+    ['apollo', 'agc', 'aea']);
diff --git a/static/bower_components/google-prettify/src/lang-basic.js b/static/bower_components/google-prettify/src/lang-basic.js
new file mode 100644
index 00000000..d60cce31
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-basic.js
@@ -0,0 +1,49 @@
+/**
+ * @license
+ * Copyright (C) 2013 Peter Kofler
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Contributed by peter dot kofler at code minus cop dot org
+
+/**
+ * @fileoverview
+ * Registers a language handler for Basic.
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-basic">(my BASIC code)</pre>
+ *
+ * @author peter dot kofler at code minus cop dot org
+ */
+
+PR.registerLangHandler(
+    PR.createSimpleLexer(
+        [ // shortcutStylePatterns
+          // "single-line-string"
+          [PR.PR_STRING,        /^(?:"(?:[^\\"\r\n]|\\.)*(?:"|$))/, null, '"'],
+          // Whitespace
+          [PR.PR_PLAIN,         /^\s+/, null, ' \r\n\t\xA0']
+        ],
+        [ // fallthroughStylePatterns
+          // A line comment that starts with REM
+          [PR.PR_COMMENT,       /^REM[^\r\n]*/, null],
+          [PR.PR_KEYWORD,       /^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/, null],
+          [PR.PR_PLAIN,         /^[A-Z][A-Z0-9]?(?:\$|%)?/i, null],
+          // Literals .0, 0, 0.0 0E13
+          [PR.PR_LITERAL,       /^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?/i,  null, '0123456789'],
+          [PR.PR_PUNCTUATION,   /^.[^\s\w\.$%"]*/, null]
+          // [PR.PR_PUNCTUATION,   /^[-,:;!<>=\+^\/\*]+/]
+        ]),
+    ['basic','cbm']);
diff --git a/static/bower_components/google-prettify/src/lang-clj.js b/static/bower_components/google-prettify/src/lang-clj.js
new file mode 100644
index 00000000..0758335f
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-clj.js
@@ -0,0 +1,64 @@
+/**
+ * @license Copyright (C) 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Clojure.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-lisp">(my lisp code)</pre>
+ * The lang-cl class identifies the language as common lisp.
+ * This file supports the following language extensions:
+ *     lang-clj - Clojure
+ *
+ *
+ * I used lang-lisp.js as the basis for this adding the clojure specific
+ * keywords and syntax.
+ *
+ * "Name"    = 'Clojure'
+ * "Author"  = 'Rich Hickey'
+ * "Version" = '1.2'
+ * "About"   = 'Clojure is a lisp for the jvm with concurrency primitives and a richer set of types.'
+ *
+ *
+ * I used <a href="http://clojure.org/Reference">Clojure.org Reference</a> as
+ * the basis for the reserved word list.
+ *
+ *
+ * @author jwall@google.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // clojure has more paren types than minimal lisp.
+         ['opn',             /^[\(\{\[]+/, null, '([{'],
+         ['clo',             /^[\)\}\]]+/, null, ')]}'],
+         // A line comment that starts with ;
+         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
+        ],
+        [
+         // clojure has a much larger set of keywords
+         [PR['PR_KEYWORD'],     /^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/, null],
+         [PR['PR_TYPE'], /^:[0-9a-zA-Z\-]+/]
+        ]),
+    ['clj']);
diff --git a/static/bower_components/google-prettify/src/lang-css.js b/static/bower_components/google-prettify/src/lang-css.js
new file mode 100644
index 00000000..c6f7c36b
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-css.js
@@ -0,0 +1,160 @@
+/**
+ * @license
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for CSS.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-css"></pre>
+ *
+ *
+ * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
+ * grammar.  This scheme does not recognize keywords containing escapes.
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+// This file is a call to a function defined in prettify.js which defines a
+// lexical scanner for CSS and maps tokens to styles.
+
+// The call to PR['registerLangHandler'] is quoted so that Closure Compiler
+// will not rename the call so that this language extensions can be
+// compiled/minified separately from one another.  Other symbols defined in
+// prettify.js are similarly quoted.
+
+// The call is structured thus:
+// PR['registerLangHandler'](
+//    PR['createSimpleLexer'](
+//        shortcutPatterns,
+//        fallThroughPatterns),
+//    [languageId0, ..., languageIdN])
+
+// Langugage IDs
+// =============
+// The language IDs are typically the file extensions of source files for
+// that language so that users can syntax highlight arbitrary files based
+// on just the extension.  This is heuristic, but works pretty well in
+// practice.
+
+// Patterns
+// ========
+// Lexers are typically implemented as a set of regular expressions.
+// The SimpleLexer function takes regular expressions, styles, and some
+// pragma-info and produces a lexer.  A token description looks like
+//   [STYLE_NAME, /regular-expression/, pragmas]
+
+// Initially, simple lexer's inner loop looked like:
+
+//    while sourceCode is not empty:
+//      try each regular expression in order until one matches
+//      remove the matched portion from sourceCode
+
+// This was really slow for large files because some JS interpreters
+// do a buffer copy on the matched portion which is O(n*n)
+
+// The current loop now looks like
+
+//    1. use js-modules/combinePrefixPatterns.js to 
+//       combine all regular expressions into one 
+//    2. use a single global regular expresion match to extract all tokens
+//    3. for each token try regular expressions in order until one matches it
+//       and classify it using the associated style
+
+// This is a lot more efficient but it does mean that lookahead and lookbehind
+// can't be used across boundaries to classify tokens.
+
+// Sometimes we need lookahead and lookbehind and sometimes we want to handle
+// embedded language -- JavaScript or CSS embedded in HTML, or inline assembly
+// in C.
+
+// If a particular pattern has a numbered group, and its style pattern starts
+// with "lang-" as in
+//    ['lang-js', /<script>(.*?)<\/script>/]
+// then the token classification step breaks the token into pieces.
+// Group 1 is re-parsed using the language handler for "lang-js", and the
+// surrounding portions are reclassified using the current language handler.
+// This mechanism gives us both lookahead, lookbehind, and language embedding.
+
+// Shortcut Patterns
+// =================
+// A shortcut pattern is one that is tried before other patterns if the first
+// character in the token is in the string of characters.
+// This very effectively lets us make quick correct decisions for common token
+// types.
+
+// All other patterns are fall-through patterns.
+
+
+
+// The comments inline below refer to productions in the CSS specification's
+// lexical grammar.  See link above.
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        // Shortcut patterns.
+        [
+         // The space production <s>
+         [PR['PR_PLAIN'],       /^[ \t\r\n\f]+/, null, ' \t\r\n\f']
+        ],
+        // Fall-through patterns.
+        [
+         // Quoted strings.  <string1> and <string2>
+         [PR['PR_STRING'],
+          /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null],
+         [PR['PR_STRING'],
+          /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null],
+         ['lang-css-str', /^url\(([^\)\"\']+)\)/i],
+         [PR['PR_KEYWORD'],
+          /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,
+          null],
+         // A property name -- an identifier followed by a colon.
+         ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],
+         // A C style block comment.  The <comment> production.
+         [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
+         // Escaping text spans
+         [PR['PR_COMMENT'], /^(?:<!--|-->)/],
+         // A number possibly containing a suffix.
+         [PR['PR_LITERAL'], /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],
+         // A hex color
+         [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}\b/i],
+         // An identifier
+         [PR['PR_PLAIN'],
+          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],
+         // A run of punctuation
+         [PR['PR_PUNCTUATION'], /^[^\s\w\'\"]+/]
+        ]),
+    ['css']);
+// Above we use embedded languages to highlight property names (identifiers
+// followed by a colon) differently from identifiers in values.
+PR['registerLangHandler'](
+    PR['createSimpleLexer']([],
+        [
+         [PR['PR_KEYWORD'],
+          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]
+        ]),
+    ['css-kw']);
+// The content of an unquoted URL literal like url(http://foo/img.png) should
+// be colored as string content.  This language handler is used above in the
+// URL production to do so.
+PR['registerLangHandler'](
+    PR['createSimpleLexer']([],
+        [
+         [PR['PR_STRING'], /^[^\)\"\']+/]
+        ]),
+    ['css-str']);
diff --git a/static/bower_components/google-prettify/src/lang-dart.js b/static/bower_components/google-prettify/src/lang-dart.js
new file mode 100644
index 00000000..5787ae30
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-dart.js
@@ -0,0 +1,92 @@
+/**
+ * @license
+ * Copyright (C) 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler Dart.
+ * Loosely structured based on the DartLexer in Pygments: http://pygments.org/.
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-dart">(Dart code)</pre>
+ *
+ * @author armstrong.timothy@gmail.com
+ */
+
+PR['registerLangHandler'](
+  PR['createSimpleLexer'](
+    [
+      // Whitespace.
+      [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0']
+    ],
+    [
+      // Script tag.
+      [PR['PR_COMMENT'], /^#!(?:.*)/],
+
+      // `import`, `library`, `part of`, `part`, `as`, `show`, and `hide`
+      // keywords.
+      [PR['PR_KEYWORD'], /^\b(?:import|library|part of|part|as|show|hide)\b/i],
+
+      // Single-line comments.
+      [PR['PR_COMMENT'], /^\/\/(?:.*)/],
+
+      // Multiline comments.
+      [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], // */
+
+      // `class` and `interface` keywords.
+      [PR['PR_KEYWORD'], /^\b(?:class|interface)\b/i],
+
+      // General keywords.
+      [PR['PR_KEYWORD'], /^\b(?:assert|async|await|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|sync|this|throw|try|while)\b/i],
+
+      // Declaration keywords.
+      [PR['PR_KEYWORD'], /^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],
+
+      // Keywords for types.
+      [PR['PR_TYPE'], /^\b(?:bool|double|Dynamic|int|num|Object|String|void)\b/i],
+
+      // Keywords for constants.
+      [PR['PR_KEYWORD'], /^\b(?:false|null|true)\b/i],
+
+      // Multiline strings, single- and double-quoted.
+      [PR['PR_STRING'], /^r?[\']{3}[\s|\S]*?[^\\][\']{3}/],
+      [PR['PR_STRING'], /^r?[\"]{3}[\s|\S]*?[^\\][\"]{3}/],
+
+      // Normal and raw strings, single- and double-quoted.
+      [PR['PR_STRING'], /^r?\'(\'|(?:[^\n\r\f])*?[^\\]\')/],
+      [PR['PR_STRING'], /^r?\"(\"|(?:[^\n\r\f])*?[^\\]\")/],
+
+      // Types are capitalized by convention.
+      [PR['PR_TYPE'], /^[A-Z]\w*/],
+
+      // Identifiers.
+      [PR['PR_PLAIN'], /^[a-z_$][a-z0-9_]*/i],
+
+      // Operators.
+      [PR['PR_PUNCTUATION'], /^[~!%^&*+=|?:<>/-]/],
+
+      // Hex numbers.
+      [PR['PR_LITERAL'], /^\b0x[0-9a-f]+/i],
+
+      // Decimal numbers.
+      [PR['PR_LITERAL'], /^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],
+      [PR['PR_LITERAL'], /^\b\.\d+(?:e[+-]?\d+)?/i],
+
+      // Punctuation.
+      [PR['PR_PUNCTUATION'], /^[(){}\[\],.;]/]
+    ]),
+  ['dart']);
diff --git a/static/bower_components/google-prettify/src/lang-erlang.js b/static/bower_components/google-prettify/src/lang-erlang.js
new file mode 100644
index 00000000..d81f5a31
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-erlang.js
@@ -0,0 +1,94 @@
+/**
+ * @license
+ * Copyright (C) 2013 Andrew Allen
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Erlang.
+ *
+ * Derived from https://raw.github.com/erlang/otp/dev/lib/compiler/src/core_parse.yrl
+ * Modified from Mike Samuel's Haskell plugin for google-code-prettify
+ *
+ * @author achew22@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         // whitechar    ->    newline | vertab | space | tab | uniWhite
+         // newline      ->    return linefeed | return | linefeed | formfeed
+         [PR['PR_PLAIN'],       /^[\t\n\x0B\x0C\r ]+/, null, '\t\n\x0B\x0C\r '],
+         // Single line double-quoted strings.
+         [PR['PR_STRING'],      /^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,
+          null, '"'],
+         
+         // Handle atoms
+         [PR['PR_LITERAL'],      /^[a-z][a-zA-Z0-9_]*/],
+         // Handle single quoted atoms
+         [PR['PR_LITERAL'],      /^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/,
+          null, "'"],
+         
+         // Handle macros. Just to be extra clear on this one, it detects the ?
+         // then uses the regexp to end it so be very careful about matching
+         // all the terminal elements
+         [PR['PR_LITERAL'],      /^\?[^ \t\n({]+/, null, "?"],
+
+          
+         
+         // decimal      ->    digit{digit}
+         // octal        ->    octit{octit}
+         // hexadecimal  ->    hexit{hexit}
+         // integer      ->    decimal
+         //               |    0o octal | 0O octal
+         //               |    0x hexadecimal | 0X hexadecimal
+         // float        ->    decimal . decimal [exponent]
+         //               |    decimal exponent
+         // exponent     ->    (e | E) [+ | -] decimal
+         [PR['PR_LITERAL'],
+          /^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,
+          null, '0123456789']
+        ],
+        [
+         // TODO: catch @declarations inside comments
+
+         // Comments in erlang are started with % and go till a newline
+         [PR['PR_COMMENT'], /^%[^\n]*/],
+
+         // Catch macros
+         //[PR['PR_TAG'], /?[^( \n)]+/],
+
+         /**
+          * %% Keywords (atoms are assumed to always be single-quoted).
+          * 'module' 'attributes' 'do' 'let' 'in' 'letrec'
+          * 'apply' 'call' 'primop'
+          * 'case' 'of' 'end' 'when' 'fun' 'try' 'catch' 'receive' 'after'
+          */
+         [PR['PR_KEYWORD'], /^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],
+         
+         /**
+          * Catch definitions (usually defined at the top of the file)
+          * Anything that starts -something
+          */
+         [PR['PR_KEYWORD'], /^-[a-z_]+/],
+
+         // Catch variables
+         [PR['PR_TYPE'], /^[A-Z_][a-zA-Z0-9_]*/],
+
+         // matches the symbol production
+         [PR['PR_PUNCTUATION'], /^[.,;]/]
+        ]),
+    ['erlang', 'erl']);
diff --git a/static/bower_components/google-prettify/src/lang-ex.js b/static/bower_components/google-prettify/src/lang-ex.js
new file mode 100644
index 00000000..9d0aa645
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-ex.js
@@ -0,0 +1,82 @@
+/**
+ * @license
+ * Copyright (C) 2017 Jacek Królikowski
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Elixir.
+ *
+ * @author nietaki@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // # comments
+         [PR['PR_COMMENT'], /^#.*/, null, '#'],
+         // a (possibly multiline) charlist
+         [PR['PR_LITERAL'], /^'(?:[^'\\]|\\(?:.|\n|\r))*'?/, null, '\''],
+         // @attributes
+         [PR['PR_ATTRIB_NAME'], /^@\w+/, null, '@'],
+         [PR['PR_PUNCTUATION'], /^[!%&()*+,\-;<=>?\[\\\]^{|}]+/, null,
+          '!%&()*+,-;<=>?[\\]^{|}'],
+         // Borrowed from lang-erlang.js:
+         [PR['PR_LITERAL'],
+          /^(?:0o[0-7](?:[0-7]|_[0-7])*|0x[\da-fA-F](?:[\da-fA-F]|_[\da-fA-F])*|\d(?:\d|_\d)*(?:\.\d(?:\d|_\d)*)?(?:[eE][+\-]?\d(?:\d|_\d)*)?)/,
+          null, '0123456789']
+        ],
+        [
+         // the iex> prompt for interactive examples
+         [PR['PR_ATTRIB_NAME'], /^iex(?:\(\d+\))?> /],
+         // special case for binaries, so that they don't get presented like atoms
+         [PR['PR_PUNCTUATION'], /^::/],
+         // atoms - :__a_word or :"colon followed by a string"
+         [PR['PR_LITERAL'], /^:(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"?)/],
+         // compile-time information
+         [PR['PR_ATTRIB_NAME'], /^(?:__(?:CALLER|ENV|MODULE|DIR)__)/],
+         // keywords
+         [PR['PR_KEYWORD'],
+          /^(?:alias|case|catch|def(?:delegate|exception|impl|macrop?|module|overridable|p?|protocol|struct)|do|else|end|fn|for|if|in|import|quote|raise|require|rescue|super|throw|try|unless|unquote(?:_splicing)?|use|when|with|yield)\b/],
+         [PR['PR_LITERAL'], /^(?:true|false|nil)\b/],
+         // atoms as keyword list keys
+         // NOTE: this does also handle the %{"I'm an atom": :foo} case
+         //
+         // Contains negative lookahead to handle <<foo::binary>>
+         [PR['PR_LITERAL'], /^(?:\w+[\!\?\@]?|"(?:[^"\\]|\\.)*"):(?!:)/],
+         // heredoc: triple double-quoted multi-line string.
+         //
+         // NOTE: the opening """ needs to be followed by a newline
+         [PR['PR_STRING'],
+          /^"""\s*(\r|\n)+(?:""?(?!")|[^\\"]|\\(?:.|\n|\r))*"{0,3}/],
+         // A double-quoted multi-line string
+         [PR['PR_STRING'],
+          /^"(?:[^"\\]|\\(?:.|\n|\r))*"?(?!")/],
+         // types
+         [PR['PR_TYPE'], /^[A-Z]\w*/],
+         // variables not meant to be used or private functions
+         [PR['PR_COMMENT'], /^_\w*/],
+         // plain: variables, functions, ...
+         [PR['PR_PLAIN'], /^[$a-z]\w*[\!\?]?/],
+         // sigils with the same starting and ending character.
+         // Key part: X(?:[^X\r\n\\]|\\.)+X where X is the sigil character
+         [PR['PR_ATTRIB_VALUE'], /^~[A-Z](?:\/(?:[^\/\r\n\\]|\\.)+\/|\|(?:[^\|\r\n\\]|\\.)+\||"(?:[^"\r\n\\]|\\.)+"|'(?:[^'\r\n\\]|\\.)+')[A-Z]*/i],
+         // sigils with a different starting and ending character.
+         // Key part: X(?:[^Y\r\n\\]|\\.)+Y where X and Y are the starting and ending characters
+         [PR['PR_ATTRIB_VALUE'], /^~[A-Z](?:\((?:[^\)\r\n\\]|\\.)+\)|\[(?:[^\]\r\n\\]|\\.)+\]|\{(?:[^\}\r\n\\]|\\.)+\}|\<(?:[^\>\r\n\\]|\\.)+\>)[A-Z]*/i],
+         [PR['PR_PUNCTUATION'], /^(?:\.+|\/|[:~])/]
+        ]),
+    ['ex','exs']);
diff --git a/static/bower_components/google-prettify/src/lang-go.js b/static/bower_components/google-prettify/src/lang-go.js
new file mode 100644
index 00000000..a48a4b58
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-go.js
@@ -0,0 +1,59 @@
+/**
+ * @license
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for the Go language..
+ * <p>
+ * Based on the lexical grammar at 
+ * http://golang.org/doc/go_spec.html#Lexical_elements
+ * <p>
+ * Go uses a minimal style for highlighting so the below does not distinguish
+ * strings, keywords, literals, etc. by design.
+ * From a discussion with the Go designers:
+ * <pre>
+ * On Thursday, July 22, 2010, Mike Samuel <...> wrote:
+ * > On Thu, Jul 22, 2010, Rob 'Commander' Pike <...> wrote:
+ * >> Personally, I would vote for the subdued style godoc presents at http://golang.org
+ * >>
+ * >> Not as fancy as some like, but a case can be made it's the official style.
+ * >> If people want more colors, I wouldn't fight too hard, in the interest of
+ * >> encouragement through familiarity, but even then I would ask to shy away
+ * >> from technicolor starbursts.
+ * >
+ * > Like http://golang.org/pkg/go/scanner/ where comments are blue and all
+ * > other content is black?  I can do that.
+ * </pre>
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace is made up of spaces, tabs and newline characters.
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // Not escaped as a string.  See note on minimalism above.
+         [PR['PR_PLAIN'],       /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])+(?:\'|$)|`[^`]*(?:`|$))/, null, '"\'']
+        ],
+        [
+         // Block comments are delimited by /* and */.
+         // Single-line comments begin with // and extend to the end of a line.
+         [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\/\*[\s\S]*?\*\/)/],
+         [PR['PR_PLAIN'],       /^(?:[^\/\"\'`]|\/(?![\/\*]))+/i]
+        ]),
+    ['go']);
diff --git a/static/bower_components/google-prettify/src/lang-hs.js b/static/bower_components/google-prettify/src/lang-hs.js
new file mode 100644
index 00000000..883c265b
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-hs.js
@@ -0,0 +1,102 @@
+/**
+ * @license
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Haskell.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-hs">(my lisp code)</pre>
+ * The lang-cl class identifies the language as common lisp.
+ * This file supports the following language extensions:
+ *     lang-cl - Common Lisp
+ *     lang-el - Emacs Lisp
+ *     lang-lisp - Lisp
+ *     lang-scm - Scheme
+ *
+ *
+ * I used http://www.informatik.uni-freiburg.de/~thiemann/haskell/haskell98-report-html/syntax-iso.html
+ * as the basis, but ignore the way the ncomment production nests since this
+ * makes the lexical grammar irregular.  It might be possible to support
+ * ncomments using the lookbehind filter.
+ *
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         // whitechar    ->    newline | vertab | space | tab | uniWhite
+         // newline      ->    return linefeed | return | linefeed | formfeed
+         [PR['PR_PLAIN'],       /^[\t\n\x0B\x0C\r ]+/, null, '\t\n\x0B\x0C\r '],
+         // Single line double and single-quoted strings.
+         // char         ->    ' (graphic<' | \> | space | escape<\&>) '
+         // string       ->    " {graphic<" | \> | space | escape | gap}"
+         // escape       ->    \ ( charesc | ascii | decimal | o octal
+         //                        | x hexadecimal )
+         // charesc      ->    a | b | f | n | r | t | v | \ | " | ' | &
+         [PR['PR_STRING'],      /^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,
+          null, '"'],
+         [PR['PR_STRING'],      /^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,
+          null, "'"],
+         // decimal      ->    digit{digit}
+         // octal        ->    octit{octit}
+         // hexadecimal  ->    hexit{hexit}
+         // integer      ->    decimal
+         //               |    0o octal | 0O octal
+         //               |    0x hexadecimal | 0X hexadecimal
+         // float        ->    decimal . decimal [exponent]
+         //               |    decimal exponent
+         // exponent     ->    (e | E) [+ | -] decimal
+         [PR['PR_LITERAL'],
+          /^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,
+          null, '0123456789']
+        ],
+        [
+         // Haskell does not have a regular lexical grammar due to the nested
+         // ncomment.
+         // comment      ->    dashes [ any<symbol> {any}] newline
+         // ncomment     ->    opencom ANYseq {ncomment ANYseq}closecom
+         // dashes       ->    '--' {'-'}
+         // opencom      ->    '{-'
+         // closecom     ->    '-}'
+         [PR['PR_COMMENT'],     /^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],
+         // reservedid   ->    case | class | data | default | deriving | do
+         //               |    else | if | import | in | infix | infixl | infixr
+         //               |    instance | let | module | newtype | of | then
+         //               |    type | where | _
+         [PR['PR_KEYWORD'],     /^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/, null],
+         // qvarid       ->    [ modid . ] varid
+         // qconid       ->    [ modid . ] conid
+         // varid        ->    (small {small | large | digit | ' })<reservedid>
+         // conid        ->    large {small | large | digit | ' }
+         // modid        ->    conid
+         // small        ->    ascSmall | uniSmall | _
+         // ascSmall     ->    a | b | ... | z
+         // uniSmall     ->    any Unicode lowercase letter
+         // large        ->    ascLarge | uniLarge
+         // ascLarge     ->    A | B | ... | Z
+         // uniLarge     ->    any uppercase or titlecase Unicode letter
+         [PR['PR_PLAIN'],  /^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],
+         // matches the symbol production
+         [PR['PR_PUNCTUATION'], /^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]
+        ]),
+    ['hs']);
diff --git a/static/bower_components/google-prettify/src/lang-kotlin.js b/static/bower_components/google-prettify/src/lang-kotlin.js
new file mode 100644
index 00000000..7f4bc2c4
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-kotlin.js
@@ -0,0 +1,58 @@
+/**
+ * @license
+ * Copyright (C) 2017 Michał Bączkowski
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Kotlin.
+ *
+ * Limitations:
+ * - doesn't support string interpolation ("$var")
+ * - doesn't support labels if there is no space between the keyword (break@loop, loop@for)
+ *
+ * @author mibac138@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+            [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+            [PR['PR_PUNCTUATION'], /^[.!%&()*+,\-;<=>?\[\\\]^{|}:]+/, null, '.!%&()*+,-;<=>?[\\]^{|}:']
+        ],
+        [
+            // keywords
+            [PR['PR_KEYWORD'],
+                /^\b(package|public|protected|private|open|abstract|constructor|final|override|import|for|while|as|typealias|get|set|((data|enum|annotation|sealed) )?class|this|super|val|var|fun|is|in|throw|return|break|continue|(companion )?object|if|try|else|do|when|init|interface|typeof)\b/],
+            [PR['PR_LITERAL'], /^(?:true|false|null)\b/],
+            // number literals
+            [PR['PR_LITERAL'], /^(0[xX][0-9a-fA-F_]+L?|0[bB][0-1]+L?|[0-9_.]+([eE]-?[0-9]+)?[fFL]?)/],
+            [PR['PR_TYPE'], /^(\b[A-Z]+[a-z][a-zA-Z0-9_$@]*|`.*`)/, null],
+            //double slash comments
+            [PR['PR_COMMENT'], /^\/\/.*/],
+            //slash star comments and documentation
+            [PR['PR_COMMENT'], /^\/\*[\s\S]*?(?:\*\/|$)/],
+            // char
+            [PR['PR_STRING'], /'.'/],
+            // string
+            [PR['PR_STRING'], /^"([^"\\]|\\[\s\S])*"/],
+            // multiline string
+            [PR['PR_STRING'], /^"{3}[\s\S]*?[^\\]"{3}/],
+            // annotation (and label)
+            [PR['PR_LITERAL'], /^@([a-zA-Z0-9_$@]*|`.*`)/],
+            // label definition
+            [PR['PR_LITERAL'], /^[a-zA-Z0-9_]+@/]
+        ]),
+    ['kotlin']);
diff --git a/static/bower_components/google-prettify/src/lang-lasso.js b/static/bower_components/google-prettify/src/lang-lasso.js
new file mode 100644
index 00000000..0df6e926
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-lasso.js
@@ -0,0 +1,67 @@
+/**
+ * @license
+ * Copyright (C) 2013 Eric Knibbe
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Lasso. <http://www.lassosoft.com>
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then enclose your code in an HTML tag like so:
+ *      <pre class="prettyprint lang-lasso">[your Lasso code]</pre>
+ *
+ * @author Eric Knibbe
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+          // whitespace
+          [PR['PR_PLAIN'],        /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+          // single quote strings
+          [PR['PR_STRING'],       /^\'[^\'\\]*(?:\\[\s\S][^\'\\]*)*(?:\'|$)/, null, "'"],
+          // double quote strings
+          [PR['PR_STRING'],       /^\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*(?:\"|$)/, null, '"'],
+          // ticked strings
+          [PR['PR_STRING'],       /^\`[^\`]*(?:\`|$)/, null, '`'],
+          // numeral as integer or hexidecimal
+          [PR['PR_LITERAL'],      /^0x[\da-f]+|\d+/i, null, '0123456789'],
+          // local or thread variables, or hashbang
+          [PR['PR_ATTRIB_NAME'],  /^[#$][a-z_][\w.]*|#\d+\b|#![ \S]+lasso9\b/i, null, '#$']
+        ],
+        [
+          // square or angle bracket delimiters
+          [PR['PR_TAG'],          /^[[\]]|<\?(?:lasso(?:script)?|=)|\?>|(no_square_brackets|noprocess)\b/i],
+          // single-line or block comments
+          [PR['PR_COMMENT'],      /^\/\/[^\r\n]*|\/\*[\s\S]*?\*\//],
+          // member variables or keyword parameters
+          [PR['PR_ATTRIB_NAME'],  /^-(?!infinity)[a-z_][\w.]*|\.\s*'[a-z_][\w.]*'|\.{3}/i],
+          // numeral as decimal or scientific notation
+          [PR['PR_LITERAL'],      /^\d*\.\d+(?:e[-+]?\d+)?|(infinity|NaN)\b/i],
+          // tag literals
+          [PR['PR_ATTRIB_VALUE'], /^::\s*[a-z_][\w.]*/i],
+          // constants
+          [PR['PR_LITERAL'],      /^(?:true|false|none|minimal|full|all|void|and|or|not|bw|nbw|ew|new|cn|ncn|lt|lte|gt|gte|eq|neq|rx|nrx|ft)\b/i],
+          // standard type or variable declarations
+          [PR['PR_TYPE'],         /^(?:array|date|decimal|duration|integer|map|pair|string|tag|xml|null|boolean|bytes|keyword|list|locale|queue|set|stack|staticarray|local|var|variable|global|data|self|inherited|currentcapture|givenblock)\b|^\.\.?/i],
+          // container or control keywords
+          [PR['PR_KEYWORD'],      /^(?:cache|database_names|database_schemanames|database_tablenames|define_tag|define_type|email_batch|encode_set|html_comment|handle|handle_error|header|if|inline|iterate|ljax_target|link|link_currentaction|link_currentgroup|link_currentrecord|link_detail|link_firstgroup|link_firstrecord|link_lastgroup|link_lastrecord|link_nextgroup|link_nextrecord|link_prevgroup|link_prevrecord|log|loop|namespace_using|output_none|portal|private|protect|records|referer|referrer|repeating|resultset|rows|search_args|search_arguments|select|sort_args|sort_arguments|thread_atomic|value_list|while|abort|case|else|fail_if|fail_ifnot|fail|if_empty|if_false|if_null|if_true|loop_abort|loop_continue|loop_count|params|params_up|return|return_value|run_children|soap_definetag|soap_lastrequest|soap_lastresponse|tag_name|ascending|average|by|define|descending|do|equals|frozen|group|handle_failure|import|in|into|join|let|match|max|min|on|order|parent|protected|provide|public|require|returnhome|skip|split_thread|sum|take|thread|to|trait|type|where|with|yield|yieldhome)\b/i],
+          // type, method, or parameter names
+          [PR['PR_PLAIN'],        /^[a-z_][\w.]*(?:=\s*(?=\())?/i],
+          // operators
+          [PR['PR_PUNCTUATION'],  /^:=|[-+*\/%=<>&|!?\\]+/]
+        ]),
+    ['lasso', 'ls', 'lassoscript']);
diff --git a/static/bower_components/google-prettify/src/lang-lisp.js b/static/bower_components/google-prettify/src/lang-lisp.js
new file mode 100644
index 00000000..aa5315e4
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-lisp.js
@@ -0,0 +1,95 @@
+/**
+ * @license
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Common Lisp and related languages.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-lisp">(my lisp code)</pre>
+ * The lang-cl class identifies the language as common lisp.
+ * This file supports the following language extensions:
+ *     lang-cl - Common Lisp
+ *     lang-el - Emacs Lisp
+ *     lang-lisp - Lisp
+ *     lang-scm - Scheme
+ *     lang-lsp - FAT 8.3 filename version of lang-lisp.
+ *
+ *
+ * I used http://www.devincook.com/goldparser/doc/meta-language/grammar-LISP.htm
+ * as the basis, but added line comments that start with ; and changed the atom
+ * production to disallow unquoted semicolons.
+ *
+ * "Name"    = 'LISP'
+ * "Author"  = 'John McCarthy'
+ * "Version" = 'Minimal'
+ * "About"   = 'LISP is an abstract language that organizes ALL'
+ *           | 'data around "lists".'
+ *
+ * "Start Symbol" = [s-Expression]
+ *
+ * {Atom Char}   = {Printable} - {Whitespace} - [()"\'']
+ *
+ * Atom = ( {Atom Char} | '\'{Printable} )+
+ *
+ * [s-Expression] ::= [Quote] Atom
+ *                  | [Quote] '(' [Series] ')'
+ *                  | [Quote] '(' [s-Expression] '.' [s-Expression] ')'
+ *
+ * [Series] ::= [s-Expression] [Series]
+ *            |
+ *
+ * [Quote]  ::= ''      !Quote = do not evaluate
+ *            |
+ *
+ *
+ * I used <a href="http://gigamonkeys.com/book/">Practical Common Lisp</a> as
+ * the basis for the reserved word list.
+ *
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         ['opn',             /^\(+/, null, '('],
+         ['clo',             /^\)+/, null, ')'],
+         // A line comment that starts with ;
+         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
+        ],
+        [
+         [PR['PR_KEYWORD'],     /^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/, null],
+         [PR['PR_LITERAL'],
+          /^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],
+         // A single quote possibly followed by a word that optionally ends with
+         // = ! or ?.
+         [PR['PR_LITERAL'],
+          /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
+         // A word that optionally ends with = ! or ?.
+         [PR['PR_PLAIN'],
+          /^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
+         // A printable non-space non-special character
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
+        ]),
+    ['cl', 'el', 'lisp', 'lsp', 'scm', 'ss', 'rkt']);
diff --git a/static/bower_components/google-prettify/src/lang-llvm.js b/static/bower_components/google-prettify/src/lang-llvm.js
new file mode 100644
index 00000000..0c575447
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-llvm.js
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright (C) 2013 Nikhil Dabas
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for LLVM.
+ * From https://gist.github.com/ndabas/2850418
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-llvm">(my LLVM code)</pre>
+ *
+ *
+ * The regular expressions were adapted from:
+ * https://github.com/hansstimer/llvm.tmbundle/blob/76fedd8f50fd6108b1780c51d79fbe3223de5f34/Syntaxes/LLVM.tmLanguage
+ * 
+ * http://llvm.org/docs/LangRef.html#constants describes the language grammar.
+ * 
+ * @author Nikhil Dabas
+ */
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^!?\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'],
+         // comment.llvm
+         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';']
+        ],
+        [
+         // variable.llvm
+         [PR['PR_PLAIN'],       /^[%@!](?:[-a-zA-Z$._][-a-zA-Z$._0-9]*|\d+)/],
+
+         // According to http://llvm.org/docs/LangRef.html#well-formedness
+         // These reserved words cannot conflict with variable names, because none of them start with a prefix character ('%' or '@').
+         [PR['PR_KEYWORD'],     /^[A-Za-z_][0-9A-Za-z_]*/, null],
+
+         // constant.numeric.float.llvm
+         [PR['PR_LITERAL'],     /^\d+\.\d+/],
+         
+         // constant.numeric.integer.llvm
+         [PR['PR_LITERAL'],     /^(?:\d+|0[xX][a-fA-F0-9]+)/],
+
+         // punctuation
+         [PR['PR_PUNCTUATION'], /^[()\[\]{},=*<>:]|\.\.\.$/]
+        ]),
+    ['llvm', 'll']);
diff --git a/static/bower_components/google-prettify/src/lang-logtalk.js b/static/bower_components/google-prettify/src/lang-logtalk.js
new file mode 100644
index 00000000..1e79559a
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-logtalk.js
@@ -0,0 +1,50 @@
+/**
+ * @license
+ * Copyright (C) 2014 Paulo Moura
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Logtalk.
+ * http://logtalk.org/
+ * @author Paulo Moura
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+          // double-quoted strings.
+          [PR['PR_STRING'], /^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/, null, '"'],
+          // atoms (don't break on underscores!)
+          [PR['PR_LITERAL'], /^[a-z][a-zA-Z0-9_]*/],
+          // quoted atoms
+          [PR['PR_LITERAL'], /^\'(?:[^\'\\\n\x0C\r]|\\[^&])+\'?/, null, "'"],
+          // numbers
+          [PR['PR_LITERAL'], /^(?:0'.|0b[0-1]+|0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i, null, '0123456789']
+        ],
+        [
+          // single-line comments begin with %
+          [PR['PR_COMMENT'], /^%[^\r\n]*/, null, '%'],
+          // block comments are delimited by /* and */
+          [PR['PR_COMMENT'], /^\/\*[\s\S]*?\*\//],
+          // directives
+          [PR['PR_KEYWORD'], /^\s*:-\s(c(a(lls|tegory)|oinductive)|p(ublic|r(ot(ocol|ected)|ivate))|e(l(if|se)|n(coding|sure_loaded)|xport)|i(f|n(clude|itialization|fo))|alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|od(e|ule)|ultifile)|reexport|s(et_(logtalk|prolog)_flag|ynchronized)|o(bject|p)|use(s|_module))/],
+          [PR['PR_KEYWORD'], /^\s*:-\s(e(lse|nd(if|_(category|object|protocol)))|built_in|dynamic|synchronized|threaded)/],
+          // variables
+          [PR['PR_TYPE'], /^[A-Z_][a-zA-Z0-9_]*/],
+          // operators
+          [PR['PR_PUNCTUATION'], /^[.,;{}:^<>=\\/+*?#!-]/]
+        ]),
+    ['logtalk', 'lgt']);
diff --git a/static/bower_components/google-prettify/src/lang-lua.js b/static/bower_components/google-prettify/src/lang-lua.js
new file mode 100644
index 00000000..3556a5f3
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-lua.js
@@ -0,0 +1,60 @@
+/**
+ * @license
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Lua.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-lua">(my Lua code)</pre>
+ *
+ *
+ * I used http://www.lua.org/manual/5.1/manual.html#2.1
+ * Because of the long-bracket concept used in strings and comments, Lua does
+ * not have a regular lexical grammar, but luckily it fits within the space
+ * of irregular grammars supported by javascript regular expressions.
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double or single quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\'']
+        ],
+        [
+         // A comment is either a line comment that starts with two dashes, or
+         // two dashes preceding a long bracketed block.
+         [PR['PR_COMMENT'], /^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],
+         // A long bracketed block not preceded by -- is a string.
+         [PR['PR_STRING'],  /^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],
+         [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/, null],
+         // A number is a hex integer literal, a decimal real literal, or in
+         // scientific notation.
+         [PR['PR_LITERAL'],
+          /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
+         // An identifier
+         [PR['PR_PLAIN'], /^[a-z_]\w*/i],
+         // A run of punctuation
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]
+        ]),
+    ['lua']);
diff --git a/static/bower_components/google-prettify/src/lang-matlab.js b/static/bower_components/google-prettify/src/lang-matlab.js
new file mode 100644
index 00000000..d98c8212
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-matlab.js
@@ -0,0 +1,183 @@
+/**
+ * @license
+ * Copyright (c) 2013 by Amro <amroamroamro@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for MATLAB.
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code inside an HTML tag like
+ *     <pre class="prettyprint lang-matlab">
+ *     </pre>
+ *
+ * @see https://github.com/amroamroamro/prettify-matlab
+ */
+(function (PR) {
+  /*
+    PR_PLAIN: plain text
+    PR_STRING: string literals
+    PR_KEYWORD: keywords
+    PR_COMMENT: comments
+    PR_TYPE: types
+    PR_LITERAL: literal values (1, null, true, ..)
+    PR_PUNCTUATION: punctuation string
+    PR_SOURCE: embedded source
+    PR_DECLARATION: markup declaration such as a DOCTYPE
+    PR_TAG: sgml tag
+    PR_ATTRIB_NAME: sgml attribute name
+    PR_ATTRIB_VALUE: sgml attribute value
+  */
+  var PR_IDENTIFIER = "ident",
+    PR_CONSTANT = "const",
+    PR_FUNCTION = "fun",
+    PR_FUNCTION_TOOLBOX = "fun_tbx",
+    PR_SYSCMD = "syscmd",
+    PR_CODE_OUTPUT = "codeoutput",
+    PR_ERROR = "err",
+    PR_WARNING = "wrn",
+    PR_TRANSPOSE = "transpose",
+    PR_LINE_CONTINUATION = "linecont";
+
+  // Refer to: http://www.mathworks.com/help/matlab/functionlist-alpha.html
+  var coreFunctions = [
+    'abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:\.(?:close|closeVar|computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers\.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event\.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab\.io\.MatFile|matlab\.mixin\.(?:Copyable|Heterogeneous(?:\.getDefaultScalarElement)?)|matlabrc|matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta\.(?:class(?:\.fromName)?|DynamicProperty|EnumeratedValue|event|MetaData|method|package(?:\.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:\.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|ncwriteschema|ndgrid|ndims|ne|NET(?:\.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|NetException|setStaticProperty))?|netcdf\.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:\.(?:create|getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:\.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:\.isPlatformSupported)?|VideoWriter(?:\.getProfiles)?|view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|ylabel|ylim|zeros|zip|zlabel|zlim|zoom'
+  ].join("|");
+  var statsFunctions = [
+    'addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|cholcov|Classification(?:BaggedEnsemble|Discriminant(?:\.(?:fit|make|template))?|Ensemble|KNN(?:\.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:\.(?:fit|template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:\.fit)?|geo(?:cdf|inv|mean|pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:\.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|LinearModel(?:\.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:\.fit)?|nan(?:cov|max|mean|median|min|std|sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:\.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:\.(?:fit|template))?)|regstats|relieff|ridge|robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest'
+  ].join("|");
+  var imageFunctions = [
+    'adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|reflect|regionprops|registration\.metric\.(?:MattesMutualInformation|MeanSquares)|registration\.optimizer\.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb'
+  ].join("|");
+  var optimFunctions = [
+    'bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog'
+  ].join("|");
+
+  // identifiers: variable/function name, or a chain of variable names joined by dots (obj.method, struct.field1.field2, etc..)
+  // valid variable names (start with letter, and contains letters, digits, and underscores).
+  // we match "xx.yy" as a whole so that if "xx" is plain and "yy" is not, we dont get a false positive for "yy"
+  //var reIdent = '(?:[a-zA-Z][a-zA-Z0-9_]*)';
+  //var reIdentChain = '(?:' + reIdent + '(?:\.' + reIdent + ')*' + ')';
+
+  // patterns that always start with a known character. Must have a shortcut string.
+  var shortcutStylePatterns = [
+    // whitespaces: space, tab, carriage return, line feed, line tab, form-feed, non-break space
+    [PR.PR_PLAIN, /^[ \t\r\n\v\f\xA0]+/, null, " \t\r\n\u000b\u000c\u00a0"],
+
+    // block comments
+    //TODO: chokes on nested block comments
+    //TODO: false positives when the lines with %{ and %} contain non-spaces
+    //[PR.PR_COMMENT, /^%(?:[^\{].*|\{(?:%|%*[^\}%])*(?:\}+%?)?)/, null],
+    [PR.PR_COMMENT, /^%\{[^%]*%+(?:[^\}%][^%]*%+)*\}/, null],
+
+    // single-line comments
+    [PR.PR_COMMENT, /^%[^\r\n]*/, null, "%"],
+
+    // system commands
+    [PR_SYSCMD, /^![^\r\n]*/, null, "!"]
+  ];
+
+  // patterns that will be tried in order if the shortcut ones fail. May have shortcuts.
+  var fallthroughStylePatterns = [
+    // line continuation
+    [PR_LINE_CONTINUATION, /^\.\.\.\s*[\r\n]/, null],
+
+    // error message
+    [PR_ERROR, /^\?\?\? [^\r\n]*/, null],
+
+    // warning message
+    [PR_WARNING, /^Warning: [^\r\n]*/, null],
+
+    // command prompt/output
+    //[PR_CODE_OUTPUT, /^>>\s+[^\r\n]*[\r\n]{1,2}[^=]*=[^\r\n]*[\r\n]{1,2}[^\r\n]*/, null],    // full command output (both loose/compact format): `>> EXP\nVAR =\n VAL`
+    [PR_CODE_OUTPUT, /^>>\s+/, null],      // only the command prompt `>> `
+    [PR_CODE_OUTPUT, /^octave:\d+>\s+/, null],  // Octave command prompt `octave:1> `
+
+    // identifier (chain) or closing-parenthesis/brace/bracket, and IS followed by transpose operator
+    // this way we dont misdetect the transpose operator ' as the start of a string
+    ["lang-matlab-operators", /^((?:[a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*|\)|\]|\}|\.)')/, null],
+
+    // identifier (chain), and NOT followed by transpose operator
+    // this must come AFTER the "is followed by transpose" step (otherwise it chops the last char of identifier)
+    ["lang-matlab-identifiers", /^([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)(?!')/, null],
+
+    // single-quoted strings: allow for escaping with '', no multilines
+    //[PR.PR_STRING, /(?:(?<=(?:\(|\[|\{|\s|=|;|,|:))|^)'(?:[^']|'')*'(?=(?:\)|\]|\}|\s|=|;|,|:|~|<|>|&|-|\+|\*|\.|\^|\|))/, null],  // string vs. transpose (check before/after context using negative/positive lookbehind/lookahead)
+    [PR.PR_STRING, /^'(?:[^']|'')*'/, null],  // "'"
+
+    // floating point numbers: 1, 1.0, 1i, -1.1E-1
+    [PR.PR_LITERAL, /^[+\-]?\.?\d+(?:\.\d*)?(?:[Ee][+\-]?\d+)?[ij]?/, null],
+
+    // parentheses, braces, brackets
+    [PR.PR_TAG, /^(?:\{|\}|\(|\)|\[|\])/, null],  // "{}()[]"
+
+    // other operators
+    [PR.PR_PUNCTUATION, /^(?:<|>|=|~|@|&|;|,|:|!|\-|\+|\*|\^|\.|\||\\|\/)/, null]
+  ];
+
+  var identifiersPatterns = [
+    // list of keywords (`iskeyword`)
+    [PR.PR_KEYWORD, /^\b(?:break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while)\b/, null],
+
+    // some specials variables/constants
+    [PR_CONSTANT, /^\b(?:true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout)\b/, null],
+
+    // some data types
+    [PR.PR_TYPE, /^\b(?:cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse)\b/, null],
+
+    // commonly used builtin functions from core MATLAB and a few popular toolboxes
+    [PR_FUNCTION, new RegExp('^\\b(?:' + coreFunctions + ')\\b'), null],
+    [PR_FUNCTION_TOOLBOX, new RegExp('^\\b(?:' + statsFunctions + ')\\b'), null],
+    [PR_FUNCTION_TOOLBOX, new RegExp('^\\b(?:' + imageFunctions + ')\\b'), null],
+    [PR_FUNCTION_TOOLBOX, new RegExp('^\\b(?:' + optimFunctions + ')\\b'), null],
+
+    // plain identifier (user-defined variable/function name)
+    [PR_IDENTIFIER, /^[a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*/, null]
+  ];
+
+  var operatorsPatterns = [
+    // forward to identifiers to match
+    ["lang-matlab-identifiers", /^([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)/, null],
+
+    // parentheses, braces, brackets
+    [PR.PR_TAG, /^(?:\{|\}|\(|\)|\[|\])/, null],  // "{}()[]"
+
+    // other operators
+    [PR.PR_PUNCTUATION, /^(?:<|>|=|~|@|&|;|,|:|!|\-|\+|\*|\^|\.|\||\\|\/)/, null],
+
+    // transpose operators
+    [PR_TRANSPOSE, /^'/, null]
+  ];
+
+  PR.registerLangHandler(
+    PR.createSimpleLexer([], identifiersPatterns),
+    ["matlab-identifiers"]
+  );
+  PR.registerLangHandler(
+    PR.createSimpleLexer([], operatorsPatterns),
+    ["matlab-operators"]
+  );
+  PR.registerLangHandler(
+    PR.createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns),
+    ["matlab"]
+  );
+})(window['PR']);
diff --git a/static/bower_components/google-prettify/src/lang-ml.js b/static/bower_components/google-prettify/src/lang-ml.js
new file mode 100644
index 00000000..6d959296
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-ml.js
@@ -0,0 +1,57 @@
+/**
+ * @license
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for OCaml, SML, F# and similar languages.
+ *
+ * Based on the lexical grammar at
+ * http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597388
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace is made up of spaces, tabs and newline characters.
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // #if ident/#else/#endif directives delimit conditional compilation
+         // sections
+         [PR['PR_COMMENT'],
+          /^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,
+          null, '#'],
+         // A double or single quoted, possibly multi-line, string.
+         // F# allows escaped newlines in strings.
+         [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/, null, '"\'']
+        ],
+        [
+         // Block comments are delimited by (* and *) and may be
+         // nested. Single-line comments begin with // and extend to
+         // the end of a line.
+         // TODO: (*...*) comments can be nested.  This does not handle that.
+         [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],
+         [PR['PR_KEYWORD'],     /^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
+         // A number is a hex integer literal, a decimal real literal, or in
+         // scientific notation.
+         [PR['PR_LITERAL'],
+          /^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
+         [PR['PR_PLAIN'],       /^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],
+         // A printable non-space non-special character
+         [PR['PR_PUNCTUATION'], /^[^\t\n\r \xA0\"\'\w]+/]
+        ]),
+    ['fs', 'ml']);
diff --git a/static/bower_components/google-prettify/src/lang-mumps.js b/static/bower_components/google-prettify/src/lang-mumps.js
new file mode 100644
index 00000000..63dec6dc
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-mumps.js
@@ -0,0 +1,140 @@
+/**
+ * @license
+ * Copyright (C) 2011 Kitware Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for MUMPS.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-mumps">(my SQL code)</pre>
+ * 
+ * Commands, intrinsic functions and variables taken from ISO/IEC 11756:1999(E)
+ *
+ * @author chris.harris@kitware.com
+ *
+ * Known issues:
+ * 
+ * - Currently can't distinguish between keywords and local or global variables having the same name
+ *   for exampe SET IF="IF?"
+ * - m file are already used for MatLab hence using mumps.
+ */
+
+(function () {
+
+
+var commands = 'B|BREAK|'       + 
+               'C|CLOSE|'       +
+               'D|DO|'          +
+               'E|ELSE|'        +
+               'F|FOR|'         +
+               'G|GOTO|'        +
+               'H|HALT|'        +
+               'H|HANG|'        +
+               'I|IF|'          +
+               'J|JOB|'         +
+               'K|KILL|'        +
+               'L|LOCK|'        +
+               'M|MERGE|'       +
+               'N|NEW|'         +
+               'O|OPEN|'        +     
+               'Q|QUIT|'        +
+               'R|READ|'        +
+               'S|SET|'         +
+               'TC|TCOMMIT|'    +
+               'TRE|TRESTART|'  +
+               'TRO|TROLLBACK|' +
+               'TS|TSTART|'     +
+               'U|USE|'         +
+               'V|VIEW|'        +  
+               'W|WRITE|'       +
+               'X|XECUTE';
+
+var intrinsicVariables = 'D|DEVICE|'       +
+                         'EC|ECODE|'       +  
+                         'ES|ESTACK|'      +
+                         'ET|ETRAP|'       +
+                         'H|HOROLOG|'      +
+                         'I|IO|'           +
+                         'J|JOB|'          +
+                         'K|KEY|'          +
+                         'P|PRINCIPAL|'    +
+                         'Q|QUIT|'         +
+                         'ST|STACK|'       +
+                         'S|STORAGE|'      +
+                         'SY|SYSTEM|'      +
+                         'T|TEST|'         +
+                         'TL|TLEVEL|'      +
+                         'TR|TRESTART|'    +
+                         'X|'              +
+                         'Y|'              +
+                         'Z[A-Z]*|';    
+
+var intrinsicFunctions = 'A|ASCII|'        +
+                         'C|CHAR|'         +
+                         'D|DATA|'         +
+                         'E|EXTRACT|'      +
+                         'F|FIND|'         +
+                         'FN|FNUMBER|'     +
+                         'G|GET|'          +
+                         'J|JUSTIFY|'      +
+                         'L|LENGTH|'       +
+                         'NA|NAME|'        +
+                         'O|ORDER|'        +
+                         'P|PIECE|'        +
+                         'QL|QLENGTH|'     +
+                         'QS|QSUBSCRIPT|'  +
+                         'Q|QUERY|'        +
+                         'R|RANDOM|'       +
+                         'RE|REVERSE|'     +
+                         'S|SELECT|'       +
+                         'ST|STACK|'       +
+                         'T|TEXT|'         +
+                         'TR|TRANSLATE|'   +
+                         'V|VIEW|'         * 
+                         'Z[A-Z]*|';   
+
+var intrinsic = intrinsicVariables + intrinsicFunctions;                  
+
+
+var shortcutStylePatterns = [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double or single quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^(?:"(?:[^"]|\\.)*")/, null, '"']
+  ];
+
+var fallthroughStylePatterns = [
+         // A line comment that starts with ;
+         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
+         // Add intrinsic variables and functions as declarations, there not really but it mean
+         // they will hilighted differently from commands.
+         [PR['PR_DECLARATION'], new RegExp('^(?:\\$(?:' + intrinsic + '))\\b', 'i'), null],
+         // Add commands as keywords
+         [PR['PR_KEYWORD'], new RegExp('^(?:[^\\$]' + commands + ')\\b', 'i'), null],
+         // A number is a decimal real literal or in scientific notation. 
+         [PR['PR_LITERAL'],
+          /^[+-]?(?:(?:\.\d+|\d+(?:\.\d*)?)(?:E[+\-]?\d+)?)/i], 
+         // An identifier
+         [PR['PR_PLAIN'], /^[a-z][a-zA-Z0-9]*/i],
+         // Exclude $ % and ^
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r\xA0\"\$;%\^]|_/]
+  ];
+// Can't use m as its already used for MatLab
+PR.registerLangHandler(PR.createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns), ['mumps']);
+})();
diff --git a/static/bower_components/google-prettify/src/lang-n.js b/static/bower_components/google-prettify/src/lang-n.js
new file mode 100644
index 00000000..9d29fd74
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-n.js
@@ -0,0 +1,67 @@
+/**
+ * @license
+ * Copyright (C) 2011 Zimin A.V.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for the Nemerle language.
+ * http://nemerle.org
+ * @author Zimin A.V.
+ */
+(function () {
+  // http://nemerle.org/wiki/index.php?title=Base_keywords
+  var keywords = 'abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|'
+         + 'fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|'
+         + 'null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|'
+         + 'syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|'
+         + 'assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|'
+         + 'otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield';
+
+  PR['registerLangHandler'](PR['createSimpleLexer'](
+      // shortcutStylePatterns
+      [
+        [PR['PR_STRING'], /^(?:\'(?:[^\\\'\r\n]|\\.)*\'|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, null, '"'],
+        [PR['PR_COMMENT'], /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, null, '#'],
+        [PR['PR_PLAIN'], /^\s+/, null, ' \r\n\t\xA0']
+      ],
+      // fallthroughStylePatterns
+      [
+        [PR['PR_STRING'], /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null],
+        [PR['PR_STRING'], /^<#(?:[^#>])*(?:#>|$)/, null],
+        [PR['PR_STRING'], /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, null],
+        [PR['PR_COMMENT'], /^\/\/[^\r\n]*/, null],
+        [PR['PR_COMMENT'], /^\/\*[\s\S]*?(?:\*\/|$)/, null],
+        [PR['PR_KEYWORD'], new RegExp('^(?:' + keywords + ')\\b'), null],
+        [PR['PR_TYPE'], /^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/, null],
+        [PR['PR_LITERAL'], /^@[a-z_$][a-z_$@0-9]*/i, null],
+        [PR['PR_TYPE'], /^@[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
+        [PR['PR_PLAIN'], /^'?[A-Za-z_$][a-z_$@0-9]*/i, null],
+        [PR['PR_LITERAL'], new RegExp(
+             '^(?:'
+  // A hex number
+             + '0x[a-f0-9]+'
+  // or an octal or decimal number,
+             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
+  // possibly in scientific notation
+             + '(?:e[+\\-]?\\d+)?'
+             + ')'
+  // with an optional modifier like UL for unsigned long
+             + '[a-z]*', 'i'), null, '0123456789'],
+
+        [PR['PR_PUNCTUATION'], /^.[^\s\w\.$@\'\"\`\/\#]*/, null]
+      ]),
+      ['n', 'nemerle']);
+})();
diff --git a/static/bower_components/google-prettify/src/lang-pascal.js b/static/bower_components/google-prettify/src/lang-pascal.js
new file mode 100644
index 00000000..0d93ecd5
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-pascal.js
@@ -0,0 +1,49 @@
+/**
+ * @license
+ * Copyright (C) 2013 Peter Kofler
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Contributed by peter dot kofler at code minus cop dot org
+
+/**
+ * @fileoverview
+ * Registers a language handler for (Turbo) Pascal.
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-pascal">(my Pascal code)</pre>
+ *
+ * @author peter dot kofler at code minus cop dot org
+ */
+
+PR.registerLangHandler(
+    PR.createSimpleLexer(
+        [ // shortcutStylePatterns
+          // 'single-line-string'
+          [PR.PR_STRING,        /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$))/, null, '\''],
+          // Whitespace
+          [PR.PR_PLAIN,         /^\s+/, null, ' \r\n\t\xA0']
+        ],
+        [ // fallthroughStylePatterns
+          // A cStyleComments comment (* *) or {}
+          [PR.PR_COMMENT,       /^\(\*[\s\S]*?(?:\*\)|$)|^\{[\s\S]*?(?:\}|$)/, null],
+          [PR.PR_KEYWORD,       /^(?:ABSOLUTE|AND|ARRAY|ASM|ASSEMBLER|BEGIN|CASE|CONST|CONSTRUCTOR|DESTRUCTOR|DIV|DO|DOWNTO|ELSE|END|EXTERNAL|FOR|FORWARD|FUNCTION|GOTO|IF|IMPLEMENTATION|IN|INLINE|INTERFACE|INTERRUPT|LABEL|MOD|NOT|OBJECT|OF|OR|PACKED|PROCEDURE|PROGRAM|RECORD|REPEAT|SET|SHL|SHR|THEN|TO|TYPE|UNIT|UNTIL|USES|VAR|VIRTUAL|WHILE|WITH|XOR)\b/i, null],
+          [PR.PR_LITERAL,       /^(?:true|false|self|nil)/i, null],
+          [PR.PR_PLAIN,         /^[a-z][a-z0-9]*/i, null],
+          // Literals .0, 0, 0.0 0E13
+          [PR.PR_LITERAL,       /^(?:\$[a-f0-9]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?)/i,  null, '0123456789'],
+          [PR.PR_PUNCTUATION,   /^.[^\s\w\.$@\'\/]*/, null]
+        ]),
+    ['pascal']);
diff --git a/static/bower_components/google-prettify/src/lang-proto.js b/static/bower_components/google-prettify/src/lang-proto.js
new file mode 100644
index 00000000..ba18e2bf
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-proto.js
@@ -0,0 +1,37 @@
+/**
+ * @license
+ * Copyright (C) 2006 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Protocol Buffers as described at
+ * http://code.google.com/p/protobuf/.
+ *
+ * Based on the lexical grammar at
+ * http://research.microsoft.com/fsharp/manual/spec2.aspx#_Toc202383715
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](PR['sourceDecorator']({
+        'keywords': (
+            'bytes,default,double,enum,extend,extensions,false,'
+            + 'group,import,max,message,option,'
+            + 'optional,package,repeated,required,returns,rpc,service,'
+            + 'syntax,to,true'),
+        'types': /^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,
+        'cStyleComments': true
+      }), ['proto']);
diff --git a/static/bower_components/google-prettify/src/lang-r.js b/static/bower_components/google-prettify/src/lang-r.js
new file mode 100644
index 00000000..e25c75f1
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-r.js
@@ -0,0 +1,59 @@
+/**
+ * @license
+ * Copyright (C) 2012 Jeffrey B. Arnold
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for S, S-plus, and R source code.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-r"> code </pre>
+ *
+ * Language definition from
+ * http://cran.r-project.org/doc/manuals/R-lang.html.
+ * Many of the regexes are shared  with the pygments SLexer,
+ * http://pygments.org/.
+ *
+ * Original: https://raw.github.com/jrnold/prettify-lang-r-bugs/master/lang-r.js
+ *
+ * @author jeffrey.arnold@gmail.com
+ */
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+	    [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'],
+	    [PR['PR_STRING'],      /^\'(?:[^\'\\]|\\[\s\S])*(?:\'|$)/, null, "'"]
+        ],
+        [
+            [PR['PR_COMMENT'],     /^#.*/],
+	    [PR['PR_KEYWORD'],     /^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],
+	    // hex numbes
+	    [PR['PR_LITERAL'], /^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],
+	    // Decimal numbers
+            [PR['PR_LITERAL'], /^[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],
+	    // builtin symbols
+	    [PR['PR_LITERAL'], /^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|[0-9]+))(?![A-Za-z0-9_.])/],
+	    // assignment, operators, and parens, etc.
+	    [PR['PR_PUNCTUATION'], /^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\*|\+|\^|\/|!|%.*?%|=|~|\$|@|:{1,3}|[\[\](){};,?])/],
+	    // valid variable names
+	    [PR['PR_PLAIN'], /^(?:[A-Za-z]+[A-Za-z0-9_.]*|\.[a-zA-Z_][0-9a-zA-Z\._]*)(?![A-Za-z0-9_.])/],
+	    // string backtick
+	    [PR['PR_STRING'], /^`.+`/]
+        ]),
+    ['r', 's', 'R', 'S', 'Splus']);
diff --git a/static/bower_components/google-prettify/src/lang-rd.js b/static/bower_components/google-prettify/src/lang-rd.js
new file mode 100644
index 00000000..e85bdc9d
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-rd.js
@@ -0,0 +1,50 @@
+/**
+ * @license
+ * Copyright (C) 2012 Jeffrey Arnold
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Support for R documentation (Rd) files
+ *
+ * Minimal highlighting or Rd files, basically just highlighting
+ * macros. It does not try to identify verbatim or R-like regions of
+ * macros as that is too complicated for a lexer.  Descriptions of the
+ * Rd format can be found
+ * http://cran.r-project.org/doc/manuals/R-exts.html and
+ * http://developer.r-project.org/parseRd.pdf.
+ *
+ * @author Jeffrey Arnold
+ */
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+            // whitespace
+            [PR['PR_PLAIN'],   /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+            // all comments begin with '%'
+            [PR['PR_COMMENT'], /^%[^\r\n]*/, null, '%']
+        ],
+        [// special macros with no args
+            [PR['PR_LITERAL'], /^\\(?:cr|l?dots|R|tab)\b/],
+	    // macros
+            [PR['PR_KEYWORD'], /^\\[a-zA-Z@]+/],
+	    // highlighted as macros, since technically they are
+            [PR['PR_KEYWORD'],  /^#(?:ifn?def|endif)/ ],
+	    // catch escaped brackets
+	    [PR['PR_PLAIN'], /^\\[{}]/],
+            // punctuation
+            [PR['PR_PUNCTUATION'], /^[{}()\[\]]+/]
+        ]),
+    ['Rd', 'rd']);
diff --git a/static/bower_components/google-prettify/src/lang-rust.js b/static/bower_components/google-prettify/src/lang-rust.js
new file mode 100644
index 00000000..62000cae
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-rust.js
@@ -0,0 +1,81 @@
+/**
+ * @license
+ * Copyright (C) 2015 Chris Morgan
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Rust.
+ *
+ * Derived from prior experience implementing similar things in a few environments,
+ * most especially rust.vim.
+ *
+ * @author me@chrismorgan.info
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer']([], [
+		// Whitespace
+		[PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/],
+
+		// Single line comments
+		[PR['PR_COMMENT'], /^\/\/.*/],
+		// Block comments (sadly I do not see how to make this cope with comment nesting as it should)
+		[PR['PR_COMMENT'], /^\/\*[\s\S]*?(?:\*\/|$)/],//, null],
+		// String and character literals
+		[PR['PR_STRING'], /^b"(?:[^\\]|\\(?:.|x[\da-fA-F]{2}))*?"/],  // Bytes literal
+		[PR['PR_STRING'], /^"(?:[^\\]|\\(?:.|x[\da-fA-F]{2}|u\{\[\da-fA-F]{1,6}\}))*?"/],  // String literal
+		[PR['PR_STRING'], /^b?r(#*)\"[\s\S]*?\"\1/],  // Raw string/bytes literal
+		[PR['PR_STRING'], /^b'([^\\]|\\(.|x[\da-fA-F]{2}))'/],  // Byte literal
+		[PR['PR_STRING'], /^'([^\\]|\\(.|x[\da-fA-F]{2}|u\{[\da-fA-F]{1,6}\}))'/],  // Character literal
+
+		// Lifetime
+		[PR['PR_TAG'], /^'\w+?\b/],
+
+		// Keywords, reserved keywords and primitive types
+		[PR['PR_KEYWORD'], /^(?:match|if|else|as|break|box|continue|extern|fn|for|in|if|impl|let|loop|pub|return|super|unsafe|where|while|use|mod|trait|struct|enum|type|move|mut|ref|static|const|crate)\b/],
+		[PR['PR_KEYWORD'], /^(?:alignof|become|do|offsetof|priv|pure|sizeof|typeof|unsized|yield|abstract|virtual|final|override|macro)\b/],
+		[PR['PR_TYPE'], /^(?:[iu](8|16|32|64|128|size)|char|bool|f32|f64|str|Self)\b/],
+
+		// Rust 1.0 prelude items
+		[PR['PR_TYPE'], /^(?:Copy|Send|Sized|Sync|Drop|Fn|FnMut|FnOnce|Box|ToOwned|Clone|PartialEq|PartialOrd|Eq|Ord|AsRef|AsMut|Into|From|Default|Iterator|Extend|IntoIterator|DoubleEndedIterator|ExactSizeIterator|Option|Some|None|Result|Ok|Err|SliceConcatExt|String|ToString|Vec)\b/],
+
+		// Literals:
+		[PR['PR_LITERAL'], /^(self|true|false|null)\b/],
+		// A number is a hex integer literal, a decimal real literal, or in
+		// scientific notation.
+		// Integer literals: decimal, hexadecimal, octal, binary.
+		[PR['PR_LITERAL'], /^\d[0-9_]*(?:[iu](?:size|8|16|32|64|128))?/],
+		[PR['PR_LITERAL'], /^0x[a-fA-F0-9_]+(?:[iu](?:size|8|16|32|64|128))?/],
+		[PR['PR_LITERAL'], /^0o[0-7_]+(?:[iu](?:size|8|16|32|64|128))?/],
+		[PR['PR_LITERAL'], /^0b[01_]+(?:[iu](?:size|8|16|32|64|128))?/],
+		// Float literals
+		[PR['PR_LITERAL'], /^\d[0-9_]*\.(?![^\s\d.])/],
+		[PR['PR_LITERAL'], /^\d[0-9_]*(?:\.\d[0-9_]*)(?:[eE][+-]?[0-9_]+)?(?:f32|f64)?/],
+		[PR['PR_LITERAL'], /^\d[0-9_]*(?:\.\d[0-9_]*)?(?:[eE][+-]?[0-9_]+)(?:f32|f64)?/],
+		[PR['PR_LITERAL'], /^\d[0-9_]*(?:\.\d[0-9_]*)?(?:[eE][+-]?[0-9_]+)?(?:f32|f64)/],
+
+		// Macro invocations (an identifier plus a !)
+		[PR['PR_ATTRIB_NAME'], /^[a-z_]\w*!/i],
+		// An identifier (sorry, this should be unicode)
+		[PR['PR_PLAIN'], /^[a-z_]\w*/i],
+		// Attributes
+		[PR['PR_ATTRIB_VALUE'], /^#!?\[[\s\S]*?\]/],
+		// All the punctuation
+		[PR['PR_PUNCTUATION'], /^[+\-/*=^&|!<>%[\](){}?:.,;]/],
+		// Anything else (which is probably illegal, as all the legal stuff should have been covered) can be plain
+		[PR['PR_PLAIN'], /./]
+		]),
+    ['rust']);
diff --git a/static/bower_components/google-prettify/src/lang-scala.js b/static/bower_components/google-prettify/src/lang-scala.js
new file mode 100644
index 00000000..01b54aca
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-scala.js
@@ -0,0 +1,56 @@
+/**
+ * @license
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Scala.
+ *
+ * Derived from http://lampsvn.epfl.ch/svn-repos/scala/scala-documentation/trunk/src/reference/SyntaxSummary.tex
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double or single quoted string 
+          // or a triple double-quoted multi-line string.
+         [PR['PR_STRING'],
+          /^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,
+          null, '"'],
+         [PR['PR_LITERAL'],     /^`(?:[^\r\n\\`]|\\.)*`?/, null, '`'],
+         [PR['PR_PUNCTUATION'], /^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/, null,
+          '!#%&()*+,-:;<=>?@[\\]^{|}~']
+        ],
+        [
+         // A symbol literal is a single quote followed by an identifier with no
+         // single quote following
+         // A character literal has single quotes on either side
+         [PR['PR_STRING'],      /^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],
+         [PR['PR_LITERAL'],     /^'[a-zA-Z_$][\w$]*(?!['$\w])/],
+         [PR['PR_KEYWORD'],     /^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
+         [PR['PR_LITERAL'],     /^(?:true|false|null|this)\b/],
+         [PR['PR_LITERAL'],     /^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],
+         // Treat upper camel case identifiers as types.
+         [PR['PR_TYPE'],        /^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],
+         [PR['PR_PLAIN'],       /^[$a-zA-Z_][\w$]*/],
+         [PR['PR_COMMENT'],     /^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],
+         [PR['PR_PUNCTUATION'], /^(?:\.+|\/)/]
+        ]),
+    ['scala']);
diff --git a/static/bower_components/google-prettify/src/lang-sql.js b/static/bower_components/google-prettify/src/lang-sql.js
new file mode 100644
index 00000000..3f0d7671
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-sql.js
@@ -0,0 +1,59 @@
+/**
+ * @license
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for SQL.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-sql">(my SQL code)</pre>
+ *
+ *
+ * http://savage.net.au/SQL/sql-99.bnf.html is the basis for the grammar, and
+ * http://msdn.microsoft.com/en-us/library/aa238507(SQL.80).aspx and
+ * http://meta.stackoverflow.com/q/92352/137403 as the bases for the keyword
+ * list.
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double or single quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/, null,
+          '"\'']
+        ],
+        [
+         // A comment is either a line comment that starts with two dashes, or
+         // two dashes preceding a long bracketed block.
+         [PR['PR_COMMENT'], /^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],
+         [PR['PR_KEYWORD'], /^(?:ADD|ALL|ALTER|AND|ANY|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONNECT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOLLOWING|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|MATCH|MATCHED|MERGE|NATURAL|NATIONAL|NOCHECK|NONCLUSTERED|NOCYCLE|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PARTITION|PERCENT|PIVOT|PLAN|PRECEDING|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|ROWS?|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|START|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNBOUNDED|UNION|UNIQUE|UNPIVOT|UPDATE|UPDATETEXT|USE|USER|USING|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WITHIN|WRITETEXT|XML)(?=[^\w-]|$)/i, null],
+         // A number is a hex integer literal, a decimal real literal, or in
+         // scientific notation.
+         [PR['PR_LITERAL'],
+          /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
+         // An identifier
+         [PR['PR_PLAIN'], /^[a-z_][\w-]*/i],
+         // A run of punctuation
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]
+        ]),
+    ['sql']);
diff --git a/static/bower_components/google-prettify/src/lang-swift.js b/static/bower_components/google-prettify/src/lang-swift.js
new file mode 100644
index 00000000..cd1538fc
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-swift.js
@@ -0,0 +1,60 @@
+/**
+ * @license
+ * Copyright (C) 2015 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Swift
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-swift">(my swift code)</pre>
+ * This file supports the following language extensions:
+ *     lang-swift - Swift
+ *
+ * I used https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AboutTheLanguageReference.html
+ * as the source of truth for this. The revision from 2015-10-21 (Swift 2.1) was used in most recent update.
+ *
+ * @author cerech@google.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+          //whitespace
+          [PR['PR_PLAIN'],                /^[ \n\r\t\v\f\0]+/, null, ' \n\r\t\v\f\0'],
+          //string literals
+          [PR['PR_STRING'],               /^"(?:[^"\\]|(?:\\.)|(?:\\\((?:[^"\\)]|\\.)*\)))*"/, null, '"']
+        ],
+        [
+          //floating point literals
+          [PR['PR_LITERAL'],              /^(?:(?:0x[\da-fA-F][\da-fA-F_]*\.[\da-fA-F][\da-fA-F_]*[pP]?)|(?:\d[\d_]*\.\d[\d_]*[eE]?))[+-]?\d[\d_]*/, null],
+          //integer literals
+          [PR['PR_LITERAL'],              /^-?(?:(?:0(?:(?:b[01][01_]*)|(?:o[0-7][0-7_]*)|(?:x[\da-fA-F][\da-fA-F_]*)))|(?:\d[\d_]*))/, null],
+          //some other literals
+          [PR['PR_LITERAL'],              /^(?:_|Any|true|false|nil)\b/, null],
+          //keywords
+          [PR['PR_KEYWORD'],              /^\b(?:__COLUMN__|__FILE__|__FUNCTION__|__LINE__|#available|#colorLiteral|#column|#else|#elseif|#endif|#file|#fileLiteral|#function|#if|#imageLiteral|#line|#selector|#sourceLocation|arch|arm|arm64|associatedtype|associativity|as|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|dynamicType|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|import|indirect|infix|init|inout|internal|i386|if|in|iOS|iOSApplicationExtension|is|lazy|left|let|mutating|none|nonmutating|open|operator|optional|OSX|OSXApplicationExtension|override|postfix|precedence|prefix|private|protocol|Protocol|public|repeat|required|rethrows|return|right|safe|Self|self|set|static|struct|subscript|super|switch|throw|throws|try|Type|typealias|unowned|unsafe|var|weak|watchOS|where|while|willSet|x86_64)\b/, null],
+          //double slash comments
+          [PR['PR_COMMENT'],              /^\/\/.*?[\n\r]/, null],
+          //slash star comments
+          [PR['PR_COMMENT'],              /^\/\*[\s\S]*?(?:\*\/|$)/, null],
+          //punctuation
+          [PR['PR_PUNCTUATION'],          /^<<=|<=|<<|>>=|>=|>>|===|==|\.\.\.|&&=|\.\.<|!==|!=|&=|~=|~|\(|\)|\[|\]|{|}|@|#|;|\.|,|:|\|\|=|\?\?|\|\||&&|&\*|&\+|&-|&=|\+=|-=|\/=|\*=|\^=|%=|\|=|->|`|==|\+\+|--|\/|\+|!|\*|%|<|>|&|\||\^|\?|=|-|_/, null],
+          [PR['PR_TYPE'],                 /^\b(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null]   //borrowing the type regex given by the main program for C-family languages
+        ]),
+    ['swift']); 
diff --git a/static/bower_components/google-prettify/src/lang-tcl.js b/static/bower_components/google-prettify/src/lang-tcl.js
new file mode 100644
index 00000000..d2f284f3
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-tcl.js
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright (C) 2012 Pyrios
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for TCL
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-tcl">proc foo {} {puts bar}</pre>
+ *
+ * I copy-pasted lang-lisp.js, so this is probably not 100% accurate.
+ * I used http://wiki.tcl.tk/1019 for the keywords, but tried to only
+ * include as keywords that had more impact on the program flow
+ * rather than providing convenience. For example, I included 'if'
+ * since that provides branching, but left off 'open' since that is more
+ * like a proc. Add more if it makes sense.
+ *
+ * @author pyrios@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         ['opn',             /^\{+/, null, '{'],
+         ['clo',             /^\}+/, null, '}'],
+         // A line comment that starts with ;
+         [PR['PR_COMMENT'],     /^#[^\r\n]*/, null, '#'],
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // A double quoted, possibly multi-line, string.
+         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
+        ],
+        [
+         [PR['PR_KEYWORD'],     /^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/, null],
+         [PR['PR_LITERAL'],
+          /^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],
+         // A single quote possibly followed by a word that optionally ends with
+         // = ! or ?.
+         [PR['PR_LITERAL'],
+          /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
+         // A word that optionally ends with = ! or ?.
+         [PR['PR_PLAIN'],
+          /^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
+         // A printable non-space non-special character
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
+        ]),
+    ['tcl']);
diff --git a/static/bower_components/google-prettify/src/lang-tex.js b/static/bower_components/google-prettify/src/lang-tex.js
new file mode 100644
index 00000000..7ff7068c
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-tex.js
@@ -0,0 +1,49 @@
+/**
+ * @license
+ * Copyright (C) 2011 Martin S.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Support for tex highlighting as discussed on
+ * <a href="http://meta.tex.stackexchange.com/questions/872/text-immediate-following-double-backslashes-is-highlighted-as-macro-inside-a-code/876#876">meta.tex.stackexchange.com</a>.
+ *
+ * @author Martin S.
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // whitespace
+         [PR['PR_PLAIN'],   /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+         // all comments begin with '%'
+         [PR['PR_COMMENT'], /^%[^\r\n]*/, null, '%']
+        ],
+        [
+         //[PR['PR_DECLARATION'], /^\\([egx]?def|(new|renew|provide)(command|environment))\b/],
+         // any command starting with a \ and contains
+         // either only letters (a-z,A-Z), '@' (internal macros)
+         [PR['PR_KEYWORD'], /^\\[a-zA-Z@]+/],
+         // or contains only one character
+         [PR['PR_KEYWORD'], /^\\./],
+         // Highlight dollar for math mode and ampersam for tabular
+         [PR['PR_TYPE'],    /^[$&]/],
+         // numeric measurement values with attached units
+         [PR['PR_LITERAL'],
+          /[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],
+         // punctuation usually occurring within commands
+         [PR['PR_PUNCTUATION'], /^[{}()\[\]=]+/]
+        ]),
+    ['latex', 'tex']);
diff --git a/static/bower_components/google-prettify/src/lang-vb.js b/static/bower_components/google-prettify/src/lang-vb.js
new file mode 100644
index 00000000..2159415c
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-vb.js
@@ -0,0 +1,67 @@
+/**
+ * @license
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for various flavors of basic.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-vb"></pre>
+ *
+ *
+ * http://msdn.microsoft.com/en-us/library/aa711638(VS.71).aspx defines the
+ * visual basic grammar lexical grammar.
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t\n\r \xA0\u2028\u2029]+/, null, '\t\n\r \xA0\u2028\u2029'],
+         // A double quoted string with quotes escaped by doubling them.
+         // A single character can be suffixed with C.
+         [PR['PR_STRING'],      /^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i, null,
+          '"\u201C\u201D'],
+         // A comment starts with a single quote and runs until the end of the
+         // line.
+         // VB6 apparently allows _ as an escape sequence for newlines though
+         // this is not a documented feature of VB.net.
+         // http://meta.stackoverflow.com/q/121497/137403
+         [PR['PR_COMMENT'],     /^[\'\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\r\n_\u2028\u2029])*/, null, '\'\u2018\u2019']
+        ],
+        [
+         [PR['PR_KEYWORD'], /^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i, null],
+         // A second comment form
+         [PR['PR_COMMENT'], /^REM\b[^\r\n\u2028\u2029]*/i],
+         // A boolean, numeric, or date literal.
+         [PR['PR_LITERAL'],
+          /^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],
+         // An identifier.  Keywords can be turned into identifers
+         // with square brackets, and there may be optional type
+         // characters after a normal identifier in square brackets.
+         [PR['PR_PLAIN'], /^(?:(?:[a-z]|_\w)\w*(?:\[[%&@!#]+\])?|\[(?:[a-z]|_\w)\w*\])/i],
+         // A run of punctuation
+         [PR['PR_PUNCTUATION'],
+          /^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],
+         // Square brackets
+         [PR['PR_PUNCTUATION'], /^(?:\[|\])/]
+        ]),
+    ['vb', 'vbs']);
diff --git a/static/bower_components/google-prettify/src/lang-vhdl.js b/static/bower_components/google-prettify/src/lang-vhdl.js
new file mode 100644
index 00000000..59c94a4f
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-vhdl.js
@@ -0,0 +1,51 @@
+/**
+ * @license
+ * Copyright (C) 2010 benoit@ryder.fr
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for VHDL '93.
+ *
+ * Based on the lexical grammar and keywords at
+ * http://www.iis.ee.ethz.ch/~zimmi/download/vhdl93_syntax.html
+ *
+ * @author benoit@ryder.fr
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0']
+        ],
+        [
+         // String, character or bit string
+         [PR['PR_STRING'], /^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],
+         // Comment, from two dashes until end of line.
+         [PR['PR_COMMENT'], /^--[^\r\n]*/],
+         [PR['PR_KEYWORD'], /^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, null],
+         // Type, predefined or standard
+         [PR['PR_TYPE'], /^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i, null],
+         // Predefined attributes
+         [PR['PR_TYPE'], /^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i, null],
+         // Number, decimal or based literal
+         [PR['PR_LITERAL'], /^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i],
+         // Identifier, basic or extended
+         [PR['PR_PLAIN'], /^(?:[a-z]\w*|\\[^\\]*\\)/i],
+         // Punctuation
+         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]
+        ]),
+    ['vhdl', 'vhd']);
diff --git a/static/bower_components/google-prettify/src/lang-wiki.js b/static/bower_components/google-prettify/src/lang-wiki.js
new file mode 100644
index 00000000..0a97258c
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-wiki.js
@@ -0,0 +1,55 @@
+/**
+ * @license
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * Registers a language handler for Wiki pages.
+ *
+ * Based on WikiSyntax at http://code.google.com/p/support/wiki/WikiSyntax
+ *
+ * @author mikesamuel@gmail.com
+ */
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Whitespace
+         [PR['PR_PLAIN'],       /^[\t \xA0a-gi-z0-9]+/, null,
+          '\t \xA0abcdefgijklmnopqrstuvwxyz0123456789'],
+         // Wiki formatting
+         [PR['PR_PUNCTUATION'], /^[=*~\^\[\]]+/, null, '=*~^[]']
+        ],
+        [
+         // Meta-info like #summary, #labels, etc.
+         ['lang-wiki.meta',  /(?:^^|\r\n?|\n)(#[a-z]+)\b/],
+         // A WikiWord
+         [PR['PR_LITERAL'],     /^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\b/
+          ],
+         // A preformatted block in an unknown language
+         ['lang-',           /^\{\{\{([\s\S]+?)\}\}\}/],
+         // A block of source code in an unknown language
+         ['lang-',           /^`([^\r\n`]+)`/],
+         // An inline URL.
+         [PR['PR_STRING'],
+          /^https?:\/\/[^\/?#\s]*(?:\/[^?#\s]*)?(?:\?[^#\s]*)?(?:#\S*)?/i],
+         [PR['PR_PLAIN'],       /^(?:\r\n|[\s\S])[^#=*~^A-Zh\{`\[\r\n]*/]
+        ]),
+    ['wiki']);
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer']([[PR['PR_KEYWORD'], /^#[a-z]+/i, null, '#']], []),
+    ['wiki.meta']);
diff --git a/static/bower_components/google-prettify/src/lang-xq.js b/static/bower_components/google-prettify/src/lang-xq.js
new file mode 100644
index 00000000..ce3cb644
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-xq.js
@@ -0,0 +1,71 @@
+/**
+ * @license
+ * Copyright (C) 2011 Patrick Wied
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/**
+ * @fileoverview
+ * Registers a language handler for XQuery.
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-xq"></pre>
+ *
+ *
+ * @author Patrick Wied ( patpa7p@live.de )
+ * @version 2010-09-28
+ */
+
+(function () {
+// Falls back to plain for stylesheets that don't style fun.
+var PR_FUNCTION = 'fun pln';
+// Falls back to plaiin for stylesheets that don't style var.
+var PR_VARIABLE = 'var pln';
+
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+         // Matching $var-ia_bles
+         [PR_VARIABLE, /^\$[A-Za-z0-9_\-]+/, null, "$"]
+        ],
+        [
+         // Matching lt and gt operators
+         // Not the best matching solution but you have to differentiate between the gt operator and the tag closing char
+         [PR['PR_PLAIN'], /^[\s=][<>][\s=]/],
+         // Matching @Attributes
+         [PR['PR_LITERAL'], /^\@[\w-]+/],
+         // Matching xml tags
+         [PR['PR_TAG'], /^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
+         // Matching single or multiline xquery comments -> (: <text> :)
+         [PR['PR_COMMENT'], /^\(:[\s\S]*?:\)/],
+         // Tokenizing /{}:=;*,[]() as plain
+         [PR['PR_PLAIN'], /^[\/\{\};,\[\]\(\)]$/],
+         // Matching a double or single quoted, possibly multi-line, string.
+         // with the special condition that a { in a string changes to xquery context 
+         [PR['PR_STRING'], /^(?:\"(?:[^\"\\\{]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\\{]|\\[\s\S])*(?:\'|$))/, null, '"\''],
+         // Matching standard xquery keywords
+         [PR['PR_KEYWORD'], /^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\b/],
+         // Matching standard xquery types
+         [PR['PR_TYPE'], /^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\b/, null],
+         // Matching standard xquery functions
+         [PR_FUNCTION, /^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\b/],
+         // Matching normal words if none of the previous regular expressions matched
+         [PR['PR_PLAIN'], /^[A-Za-z0-9_\-\:]+/],
+         // Matching whitespaces
+         [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/]
+         ]),
+    ['xq', 'xquery']);
+})();
diff --git a/static/bower_components/google-prettify/src/lang-yaml.js b/static/bower_components/google-prettify/src/lang-yaml.js
new file mode 100644
index 00000000..5a7db409
--- /dev/null
+++ b/static/bower_components/google-prettify/src/lang-yaml.js
@@ -0,0 +1,45 @@
+/**
+ * @license
+ * Copyright (C) 2015 ribrdb @ code.google.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// Contributed by ribrdb @ code.google.com
+
+/**
+ * @fileoverview
+ * Registers a language handler for YAML.
+ *
+ * @author ribrdb
+ */
+
+PR['registerLangHandler'](
+  PR['createSimpleLexer'](
+    [
+      [PR['PR_PUNCTUATION'], /^[:|>?]+/, null, ':|>?'],
+      [PR['PR_DECLARATION'],  /^%(?:YAML|TAG)[^#\r\n]+/, null, '%'],
+      [PR['PR_TYPE'], /^[&]\S+/, null, '&'],
+      [PR['PR_TYPE'], /^!\S*/, null, '!'],
+      [PR['PR_STRING'], /^"(?:[^\\"]|\\.)*(?:"|$)/, null, '"'],
+      [PR['PR_STRING'], /^'(?:[^']|'')*(?:'|$)/, null, "'"],
+      [PR['PR_COMMENT'], /^#[^\r\n]*/, null, '#'],
+      [PR['PR_PLAIN'], /^\s+/, null, ' \t\r\n']
+    ],
+    [
+      [PR['PR_DECLARATION'], /^(?:---|\.\.\.)(?:[\r\n]|$)/],
+      [PR['PR_PUNCTUATION'], /^-/],
+      [PR['PR_KEYWORD'], /^[\w-]+:[ \r\n]/],
+      [PR['PR_PLAIN'], /^\w+/]
+    ]), ['yaml', 'yml']);
diff --git a/static/bower_components/google-prettify/src/node_prettify.js b/static/bower_components/google-prettify/src/node_prettify.js
new file mode 100644
index 00000000..df8d0266
--- /dev/null
+++ b/static/bower_components/google-prettify/src/node_prettify.js
@@ -0,0 +1,1715 @@
+
+var IN_GLOBAL_SCOPE = false;
+
+/**
+ * @license
+ * Copyright (C) 2006 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * some functions for browser-side pretty printing of code contained in html.
+ *
+ * <p>
+ * For a fairly comprehensive set of languages see the
+ * <a href="https://github.com/google/code-prettify#for-which-languages-does-it-work">README</a>
+ * file that came with this source.  At a minimum, the lexer should work on a
+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+ * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+ * <p>
+ * Usage: <ol>
+ * <li> include this source file in an html page via
+ *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
+ * <li> define style rules.  See the example page for examples.
+ * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
+ *    {@code class=prettyprint.}
+ *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
+ *    printer needs to do more substantial DOM manipulations to support that, so
+ *    some css styles may not be preserved.
+ * </ol>
+ * That's it.  I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in, but if you wish, you can add
+ * another class to the {@code <pre>} or {@code <code>} element to specify the
+ * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
+ * starts with "lang-" followed by a file extension, specifies the file type.
+ * See the "lang-*.js" files in this directory for code that implements
+ * per-language file handlers.
+ * <p>
+ * Change log:<br>
+ * cbeust, 2006/08/22
+ * <blockquote>
+ *   Java annotations (start with "@") are now captured as literals ("lit")
+ * </blockquote>
+ * @requires console
+ */
+
+// JSLint declarations
+/*global console, document, navigator, setTimeout, window, define */
+
+
+/**
+ * {@type !{
+ *   'createSimpleLexer': function (Array, Array): (function (JobT)),
+ *   'registerLangHandler': function (function (JobT), Array.<string>),
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_VALUE': string,
+ *   'PR_COMMENT': string,
+ *   'PR_DECLARATION': string,
+ *   'PR_KEYWORD': string,
+ *   'PR_LITERAL': string,
+ *   'PR_NOCODE': string,
+ *   'PR_PLAIN': string,
+ *   'PR_PUNCTUATION': string,
+ *   'PR_SOURCE': string,
+ *   'PR_STRING': string,
+ *   'PR_TAG': string,
+ *   'PR_TYPE': string,
+ *   'prettyPrintOne': function (string, string, number|boolean),
+ *   'prettyPrint': function (?function, ?(HTMLElement|HTMLDocument))
+ * }}
+ * @const
+ */
+var PR;
+
+/**
+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+ * UI events.
+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
+ */
+var PR_SHOULD_USE_CONTINUATION = true
+if (typeof window !== 'undefined') {
+  window['PR_SHOULD_USE_CONTINUATION'] = PR_SHOULD_USE_CONTINUATION;
+}
+
+/**
+ * Pretty print a chunk of code.
+ * @param {string} sourceCodeHtml The HTML to pretty print.
+ * @param {string} opt_langExtension The language name to use.
+ *     Typically, a filename extension like 'cpp' or 'java'.
+ * @param {number|boolean} opt_numberLines True to number lines,
+ *     or the 1-indexed number of the first line in sourceCodeHtml.
+ * @return {string} code as html, but prettier
+ */
+var prettyPrintOne;
+/**
+ * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+ * {@code class=prettyprint} and prettify them.
+ *
+ * @param {Function} opt_whenDone called when prettifying is done.
+ * @param {HTMLElement|HTMLDocument} opt_root an element or document
+ *   containing all the elements to pretty print.
+ *   Defaults to {@code document.body}.
+ */
+var prettyPrint;
+
+
+(function () {
+  var win = (typeof window !== 'undefined') ? window : {};
+  // Keyword lists for various languages.
+  // We use things that coerce to strings to make them compact when minified
+  // and to defeat aggressive optimizers that fold large string constants.
+  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
+  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
+      "double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed," +
+      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
+  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
+      "new,operator,private,protected,public,this,throw,true,try,typeof"];
+  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignas,alignof,align_union,asm,axiom,bool," +
+      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
+      "dynamic_cast,explicit,export,friend,generic,late_check," +
+      "mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert," +
+      "static_cast,template,typeid,typename,using,virtual,where"];
+  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,assert,boolean,byte,extends,finally,final,implements,import," +
+      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
+      "throws,transient"];
+  var CSHARP_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending," +
+      "dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface," +
+      "internal,into,is,join,let,lock,null,object,out,override,orderby,params," +
+      "partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong," +
+      "unchecked,unsafe,ushort,value,var,virtual,where,yield"];
+  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
+      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
+      "throw,true,try,unless,until,when,while,yes";
+  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,async,await,constructor,debugger,enum,eval,export,from,function," +
+      "get,import,implements,instanceof,interface,let,null,of,set,undefined," +
+      "var,with,yield,Infinity,NaN"];
+  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
+      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
+      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
+  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
+      "elif,except,exec,finally,from,global,import,in,is,lambda," +
+      "nonlocal,not,or,pass,print,raise,try,with,yield," +
+      "False,True,None"];
+  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
+      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
+      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
+      "BEGIN,END"];
+  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
+      "function,in,local,set,then,until"];
+  var ALL_KEYWORDS = [
+      CPP_KEYWORDS, CSHARP_KEYWORDS, JAVA_KEYWORDS, JSCRIPT_KEYWORDS,
+      PERL_KEYWORDS, PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
+  var C_TYPES = /^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
+
+  // token style names.  correspond to css classes
+  /**
+   * token style for a string literal
+   * @const
+   */
+  var PR_STRING = 'str';
+  /**
+   * token style for a keyword
+   * @const
+   */
+  var PR_KEYWORD = 'kwd';
+  /**
+   * token style for a comment
+   * @const
+   */
+  var PR_COMMENT = 'com';
+  /**
+   * token style for a type
+   * @const
+   */
+  var PR_TYPE = 'typ';
+  /**
+   * token style for a literal value.  e.g. 1, null, true.
+   * @const
+   */
+  var PR_LITERAL = 'lit';
+  /**
+   * token style for a punctuation string.
+   * @const
+   */
+  var PR_PUNCTUATION = 'pun';
+  /**
+   * token style for plain text.
+   * @const
+   */
+  var PR_PLAIN = 'pln';
+
+  /**
+   * token style for an sgml tag.
+   * @const
+   */
+  var PR_TAG = 'tag';
+  /**
+   * token style for a markup declaration such as a DOCTYPE.
+   * @const
+   */
+  var PR_DECLARATION = 'dec';
+  /**
+   * token style for embedded source.
+   * @const
+   */
+  var PR_SOURCE = 'src';
+  /**
+   * token style for an sgml attribute name.
+   * @const
+   */
+  var PR_ATTRIB_NAME = 'atn';
+  /**
+   * token style for an sgml attribute value.
+   * @const
+   */
+  var PR_ATTRIB_VALUE = 'atv';
+
+  /**
+   * A class that indicates a section of markup that is not code, e.g. to allow
+   * embedding of line numbers within code listings.
+   * @const
+   */
+  var PR_NOCODE = 'nocode';
+
+
+  // Regex pattern below is automatically generated by regexpPrecederPatterns.pl
+  // Do not modify, your changes will be erased.
+
+  // CAVEAT: this does not properly handle the case where a regular
+  // expression immediately follows another since a regular expression may
+  // have flags for case-sensitivity and the like.  Having regexp tokens
+  // adjacent is not valid in any language I'm aware of, so I'm punting.
+  // TODO: maybe style special characters inside a regexp as punctuation.
+
+  /**
+   * A set of tokens that can precede a regular expression literal in
+   * javascript
+   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+   * has the full list, but I've removed ones that might be problematic when
+   * seen in languages that don't support regular expression literals.
+   *
+   * Specifically, I've removed any keywords that can't precede a regexp
+   * literal in a syntactically legal javascript program, and I've removed the
+   * "in" keyword since it's not a keyword in many languages, and might be used
+   * as a count of inches.
+   *
+   * The link above does not accurately describe EcmaScript rules since
+   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+   * very well in practice.
+   *
+   * @private
+   * @const
+   */
+  var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
+
+
+  /**
+   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+   * matches the union of the sets of strings matched by the input RegExp.
+   * Since it matches globally, if the input strings have a start-of-input
+   * anchor (/^.../), it is ignored for the purposes of unioning.
+   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
+   * @return {RegExp} a global regex.
+   */
+  function combinePrefixPatterns(regexs) {
+    var capturedGroupIndex = 0;
+
+    var needToFoldCase = false;
+    var ignoreCase = false;
+    for (var i = 0, n = regexs.length; i < n; ++i) {
+      var regex = regexs[i];
+      if (regex.ignoreCase) {
+        ignoreCase = true;
+      } else if (/[a-z]/i.test(regex.source.replace(
+                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+        needToFoldCase = true;
+        ignoreCase = false;
+        break;
+      }
+    }
+
+    var escapeCharToCodeUnit = {
+      'b': 8,
+      't': 9,
+      'n': 0xa,
+      'v': 0xb,
+      'f': 0xc,
+      'r': 0xd
+    };
+
+    function decodeEscape(charsetPart) {
+      var cc0 = charsetPart.charCodeAt(0);
+      if (cc0 !== 92 /* \\ */) {
+        return cc0;
+      }
+      var c1 = charsetPart.charAt(1);
+      cc0 = escapeCharToCodeUnit[c1];
+      if (cc0) {
+        return cc0;
+      } else if ('0' <= c1 && c1 <= '7') {
+        return parseInt(charsetPart.substring(1), 8);
+      } else if (c1 === 'u' || c1 === 'x') {
+        return parseInt(charsetPart.substring(2), 16);
+      } else {
+        return charsetPart.charCodeAt(1);
+      }
+    }
+
+    function encodeEscape(charCode) {
+      if (charCode < 0x20) {
+        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+      }
+      var ch = String.fromCharCode(charCode);
+      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
+          ? "\\" + ch : ch;
+    }
+
+    function caseFoldCharset(charSet) {
+      var charsetParts = charSet.substring(1, charSet.length - 1).match(
+          new RegExp(
+              '\\\\u[0-9A-Fa-f]{4}'
+              + '|\\\\x[0-9A-Fa-f]{2}'
+              + '|\\\\[0-3][0-7]{0,2}'
+              + '|\\\\[0-7]{1,2}'
+              + '|\\\\[\\s\\S]'
+              + '|-'
+              + '|[^-\\\\]',
+              'g'));
+      var ranges = [];
+      var inverse = charsetParts[0] === '^';
+
+      var out = ['['];
+      if (inverse) { out.push('^'); }
+
+      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+        var p = charsetParts[i];
+        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
+          out.push(p);
+        } else {
+          var start = decodeEscape(p);
+          var end;
+          if (i + 2 < n && '-' === charsetParts[i + 1]) {
+            end = decodeEscape(charsetParts[i + 2]);
+            i += 2;
+          } else {
+            end = start;
+          }
+          ranges.push([start, end]);
+          // If the range might intersect letters, then expand it.
+          // This case handling is too simplistic.
+          // It does not deal with non-latin case folding.
+          // It works for latin source code identifiers though.
+          if (!(end < 65 || start > 122)) {
+            if (!(end < 65 || start > 90)) {
+              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+            }
+            if (!(end < 97 || start > 122)) {
+              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+            }
+          }
+        }
+      }
+
+      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+      // -> [[1, 12], [14, 14], [16, 17]]
+      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
+      var consolidatedRanges = [];
+      var lastRange = [];
+      for (var i = 0; i < ranges.length; ++i) {
+        var range = ranges[i];
+        if (range[0] <= lastRange[1] + 1) {
+          lastRange[1] = Math.max(lastRange[1], range[1]);
+        } else {
+          consolidatedRanges.push(lastRange = range);
+        }
+      }
+
+      for (var i = 0; i < consolidatedRanges.length; ++i) {
+        var range = consolidatedRanges[i];
+        out.push(encodeEscape(range[0]));
+        if (range[1] > range[0]) {
+          if (range[1] + 1 > range[0]) { out.push('-'); }
+          out.push(encodeEscape(range[1]));
+        }
+      }
+      out.push(']');
+      return out.join('');
+    }
+
+    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+      // Split into character sets, escape sequences, punctuation strings
+      // like ('(', '(?:', ')', '^'), and runs of characters that do not
+      // include any of the above.
+      var parts = regex.source.match(
+          new RegExp(
+              '(?:'
+              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
+              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
+              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
+              + '|\\\\[0-9]+'  // a back-reference or octal escape
+              + '|\\\\[^ux0-9]'  // other escape sequence
+              + '|\\(\\?[:!=]'  // start of a non-capturing group
+              + '|[\\(\\)\\^]'  // start/end of a group, or line start
+              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
+              + ')',
+              'g'));
+      var n = parts.length;
+
+      // Maps captured group numbers to the number they will occupy in
+      // the output or to -1 if that has not been determined, or to
+      // undefined if they need not be capturing in the output.
+      var capturedGroups = [];
+
+      // Walk over and identify back references to build the capturedGroups
+      // mapping.
+      for (var i = 0, groupIndex = 0; i < n; ++i) {
+        var p = parts[i];
+        if (p === '(') {
+          // groups are 1-indexed, so max group index is count of '('
+          ++groupIndex;
+        } else if ('\\' === p.charAt(0)) {
+          var decimalValue = +p.substring(1);
+          if (decimalValue) {
+            if (decimalValue <= groupIndex) {
+              capturedGroups[decimalValue] = -1;
+            } else {
+              // Replace with an unambiguous escape sequence so that
+              // an octal escape sequence does not turn into a backreference
+              // to a capturing group from an earlier regex.
+              parts[i] = encodeEscape(decimalValue);
+            }
+          }
+        }
+      }
+
+      // Renumber groups and reduce capturing groups to non-capturing groups
+      // where possible.
+      for (var i = 1; i < capturedGroups.length; ++i) {
+        if (-1 === capturedGroups[i]) {
+          capturedGroups[i] = ++capturedGroupIndex;
+        }
+      }
+      for (var i = 0, groupIndex = 0; i < n; ++i) {
+        var p = parts[i];
+        if (p === '(') {
+          ++groupIndex;
+          if (!capturedGroups[groupIndex]) {
+            parts[i] = '(?:';
+          }
+        } else if ('\\' === p.charAt(0)) {
+          var decimalValue = +p.substring(1);
+          if (decimalValue && decimalValue <= groupIndex) {
+            parts[i] = '\\' + capturedGroups[decimalValue];
+          }
+        }
+      }
+
+      // Remove any prefix anchors so that the output will match anywhere.
+      // ^^ really does mean an anchored match though.
+      for (var i = 0; i < n; ++i) {
+        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+      }
+
+      // Expand letters to groups to handle mixing of case-sensitive and
+      // case-insensitive patterns if necessary.
+      if (regex.ignoreCase && needToFoldCase) {
+        for (var i = 0; i < n; ++i) {
+          var p = parts[i];
+          var ch0 = p.charAt(0);
+          if (p.length >= 2 && ch0 === '[') {
+            parts[i] = caseFoldCharset(p);
+          } else if (ch0 !== '\\') {
+            // TODO: handle letters in numeric escapes.
+            parts[i] = p.replace(
+                /[a-zA-Z]/g,
+                function (ch) {
+                  var cc = ch.charCodeAt(0);
+                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+                });
+          }
+        }
+      }
+
+      return parts.join('');
+    }
+
+    var rewritten = [];
+    for (var i = 0, n = regexs.length; i < n; ++i) {
+      var regex = regexs[i];
+      if (regex.global || regex.multiline) { throw new Error('' + regex); }
+      rewritten.push(
+          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+    }
+
+    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+  }
+
+
+  /**
+   * Split markup into a string of source code and an array mapping ranges in
+   * that string to the text nodes in which they appear.
+   *
+   * <p>
+   * The HTML DOM structure:</p>
+   * <pre>
+   * (Element   "p"
+   *   (Element "b"
+   *     (Text  "print "))       ; #1
+   *   (Text    "'Hello '")      ; #2
+   *   (Element "br")            ; #3
+   *   (Text    "  + 'World';")) ; #4
+   * </pre>
+   * <p>
+   * corresponds to the HTML
+   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
+   *
+   * <p>
+   * It will produce the output:</p>
+   * <pre>
+   * {
+   *   sourceCode: "print 'Hello '\n  + 'World';",
+   *   //                     1          2
+   *   //           012345678901234 5678901234567
+   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
+   * }
+   * </pre>
+   * <p>
+   * where #1 is a reference to the {@code "print "} text node above, and so
+   * on for the other text nodes.
+   * </p>
+   *
+   * <p>
+   * The {@code} spans array is an array of pairs.  Even elements are the start
+   * indices of substrings, and odd elements are the text nodes (or BR elements)
+   * that contain the text for those substrings.
+   * Substrings continue until the next index or the end of the source.
+   * </p>
+   *
+   * @param {Node} node an HTML DOM subtree containing source-code.
+   * @param {boolean|number} isPreformatted truthy if white-space in
+   *    text nodes should be considered significant.
+   * @return {SourceSpansT} source code and the nodes in which they occur.
+   */
+  function extractSourceSpans(node, isPreformatted) {
+    var nocode = /(?:^|\s)nocode(?:\s|$)/;
+
+    var chunks = [];
+    var length = 0;
+    var spans = [];
+    var k = 0;
+
+    function walk(node) {
+      var type = node.nodeType;
+      if (type == 1) {  // Element
+        if (nocode.test(node.className)) { return; }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          walk(child);
+        }
+        var nodeName = node.nodeName.toLowerCase();
+        if ('br' === nodeName || 'li' === nodeName) {
+          chunks[k] = '\n';
+          spans[k << 1] = length++;
+          spans[(k++ << 1) | 1] = node;
+        }
+      } else if (type == 3 || type == 4) {  // Text
+        var text = node.nodeValue;
+        if (text.length) {
+          if (!isPreformatted) {
+            text = text.replace(/[ \t\r\n]+/g, ' ');
+          } else {
+            text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
+          }
+          // TODO: handle tabs here?
+          chunks[k] = text;
+          spans[k << 1] = length;
+          length += text.length;
+          spans[(k++ << 1) | 1] = node;
+        }
+      }
+    }
+
+    walk(node);
+
+    return {
+      sourceCode: chunks.join('').replace(/\n$/, ''),
+      spans: spans
+    };
+  }
+
+
+  /**
+   * Apply the given language handler to sourceCode and add the resulting
+   * decorations to out.
+   * @param {!Element} sourceNode
+   * @param {number} basePos the index of sourceCode within the chunk of source
+   *    whose decorations are already present on out.
+   * @param {string} sourceCode
+   * @param {function(JobT)} langHandler
+   * @param {DecorationsT} out
+   */
+  function appendDecorations(
+      sourceNode, basePos, sourceCode, langHandler, out) {
+    if (!sourceCode) { return; }
+    /** @type {JobT} */
+    var job = {
+      sourceNode: sourceNode,
+      pre: 1,
+      langExtension: null,
+      numberLines: null,
+      sourceCode: sourceCode,
+      spans: null,
+      basePos: basePos,
+      decorations: null
+    };
+    langHandler(job);
+    out.push.apply(out, job.decorations);
+  }
+
+  var notWs = /\S/;
+
+  /**
+   * Given an element, if it contains only one child element and any text nodes
+   * it contains contain only space characters, return the sole child element.
+   * Otherwise returns undefined.
+   * <p>
+   * This is meant to return the CODE element in {@code <pre><code ...>} when
+   * there is a single child element that contains all the non-space textual
+   * content, but not to return anything where there are multiple child elements
+   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
+   * is textual content.
+   */
+  function childContentWrapper(element) {
+    var wrapper = undefined;
+    for (var c = element.firstChild; c; c = c.nextSibling) {
+      var type = c.nodeType;
+      wrapper = (type === 1)  // Element Node
+          ? (wrapper ? element : c)
+          : (type === 3)  // Text Node
+          ? (notWs.test(c.nodeValue) ? element : wrapper)
+          : wrapper;
+    }
+    return wrapper === element ? undefined : wrapper;
+  }
+
+  /** Given triples of [style, pattern, context] returns a lexing function,
+    * The lexing function interprets the patterns to find token boundaries and
+    * returns a decoration list of the form
+    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+    * where index_n is an index into the sourceCode, and style_n is a style
+    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
+    * all characters in sourceCode[index_n-1:index_n].
+    *
+    * The stylePatterns is a list whose elements have the form
+    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+    *
+    * Style is a style constant like PR_PLAIN, or can be a string of the
+    * form 'lang-FOO', where FOO is a language extension describing the
+    * language of the portion of the token in $1 after pattern executes.
+    * E.g., if style is 'lang-lisp', and group 1 contains the text
+    * '(hello (world))', then that portion of the token will be passed to the
+    * registered lisp handler for formatting.
+    * The text before and after group 1 will be restyled using this decorator
+    * so decorators should take care that this doesn't result in infinite
+    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
+    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
+    * '<script>foo()<\/script>', which would cause the current decorator to
+    * be called with '<script>' which would not match the same rule since
+    * group 1 must not be empty, so it would be instead styled as PR_TAG by
+    * the generic tag rule.  The handler registered for the 'js' extension would
+    * then be called with 'foo()', and finally, the current decorator would
+    * be called with '<\/script>' which would not match the original rule and
+    * so the generic tag rule would identify it as a tag.
+    *
+    * Pattern must only match prefixes, and if it matches a prefix, then that
+    * match is considered a token with the same style.
+    *
+    * Context is applied to the last non-whitespace, non-comment token
+    * recognized.
+    *
+    * Shortcut is an optional string of characters, any of which, if the first
+    * character, gurantee that this pattern and only this pattern matches.
+    *
+    * @param {Array} shortcutStylePatterns patterns that always start with
+    *   a known character.  Must have a shortcut string.
+    * @param {Array} fallthroughStylePatterns patterns that will be tried in
+    *   order if the shortcut ones fail.  May have shortcuts.
+    *
+    * @return {function (JobT)} a function that takes an undecorated job and
+    *   attaches a list of decorations.
+    */
+  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
+    var shortcuts = {};
+    var tokenizer;
+    (function () {
+      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
+      var allRegexs = [];
+      var regexKeys = {};
+      for (var i = 0, n = allPatterns.length; i < n; ++i) {
+        var patternParts = allPatterns[i];
+        var shortcutChars = patternParts[3];
+        if (shortcutChars) {
+          for (var c = shortcutChars.length; --c >= 0;) {
+            shortcuts[shortcutChars.charAt(c)] = patternParts;
+          }
+        }
+        var regex = patternParts[1];
+        var k = '' + regex;
+        if (!regexKeys.hasOwnProperty(k)) {
+          allRegexs.push(regex);
+          regexKeys[k] = null;
+        }
+      }
+      allRegexs.push(/[\0-\uffff]/);
+      tokenizer = combinePrefixPatterns(allRegexs);
+    })();
+
+    var nPatterns = fallthroughStylePatterns.length;
+
+    /**
+     * Lexes job.sourceCode and attaches an output array job.decorations of
+     * style classes preceded by the position at which they start in
+     * job.sourceCode in order.
+     *
+     * @type{function (JobT)}
+     */
+    var decorate = function (job) {
+      var sourceCode = job.sourceCode, basePos = job.basePos;
+      var sourceNode = job.sourceNode;
+      /** Even entries are positions in source in ascending order.  Odd enties
+        * are style markers (e.g., PR_COMMENT) that run from that position until
+        * the end.
+        * @type {DecorationsT}
+        */
+      var decorations = [basePos, PR_PLAIN];
+      var pos = 0;  // index into sourceCode
+      var tokens = sourceCode.match(tokenizer) || [];
+      var styleCache = {};
+
+      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
+        var token = tokens[ti];
+        var style = styleCache[token];
+        var match = void 0;
+
+        var isEmbedded;
+        if (typeof style === 'string') {
+          isEmbedded = false;
+        } else {
+          var patternParts = shortcuts[token.charAt(0)];
+          if (patternParts) {
+            match = token.match(patternParts[1]);
+            style = patternParts[0];
+          } else {
+            for (var i = 0; i < nPatterns; ++i) {
+              patternParts = fallthroughStylePatterns[i];
+              match = token.match(patternParts[1]);
+              if (match) {
+                style = patternParts[0];
+                break;
+              }
+            }
+
+            if (!match) {  // make sure that we make progress
+              style = PR_PLAIN;
+            }
+          }
+
+          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
+          if (isEmbedded && !(match && typeof match[1] === 'string')) {
+            isEmbedded = false;
+            style = PR_SOURCE;
+          }
+
+          if (!isEmbedded) { styleCache[token] = style; }
+        }
+
+        var tokenStart = pos;
+        pos += token.length;
+
+        if (!isEmbedded) {
+          decorations.push(basePos + tokenStart, style);
+        } else {  // Treat group 1 as an embedded block of source code.
+          var embeddedSource = match[1];
+          var embeddedSourceStart = token.indexOf(embeddedSource);
+          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
+          if (match[2]) {
+            // If embeddedSource can be blank, then it would match at the
+            // beginning which would cause us to infinitely recurse on the
+            // entire token, so we catch the right context in match[2].
+            embeddedSourceEnd = token.length - match[2].length;
+            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
+          }
+          var lang = style.substring(5);
+          // Decorate the left of the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart,
+              token.substring(0, embeddedSourceStart),
+              decorate, decorations);
+          // Decorate the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceStart,
+              embeddedSource,
+              langHandlerForExtension(lang, embeddedSource),
+              decorations);
+          // Decorate the right of the embedded section
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceEnd,
+              token.substring(embeddedSourceEnd),
+              decorate, decorations);
+        }
+      }
+      job.decorations = decorations;
+    };
+    return decorate;
+  }
+
+  /** returns a function that produces a list of decorations from source text.
+    *
+    * This code treats ", ', and ` as string delimiters, and \ as a string
+    * escape.  It does not recognize perl's qq() style strings.
+    * It has no special handling for double delimiter escapes as in basic, or
+    * the tripled delimiters used in python, but should work on those regardless
+    * although in those cases a single string literal may be broken up into
+    * multiple adjacent string literals.
+    *
+    * It recognizes C, C++, and shell style comments.
+    *
+    * @param {Object} options a set of optional parameters.
+    * @return {function (JobT)} a function that examines the source code
+    *     in the input job and builds a decoration list which it attaches to
+    *     the job.
+    */
+  function sourceDecorator(options) {
+    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
+    if (options['tripleQuotedStrings']) {
+      // '''multi-line-string''', 'single-line-string', and double-quoted
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
+           null, '\'"']);
+    } else if (options['multiLineStrings']) {
+      // 'multi-line-string', "multi-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
+           null, '\'"`']);
+    } else {
+      // 'single-line-string', "single-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,
+           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
+           null, '"\'']);
+    }
+    if (options['verbatimStrings']) {
+      // verbatim-string-literal production from the C# grammar.  See issue 93.
+      fallthroughStylePatterns.push(
+          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
+    }
+    var hc = options['hashComments'];
+    if (hc) {
+      if (options['cStyleComments']) {
+        if (hc > 1) {  // multiline hash comments
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
+        } else {
+          // Stop C preprocessor declarations at an unclosed open comment
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
+               null, '#']);
+        }
+        // #include <stdio.h>
+        fallthroughStylePatterns.push(
+            [PR_STRING,
+             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
+             null]);
+      } else {
+        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
+      }
+    }
+    if (options['cStyleComments']) {
+      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
+      fallthroughStylePatterns.push(
+          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
+    }
+    var regexLiterals = options['regexLiterals'];
+    if (regexLiterals) {
+      /**
+       * @const
+       */
+      var regexExcls = regexLiterals > 1
+        ? ''  // Multiline regex literals
+        : '\n\r';
+      /**
+       * @const
+       */
+      var regexAny = regexExcls ? '.' : '[\\S\\s]';
+      /**
+       * @const
+       */
+      var REGEX_LITERAL = (
+          // A regular expression literal starts with a slash that is
+          // not followed by * or / so that it is not confused with
+          // comments.
+          '/(?=[^/*' + regexExcls + '])'
+          // and then contains any number of raw characters,
+          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
+          // escape sequences (\x5C),
+          +    '|\\x5C' + regexAny
+          // or non-nesting character sets (\x5B\x5D);
+          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
+          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
+          // finally closed by a /.
+          + '/');
+      fallthroughStylePatterns.push(
+          ['lang-regex',
+           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
+           ]);
+    }
+
+    var types = options['types'];
+    if (types) {
+      fallthroughStylePatterns.push([PR_TYPE, types]);
+    }
+
+    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
+    if (keywords.length) {
+      fallthroughStylePatterns.push(
+          [PR_KEYWORD,
+           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
+           null]);
+    }
+
+    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
+
+    var punctuation =
+      // The Bash man page says
+
+      // A word is a sequence of characters considered as a single
+      // unit by GRUB. Words are separated by metacharacters,
+      // which are the following plus space, tab, and newline: { }
+      // | & $ ; < >
+      // ...
+
+      // A word beginning with # causes that word and all remaining
+      // characters on that line to be ignored.
+
+      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
+      // comment but empirically
+      // $ echo {#}
+      // {#}
+      // $ echo \$#
+      // $#
+      // $ echo }#
+      // }#
+
+      // so /(?:^|[|&;<>\s])/ is more appropriate.
+
+      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
+      // suggests that this definition is compatible with a
+      // default mode that tries to use a single token definition
+      // to recognize both bash/python style comments and C
+      // preprocessor directives.
+
+      // This definition of punctuation does not include # in the list of
+      // follow-on exclusions, so # will not be broken before if preceeded
+      // by a punctuation character.  We could try to exclude # after
+      // [|&;<>] but that doesn't seem to cause many major problems.
+      // If that does turn out to be a problem, we should change the below
+      // when hc is truthy to include # in the run of punctuation characters
+      // only when not followint [|&;<>].
+      '^.[^\\s\\w.$@\'"`/\\\\]*';
+    if (options['regexLiterals']) {
+      punctuation += '(?!\s*\/)';
+    }
+
+    fallthroughStylePatterns.push(
+        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
+        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
+        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_LITERAL,
+         new RegExp(
+             '^(?:'
+             // A hex number
+             + '0x[a-f0-9]+'
+             // or an octal or decimal number,
+             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
+             // possibly in scientific notation
+             + '(?:e[+\\-]?\\d+)?'
+             + ')'
+             // with an optional modifier like UL for unsigned long
+             + '[a-z]*', 'i'),
+         null, '0123456789'],
+        // Don't treat escaped quotes in bash as starting strings.
+        // See issue 144.
+        [PR_PLAIN,       /^\\[\s\S]?/, null],
+        [PR_PUNCTUATION, new RegExp(punctuation), null]);
+
+    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
+  }
+
+  var decorateSource = sourceDecorator({
+        'keywords': ALL_KEYWORDS,
+        'hashComments': true,
+        'cStyleComments': true,
+        'multiLineStrings': true,
+        'regexLiterals': true
+      });
+
+  /**
+   * Given a DOM subtree, wraps it in a list, and puts each line into its own
+   * list item.
+   *
+   * @param {Node} node modified in place.  Its content is pulled into an
+   *     HTMLOListElement, and each line is moved into a separate list item.
+   *     This requires cloning elements, so the input might not have unique
+   *     IDs after numbering.
+   * @param {number|null|boolean} startLineNum
+   *     If truthy, coerced to an integer which is the 1-indexed line number
+   *     of the first line of code.  The number of the first line will be
+   *     attached to the list.
+   * @param {boolean} isPreformatted true iff white-space in text nodes should
+   *     be treated as significant.
+   */
+  function numberLines(node, startLineNum, isPreformatted) {
+    var nocode = /(?:^|\s)nocode(?:\s|$)/;
+    var lineBreak = /\r\n?|\n/;
+
+    var document = node.ownerDocument;
+
+    var li = document.createElement('li');
+    while (node.firstChild) {
+      li.appendChild(node.firstChild);
+    }
+    // An array of lines.  We split below, so this is initialized to one
+    // un-split line.
+    var listItems = [li];
+
+    function walk(node) {
+      var type = node.nodeType;
+      if (type == 1 && !nocode.test(node.className)) {  // Element
+        if ('br' === node.nodeName.toLowerCase()) {
+          breakAfter(node);
+          // Discard the <BR> since it is now flush against a </LI>.
+          if (node.parentNode) {
+            node.parentNode.removeChild(node);
+          }
+        } else {
+          for (var child = node.firstChild; child; child = child.nextSibling) {
+            walk(child);
+          }
+        }
+      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
+        var text = node.nodeValue;
+        var match = text.match(lineBreak);
+        if (match) {
+          var firstLine = text.substring(0, match.index);
+          node.nodeValue = firstLine;
+          var tail = text.substring(match.index + match[0].length);
+          if (tail) {
+            var parent = node.parentNode;
+            parent.insertBefore(
+              document.createTextNode(tail), node.nextSibling);
+          }
+          breakAfter(node);
+          if (!firstLine) {
+            // Don't leave blank text nodes in the DOM.
+            node.parentNode.removeChild(node);
+          }
+        }
+      }
+    }
+
+    // Split a line after the given node.
+    function breakAfter(lineEndNode) {
+      // If there's nothing to the right, then we can skip ending the line
+      // here, and move root-wards since splitting just before an end-tag
+      // would require us to create a bunch of empty copies.
+      while (!lineEndNode.nextSibling) {
+        lineEndNode = lineEndNode.parentNode;
+        if (!lineEndNode) { return; }
+      }
+
+      function breakLeftOf(limit, copy) {
+        // Clone shallowly if this node needs to be on both sides of the break.
+        var rightSide = copy ? limit.cloneNode(false) : limit;
+        var parent = limit.parentNode;
+        if (parent) {
+          // We clone the parent chain.
+          // This helps us resurrect important styling elements that cross lines.
+          // E.g. in <i>Foo<br>Bar</i>
+          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
+          var parentClone = breakLeftOf(parent, 1);
+          // Move the clone and everything to the right of the original
+          // onto the cloned parent.
+          var next = limit.nextSibling;
+          parentClone.appendChild(rightSide);
+          for (var sibling = next; sibling; sibling = next) {
+            next = sibling.nextSibling;
+            parentClone.appendChild(sibling);
+          }
+        }
+        return rightSide;
+      }
+
+      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
+
+      // Walk the parent chain until we reach an unattached LI.
+      for (var parent;
+           // Check nodeType since IE invents document fragments.
+           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
+        copiedListItem = parent;
+      }
+      // Put it on the list of lines for later processing.
+      listItems.push(copiedListItem);
+    }
+
+    // Split lines while there are lines left to split.
+    for (var i = 0;  // Number of lines that have been split so far.
+         i < listItems.length;  // length updated by breakAfter calls.
+         ++i) {
+      walk(listItems[i]);
+    }
+
+    // Make sure numeric indices show correctly.
+    if (startLineNum === (startLineNum|0)) {
+      listItems[0].setAttribute('value', startLineNum);
+    }
+
+    var ol = document.createElement('ol');
+    ol.className = 'linenums';
+    var offset = Math.max(0, ((startLineNum - 1 /* zero index */)) | 0) || 0;
+    for (var i = 0, n = listItems.length; i < n; ++i) {
+      li = listItems[i];
+      // Stick a class on the LIs so that stylesheets can
+      // color odd/even rows, or any other row pattern that
+      // is co-prime with 10.
+      li.className = 'L' + ((i + offset) % 10);
+      if (!li.firstChild) {
+        li.appendChild(document.createTextNode('\xA0'));
+      }
+      ol.appendChild(li);
+    }
+
+    node.appendChild(ol);
+  }
+
+
+  /**
+   * Breaks {@code job.sourceCode} around style boundaries in
+   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
+   * @param {JobT} job
+   * @private
+   */
+  function recombineTagsAndDecorations(job) {
+    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
+    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
+    var newlineRe = /\n/g;
+
+    var source = job.sourceCode;
+    var sourceLength = source.length;
+    // Index into source after the last code-unit recombined.
+    var sourceIndex = 0;
+
+    var spans = job.spans;
+    var nSpans = spans.length;
+    // Index into spans after the last span which ends at or before sourceIndex.
+    var spanIndex = 0;
+
+    var decorations = job.decorations;
+    var nDecorations = decorations.length;
+    // Index into decorations after the last decoration which ends at or before
+    // sourceIndex.
+    var decorationIndex = 0;
+
+    // Remove all zero-length decorations.
+    decorations[nDecorations] = sourceLength;
+    var decPos, i;
+    for (i = decPos = 0; i < nDecorations;) {
+      if (decorations[i] !== decorations[i + 2]) {
+        decorations[decPos++] = decorations[i++];
+        decorations[decPos++] = decorations[i++];
+      } else {
+        i += 2;
+      }
+    }
+    nDecorations = decPos;
+
+    // Simplify decorations.
+    for (i = decPos = 0; i < nDecorations;) {
+      var startPos = decorations[i];
+      // Conflate all adjacent decorations that use the same style.
+      var startDec = decorations[i + 1];
+      var end = i + 2;
+      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
+        end += 2;
+      }
+      decorations[decPos++] = startPos;
+      decorations[decPos++] = startDec;
+      i = end;
+    }
+
+    nDecorations = decorations.length = decPos;
+
+    var sourceNode = job.sourceNode;
+    var oldDisplay = "";
+    if (sourceNode) {
+      oldDisplay = sourceNode.style.display;
+      sourceNode.style.display = 'none';
+    }
+    try {
+      var decoration = null;
+      while (spanIndex < nSpans) {
+        var spanStart = spans[spanIndex];
+        var spanEnd = /** @type{number} */ (spans[spanIndex + 2])
+            || sourceLength;
+
+        var decEnd = decorations[decorationIndex + 2] || sourceLength;
+
+        var end = Math.min(spanEnd, decEnd);
+
+        var textNode = /** @type{Node} */ (spans[spanIndex + 1]);
+        var styledText;
+        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
+            // Don't introduce spans around empty text nodes.
+            && (styledText = source.substring(sourceIndex, end))) {
+          // This may seem bizarre, and it is.  Emitting LF on IE causes the
+          // code to display with spaces instead of line breaks.
+          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
+          // space to appear at the beginning of every line but the first.
+          // Emitting an old Mac OS 9 line separator makes everything spiffy.
+          if (isIE8OrEarlier) {
+            styledText = styledText.replace(newlineRe, '\r');
+          }
+          textNode.nodeValue = styledText;
+          var document = textNode.ownerDocument;
+          var span = document.createElement('span');
+          span.className = decorations[decorationIndex + 1];
+          var parentNode = textNode.parentNode;
+          parentNode.replaceChild(span, textNode);
+          span.appendChild(textNode);
+          if (sourceIndex < spanEnd) {  // Split off a text node.
+            spans[spanIndex + 1] = textNode
+                // TODO: Possibly optimize by using '' if there's no flicker.
+                = document.createTextNode(source.substring(end, spanEnd));
+            parentNode.insertBefore(textNode, span.nextSibling);
+          }
+        }
+
+        sourceIndex = end;
+
+        if (sourceIndex >= spanEnd) {
+          spanIndex += 2;
+        }
+        if (sourceIndex >= decEnd) {
+          decorationIndex += 2;
+        }
+      }
+    } finally {
+      if (sourceNode) {
+        sourceNode.style.display = oldDisplay;
+      }
+    }
+  }
+
+
+  /** Maps language-specific file extensions to handlers. */
+  var langHandlerRegistry = {};
+  /** Register a language handler for the given file extensions.
+    * @param {function (JobT)} handler a function from source code to a list
+    *      of decorations.  Takes a single argument job which describes the
+    *      state of the computation and attaches the decorations to it.
+    * @param {Array.<string>} fileExtensions
+    */
+  function registerLangHandler(handler, fileExtensions) {
+    for (var i = fileExtensions.length; --i >= 0;) {
+      var ext = fileExtensions[i];
+      if (!langHandlerRegistry.hasOwnProperty(ext)) {
+        langHandlerRegistry[ext] = handler;
+      } else if (win['console']) {
+        console['warn']('cannot override language handler %s', ext);
+      }
+    }
+  }
+  function langHandlerForExtension(extension, source) {
+    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
+      // Treat it as markup if the first non whitespace character is a < and
+      // the last non-whitespace character is a >.
+      extension = /^\s*</.test(source)
+          ? 'default-markup'
+          : 'default-code';
+    }
+    return langHandlerRegistry[extension];
+  }
+  registerLangHandler(decorateSource, ['default-code']);
+  registerLangHandler(
+      createSimpleLexer(
+          [],
+          [
+           [PR_PLAIN,       /^[^<?]+/],
+           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
+           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
+           // Unescaped content in an unknown language
+           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
+           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
+           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
+           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
+           // Unescaped content in javascript.  (Or possibly vbscript).
+           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
+           // Contains unescaped stylesheet content
+           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
+           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
+          ]),
+      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
+  registerLangHandler(
+      createSimpleLexer(
+          [
+           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
+           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
+           ],
+          [
+           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
+           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
+           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+           [PR_PUNCTUATION,  /^[=<>\/]+/],
+           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
+           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
+           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
+           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
+           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
+           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
+           ]),
+      ['in.tag']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CPP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'types': C_TYPES
+        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': 'null,true,false'
+        }), ['json']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CSHARP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'verbatimStrings': true,
+          'types': C_TYPES
+        }), ['cs']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JAVA_KEYWORDS,
+          'cStyleComments': true
+        }), ['java']);
+  registerLangHandler(sourceDecorator({
+          'keywords': SH_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true
+        }), ['bash', 'bsh', 'csh', 'sh']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PYTHON_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'tripleQuotedStrings': true
+        }), ['cv', 'py', 'python']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PERL_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': 2  // multiline regex literals
+        }), ['perl', 'pl', 'pm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': RUBY_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': true
+        }), ['rb', 'ruby']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JSCRIPT_KEYWORDS,
+          'cStyleComments': true,
+          'regexLiterals': true
+        }), ['javascript', 'js', 'ts', 'typescript']);
+  registerLangHandler(sourceDecorator({
+          'keywords': COFFEE_KEYWORDS,
+          'hashComments': 3,  // ### style block comments
+          'cStyleComments': true,
+          'multilineStrings': true,
+          'tripleQuotedStrings': true,
+          'regexLiterals': true
+        }), ['coffee']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
+
+  /** @param {JobT} job */
+  function applyDecorator(job) {
+    var opt_langExtension = job.langExtension;
+
+    try {
+      // Extract tags, and convert the source code to plain text.
+      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
+      /** Plain text. @type {string} */
+      var source = sourceAndSpans.sourceCode;
+      job.sourceCode = source;
+      job.spans = sourceAndSpans.spans;
+      job.basePos = 0;
+
+      // Apply the appropriate language handler
+      langHandlerForExtension(opt_langExtension, source)(job);
+
+      // Integrate the decorations and tags back into the source code,
+      // modifying the sourceNode in place.
+      recombineTagsAndDecorations(job);
+    } catch (e) {
+      if (win['console']) {
+        console['log'](e && e['stack'] || e);
+      }
+    }
+  }
+
+  /**
+   * Pretty print a chunk of code.
+   * @param sourceCodeHtml {string} The HTML to pretty print.
+   * @param opt_langExtension {string} The language name to use.
+   *     Typically, a filename extension like 'cpp' or 'java'.
+   * @param opt_numberLines {number|boolean} True to number lines,
+   *     or the 1-indexed number of the first line in sourceCodeHtml.
+   */
+  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
+    /** @type{number|boolean} */
+    var nl = opt_numberLines || false;
+    /** @type{string|null} */
+    var langExtension = opt_langExtension || null;
+    /** @type{!Element} */
+    var container = document.createElement('div');
+    // This could cause images to load and onload listeners to fire.
+    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
+    // We assume that the inner HTML is from a trusted source.
+    // The pre-tag is required for IE8 which strips newlines from innerHTML
+    // when it is injected into a <pre> tag.
+    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
+    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
+    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
+    container = /** @type{!Element} */(container.firstChild);
+    if (nl) {
+      numberLines(container, nl, true);
+    }
+
+    /** @type{JobT} */
+    var job = {
+      langExtension: langExtension,
+      numberLines: nl,
+      sourceNode: container,
+      pre: 1,
+      sourceCode: null,
+      basePos: null,
+      spans: null,
+      decorations: null
+    };
+    applyDecorator(job);
+    return container.innerHTML;
+  }
+
+   /**
+    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+    * {@code class=prettyprint} and prettify them.
+    *
+    * @param {Function} opt_whenDone called when prettifying is done.
+    * @param {HTMLElement|HTMLDocument} opt_root an element or document
+    *   containing all the elements to pretty print.
+    *   Defaults to {@code document.body}.
+    */
+  function $prettyPrint(opt_whenDone, opt_root) {
+    var root = opt_root || document.body;
+    var doc = root.ownerDocument || document;
+    function byTagName(tn) { return root.getElementsByTagName(tn); }
+    // fetch a list of nodes to rewrite
+    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
+    var elements = [];
+    for (var i = 0; i < codeSegments.length; ++i) {
+      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
+        elements.push(codeSegments[i][j]);
+      }
+    }
+    codeSegments = null;
+
+    var clock = Date;
+    if (!clock['now']) {
+      clock = { 'now': function () { return +(new Date); } };
+    }
+
+    // The loop is broken into a series of continuations to make sure that we
+    // don't make the browser unresponsive when rewriting a large page.
+    var k = 0;
+
+    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
+    var prettyPrintRe = /\bprettyprint\b/;
+    var prettyPrintedRe = /\bprettyprinted\b/;
+    var preformattedTagNameRe = /pre|xmp/i;
+    var codeRe = /^code$/i;
+    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
+    var EMPTY = {};
+
+    function doWork() {
+      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
+                     clock['now']() + 250 /* ms */ :
+                     Infinity);
+      for (; k < elements.length && clock['now']() < endTime; k++) {
+        var cs = elements[k];
+
+        // Look for a preceding comment like
+        // <?prettify lang="..." linenums="..."?>
+        var attrs = EMPTY;
+        {
+          for (var preceder = cs; (preceder = preceder.previousSibling);) {
+            var nt = preceder.nodeType;
+            // <?foo?> is parsed by HTML 5 to a comment node (8)
+            // like <!--?foo?-->, but in XML is a processing instruction
+            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
+            if (value
+                ? !/^\??prettify\b/.test(value)
+                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
+              // Skip over white-space text nodes but not others.
+              break;
+            }
+            if (value) {
+              attrs = {};
+              value.replace(
+                  /\b(\w+)=([\w:.%+-]+)/g,
+                function (_, name, value) { attrs[name] = value; });
+              break;
+            }
+          }
+        }
+
+        var className = cs.className;
+        if ((attrs !== EMPTY || prettyPrintRe.test(className))
+            // Don't redo this if we've already done it.
+            // This allows recalling pretty print to just prettyprint elements
+            // that have been added to the page since last call.
+            && !prettyPrintedRe.test(className)) {
+
+          // make sure this is not nested in an already prettified element
+          var nested = false;
+          for (var p = cs.parentNode; p; p = p.parentNode) {
+            var tn = p.tagName;
+            if (preCodeXmpRe.test(tn)
+                && p.className && prettyPrintRe.test(p.className)) {
+              nested = true;
+              break;
+            }
+          }
+          if (!nested) {
+            // Mark done.  If we fail to prettyprint for whatever reason,
+            // we shouldn't try again.
+            cs.className += ' prettyprinted';
+
+            // If the classes includes a language extensions, use it.
+            // Language extensions can be specified like
+            //     <pre class="prettyprint lang-cpp">
+            // the language extension "cpp" is used to find a language handler
+            // as passed to PR.registerLangHandler.
+            // HTML5 recommends that a language be specified using "language-"
+            // as the prefix instead.  Google Code Prettify supports both.
+            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
+            var langExtension = attrs['lang'];
+            if (!langExtension) {
+              langExtension = className.match(langExtensionRe);
+              // Support <pre class="prettyprint"><code class="language-c">
+              var wrapper;
+              if (!langExtension && (wrapper = childContentWrapper(cs))
+                  && codeRe.test(wrapper.tagName)) {
+                langExtension = wrapper.className.match(langExtensionRe);
+              }
+
+              if (langExtension) { langExtension = langExtension[1]; }
+            }
+
+            var preformatted;
+            if (preformattedTagNameRe.test(cs.tagName)) {
+              preformatted = 1;
+            } else {
+              var currentStyle = cs['currentStyle'];
+              var defaultView = doc.defaultView;
+              var whitespace = (
+                  currentStyle
+                  ? currentStyle['whiteSpace']
+                  : (defaultView
+                     && defaultView.getComputedStyle)
+                  ? defaultView.getComputedStyle(cs, null)
+                  .getPropertyValue('white-space')
+                  : 0);
+              preformatted = whitespace
+                  && 'pre' === whitespace.substring(0, 3);
+            }
+
+            // Look for a class like linenums or linenums:<n> where <n> is the
+            // 1-indexed number of the first line.
+            var lineNums = attrs['linenums'];
+            if (!(lineNums = lineNums === 'true' || +lineNums)) {
+              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
+              lineNums =
+                lineNums
+                ? lineNums[1] && lineNums[1].length
+                  ? +lineNums[1] : true
+                : false;
+            }
+            if (lineNums) { numberLines(cs, lineNums, preformatted); }
+
+            // do the pretty printing
+            var prettyPrintingJob = {
+              langExtension: langExtension,
+              sourceNode: cs,
+              numberLines: lineNums,
+              pre: preformatted,
+              sourceCode: null,
+              basePos: null,
+              spans: null,
+              decorations: null
+            };
+            applyDecorator(prettyPrintingJob);
+          }
+        }
+      }
+      if (k < elements.length) {
+        // finish up in a continuation
+        win.setTimeout(doWork, 250);
+      } else if ('function' === typeof opt_whenDone) {
+        opt_whenDone();
+      }
+    }
+
+    doWork();
+  }
+
+  /**
+   * Contains functions for creating and registering new language handlers.
+   * @type {Object}
+   */
+  var PR = win['PR'] = {
+        'createSimpleLexer': createSimpleLexer,
+        'registerLangHandler': registerLangHandler,
+        'sourceDecorator': sourceDecorator,
+        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
+        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
+        'PR_COMMENT': PR_COMMENT,
+        'PR_DECLARATION': PR_DECLARATION,
+        'PR_KEYWORD': PR_KEYWORD,
+        'PR_LITERAL': PR_LITERAL,
+        'PR_NOCODE': PR_NOCODE,
+        'PR_PLAIN': PR_PLAIN,
+        'PR_PUNCTUATION': PR_PUNCTUATION,
+        'PR_SOURCE': PR_SOURCE,
+        'PR_STRING': PR_STRING,
+        'PR_TAG': PR_TAG,
+        'PR_TYPE': PR_TYPE,
+        'prettyPrintOne':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrintOne'] = $prettyPrintOne)
+             : (prettyPrintOne = $prettyPrintOne),
+        'prettyPrint':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrint'] = $prettyPrint)
+             : (prettyPrint = $prettyPrint)
+      };
+
+  // Make PR available via the Asynchronous Module Definition (AMD) API.
+  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
+  // The Asynchronous Module Definition (AMD) API specifies a
+  // mechanism for defining modules such that the module and its
+  // dependencies can be asynchronously loaded.
+  // ...
+  // To allow a clear indicator that a global define function (as
+  // needed for script src browser loading) conforms to the AMD API,
+  // any global define function SHOULD have a property called "amd"
+  // whose value is an object. This helps avoid conflict with any
+  // other existing JavaScript code that could have defined a define()
+  // function that does not conform to the AMD API.
+  var define = win['define'];
+  if (typeof define === "function" && define['amd']) {
+    define("google-code-prettify", [], function () {
+      return PR;
+    });
+  }
+})();
+
+
+var path = require('path');
+
+module.exports = {
+  prettyPrint: prettyPrint,
+  prettyPrintOne: prettyPrintOne,
+  // include paths for css preprocessor support
+  includePaths: [
+    __dirname,
+    path.resolve(__dirname, '../styles')
+  ]
+};
diff --git a/static/bower_components/google-prettify/src/prettify.css b/static/bower_components/google-prettify/src/prettify.css
new file mode 100644
index 00000000..f581ffac
--- /dev/null
+++ b/static/bower_components/google-prettify/src/prettify.css
@@ -0,0 +1,70 @@
+/**
+ * @license
+ * Copyright (C) 2015 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Pretty printing styles. Used with prettify.js. */
+
+
+/* SPAN elements with the classes below are added by prettyprint. */
+.pln { color: #000 }  /* plain text */
+
+@media screen {
+  .str { color: #080 }  /* string content */
+  .kwd { color: #008 }  /* a keyword */
+  .com { color: #800 }  /* a comment */
+  .typ { color: #606 }  /* a type name */
+  .lit { color: #066 }  /* a literal value */
+  /* punctuation, lisp open bracket, lisp close bracket */
+  .pun, .opn, .clo { color: #660 }
+  .tag { color: #008 }  /* a markup tag name */
+  .atn { color: #606 }  /* a markup attribute name */
+  .atv { color: #080 }  /* a markup attribute value */
+  .dec, .var { color: #606 }  /* a declaration; a variable name */
+  .fun { color: red }  /* a function name */
+}
+
+/* Use higher contrast and text-weight for printable form. */
+@media print, projection {
+  .str { color: #060 }
+  .kwd { color: #006; font-weight: bold }
+  .com { color: #600; font-style: italic }
+  .typ { color: #404; font-weight: bold }
+  .lit { color: #044 }
+  .pun, .opn, .clo { color: #440 }
+  .tag { color: #006; font-weight: bold }
+  .atn { color: #404 }
+  .atv { color: #060 }
+}
+
+/* Put a border around prettyprinted code snippets. */
+pre.prettyprint { padding: 2px; border: 1px solid #888 }
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L5,
+li.L6,
+li.L7,
+li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,
+li.L3,
+li.L5,
+li.L7,
+li.L9 { background: #eee }
diff --git a/static/bower_components/google-prettify/src/prettify.js b/static/bower_components/google-prettify/src/prettify.js
new file mode 100644
index 00000000..7080ec7b
--- /dev/null
+++ b/static/bower_components/google-prettify/src/prettify.js
@@ -0,0 +1,1750 @@
+/**
+ * @license
+ * Copyright (C) 2006 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * some functions for browser-side pretty printing of code contained in html.
+ *
+ * <p>
+ * For a fairly comprehensive set of languages see the
+ * <a href="https://github.com/google/code-prettify#for-which-languages-does-it-work">README</a>
+ * file that came with this source.  At a minimum, the lexer should work on a
+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+ * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+ * <p>
+ * Usage: <ol>
+ * <li> include this source file in an html page via
+ *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
+ * <li> define style rules.  See the example page for examples.
+ * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
+ *    {@code class=prettyprint.}
+ *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
+ *    printer needs to do more substantial DOM manipulations to support that, so
+ *    some css styles may not be preserved.
+ * </ol>
+ * That's it.  I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in, but if you wish, you can add
+ * another class to the {@code <pre>} or {@code <code>} element to specify the
+ * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
+ * starts with "lang-" followed by a file extension, specifies the file type.
+ * See the "lang-*.js" files in this directory for code that implements
+ * per-language file handlers.
+ * <p>
+ * Change log:<br>
+ * cbeust, 2006/08/22
+ * <blockquote>
+ *   Java annotations (start with "@") are now captured as literals ("lit")
+ * </blockquote>
+ * @requires console
+ */
+
+// JSLint declarations
+/*global console, document, navigator, setTimeout, window, define */
+
+/**
+ * @typedef {!Array.<number|string>}
+ * Alternating indices and the decorations that should be inserted there.
+ * The indices are monotonically increasing.
+ */
+var DecorationsT;
+
+/**
+ * @typedef {!{
+ *   sourceNode: !Element,
+ *   pre: !(number|boolean),
+ *   langExtension: ?string,
+ *   numberLines: ?(number|boolean),
+ *   sourceCode: ?string,
+ *   spans: ?(Array.<number|Node>),
+ *   basePos: ?number,
+ *   decorations: ?DecorationsT
+ * }}
+ * <dl>
+ *  <dt>sourceNode<dd>the element containing the source
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>pre<dd>truthy if white-space in text nodes
+ *     should be considered significant.
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ *  <dt>decorations<dd>an array of style classes preceded
+ *     by the position at which they start in job.sourceCode in order
+ *  <dt>basePos<dd>integer position of this.sourceCode in the larger chunk of
+ *     source.
+ * </dl>
+ */
+var JobT;
+
+/**
+ * @typedef {!{
+ *   sourceCode: string,
+ *   spans: !(Array.<number|Node>)
+ * }}
+ * <dl>
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ * </dl>
+ */
+var SourceSpansT;
+
+/** @define {boolean} */
+var IN_GLOBAL_SCOPE = true;
+
+
+/**
+ * {@type !{
+ *   'createSimpleLexer': function (Array, Array): (function (JobT)),
+ *   'registerLangHandler': function (function (JobT), Array.<string>),
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_NAME': string,
+ *   'PR_ATTRIB_VALUE': string,
+ *   'PR_COMMENT': string,
+ *   'PR_DECLARATION': string,
+ *   'PR_KEYWORD': string,
+ *   'PR_LITERAL': string,
+ *   'PR_NOCODE': string,
+ *   'PR_PLAIN': string,
+ *   'PR_PUNCTUATION': string,
+ *   'PR_SOURCE': string,
+ *   'PR_STRING': string,
+ *   'PR_TAG': string,
+ *   'PR_TYPE': string,
+ *   'prettyPrintOne': function (string, string, number|boolean),
+ *   'prettyPrint': function (?function, ?(HTMLElement|HTMLDocument))
+ * }}
+ * @const
+ */
+var PR;
+
+/**
+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+ * UI events.
+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
+ */
+var PR_SHOULD_USE_CONTINUATION = true
+if (typeof window !== 'undefined') {
+  window['PR_SHOULD_USE_CONTINUATION'] = PR_SHOULD_USE_CONTINUATION;
+}
+
+/**
+ * Pretty print a chunk of code.
+ * @param {string} sourceCodeHtml The HTML to pretty print.
+ * @param {string} opt_langExtension The language name to use.
+ *     Typically, a filename extension like 'cpp' or 'java'.
+ * @param {number|boolean} opt_numberLines True to number lines,
+ *     or the 1-indexed number of the first line in sourceCodeHtml.
+ * @return {string} code as html, but prettier
+ */
+var prettyPrintOne;
+/**
+ * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+ * {@code class=prettyprint} and prettify them.
+ *
+ * @param {Function} opt_whenDone called when prettifying is done.
+ * @param {HTMLElement|HTMLDocument} opt_root an element or document
+ *   containing all the elements to pretty print.
+ *   Defaults to {@code document.body}.
+ */
+var prettyPrint;
+
+
+(function () {
+  var win = (typeof window !== 'undefined') ? window : {};
+  // Keyword lists for various languages.
+  // We use things that coerce to strings to make them compact when minified
+  // and to defeat aggressive optimizers that fold large string constants.
+  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
+  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
+      "double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed," +
+      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
+  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
+      "new,operator,private,protected,public,this,throw,true,try,typeof"];
+  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignas,alignof,align_union,asm,axiom,bool," +
+      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
+      "dynamic_cast,explicit,export,friend,generic,late_check," +
+      "mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert," +
+      "static_cast,template,typeid,typename,using,virtual,where"];
+  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,assert,boolean,byte,extends,finally,final,implements,import," +
+      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
+      "throws,transient"];
+  var CSHARP_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending," +
+      "dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface," +
+      "internal,into,is,join,let,lock,null,object,out,override,orderby,params," +
+      "partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong," +
+      "unchecked,unsafe,ushort,value,var,virtual,where,yield"];
+  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
+      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
+      "throw,true,try,unless,until,when,while,yes";
+  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
+      "abstract,async,await,constructor,debugger,enum,eval,export,from,function," +
+      "get,import,implements,instanceof,interface,let,null,of,set,undefined," +
+      "var,with,yield,Infinity,NaN"];
+  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
+      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
+      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
+  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
+      "elif,except,exec,finally,from,global,import,in,is,lambda," +
+      "nonlocal,not,or,pass,print,raise,try,with,yield," +
+      "False,True,None"];
+  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
+      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
+      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
+      "BEGIN,END"];
+  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
+      "function,in,local,set,then,until"];
+  var ALL_KEYWORDS = [
+      CPP_KEYWORDS, CSHARP_KEYWORDS, JAVA_KEYWORDS, JSCRIPT_KEYWORDS,
+      PERL_KEYWORDS, PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
+  var C_TYPES = /^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
+
+  // token style names.  correspond to css classes
+  /**
+   * token style for a string literal
+   * @const
+   */
+  var PR_STRING = 'str';
+  /**
+   * token style for a keyword
+   * @const
+   */
+  var PR_KEYWORD = 'kwd';
+  /**
+   * token style for a comment
+   * @const
+   */
+  var PR_COMMENT = 'com';
+  /**
+   * token style for a type
+   * @const
+   */
+  var PR_TYPE = 'typ';
+  /**
+   * token style for a literal value.  e.g. 1, null, true.
+   * @const
+   */
+  var PR_LITERAL = 'lit';
+  /**
+   * token style for a punctuation string.
+   * @const
+   */
+  var PR_PUNCTUATION = 'pun';
+  /**
+   * token style for plain text.
+   * @const
+   */
+  var PR_PLAIN = 'pln';
+
+  /**
+   * token style for an sgml tag.
+   * @const
+   */
+  var PR_TAG = 'tag';
+  /**
+   * token style for a markup declaration such as a DOCTYPE.
+   * @const
+   */
+  var PR_DECLARATION = 'dec';
+  /**
+   * token style for embedded source.
+   * @const
+   */
+  var PR_SOURCE = 'src';
+  /**
+   * token style for an sgml attribute name.
+   * @const
+   */
+  var PR_ATTRIB_NAME = 'atn';
+  /**
+   * token style for an sgml attribute value.
+   * @const
+   */
+  var PR_ATTRIB_VALUE = 'atv';
+
+  /**
+   * A class that indicates a section of markup that is not code, e.g. to allow
+   * embedding of line numbers within code listings.
+   * @const
+   */
+  var PR_NOCODE = 'nocode';
+
+
+  // Regex pattern below is automatically generated by regexpPrecederPatterns.pl
+  // Do not modify, your changes will be erased.
+
+  // CAVEAT: this does not properly handle the case where a regular
+  // expression immediately follows another since a regular expression may
+  // have flags for case-sensitivity and the like.  Having regexp tokens
+  // adjacent is not valid in any language I'm aware of, so I'm punting.
+  // TODO: maybe style special characters inside a regexp as punctuation.
+
+  /**
+   * A set of tokens that can precede a regular expression literal in
+   * javascript
+   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+   * has the full list, but I've removed ones that might be problematic when
+   * seen in languages that don't support regular expression literals.
+   *
+   * Specifically, I've removed any keywords that can't precede a regexp
+   * literal in a syntactically legal javascript program, and I've removed the
+   * "in" keyword since it's not a keyword in many languages, and might be used
+   * as a count of inches.
+   *
+   * The link above does not accurately describe EcmaScript rules since
+   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+   * very well in practice.
+   *
+   * @private
+   * @const
+   */
+  var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
+
+
+  /**
+   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+   * matches the union of the sets of strings matched by the input RegExp.
+   * Since it matches globally, if the input strings have a start-of-input
+   * anchor (/^.../), it is ignored for the purposes of unioning.
+   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
+   * @return {RegExp} a global regex.
+   */
+  function combinePrefixPatterns(regexs) {
+    var capturedGroupIndex = 0;
+
+    var needToFoldCase = false;
+    var ignoreCase = false;
+    for (var i = 0, n = regexs.length; i < n; ++i) {
+      var regex = regexs[i];
+      if (regex.ignoreCase) {
+        ignoreCase = true;
+      } else if (/[a-z]/i.test(regex.source.replace(
+                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+        needToFoldCase = true;
+        ignoreCase = false;
+        break;
+      }
+    }
+
+    var escapeCharToCodeUnit = {
+      'b': 8,
+      't': 9,
+      'n': 0xa,
+      'v': 0xb,
+      'f': 0xc,
+      'r': 0xd
+    };
+
+    function decodeEscape(charsetPart) {
+      var cc0 = charsetPart.charCodeAt(0);
+      if (cc0 !== 92 /* \\ */) {
+        return cc0;
+      }
+      var c1 = charsetPart.charAt(1);
+      cc0 = escapeCharToCodeUnit[c1];
+      if (cc0) {
+        return cc0;
+      } else if ('0' <= c1 && c1 <= '7') {
+        return parseInt(charsetPart.substring(1), 8);
+      } else if (c1 === 'u' || c1 === 'x') {
+        return parseInt(charsetPart.substring(2), 16);
+      } else {
+        return charsetPart.charCodeAt(1);
+      }
+    }
+
+    function encodeEscape(charCode) {
+      if (charCode < 0x20) {
+        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+      }
+      var ch = String.fromCharCode(charCode);
+      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
+          ? "\\" + ch : ch;
+    }
+
+    function caseFoldCharset(charSet) {
+      var charsetParts = charSet.substring(1, charSet.length - 1).match(
+          new RegExp(
+              '\\\\u[0-9A-Fa-f]{4}'
+              + '|\\\\x[0-9A-Fa-f]{2}'
+              + '|\\\\[0-3][0-7]{0,2}'
+              + '|\\\\[0-7]{1,2}'
+              + '|\\\\[\\s\\S]'
+              + '|-'
+              + '|[^-\\\\]',
+              'g'));
+      var ranges = [];
+      var inverse = charsetParts[0] === '^';
+
+      var out = ['['];
+      if (inverse) { out.push('^'); }
+
+      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+        var p = charsetParts[i];
+        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
+          out.push(p);
+        } else {
+          var start = decodeEscape(p);
+          var end;
+          if (i + 2 < n && '-' === charsetParts[i + 1]) {
+            end = decodeEscape(charsetParts[i + 2]);
+            i += 2;
+          } else {
+            end = start;
+          }
+          ranges.push([start, end]);
+          // If the range might intersect letters, then expand it.
+          // This case handling is too simplistic.
+          // It does not deal with non-latin case folding.
+          // It works for latin source code identifiers though.
+          if (!(end < 65 || start > 122)) {
+            if (!(end < 65 || start > 90)) {
+              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+            }
+            if (!(end < 97 || start > 122)) {
+              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+            }
+          }
+        }
+      }
+
+      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+      // -> [[1, 12], [14, 14], [16, 17]]
+      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
+      var consolidatedRanges = [];
+      var lastRange = [];
+      for (var i = 0; i < ranges.length; ++i) {
+        var range = ranges[i];
+        if (range[0] <= lastRange[1] + 1) {
+          lastRange[1] = Math.max(lastRange[1], range[1]);
+        } else {
+          consolidatedRanges.push(lastRange = range);
+        }
+      }
+
+      for (var i = 0; i < consolidatedRanges.length; ++i) {
+        var range = consolidatedRanges[i];
+        out.push(encodeEscape(range[0]));
+        if (range[1] > range[0]) {
+          if (range[1] + 1 > range[0]) { out.push('-'); }
+          out.push(encodeEscape(range[1]));
+        }
+      }
+      out.push(']');
+      return out.join('');
+    }
+
+    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+      // Split into character sets, escape sequences, punctuation strings
+      // like ('(', '(?:', ')', '^'), and runs of characters that do not
+      // include any of the above.
+      var parts = regex.source.match(
+          new RegExp(
+              '(?:'
+              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
+              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
+              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
+              + '|\\\\[0-9]+'  // a back-reference or octal escape
+              + '|\\\\[^ux0-9]'  // other escape sequence
+              + '|\\(\\?[:!=]'  // start of a non-capturing group
+              + '|[\\(\\)\\^]'  // start/end of a group, or line start
+              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
+              + ')',
+              'g'));
+      var n = parts.length;
+
+      // Maps captured group numbers to the number they will occupy in
+      // the output or to -1 if that has not been determined, or to
+      // undefined if they need not be capturing in the output.
+      var capturedGroups = [];
+
+      // Walk over and identify back references to build the capturedGroups
+      // mapping.
+      for (var i = 0, groupIndex = 0; i < n; ++i) {
+        var p = parts[i];
+        if (p === '(') {
+          // groups are 1-indexed, so max group index is count of '('
+          ++groupIndex;
+        } else if ('\\' === p.charAt(0)) {
+          var decimalValue = +p.substring(1);
+          if (decimalValue) {
+            if (decimalValue <= groupIndex) {
+              capturedGroups[decimalValue] = -1;
+            } else {
+              // Replace with an unambiguous escape sequence so that
+              // an octal escape sequence does not turn into a backreference
+              // to a capturing group from an earlier regex.
+              parts[i] = encodeEscape(decimalValue);
+            }
+          }
+        }
+      }
+
+      // Renumber groups and reduce capturing groups to non-capturing groups
+      // where possible.
+      for (var i = 1; i < capturedGroups.length; ++i) {
+        if (-1 === capturedGroups[i]) {
+          capturedGroups[i] = ++capturedGroupIndex;
+        }
+      }
+      for (var i = 0, groupIndex = 0; i < n; ++i) {
+        var p = parts[i];
+        if (p === '(') {
+          ++groupIndex;
+          if (!capturedGroups[groupIndex]) {
+            parts[i] = '(?:';
+          }
+        } else if ('\\' === p.charAt(0)) {
+          var decimalValue = +p.substring(1);
+          if (decimalValue && decimalValue <= groupIndex) {
+            parts[i] = '\\' + capturedGroups[decimalValue];
+          }
+        }
+      }
+
+      // Remove any prefix anchors so that the output will match anywhere.
+      // ^^ really does mean an anchored match though.
+      for (var i = 0; i < n; ++i) {
+        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+      }
+
+      // Expand letters to groups to handle mixing of case-sensitive and
+      // case-insensitive patterns if necessary.
+      if (regex.ignoreCase && needToFoldCase) {
+        for (var i = 0; i < n; ++i) {
+          var p = parts[i];
+          var ch0 = p.charAt(0);
+          if (p.length >= 2 && ch0 === '[') {
+            parts[i] = caseFoldCharset(p);
+          } else if (ch0 !== '\\') {
+            // TODO: handle letters in numeric escapes.
+            parts[i] = p.replace(
+                /[a-zA-Z]/g,
+                function (ch) {
+                  var cc = ch.charCodeAt(0);
+                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+                });
+          }
+        }
+      }
+
+      return parts.join('');
+    }
+
+    var rewritten = [];
+    for (var i = 0, n = regexs.length; i < n; ++i) {
+      var regex = regexs[i];
+      if (regex.global || regex.multiline) { throw new Error('' + regex); }
+      rewritten.push(
+          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+    }
+
+    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+  }
+
+
+  /**
+   * Split markup into a string of source code and an array mapping ranges in
+   * that string to the text nodes in which they appear.
+   *
+   * <p>
+   * The HTML DOM structure:</p>
+   * <pre>
+   * (Element   "p"
+   *   (Element "b"
+   *     (Text  "print "))       ; #1
+   *   (Text    "'Hello '")      ; #2
+   *   (Element "br")            ; #3
+   *   (Text    "  + 'World';")) ; #4
+   * </pre>
+   * <p>
+   * corresponds to the HTML
+   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
+   *
+   * <p>
+   * It will produce the output:</p>
+   * <pre>
+   * {
+   *   sourceCode: "print 'Hello '\n  + 'World';",
+   *   //                     1          2
+   *   //           012345678901234 5678901234567
+   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
+   * }
+   * </pre>
+   * <p>
+   * where #1 is a reference to the {@code "print "} text node above, and so
+   * on for the other text nodes.
+   * </p>
+   *
+   * <p>
+   * The {@code} spans array is an array of pairs.  Even elements are the start
+   * indices of substrings, and odd elements are the text nodes (or BR elements)
+   * that contain the text for those substrings.
+   * Substrings continue until the next index or the end of the source.
+   * </p>
+   *
+   * @param {Node} node an HTML DOM subtree containing source-code.
+   * @param {boolean|number} isPreformatted truthy if white-space in
+   *    text nodes should be considered significant.
+   * @return {SourceSpansT} source code and the nodes in which they occur.
+   */
+  function extractSourceSpans(node, isPreformatted) {
+    var nocode = /(?:^|\s)nocode(?:\s|$)/;
+
+    var chunks = [];
+    var length = 0;
+    var spans = [];
+    var k = 0;
+
+    function walk(node) {
+      var type = node.nodeType;
+      if (type == 1) {  // Element
+        if (nocode.test(node.className)) { return; }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          walk(child);
+        }
+        var nodeName = node.nodeName.toLowerCase();
+        if ('br' === nodeName || 'li' === nodeName) {
+          chunks[k] = '\n';
+          spans[k << 1] = length++;
+          spans[(k++ << 1) | 1] = node;
+        }
+      } else if (type == 3 || type == 4) {  // Text
+        var text = node.nodeValue;
+        if (text.length) {
+          if (!isPreformatted) {
+            text = text.replace(/[ \t\r\n]+/g, ' ');
+          } else {
+            text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
+          }
+          // TODO: handle tabs here?
+          chunks[k] = text;
+          spans[k << 1] = length;
+          length += text.length;
+          spans[(k++ << 1) | 1] = node;
+        }
+      }
+    }
+
+    walk(node);
+
+    return {
+      sourceCode: chunks.join('').replace(/\n$/, ''),
+      spans: spans
+    };
+  }
+
+
+  /**
+   * Apply the given language handler to sourceCode and add the resulting
+   * decorations to out.
+   * @param {!Element} sourceNode
+   * @param {number} basePos the index of sourceCode within the chunk of source
+   *    whose decorations are already present on out.
+   * @param {string} sourceCode
+   * @param {function(JobT)} langHandler
+   * @param {DecorationsT} out
+   */
+  function appendDecorations(
+      sourceNode, basePos, sourceCode, langHandler, out) {
+    if (!sourceCode) { return; }
+    /** @type {JobT} */
+    var job = {
+      sourceNode: sourceNode,
+      pre: 1,
+      langExtension: null,
+      numberLines: null,
+      sourceCode: sourceCode,
+      spans: null,
+      basePos: basePos,
+      decorations: null
+    };
+    langHandler(job);
+    out.push.apply(out, job.decorations);
+  }
+
+  var notWs = /\S/;
+
+  /**
+   * Given an element, if it contains only one child element and any text nodes
+   * it contains contain only space characters, return the sole child element.
+   * Otherwise returns undefined.
+   * <p>
+   * This is meant to return the CODE element in {@code <pre><code ...>} when
+   * there is a single child element that contains all the non-space textual
+   * content, but not to return anything where there are multiple child elements
+   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
+   * is textual content.
+   */
+  function childContentWrapper(element) {
+    var wrapper = undefined;
+    for (var c = element.firstChild; c; c = c.nextSibling) {
+      var type = c.nodeType;
+      wrapper = (type === 1)  // Element Node
+          ? (wrapper ? element : c)
+          : (type === 3)  // Text Node
+          ? (notWs.test(c.nodeValue) ? element : wrapper)
+          : wrapper;
+    }
+    return wrapper === element ? undefined : wrapper;
+  }
+
+  /** Given triples of [style, pattern, context] returns a lexing function,
+    * The lexing function interprets the patterns to find token boundaries and
+    * returns a decoration list of the form
+    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+    * where index_n is an index into the sourceCode, and style_n is a style
+    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
+    * all characters in sourceCode[index_n-1:index_n].
+    *
+    * The stylePatterns is a list whose elements have the form
+    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+    *
+    * Style is a style constant like PR_PLAIN, or can be a string of the
+    * form 'lang-FOO', where FOO is a language extension describing the
+    * language of the portion of the token in $1 after pattern executes.
+    * E.g., if style is 'lang-lisp', and group 1 contains the text
+    * '(hello (world))', then that portion of the token will be passed to the
+    * registered lisp handler for formatting.
+    * The text before and after group 1 will be restyled using this decorator
+    * so decorators should take care that this doesn't result in infinite
+    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
+    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
+    * '<script>foo()<\/script>', which would cause the current decorator to
+    * be called with '<script>' which would not match the same rule since
+    * group 1 must not be empty, so it would be instead styled as PR_TAG by
+    * the generic tag rule.  The handler registered for the 'js' extension would
+    * then be called with 'foo()', and finally, the current decorator would
+    * be called with '<\/script>' which would not match the original rule and
+    * so the generic tag rule would identify it as a tag.
+    *
+    * Pattern must only match prefixes, and if it matches a prefix, then that
+    * match is considered a token with the same style.
+    *
+    * Context is applied to the last non-whitespace, non-comment token
+    * recognized.
+    *
+    * Shortcut is an optional string of characters, any of which, if the first
+    * character, gurantee that this pattern and only this pattern matches.
+    *
+    * @param {Array} shortcutStylePatterns patterns that always start with
+    *   a known character.  Must have a shortcut string.
+    * @param {Array} fallthroughStylePatterns patterns that will be tried in
+    *   order if the shortcut ones fail.  May have shortcuts.
+    *
+    * @return {function (JobT)} a function that takes an undecorated job and
+    *   attaches a list of decorations.
+    */
+  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
+    var shortcuts = {};
+    var tokenizer;
+    (function () {
+      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
+      var allRegexs = [];
+      var regexKeys = {};
+      for (var i = 0, n = allPatterns.length; i < n; ++i) {
+        var patternParts = allPatterns[i];
+        var shortcutChars = patternParts[3];
+        if (shortcutChars) {
+          for (var c = shortcutChars.length; --c >= 0;) {
+            shortcuts[shortcutChars.charAt(c)] = patternParts;
+          }
+        }
+        var regex = patternParts[1];
+        var k = '' + regex;
+        if (!regexKeys.hasOwnProperty(k)) {
+          allRegexs.push(regex);
+          regexKeys[k] = null;
+        }
+      }
+      allRegexs.push(/[\0-\uffff]/);
+      tokenizer = combinePrefixPatterns(allRegexs);
+    })();
+
+    var nPatterns = fallthroughStylePatterns.length;
+
+    /**
+     * Lexes job.sourceCode and attaches an output array job.decorations of
+     * style classes preceded by the position at which they start in
+     * job.sourceCode in order.
+     *
+     * @type{function (JobT)}
+     */
+    var decorate = function (job) {
+      var sourceCode = job.sourceCode, basePos = job.basePos;
+      var sourceNode = job.sourceNode;
+      /** Even entries are positions in source in ascending order.  Odd enties
+        * are style markers (e.g., PR_COMMENT) that run from that position until
+        * the end.
+        * @type {DecorationsT}
+        */
+      var decorations = [basePos, PR_PLAIN];
+      var pos = 0;  // index into sourceCode
+      var tokens = sourceCode.match(tokenizer) || [];
+      var styleCache = {};
+
+      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
+        var token = tokens[ti];
+        var style = styleCache[token];
+        var match = void 0;
+
+        var isEmbedded;
+        if (typeof style === 'string') {
+          isEmbedded = false;
+        } else {
+          var patternParts = shortcuts[token.charAt(0)];
+          if (patternParts) {
+            match = token.match(patternParts[1]);
+            style = patternParts[0];
+          } else {
+            for (var i = 0; i < nPatterns; ++i) {
+              patternParts = fallthroughStylePatterns[i];
+              match = token.match(patternParts[1]);
+              if (match) {
+                style = patternParts[0];
+                break;
+              }
+            }
+
+            if (!match) {  // make sure that we make progress
+              style = PR_PLAIN;
+            }
+          }
+
+          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
+          if (isEmbedded && !(match && typeof match[1] === 'string')) {
+            isEmbedded = false;
+            style = PR_SOURCE;
+          }
+
+          if (!isEmbedded) { styleCache[token] = style; }
+        }
+
+        var tokenStart = pos;
+        pos += token.length;
+
+        if (!isEmbedded) {
+          decorations.push(basePos + tokenStart, style);
+        } else {  // Treat group 1 as an embedded block of source code.
+          var embeddedSource = match[1];
+          var embeddedSourceStart = token.indexOf(embeddedSource);
+          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
+          if (match[2]) {
+            // If embeddedSource can be blank, then it would match at the
+            // beginning which would cause us to infinitely recurse on the
+            // entire token, so we catch the right context in match[2].
+            embeddedSourceEnd = token.length - match[2].length;
+            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
+          }
+          var lang = style.substring(5);
+          // Decorate the left of the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart,
+              token.substring(0, embeddedSourceStart),
+              decorate, decorations);
+          // Decorate the embedded source
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceStart,
+              embeddedSource,
+              langHandlerForExtension(lang, embeddedSource),
+              decorations);
+          // Decorate the right of the embedded section
+          appendDecorations(
+              sourceNode,
+              basePos + tokenStart + embeddedSourceEnd,
+              token.substring(embeddedSourceEnd),
+              decorate, decorations);
+        }
+      }
+      job.decorations = decorations;
+    };
+    return decorate;
+  }
+
+  /** returns a function that produces a list of decorations from source text.
+    *
+    * This code treats ", ', and ` as string delimiters, and \ as a string
+    * escape.  It does not recognize perl's qq() style strings.
+    * It has no special handling for double delimiter escapes as in basic, or
+    * the tripled delimiters used in python, but should work on those regardless
+    * although in those cases a single string literal may be broken up into
+    * multiple adjacent string literals.
+    *
+    * It recognizes C, C++, and shell style comments.
+    *
+    * @param {Object} options a set of optional parameters.
+    * @return {function (JobT)} a function that examines the source code
+    *     in the input job and builds a decoration list which it attaches to
+    *     the job.
+    */
+  function sourceDecorator(options) {
+    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
+    if (options['tripleQuotedStrings']) {
+      // '''multi-line-string''', 'single-line-string', and double-quoted
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
+           null, '\'"']);
+    } else if (options['multiLineStrings']) {
+      // 'multi-line-string', "multi-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
+           null, '\'"`']);
+    } else {
+      // 'single-line-string', "single-line-string"
+      shortcutStylePatterns.push(
+          [PR_STRING,
+           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
+           null, '"\'']);
+    }
+    if (options['verbatimStrings']) {
+      // verbatim-string-literal production from the C# grammar.  See issue 93.
+      fallthroughStylePatterns.push(
+          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
+    }
+    var hc = options['hashComments'];
+    if (hc) {
+      if (options['cStyleComments']) {
+        if (hc > 1) {  // multiline hash comments
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
+        } else {
+          // Stop C preprocessor declarations at an unclosed open comment
+          shortcutStylePatterns.push(
+              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
+               null, '#']);
+        }
+        // #include <stdio.h>
+        fallthroughStylePatterns.push(
+            [PR_STRING,
+             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
+             null]);
+      } else {
+        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
+      }
+    }
+    if (options['cStyleComments']) {
+      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
+      fallthroughStylePatterns.push(
+          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
+    }
+    var regexLiterals = options['regexLiterals'];
+    if (regexLiterals) {
+      /**
+       * @const
+       */
+      var regexExcls = regexLiterals > 1
+        ? ''  // Multiline regex literals
+        : '\n\r';
+      /**
+       * @const
+       */
+      var regexAny = regexExcls ? '.' : '[\\S\\s]';
+      /**
+       * @const
+       */
+      var REGEX_LITERAL = (
+          // A regular expression literal starts with a slash that is
+          // not followed by * or / so that it is not confused with
+          // comments.
+          '/(?=[^/*' + regexExcls + '])'
+          // and then contains any number of raw characters,
+          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
+          // escape sequences (\x5C),
+          +    '|\\x5C' + regexAny
+          // or non-nesting character sets (\x5B\x5D);
+          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
+          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
+          // finally closed by a /.
+          + '/');
+      fallthroughStylePatterns.push(
+          ['lang-regex',
+           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
+           ]);
+    }
+
+    var types = options['types'];
+    if (types) {
+      fallthroughStylePatterns.push([PR_TYPE, types]);
+    }
+
+    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
+    if (keywords.length) {
+      fallthroughStylePatterns.push(
+          [PR_KEYWORD,
+           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
+           null]);
+    }
+
+    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
+
+    var punctuation =
+      // The Bash man page says
+
+      // A word is a sequence of characters considered as a single
+      // unit by GRUB. Words are separated by metacharacters,
+      // which are the following plus space, tab, and newline: { }
+      // | & $ ; < >
+      // ...
+
+      // A word beginning with # causes that word and all remaining
+      // characters on that line to be ignored.
+
+      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
+      // comment but empirically
+      // $ echo {#}
+      // {#}
+      // $ echo \$#
+      // $#
+      // $ echo }#
+      // }#
+
+      // so /(?:^|[|&;<>\s])/ is more appropriate.
+
+      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
+      // suggests that this definition is compatible with a
+      // default mode that tries to use a single token definition
+      // to recognize both bash/python style comments and C
+      // preprocessor directives.
+
+      // This definition of punctuation does not include # in the list of
+      // follow-on exclusions, so # will not be broken before if preceeded
+      // by a punctuation character.  We could try to exclude # after
+      // [|&;<>] but that doesn't seem to cause many major problems.
+      // If that does turn out to be a problem, we should change the below
+      // when hc is truthy to include # in the run of punctuation characters
+      // only when not followint [|&;<>].
+      '^.[^\\s\\w.$@\'"`/\\\\]*';
+    if (options['regexLiterals']) {
+      punctuation += '(?!\s*\/)';
+    }
+
+    fallthroughStylePatterns.push(
+        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
+        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
+        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
+        [PR_LITERAL,
+         new RegExp(
+             '^(?:'
+             // A hex number
+             + '0x[a-f0-9]+'
+             // or an octal or decimal number,
+             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
+             // possibly in scientific notation
+             + '(?:e[+\\-]?\\d+)?'
+             + ')'
+             // with an optional modifier like UL for unsigned long
+             + '[a-z]*', 'i'),
+         null, '0123456789'],
+        // Don't treat escaped quotes in bash as starting strings.
+        // See issue 144.
+        [PR_PLAIN,       /^\\[\s\S]?/, null],
+        [PR_PUNCTUATION, new RegExp(punctuation), null]);
+
+    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
+  }
+
+  var decorateSource = sourceDecorator({
+        'keywords': ALL_KEYWORDS,
+        'hashComments': true,
+        'cStyleComments': true,
+        'multiLineStrings': true,
+        'regexLiterals': true
+      });
+
+  /**
+   * Given a DOM subtree, wraps it in a list, and puts each line into its own
+   * list item.
+   *
+   * @param {Node} node modified in place.  Its content is pulled into an
+   *     HTMLOListElement, and each line is moved into a separate list item.
+   *     This requires cloning elements, so the input might not have unique
+   *     IDs after numbering.
+   * @param {number|null|boolean} startLineNum
+   *     If truthy, coerced to an integer which is the 1-indexed line number
+   *     of the first line of code.  The number of the first line will be
+   *     attached to the list.
+   * @param {boolean} isPreformatted true iff white-space in text nodes should
+   *     be treated as significant.
+   */
+  function numberLines(node, startLineNum, isPreformatted) {
+    var nocode = /(?:^|\s)nocode(?:\s|$)/;
+    var lineBreak = /\r\n?|\n/;
+
+    var document = node.ownerDocument;
+
+    var li = document.createElement('li');
+    while (node.firstChild) {
+      li.appendChild(node.firstChild);
+    }
+    // An array of lines.  We split below, so this is initialized to one
+    // un-split line.
+    var listItems = [li];
+
+    function walk(node) {
+      var type = node.nodeType;
+      if (type == 1 && !nocode.test(node.className)) {  // Element
+        if ('br' === node.nodeName.toLowerCase()) {
+          breakAfter(node);
+          // Discard the <BR> since it is now flush against a </LI>.
+          if (node.parentNode) {
+            node.parentNode.removeChild(node);
+          }
+        } else {
+          for (var child = node.firstChild; child; child = child.nextSibling) {
+            walk(child);
+          }
+        }
+      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
+        var text = node.nodeValue;
+        var match = text.match(lineBreak);
+        if (match) {
+          var firstLine = text.substring(0, match.index);
+          node.nodeValue = firstLine;
+          var tail = text.substring(match.index + match[0].length);
+          if (tail) {
+            var parent = node.parentNode;
+            parent.insertBefore(
+              document.createTextNode(tail), node.nextSibling);
+          }
+          breakAfter(node);
+          if (!firstLine) {
+            // Don't leave blank text nodes in the DOM.
+            node.parentNode.removeChild(node);
+          }
+        }
+      }
+    }
+
+    // Split a line after the given node.
+    function breakAfter(lineEndNode) {
+      // If there's nothing to the right, then we can skip ending the line
+      // here, and move root-wards since splitting just before an end-tag
+      // would require us to create a bunch of empty copies.
+      while (!lineEndNode.nextSibling) {
+        lineEndNode = lineEndNode.parentNode;
+        if (!lineEndNode) { return; }
+      }
+
+      function breakLeftOf(limit, copy) {
+        // Clone shallowly if this node needs to be on both sides of the break.
+        var rightSide = copy ? limit.cloneNode(false) : limit;
+        var parent = limit.parentNode;
+        if (parent) {
+          // We clone the parent chain.
+          // This helps us resurrect important styling elements that cross lines.
+          // E.g. in <i>Foo<br>Bar</i>
+          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
+          var parentClone = breakLeftOf(parent, 1);
+          // Move the clone and everything to the right of the original
+          // onto the cloned parent.
+          var next = limit.nextSibling;
+          parentClone.appendChild(rightSide);
+          for (var sibling = next; sibling; sibling = next) {
+            next = sibling.nextSibling;
+            parentClone.appendChild(sibling);
+          }
+        }
+        return rightSide;
+      }
+
+      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
+
+      // Walk the parent chain until we reach an unattached LI.
+      for (var parent;
+           // Check nodeType since IE invents document fragments.
+           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
+        copiedListItem = parent;
+      }
+      // Put it on the list of lines for later processing.
+      listItems.push(copiedListItem);
+    }
+
+    // Split lines while there are lines left to split.
+    for (var i = 0;  // Number of lines that have been split so far.
+         i < listItems.length;  // length updated by breakAfter calls.
+         ++i) {
+      walk(listItems[i]);
+    }
+
+    // Make sure numeric indices show correctly.
+    if (startLineNum === (startLineNum|0)) {
+      listItems[0].setAttribute('value', startLineNum);
+    }
+
+    var ol = document.createElement('ol');
+    ol.className = 'linenums';
+    var offset = Math.max(0, ((startLineNum - 1 /* zero index */)) | 0) || 0;
+    for (var i = 0, n = listItems.length; i < n; ++i) {
+      li = listItems[i];
+      // Stick a class on the LIs so that stylesheets can
+      // color odd/even rows, or any other row pattern that
+      // is co-prime with 10.
+      li.className = 'L' + ((i + offset) % 10);
+      if (!li.firstChild) {
+        li.appendChild(document.createTextNode('\xA0'));
+      }
+      ol.appendChild(li);
+    }
+
+    node.appendChild(ol);
+  }
+
+
+  /**
+   * Breaks {@code job.sourceCode} around style boundaries in
+   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
+   * @param {JobT} job
+   * @private
+   */
+  function recombineTagsAndDecorations(job) {
+    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
+    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
+    var newlineRe = /\n/g;
+
+    var source = job.sourceCode;
+    var sourceLength = source.length;
+    // Index into source after the last code-unit recombined.
+    var sourceIndex = 0;
+
+    var spans = job.spans;
+    var nSpans = spans.length;
+    // Index into spans after the last span which ends at or before sourceIndex.
+    var spanIndex = 0;
+
+    var decorations = job.decorations;
+    var nDecorations = decorations.length;
+    // Index into decorations after the last decoration which ends at or before
+    // sourceIndex.
+    var decorationIndex = 0;
+
+    // Remove all zero-length decorations.
+    decorations[nDecorations] = sourceLength;
+    var decPos, i;
+    for (i = decPos = 0; i < nDecorations;) {
+      if (decorations[i] !== decorations[i + 2]) {
+        decorations[decPos++] = decorations[i++];
+        decorations[decPos++] = decorations[i++];
+      } else {
+        i += 2;
+      }
+    }
+    nDecorations = decPos;
+
+    // Simplify decorations.
+    for (i = decPos = 0; i < nDecorations;) {
+      var startPos = decorations[i];
+      // Conflate all adjacent decorations that use the same style.
+      var startDec = decorations[i + 1];
+      var end = i + 2;
+      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
+        end += 2;
+      }
+      decorations[decPos++] = startPos;
+      decorations[decPos++] = startDec;
+      i = end;
+    }
+
+    nDecorations = decorations.length = decPos;
+
+    var sourceNode = job.sourceNode;
+    var oldDisplay = "";
+    if (sourceNode) {
+      oldDisplay = sourceNode.style.display;
+      sourceNode.style.display = 'none';
+    }
+    try {
+      var decoration = null;
+      while (spanIndex < nSpans) {
+        var spanStart = spans[spanIndex];
+        var spanEnd = /** @type{number} */ (spans[spanIndex + 2])
+            || sourceLength;
+
+        var decEnd = decorations[decorationIndex + 2] || sourceLength;
+
+        var end = Math.min(spanEnd, decEnd);
+
+        var textNode = /** @type{Node} */ (spans[spanIndex + 1]);
+        var styledText;
+        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
+            // Don't introduce spans around empty text nodes.
+            && (styledText = source.substring(sourceIndex, end))) {
+          // This may seem bizarre, and it is.  Emitting LF on IE causes the
+          // code to display with spaces instead of line breaks.
+          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
+          // space to appear at the beginning of every line but the first.
+          // Emitting an old Mac OS 9 line separator makes everything spiffy.
+          if (isIE8OrEarlier) {
+            styledText = styledText.replace(newlineRe, '\r');
+          }
+          textNode.nodeValue = styledText;
+          var document = textNode.ownerDocument;
+          var span = document.createElement('span');
+          span.className = decorations[decorationIndex + 1];
+          var parentNode = textNode.parentNode;
+          parentNode.replaceChild(span, textNode);
+          span.appendChild(textNode);
+          if (sourceIndex < spanEnd) {  // Split off a text node.
+            spans[spanIndex + 1] = textNode
+                // TODO: Possibly optimize by using '' if there's no flicker.
+                = document.createTextNode(source.substring(end, spanEnd));
+            parentNode.insertBefore(textNode, span.nextSibling);
+          }
+        }
+
+        sourceIndex = end;
+
+        if (sourceIndex >= spanEnd) {
+          spanIndex += 2;
+        }
+        if (sourceIndex >= decEnd) {
+          decorationIndex += 2;
+        }
+      }
+    } finally {
+      if (sourceNode) {
+        sourceNode.style.display = oldDisplay;
+      }
+    }
+  }
+
+
+  /** Maps language-specific file extensions to handlers. */
+  var langHandlerRegistry = {};
+  /** Register a language handler for the given file extensions.
+    * @param {function (JobT)} handler a function from source code to a list
+    *      of decorations.  Takes a single argument job which describes the
+    *      state of the computation and attaches the decorations to it.
+    * @param {Array.<string>} fileExtensions
+    */
+  function registerLangHandler(handler, fileExtensions) {
+    for (var i = fileExtensions.length; --i >= 0;) {
+      var ext = fileExtensions[i];
+      if (!langHandlerRegistry.hasOwnProperty(ext)) {
+        langHandlerRegistry[ext] = handler;
+      } else if (win['console']) {
+        console['warn']('cannot override language handler %s', ext);
+      }
+    }
+  }
+  function langHandlerForExtension(extension, source) {
+    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
+      // Treat it as markup if the first non whitespace character is a < and
+      // the last non-whitespace character is a >.
+      extension = /^\s*</.test(source)
+          ? 'default-markup'
+          : 'default-code';
+    }
+    return langHandlerRegistry[extension];
+  }
+  registerLangHandler(decorateSource, ['default-code']);
+  registerLangHandler(
+      createSimpleLexer(
+          [],
+          [
+           [PR_PLAIN,       /^[^<?]+/],
+           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
+           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
+           // Unescaped content in an unknown language
+           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
+           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
+           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
+           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
+           // Unescaped content in javascript.  (Or possibly vbscript).
+           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
+           // Contains unescaped stylesheet content
+           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
+           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
+          ]),
+      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
+  registerLangHandler(
+      createSimpleLexer(
+          [
+           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
+           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
+           ],
+          [
+           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
+           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
+           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+           [PR_PUNCTUATION,  /^[=<>\/]+/],
+           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
+           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
+           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
+           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
+           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
+           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
+           ]),
+      ['in.tag']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CPP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'types': C_TYPES
+        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': 'null,true,false'
+        }), ['json']);
+  registerLangHandler(sourceDecorator({
+          'keywords': CSHARP_KEYWORDS,
+          'hashComments': true,
+          'cStyleComments': true,
+          'verbatimStrings': true,
+          'types': C_TYPES
+        }), ['cs']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JAVA_KEYWORDS,
+          'cStyleComments': true
+        }), ['java']);
+  registerLangHandler(sourceDecorator({
+          'keywords': SH_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true
+        }), ['bash', 'bsh', 'csh', 'sh']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PYTHON_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'tripleQuotedStrings': true
+        }), ['cv', 'py', 'python']);
+  registerLangHandler(sourceDecorator({
+          'keywords': PERL_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': 2  // multiline regex literals
+        }), ['perl', 'pl', 'pm']);
+  registerLangHandler(sourceDecorator({
+          'keywords': RUBY_KEYWORDS,
+          'hashComments': true,
+          'multiLineStrings': true,
+          'regexLiterals': true
+        }), ['rb', 'ruby']);
+  registerLangHandler(sourceDecorator({
+          'keywords': JSCRIPT_KEYWORDS,
+          'cStyleComments': true,
+          'regexLiterals': true
+        }), ['javascript', 'js', 'ts', 'typescript']);
+  registerLangHandler(sourceDecorator({
+          'keywords': COFFEE_KEYWORDS,
+          'hashComments': 3,  // ### style block comments
+          'cStyleComments': true,
+          'multilineStrings': true,
+          'tripleQuotedStrings': true,
+          'regexLiterals': true
+        }), ['coffee']);
+  registerLangHandler(
+      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
+
+  /** @param {JobT} job */
+  function applyDecorator(job) {
+    var opt_langExtension = job.langExtension;
+
+    try {
+      // Extract tags, and convert the source code to plain text.
+      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
+      /** Plain text. @type {string} */
+      var source = sourceAndSpans.sourceCode;
+      job.sourceCode = source;
+      job.spans = sourceAndSpans.spans;
+      job.basePos = 0;
+
+      // Apply the appropriate language handler
+      langHandlerForExtension(opt_langExtension, source)(job);
+
+      // Integrate the decorations and tags back into the source code,
+      // modifying the sourceNode in place.
+      recombineTagsAndDecorations(job);
+    } catch (e) {
+      if (win['console']) {
+        console['log'](e && e['stack'] || e);
+      }
+    }
+  }
+
+  /**
+   * Pretty print a chunk of code.
+   * @param sourceCodeHtml {string} The HTML to pretty print.
+   * @param opt_langExtension {string} The language name to use.
+   *     Typically, a filename extension like 'cpp' or 'java'.
+   * @param opt_numberLines {number|boolean} True to number lines,
+   *     or the 1-indexed number of the first line in sourceCodeHtml.
+   */
+  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
+    /** @type{number|boolean} */
+    var nl = opt_numberLines || false;
+    /** @type{string|null} */
+    var langExtension = opt_langExtension || null;
+    /** @type{!Element} */
+    var container = document.createElement('div');
+    // This could cause images to load and onload listeners to fire.
+    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
+    // We assume that the inner HTML is from a trusted source.
+    // The pre-tag is required for IE8 which strips newlines from innerHTML
+    // when it is injected into a <pre> tag.
+    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
+    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
+    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
+    container = /** @type{!Element} */(container.firstChild);
+    if (nl) {
+      numberLines(container, nl, true);
+    }
+
+    /** @type{JobT} */
+    var job = {
+      langExtension: langExtension,
+      numberLines: nl,
+      sourceNode: container,
+      pre: 1,
+      sourceCode: null,
+      basePos: null,
+      spans: null,
+      decorations: null
+    };
+    applyDecorator(job);
+    return container.innerHTML;
+  }
+
+   /**
+    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+    * {@code class=prettyprint} and prettify them.
+    *
+    * @param {Function} opt_whenDone called when prettifying is done.
+    * @param {HTMLElement|HTMLDocument} opt_root an element or document
+    *   containing all the elements to pretty print.
+    *   Defaults to {@code document.body}.
+    */
+  function $prettyPrint(opt_whenDone, opt_root) {
+    var root = opt_root || document.body;
+    var doc = root.ownerDocument || document;
+    function byTagName(tn) { return root.getElementsByTagName(tn); }
+    // fetch a list of nodes to rewrite
+    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
+    var elements = [];
+    for (var i = 0; i < codeSegments.length; ++i) {
+      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
+        elements.push(codeSegments[i][j]);
+      }
+    }
+    codeSegments = null;
+
+    var clock = Date;
+    if (!clock['now']) {
+      clock = { 'now': function () { return +(new Date); } };
+    }
+
+    // The loop is broken into a series of continuations to make sure that we
+    // don't make the browser unresponsive when rewriting a large page.
+    var k = 0;
+
+    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
+    var prettyPrintRe = /\bprettyprint\b/;
+    var prettyPrintedRe = /\bprettyprinted\b/;
+    var preformattedTagNameRe = /pre|xmp/i;
+    var codeRe = /^code$/i;
+    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
+    var EMPTY = {};
+
+    function doWork() {
+      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
+                     clock['now']() + 250 /* ms */ :
+                     Infinity);
+      for (; k < elements.length && clock['now']() < endTime; k++) {
+        var cs = elements[k];
+
+        // Look for a preceding comment like
+        // <?prettify lang="..." linenums="..."?>
+        var attrs = EMPTY;
+        {
+          for (var preceder = cs; (preceder = preceder.previousSibling);) {
+            var nt = preceder.nodeType;
+            // <?foo?> is parsed by HTML 5 to a comment node (8)
+            // like <!--?foo?-->, but in XML is a processing instruction
+            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
+            if (value
+                ? !/^\??prettify\b/.test(value)
+                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
+              // Skip over white-space text nodes but not others.
+              break;
+            }
+            if (value) {
+              attrs = {};
+              value.replace(
+                  /\b(\w+)=([\w:.%+-]+)/g,
+                function (_, name, value) { attrs[name] = value; });
+              break;
+            }
+          }
+        }
+
+        var className = cs.className;
+        if ((attrs !== EMPTY || prettyPrintRe.test(className))
+            // Don't redo this if we've already done it.
+            // This allows recalling pretty print to just prettyprint elements
+            // that have been added to the page since last call.
+            && !prettyPrintedRe.test(className)) {
+
+          // make sure this is not nested in an already prettified element
+          var nested = false;
+          for (var p = cs.parentNode; p; p = p.parentNode) {
+            var tn = p.tagName;
+            if (preCodeXmpRe.test(tn)
+                && p.className && prettyPrintRe.test(p.className)) {
+              nested = true;
+              break;
+            }
+          }
+          if (!nested) {
+            // Mark done.  If we fail to prettyprint for whatever reason,
+            // we shouldn't try again.
+            cs.className += ' prettyprinted';
+
+            // If the classes includes a language extensions, use it.
+            // Language extensions can be specified like
+            //     <pre class="prettyprint lang-cpp">
+            // the language extension "cpp" is used to find a language handler
+            // as passed to PR.registerLangHandler.
+            // HTML5 recommends that a language be specified using "language-"
+            // as the prefix instead.  Google Code Prettify supports both.
+            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
+            var langExtension = attrs['lang'];
+            if (!langExtension) {
+              langExtension = className.match(langExtensionRe);
+              // Support <pre class="prettyprint"><code class="language-c">
+              var wrapper;
+              if (!langExtension && (wrapper = childContentWrapper(cs))
+                  && codeRe.test(wrapper.tagName)) {
+                langExtension = wrapper.className.match(langExtensionRe);
+              }
+
+              if (langExtension) { langExtension = langExtension[1]; }
+            }
+
+            var preformatted;
+            if (preformattedTagNameRe.test(cs.tagName)) {
+              preformatted = 1;
+            } else {
+              var currentStyle = cs['currentStyle'];
+              var defaultView = doc.defaultView;
+              var whitespace = (
+                  currentStyle
+                  ? currentStyle['whiteSpace']
+                  : (defaultView
+                     && defaultView.getComputedStyle)
+                  ? defaultView.getComputedStyle(cs, null)
+                  .getPropertyValue('white-space')
+                  : 0);
+              preformatted = whitespace
+                  && 'pre' === whitespace.substring(0, 3);
+            }
+
+            // Look for a class like linenums or linenums:<n> where <n> is the
+            // 1-indexed number of the first line.
+            var lineNums = attrs['linenums'];
+            if (!(lineNums = lineNums === 'true' || +lineNums)) {
+              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
+              lineNums =
+                lineNums
+                ? lineNums[1] && lineNums[1].length
+                  ? +lineNums[1] : true
+                : false;
+            }
+            if (lineNums) { numberLines(cs, lineNums, preformatted); }
+
+            // do the pretty printing
+            var prettyPrintingJob = {
+              langExtension: langExtension,
+              sourceNode: cs,
+              numberLines: lineNums,
+              pre: preformatted,
+              sourceCode: null,
+              basePos: null,
+              spans: null,
+              decorations: null
+            };
+            applyDecorator(prettyPrintingJob);
+          }
+        }
+      }
+      if (k < elements.length) {
+        // finish up in a continuation
+        win.setTimeout(doWork, 250);
+      } else if ('function' === typeof opt_whenDone) {
+        opt_whenDone();
+      }
+    }
+
+    doWork();
+  }
+
+  /**
+   * Contains functions for creating and registering new language handlers.
+   * @type {Object}
+   */
+  var PR = win['PR'] = {
+        'createSimpleLexer': createSimpleLexer,
+        'registerLangHandler': registerLangHandler,
+        'sourceDecorator': sourceDecorator,
+        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
+        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
+        'PR_COMMENT': PR_COMMENT,
+        'PR_DECLARATION': PR_DECLARATION,
+        'PR_KEYWORD': PR_KEYWORD,
+        'PR_LITERAL': PR_LITERAL,
+        'PR_NOCODE': PR_NOCODE,
+        'PR_PLAIN': PR_PLAIN,
+        'PR_PUNCTUATION': PR_PUNCTUATION,
+        'PR_SOURCE': PR_SOURCE,
+        'PR_STRING': PR_STRING,
+        'PR_TAG': PR_TAG,
+        'PR_TYPE': PR_TYPE,
+        'prettyPrintOne':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrintOne'] = $prettyPrintOne)
+             : (prettyPrintOne = $prettyPrintOne),
+        'prettyPrint':
+           IN_GLOBAL_SCOPE
+             ? (win['prettyPrint'] = $prettyPrint)
+             : (prettyPrint = $prettyPrint)
+      };
+
+  // Make PR available via the Asynchronous Module Definition (AMD) API.
+  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
+  // The Asynchronous Module Definition (AMD) API specifies a
+  // mechanism for defining modules such that the module and its
+  // dependencies can be asynchronously loaded.
+  // ...
+  // To allow a clear indicator that a global define function (as
+  // needed for script src browser loading) conforms to the AMD API,
+  // any global define function SHOULD have a property called "amd"
+  // whose value is an object. This helps avoid conflict with any
+  // other existing JavaScript code that could have defined a define()
+  // function that does not conform to the AMD API.
+  var define = win['define'];
+  if (typeof define === "function" && define['amd']) {
+    define("google-code-prettify", [], function () {
+      return PR;
+    });
+  }
+})();
diff --git a/static/bower_components/google-prettify/src/run_prettify.js b/static/bower_components/google-prettify/src/run_prettify.js
new file mode 100644
index 00000000..f71fc192
--- /dev/null
+++ b/static/bower_components/google-prettify/src/run_prettify.js
@@ -0,0 +1,2008 @@
+/**
+ * @license
+ * Copyright (C) 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview
+ * <div style="white-space: pre">
+ * Looks at query parameters to decide which language handlers and style-sheets
+ * to load.
+ *
+ * Query Parameter     Format           Effect                        Default
+ * +------------------+---------------+------------------------------+--------+
+ * | autorun=         | true | false  | If true then prettyPrint()   | "true" |
+ * |                  |               | is called on page load.      |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | lang=            | language name | Loads the language handler   | Can    |
+ * |                  |               | named "lang-<NAME>.js".      | appear |
+ * |                  |               | See available handlers at    | many   |
+ * |                  |               | https://github.com/google/   | times. |
+ * |                  |               | code-prettify/tree/master/   |        |
+ * |                  |               | src                          |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | skin=            | skin name     | Loads the skin stylesheet    | none.  |
+ * |                  |               | named "<NAME>.css".          |        |
+ * |                  |               | https://cdn.rawgit.com/      |        |
+ * |                  |               | google/code-prettify/master/ |        |
+ * |                  |               | styles/index.html            |        |
+ * +------------------+---------------+------------------------------+--------+
+ * | callback=        | JS identifier | When "prettyPrint" finishes  | none   |
+ * |                  |               | window.exports[js_ident] is  |        |
+ * |                  |               | called.                      |        |
+ * |                  |               | The callback must be under   |        |
+ * |                  |               | exports to reduce the risk   |        |
+ * |                  |               | of XSS via query parameter   |        |
+ * |                  |               | injection.                   |        |
+ * +------------------+---------------+------------------------------+--------+
+ *
+ * Examples
+ * .../run_prettify.js?lang=css&skin=sunburst
+ *   1. Loads the CSS language handler which can be used to prettify CSS
+ *      stylesheets, HTML <style> element bodies and style="..." attributes
+ *      values.
+ *   2. Loads the sunburst.css stylesheet instead of the default prettify.css
+ *      stylesheet.
+ *      A gallery of stylesheets is available at
+ *      https://cdn.rawgit.com/google/code-prettify/master/styles/index.html
+ *   3. Since autorun=false is not specified, calls prettyPrint() on page load.
+ * </div>
+ */
+
+/**
+ * @typedef {!Array.<number|string>}
+ * Alternating indices and the decorations that should be inserted there.
+ * The indices are monotonically increasing.
+ */
+var DecorationsT;
+
+/**
+ * @typedef {!{
+ *   sourceNode: !Element,
+ *   pre: !(number|boolean),
+ *   langExtension: ?string,
+ *   numberLines: ?(number|boolean),
+ *   sourceCode: ?string,
+ *   spans: ?(Array.<number|Node>),
+ *   basePos: ?number,
+ *   decorations: ?DecorationsT
+ * }}
+ * <dl>
+ *  <dt>sourceNode<dd>the element containing the source
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>pre<dd>truthy if white-space in text nodes
+ *     should be considered significant.
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ *  <dt>decorations<dd>an array of style classes preceded
+ *     by the position at which they start in job.sourceCode in order
+ *  <dt>basePos<dd>integer position of this.sourceCode in the larger chunk of
+ *     source.
+ * </dl>
+ */
+var JobT;
+
+/**
+ * @typedef {!{
+ *   sourceCode: string,
+ *   spans: !(Array.<number|Node>)
+ * }}
+ * <dl>
+ *  <dt>sourceCode<dd>source as plain text
+ *  <dt>spans<dd> alternating span start indices into source
+ *     and the text node or element (e.g. {@code <BR>}) corresponding to that
+ *     span.
+ * </dl>
+ */
+var SourceSpansT;
+
+/** @define {boolean} */
+var IN_GLOBAL_SCOPE = false;
+
+
+(function () {
+  "use strict";
+
+  var win = window;
+  var doc = document;
+  var root = doc.documentElement;
+  var head = doc['head'] || doc.getElementsByTagName("head")[0] || root;
+
+  // From http://javascript.nwbox.com/ContentLoaded/contentloaded.js
+  // Author: Diego Perini (diego.perini at gmail.com)
+  // Summary: cross-browser wrapper for DOMContentLoaded
+  // Updated: 20101020
+  // License: MIT
+  // Version: 1.2
+  function contentLoaded(callback) {
+    var addEventListener = doc['addEventListener'];
+    var done = false, top = true,
+        add = addEventListener ? 'addEventListener' : 'attachEvent',
+        rem = addEventListener ? 'removeEventListener' : 'detachEvent',
+        pre = addEventListener ? '' : 'on',
+
+        init = function(e) {
+          if (e.type == 'readystatechange' && doc.readyState != 'complete') {
+            return;
+          }
+          (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);
+          if (!done && (done = true)) { callback.call(win, e.type || e); }
+        },
+
+        poll = function() {
+          try {
+            root.doScroll('left');
+          } catch(e) {
+            win.setTimeout(poll, 50);
+            return;
+          }
+          init('poll');
+        };
+
+    if (doc.readyState == 'complete') {
+      callback.call(win, 'lazy');
+    } else {
+      if (doc.createEventObject && root.doScroll) {
+        try { top = !win.frameElement; } catch(e) { }
+        if (top) { poll(); }
+      }
+      doc[add](pre + 'DOMContentLoaded', init, false);
+      doc[add](pre + 'readystatechange', init, false);
+      win[add](pre + 'load', init, false);
+    }
+  }
+
+  // Given a list of URLs to stylesheets, loads the first that loads without
+  // triggering an error event.
+  function loadStylesheetsFallingBack(stylesheets) {
+    var n = stylesheets.length;
+    function load(i) {
+      if (i === n) { return; }
+      var link = doc.createElement('link');
+      link.rel = 'stylesheet';
+      link.type = 'text/css';
+      if (i + 1 < n) {
+        // http://pieisgood.org/test/script-link-events/ indicates that many
+        // versions of IE do not support onerror on <link>s, though
+        // http://msdn.microsoft.com/en-us/library/ie/ms535848(v=vs.85).aspx
+        // indicates that recent IEs do support error.
+        link.error = link.onerror = function () { load(i + 1); };
+      }
+      link.href = stylesheets[i];
+      head.appendChild(link);
+    }
+    load(0);
+  }
+
+  var scriptQuery = '';
+  // Look for the <script> node that loads this script to get its parameters.
+  // This starts looking at the end instead of just considering the last
+  // because deferred and async scripts run out of order.
+  // If the script is loaded twice, then this will run in reverse order.
+  var scripts = doc.getElementsByTagName('script');
+  for (var i = scripts.length; --i >= 0;) {
+    var script = scripts[i];
+    var match = script.src.match(
+        /^[^?#]*\/run_prettify\.js(\?[^#]*)?(?:#.*)?$/);
+    if (match) {
+      scriptQuery = match[1] || '';
+      // Remove the script from the DOM so that multiple runs at least run
+      // multiple times even if parameter sets are interpreted in reverse
+      // order.
+      script.parentNode.removeChild(script);
+      break;
+    }
+  }
+
+  // Pull parameters into local variables.
+  var autorun = true;
+  var langs = [];
+  var skins = [];
+  var callbacks = [];
+  scriptQuery.replace(
+      /[?&]([^&=]+)=([^&]+)/g,
+      function (_, name, value) {
+        value = decodeURIComponent(value);
+        name = decodeURIComponent(name);
+        if (name == 'autorun')   { autorun = !/^[0fn]/i.test(value); } else
+        if (name == 'lang')      { langs.push(value);                } else
+        if (name == 'skin')      { skins.push(value);                } else
+        if (name == 'callback')  { callbacks.push(value);            }
+      });
+
+  // Use https to avoid mixed content warnings in client pages and to
+  // prevent a MITM from rewrite prettify mid-flight.
+  // This only works if this script is loaded via https : something
+  // over which we exercise no control.
+  var LOADER_BASE_URL =
+     'https://cdn.rawgit.com/google/code-prettify/master/loader';
+
+  for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {
+    var script = doc.createElement("script");
+
+    // Excerpted from jQuery.ajaxTransport("script") to fire events when
+    // a script is finished loading.
+    // Attach handlers for each script
+    script.onload = script.onerror = script.onreadystatechange = function () {
+      if (script && (
+            !script.readyState || /loaded|complete/.test(script.readyState))) {
+        // Handle memory leak in IE
+        script.onerror = script.onload = script.onreadystatechange = null;
+
+        --pendingLanguages;
+        checkPendingLanguages();
+
+        // Remove the script
+        if (script.parentNode) {
+          script.parentNode.removeChild(script);
+        }
+
+        script = null;
+      }
+    };
+
+    script.type = 'text/javascript';
+    script.src = LOADER_BASE_URL
+      + '/lang-' + encodeURIComponent(langs[i]) + '.js';
+
+    // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+    head.insertBefore(script, head.firstChild);
+  })(langs[i]);
+
+  var pendingLanguages = langs.length;
+  function checkPendingLanguages() {
+    if (!pendingLanguages) {
+      win.setTimeout(onLangsLoaded, 0);
+    }
+  }
+
+  var skinUrls = [];
+  for (var i = 0, n = skins.length; i < n; ++i) {
+    skinUrls.push(LOADER_BASE_URL
+        + '/skins/' + encodeURIComponent(skins[i]) + '.css');
+  }
+  skinUrls.push(LOADER_BASE_URL + '/prettify.css');
+  loadStylesheetsFallingBack(skinUrls);
+
+  var prettyPrint = (function () {
+    /**
+     * @license
+     * Copyright (C) 2006 Google Inc.
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *      http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /**
+     * @fileoverview
+     * some functions for browser-side pretty printing of code contained in html.
+     *
+     * <p>
+     * For a fairly comprehensive set of languages see the
+     * <a href="https://github.com/google/code-prettify#for-which-languages-does-it-work">README</a>
+     * file that came with this source.  At a minimum, the lexer should work on a
+     * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+     * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
+     * and a subset of Perl, but, because of commenting conventions, doesn't work on
+     * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+     * <p>
+     * Usage: <ol>
+     * <li> include this source file in an html page via
+     *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
+     * <li> define style rules.  See the example page for examples.
+     * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
+     *    {@code class=prettyprint.}
+     *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
+     *    printer needs to do more substantial DOM manipulations to support that, so
+     *    some css styles may not be preserved.
+     * </ol>
+     * That's it.  I wanted to keep the API as simple as possible, so there's no
+     * need to specify which language the code is in, but if you wish, you can add
+     * another class to the {@code <pre>} or {@code <code>} element to specify the
+     * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
+     * starts with "lang-" followed by a file extension, specifies the file type.
+     * See the "lang-*.js" files in this directory for code that implements
+     * per-language file handlers.
+     * <p>
+     * Change log:<br>
+     * cbeust, 2006/08/22
+     * <blockquote>
+     *   Java annotations (start with "@") are now captured as literals ("lit")
+     * </blockquote>
+     * @requires console
+     */
+
+    // JSLint declarations
+    /*global console, document, navigator, setTimeout, window, define */
+
+
+    /**
+     * {@type !{
+     *   'createSimpleLexer': function (Array, Array): (function (JobT)),
+     *   'registerLangHandler': function (function (JobT), Array.<string>),
+     *   'PR_ATTRIB_NAME': string,
+     *   'PR_ATTRIB_NAME': string,
+     *   'PR_ATTRIB_VALUE': string,
+     *   'PR_COMMENT': string,
+     *   'PR_DECLARATION': string,
+     *   'PR_KEYWORD': string,
+     *   'PR_LITERAL': string,
+     *   'PR_NOCODE': string,
+     *   'PR_PLAIN': string,
+     *   'PR_PUNCTUATION': string,
+     *   'PR_SOURCE': string,
+     *   'PR_STRING': string,
+     *   'PR_TAG': string,
+     *   'PR_TYPE': string,
+     *   'prettyPrintOne': function (string, string, number|boolean),
+     *   'prettyPrint': function (?function, ?(HTMLElement|HTMLDocument))
+     * }}
+     * @const
+     */
+    var PR;
+
+    /**
+     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+     * UI events.
+     * If set to {@code false}, {@code prettyPrint()} is synchronous.
+     */
+    var PR_SHOULD_USE_CONTINUATION = true
+    if (typeof window !== 'undefined') {
+      window['PR_SHOULD_USE_CONTINUATION'] = PR_SHOULD_USE_CONTINUATION;
+    }
+
+    /**
+     * Pretty print a chunk of code.
+     * @param {string} sourceCodeHtml The HTML to pretty print.
+     * @param {string} opt_langExtension The language name to use.
+     *     Typically, a filename extension like 'cpp' or 'java'.
+     * @param {number|boolean} opt_numberLines True to number lines,
+     *     or the 1-indexed number of the first line in sourceCodeHtml.
+     * @return {string} code as html, but prettier
+     */
+    var prettyPrintOne;
+    /**
+     * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+     * {@code class=prettyprint} and prettify them.
+     *
+     * @param {Function} opt_whenDone called when prettifying is done.
+     * @param {HTMLElement|HTMLDocument} opt_root an element or document
+     *   containing all the elements to pretty print.
+     *   Defaults to {@code document.body}.
+     */
+    var prettyPrint;
+
+
+    (function () {
+      var win = (typeof window !== 'undefined') ? window : {};
+      // Keyword lists for various languages.
+      // We use things that coerce to strings to make them compact when minified
+      // and to defeat aggressive optimizers that fold large string constants.
+      var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
+      var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
+          "double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed," +
+          "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
+      var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
+          "new,operator,private,protected,public,this,throw,true,try,typeof"];
+      var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignas,alignof,align_union,asm,axiom,bool," +
+          "concept,concept_map,const_cast,constexpr,decltype,delegate," +
+          "dynamic_cast,explicit,export,friend,generic,late_check," +
+          "mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert," +
+          "static_cast,template,typeid,typename,using,virtual,where"];
+      var JAVA_KEYWORDS = [COMMON_KEYWORDS,
+          "abstract,assert,boolean,byte,extends,finally,final,implements,import," +
+          "instanceof,interface,null,native,package,strictfp,super,synchronized," +
+          "throws,transient"];
+      var CSHARP_KEYWORDS = [COMMON_KEYWORDS,
+          "abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending," +
+          "dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface," +
+          "internal,into,is,join,let,lock,null,object,out,override,orderby,params," +
+          "partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong," +
+          "unchecked,unsafe,ushort,value,var,virtual,where,yield"];
+      var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
+          "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
+          "throw,true,try,unless,until,when,while,yes";
+      var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
+          "abstract,async,await,constructor,debugger,enum,eval,export,from,function," +
+          "get,import,implements,instanceof,interface,let,null,of,set,undefined," +
+          "var,with,yield,Infinity,NaN"];
+      var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
+          "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
+          "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
+      var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
+          "elif,except,exec,finally,from,global,import,in,is,lambda," +
+          "nonlocal,not,or,pass,print,raise,try,with,yield," +
+          "False,True,None"];
+      var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
+          "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
+          "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
+          "BEGIN,END"];
+      var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
+          "function,in,local,set,then,until"];
+      var ALL_KEYWORDS = [
+          CPP_KEYWORDS, CSHARP_KEYWORDS, JAVA_KEYWORDS, JSCRIPT_KEYWORDS,
+          PERL_KEYWORDS, PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
+      var C_TYPES = /^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
+
+      // token style names.  correspond to css classes
+      /**
+       * token style for a string literal
+       * @const
+       */
+      var PR_STRING = 'str';
+      /**
+       * token style for a keyword
+       * @const
+       */
+      var PR_KEYWORD = 'kwd';
+      /**
+       * token style for a comment
+       * @const
+       */
+      var PR_COMMENT = 'com';
+      /**
+       * token style for a type
+       * @const
+       */
+      var PR_TYPE = 'typ';
+      /**
+       * token style for a literal value.  e.g. 1, null, true.
+       * @const
+       */
+      var PR_LITERAL = 'lit';
+      /**
+       * token style for a punctuation string.
+       * @const
+       */
+      var PR_PUNCTUATION = 'pun';
+      /**
+       * token style for plain text.
+       * @const
+       */
+      var PR_PLAIN = 'pln';
+
+      /**
+       * token style for an sgml tag.
+       * @const
+       */
+      var PR_TAG = 'tag';
+      /**
+       * token style for a markup declaration such as a DOCTYPE.
+       * @const
+       */
+      var PR_DECLARATION = 'dec';
+      /**
+       * token style for embedded source.
+       * @const
+       */
+      var PR_SOURCE = 'src';
+      /**
+       * token style for an sgml attribute name.
+       * @const
+       */
+      var PR_ATTRIB_NAME = 'atn';
+      /**
+       * token style for an sgml attribute value.
+       * @const
+       */
+      var PR_ATTRIB_VALUE = 'atv';
+
+      /**
+       * A class that indicates a section of markup that is not code, e.g. to allow
+       * embedding of line numbers within code listings.
+       * @const
+       */
+      var PR_NOCODE = 'nocode';
+
+
+      // Regex pattern below is automatically generated by regexpPrecederPatterns.pl
+      // Do not modify, your changes will be erased.
+
+      // CAVEAT: this does not properly handle the case where a regular
+      // expression immediately follows another since a regular expression may
+      // have flags for case-sensitivity and the like.  Having regexp tokens
+      // adjacent is not valid in any language I'm aware of, so I'm punting.
+      // TODO: maybe style special characters inside a regexp as punctuation.
+
+      /**
+       * A set of tokens that can precede a regular expression literal in
+       * javascript
+       * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
+       * has the full list, but I've removed ones that might be problematic when
+       * seen in languages that don't support regular expression literals.
+       *
+       * Specifically, I've removed any keywords that can't precede a regexp
+       * literal in a syntactically legal javascript program, and I've removed the
+       * "in" keyword since it's not a keyword in many languages, and might be used
+       * as a count of inches.
+       *
+       * The link above does not accurately describe EcmaScript rules since
+       * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+       * very well in practice.
+       *
+       * @private
+       * @const
+       */
+      var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
+
+
+      /**
+       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+       * matches the union of the sets of strings matched by the input RegExp.
+       * Since it matches globally, if the input strings have a start-of-input
+       * anchor (/^.../), it is ignored for the purposes of unioning.
+       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
+       * @return {RegExp} a global regex.
+       */
+      function combinePrefixPatterns(regexs) {
+        var capturedGroupIndex = 0;
+
+        var needToFoldCase = false;
+        var ignoreCase = false;
+        for (var i = 0, n = regexs.length; i < n; ++i) {
+          var regex = regexs[i];
+          if (regex.ignoreCase) {
+            ignoreCase = true;
+          } else if (/[a-z]/i.test(regex.source.replace(
+                         /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+            needToFoldCase = true;
+            ignoreCase = false;
+            break;
+          }
+        }
+
+        var escapeCharToCodeUnit = {
+          'b': 8,
+          't': 9,
+          'n': 0xa,
+          'v': 0xb,
+          'f': 0xc,
+          'r': 0xd
+        };
+
+        function decodeEscape(charsetPart) {
+          var cc0 = charsetPart.charCodeAt(0);
+          if (cc0 !== 92 /* \\ */) {
+            return cc0;
+          }
+          var c1 = charsetPart.charAt(1);
+          cc0 = escapeCharToCodeUnit[c1];
+          if (cc0) {
+            return cc0;
+          } else if ('0' <= c1 && c1 <= '7') {
+            return parseInt(charsetPart.substring(1), 8);
+          } else if (c1 === 'u' || c1 === 'x') {
+            return parseInt(charsetPart.substring(2), 16);
+          } else {
+            return charsetPart.charCodeAt(1);
+          }
+        }
+
+        function encodeEscape(charCode) {
+          if (charCode < 0x20) {
+            return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+          }
+          var ch = String.fromCharCode(charCode);
+          return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
+              ? "\\" + ch : ch;
+        }
+
+        function caseFoldCharset(charSet) {
+          var charsetParts = charSet.substring(1, charSet.length - 1).match(
+              new RegExp(
+                  '\\\\u[0-9A-Fa-f]{4}'
+                  + '|\\\\x[0-9A-Fa-f]{2}'
+                  + '|\\\\[0-3][0-7]{0,2}'
+                  + '|\\\\[0-7]{1,2}'
+                  + '|\\\\[\\s\\S]'
+                  + '|-'
+                  + '|[^-\\\\]',
+                  'g'));
+          var ranges = [];
+          var inverse = charsetParts[0] === '^';
+
+          var out = ['['];
+          if (inverse) { out.push('^'); }
+
+          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+            var p = charsetParts[i];
+            if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
+              out.push(p);
+            } else {
+              var start = decodeEscape(p);
+              var end;
+              if (i + 2 < n && '-' === charsetParts[i + 1]) {
+                end = decodeEscape(charsetParts[i + 2]);
+                i += 2;
+              } else {
+                end = start;
+              }
+              ranges.push([start, end]);
+              // If the range might intersect letters, then expand it.
+              // This case handling is too simplistic.
+              // It does not deal with non-latin case folding.
+              // It works for latin source code identifiers though.
+              if (!(end < 65 || start > 122)) {
+                if (!(end < 65 || start > 90)) {
+                  ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+                }
+                if (!(end < 97 || start > 122)) {
+                  ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+                }
+              }
+            }
+          }
+
+          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+          // -> [[1, 12], [14, 14], [16, 17]]
+          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
+          var consolidatedRanges = [];
+          var lastRange = [];
+          for (var i = 0; i < ranges.length; ++i) {
+            var range = ranges[i];
+            if (range[0] <= lastRange[1] + 1) {
+              lastRange[1] = Math.max(lastRange[1], range[1]);
+            } else {
+              consolidatedRanges.push(lastRange = range);
+            }
+          }
+
+          for (var i = 0; i < consolidatedRanges.length; ++i) {
+            var range = consolidatedRanges[i];
+            out.push(encodeEscape(range[0]));
+            if (range[1] > range[0]) {
+              if (range[1] + 1 > range[0]) { out.push('-'); }
+              out.push(encodeEscape(range[1]));
+            }
+          }
+          out.push(']');
+          return out.join('');
+        }
+
+        function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+          // Split into character sets, escape sequences, punctuation strings
+          // like ('(', '(?:', ')', '^'), and runs of characters that do not
+          // include any of the above.
+          var parts = regex.source.match(
+              new RegExp(
+                  '(?:'
+                  + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
+                  + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
+                  + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
+                  + '|\\\\[0-9]+'  // a back-reference or octal escape
+                  + '|\\\\[^ux0-9]'  // other escape sequence
+                  + '|\\(\\?[:!=]'  // start of a non-capturing group
+                  + '|[\\(\\)\\^]'  // start/end of a group, or line start
+                  + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
+                  + ')',
+                  'g'));
+          var n = parts.length;
+
+          // Maps captured group numbers to the number they will occupy in
+          // the output or to -1 if that has not been determined, or to
+          // undefined if they need not be capturing in the output.
+          var capturedGroups = [];
+
+          // Walk over and identify back references to build the capturedGroups
+          // mapping.
+          for (var i = 0, groupIndex = 0; i < n; ++i) {
+            var p = parts[i];
+            if (p === '(') {
+              // groups are 1-indexed, so max group index is count of '('
+              ++groupIndex;
+            } else if ('\\' === p.charAt(0)) {
+              var decimalValue = +p.substring(1);
+              if (decimalValue) {
+                if (decimalValue <= groupIndex) {
+                  capturedGroups[decimalValue] = -1;
+                } else {
+                  // Replace with an unambiguous escape sequence so that
+                  // an octal escape sequence does not turn into a backreference
+                  // to a capturing group from an earlier regex.
+                  parts[i] = encodeEscape(decimalValue);
+                }
+              }
+            }
+          }
+
+          // Renumber groups and reduce capturing groups to non-capturing groups
+          // where possible.
+          for (var i = 1; i < capturedGroups.length; ++i) {
+            if (-1 === capturedGroups[i]) {
+              capturedGroups[i] = ++capturedGroupIndex;
+            }
+          }
+          for (var i = 0, groupIndex = 0; i < n; ++i) {
+            var p = parts[i];
+            if (p === '(') {
+              ++groupIndex;
+              if (!capturedGroups[groupIndex]) {
+                parts[i] = '(?:';
+              }
+            } else if ('\\' === p.charAt(0)) {
+              var decimalValue = +p.substring(1);
+              if (decimalValue && decimalValue <= groupIndex) {
+                parts[i] = '\\' + capturedGroups[decimalValue];
+              }
+            }
+          }
+
+          // Remove any prefix anchors so that the output will match anywhere.
+          // ^^ really does mean an anchored match though.
+          for (var i = 0; i < n; ++i) {
+            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+          }
+
+          // Expand letters to groups to handle mixing of case-sensitive and
+          // case-insensitive patterns if necessary.
+          if (regex.ignoreCase && needToFoldCase) {
+            for (var i = 0; i < n; ++i) {
+              var p = parts[i];
+              var ch0 = p.charAt(0);
+              if (p.length >= 2 && ch0 === '[') {
+                parts[i] = caseFoldCharset(p);
+              } else if (ch0 !== '\\') {
+                // TODO: handle letters in numeric escapes.
+                parts[i] = p.replace(
+                    /[a-zA-Z]/g,
+                    function (ch) {
+                      var cc = ch.charCodeAt(0);
+                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+                    });
+              }
+            }
+          }
+
+          return parts.join('');
+        }
+
+        var rewritten = [];
+        for (var i = 0, n = regexs.length; i < n; ++i) {
+          var regex = regexs[i];
+          if (regex.global || regex.multiline) { throw new Error('' + regex); }
+          rewritten.push(
+              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+        }
+
+        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+      }
+
+
+      /**
+       * Split markup into a string of source code and an array mapping ranges in
+       * that string to the text nodes in which they appear.
+       *
+       * <p>
+       * The HTML DOM structure:</p>
+       * <pre>
+       * (Element   "p"
+       *   (Element "b"
+       *     (Text  "print "))       ; #1
+       *   (Text    "'Hello '")      ; #2
+       *   (Element "br")            ; #3
+       *   (Text    "  + 'World';")) ; #4
+       * </pre>
+       * <p>
+       * corresponds to the HTML
+       * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
+       *
+       * <p>
+       * It will produce the output:</p>
+       * <pre>
+       * {
+       *   sourceCode: "print 'Hello '\n  + 'World';",
+       *   //                     1          2
+       *   //           012345678901234 5678901234567
+       *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
+       * }
+       * </pre>
+       * <p>
+       * where #1 is a reference to the {@code "print "} text node above, and so
+       * on for the other text nodes.
+       * </p>
+       *
+       * <p>
+       * The {@code} spans array is an array of pairs.  Even elements are the start
+       * indices of substrings, and odd elements are the text nodes (or BR elements)
+       * that contain the text for those substrings.
+       * Substrings continue until the next index or the end of the source.
+       * </p>
+       *
+       * @param {Node} node an HTML DOM subtree containing source-code.
+       * @param {boolean|number} isPreformatted truthy if white-space in
+       *    text nodes should be considered significant.
+       * @return {SourceSpansT} source code and the nodes in which they occur.
+       */
+      function extractSourceSpans(node, isPreformatted) {
+        var nocode = /(?:^|\s)nocode(?:\s|$)/;
+
+        var chunks = [];
+        var length = 0;
+        var spans = [];
+        var k = 0;
+
+        function walk(node) {
+          var type = node.nodeType;
+          if (type == 1) {  // Element
+            if (nocode.test(node.className)) { return; }
+            for (var child = node.firstChild; child; child = child.nextSibling) {
+              walk(child);
+            }
+            var nodeName = node.nodeName.toLowerCase();
+            if ('br' === nodeName || 'li' === nodeName) {
+              chunks[k] = '\n';
+              spans[k << 1] = length++;
+              spans[(k++ << 1) | 1] = node;
+            }
+          } else if (type == 3 || type == 4) {  // Text
+            var text = node.nodeValue;
+            if (text.length) {
+              if (!isPreformatted) {
+                text = text.replace(/[ \t\r\n]+/g, ' ');
+              } else {
+                text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
+              }
+              // TODO: handle tabs here?
+              chunks[k] = text;
+              spans[k << 1] = length;
+              length += text.length;
+              spans[(k++ << 1) | 1] = node;
+            }
+          }
+        }
+
+        walk(node);
+
+        return {
+          sourceCode: chunks.join('').replace(/\n$/, ''),
+          spans: spans
+        };
+      }
+
+
+      /**
+       * Apply the given language handler to sourceCode and add the resulting
+       * decorations to out.
+       * @param {!Element} sourceNode
+       * @param {number} basePos the index of sourceCode within the chunk of source
+       *    whose decorations are already present on out.
+       * @param {string} sourceCode
+       * @param {function(JobT)} langHandler
+       * @param {DecorationsT} out
+       */
+      function appendDecorations(
+          sourceNode, basePos, sourceCode, langHandler, out) {
+        if (!sourceCode) { return; }
+        /** @type {JobT} */
+        var job = {
+          sourceNode: sourceNode,
+          pre: 1,
+          langExtension: null,
+          numberLines: null,
+          sourceCode: sourceCode,
+          spans: null,
+          basePos: basePos,
+          decorations: null
+        };
+        langHandler(job);
+        out.push.apply(out, job.decorations);
+      }
+
+      var notWs = /\S/;
+
+      /**
+       * Given an element, if it contains only one child element and any text nodes
+       * it contains contain only space characters, return the sole child element.
+       * Otherwise returns undefined.
+       * <p>
+       * This is meant to return the CODE element in {@code <pre><code ...>} when
+       * there is a single child element that contains all the non-space textual
+       * content, but not to return anything where there are multiple child elements
+       * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
+       * is textual content.
+       */
+      function childContentWrapper(element) {
+        var wrapper = undefined;
+        for (var c = element.firstChild; c; c = c.nextSibling) {
+          var type = c.nodeType;
+          wrapper = (type === 1)  // Element Node
+              ? (wrapper ? element : c)
+              : (type === 3)  // Text Node
+              ? (notWs.test(c.nodeValue) ? element : wrapper)
+              : wrapper;
+        }
+        return wrapper === element ? undefined : wrapper;
+      }
+
+      /** Given triples of [style, pattern, context] returns a lexing function,
+        * The lexing function interprets the patterns to find token boundaries and
+        * returns a decoration list of the form
+        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+        * where index_n is an index into the sourceCode, and style_n is a style
+        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
+        * all characters in sourceCode[index_n-1:index_n].
+        *
+        * The stylePatterns is a list whose elements have the form
+        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+        *
+        * Style is a style constant like PR_PLAIN, or can be a string of the
+        * form 'lang-FOO', where FOO is a language extension describing the
+        * language of the portion of the token in $1 after pattern executes.
+        * E.g., if style is 'lang-lisp', and group 1 contains the text
+        * '(hello (world))', then that portion of the token will be passed to the
+        * registered lisp handler for formatting.
+        * The text before and after group 1 will be restyled using this decorator
+        * so decorators should take care that this doesn't result in infinite
+        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
+        * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
+        * '<script>foo()<\/script>', which would cause the current decorator to
+        * be called with '<script>' which would not match the same rule since
+        * group 1 must not be empty, so it would be instead styled as PR_TAG by
+        * the generic tag rule.  The handler registered for the 'js' extension would
+        * then be called with 'foo()', and finally, the current decorator would
+        * be called with '<\/script>' which would not match the original rule and
+        * so the generic tag rule would identify it as a tag.
+        *
+        * Pattern must only match prefixes, and if it matches a prefix, then that
+        * match is considered a token with the same style.
+        *
+        * Context is applied to the last non-whitespace, non-comment token
+        * recognized.
+        *
+        * Shortcut is an optional string of characters, any of which, if the first
+        * character, gurantee that this pattern and only this pattern matches.
+        *
+        * @param {Array} shortcutStylePatterns patterns that always start with
+        *   a known character.  Must have a shortcut string.
+        * @param {Array} fallthroughStylePatterns patterns that will be tried in
+        *   order if the shortcut ones fail.  May have shortcuts.
+        *
+        * @return {function (JobT)} a function that takes an undecorated job and
+        *   attaches a list of decorations.
+        */
+      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
+        var shortcuts = {};
+        var tokenizer;
+        (function () {
+          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
+          var allRegexs = [];
+          var regexKeys = {};
+          for (var i = 0, n = allPatterns.length; i < n; ++i) {
+            var patternParts = allPatterns[i];
+            var shortcutChars = patternParts[3];
+            if (shortcutChars) {
+              for (var c = shortcutChars.length; --c >= 0;) {
+                shortcuts[shortcutChars.charAt(c)] = patternParts;
+              }
+            }
+            var regex = patternParts[1];
+            var k = '' + regex;
+            if (!regexKeys.hasOwnProperty(k)) {
+              allRegexs.push(regex);
+              regexKeys[k] = null;
+            }
+          }
+          allRegexs.push(/[\0-\uffff]/);
+          tokenizer = combinePrefixPatterns(allRegexs);
+        })();
+
+        var nPatterns = fallthroughStylePatterns.length;
+
+        /**
+         * Lexes job.sourceCode and attaches an output array job.decorations of
+         * style classes preceded by the position at which they start in
+         * job.sourceCode in order.
+         *
+         * @type{function (JobT)}
+         */
+        var decorate = function (job) {
+          var sourceCode = job.sourceCode, basePos = job.basePos;
+          var sourceNode = job.sourceNode;
+          /** Even entries are positions in source in ascending order.  Odd enties
+            * are style markers (e.g., PR_COMMENT) that run from that position until
+            * the end.
+            * @type {DecorationsT}
+            */
+          var decorations = [basePos, PR_PLAIN];
+          var pos = 0;  // index into sourceCode
+          var tokens = sourceCode.match(tokenizer) || [];
+          var styleCache = {};
+
+          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
+            var token = tokens[ti];
+            var style = styleCache[token];
+            var match = void 0;
+
+            var isEmbedded;
+            if (typeof style === 'string') {
+              isEmbedded = false;
+            } else {
+              var patternParts = shortcuts[token.charAt(0)];
+              if (patternParts) {
+                match = token.match(patternParts[1]);
+                style = patternParts[0];
+              } else {
+                for (var i = 0; i < nPatterns; ++i) {
+                  patternParts = fallthroughStylePatterns[i];
+                  match = token.match(patternParts[1]);
+                  if (match) {
+                    style = patternParts[0];
+                    break;
+                  }
+                }
+
+                if (!match) {  // make sure that we make progress
+                  style = PR_PLAIN;
+                }
+              }
+
+              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
+              if (isEmbedded && !(match && typeof match[1] === 'string')) {
+                isEmbedded = false;
+                style = PR_SOURCE;
+              }
+
+              if (!isEmbedded) { styleCache[token] = style; }
+            }
+
+            var tokenStart = pos;
+            pos += token.length;
+
+            if (!isEmbedded) {
+              decorations.push(basePos + tokenStart, style);
+            } else {  // Treat group 1 as an embedded block of source code.
+              var embeddedSource = match[1];
+              var embeddedSourceStart = token.indexOf(embeddedSource);
+              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
+              if (match[2]) {
+                // If embeddedSource can be blank, then it would match at the
+                // beginning which would cause us to infinitely recurse on the
+                // entire token, so we catch the right context in match[2].
+                embeddedSourceEnd = token.length - match[2].length;
+                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
+              }
+              var lang = style.substring(5);
+              // Decorate the left of the embedded source
+              appendDecorations(
+                  sourceNode,
+                  basePos + tokenStart,
+                  token.substring(0, embeddedSourceStart),
+                  decorate, decorations);
+              // Decorate the embedded source
+              appendDecorations(
+                  sourceNode,
+                  basePos + tokenStart + embeddedSourceStart,
+                  embeddedSource,
+                  langHandlerForExtension(lang, embeddedSource),
+                  decorations);
+              // Decorate the right of the embedded section
+              appendDecorations(
+                  sourceNode,
+                  basePos + tokenStart + embeddedSourceEnd,
+                  token.substring(embeddedSourceEnd),
+                  decorate, decorations);
+            }
+          }
+          job.decorations = decorations;
+        };
+        return decorate;
+      }
+
+      /** returns a function that produces a list of decorations from source text.
+        *
+        * This code treats ", ', and ` as string delimiters, and \ as a string
+        * escape.  It does not recognize perl's qq() style strings.
+        * It has no special handling for double delimiter escapes as in basic, or
+        * the tripled delimiters used in python, but should work on those regardless
+        * although in those cases a single string literal may be broken up into
+        * multiple adjacent string literals.
+        *
+        * It recognizes C, C++, and shell style comments.
+        *
+        * @param {Object} options a set of optional parameters.
+        * @return {function (JobT)} a function that examines the source code
+        *     in the input job and builds a decoration list which it attaches to
+        *     the job.
+        */
+      function sourceDecorator(options) {
+        var shortcutStylePatterns = [], fallthroughStylePatterns = [];
+        if (options['tripleQuotedStrings']) {
+          // '''multi-line-string''', 'single-line-string', and double-quoted
+          shortcutStylePatterns.push(
+              [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
+               null, '\'"']);
+        } else if (options['multiLineStrings']) {
+          // 'multi-line-string', "multi-line-string"
+          shortcutStylePatterns.push(
+              [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
+               null, '\'"`']);
+        } else {
+          // 'single-line-string', "single-line-string"
+          shortcutStylePatterns.push(
+              [PR_STRING,
+               /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
+               null, '"\'']);
+        }
+        if (options['verbatimStrings']) {
+          // verbatim-string-literal production from the C# grammar.  See issue 93.
+          fallthroughStylePatterns.push(
+              [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
+        }
+        var hc = options['hashComments'];
+        if (hc) {
+          if (options['cStyleComments']) {
+            if (hc > 1) {  // multiline hash comments
+              shortcutStylePatterns.push(
+                  [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
+            } else {
+              // Stop C preprocessor declarations at an unclosed open comment
+              shortcutStylePatterns.push(
+                  [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
+                   null, '#']);
+            }
+            // #include <stdio.h>
+            fallthroughStylePatterns.push(
+                [PR_STRING,
+                 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
+                 null]);
+          } else {
+            shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
+          }
+        }
+        if (options['cStyleComments']) {
+          fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
+          fallthroughStylePatterns.push(
+              [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
+        }
+        var regexLiterals = options['regexLiterals'];
+        if (regexLiterals) {
+          /**
+           * @const
+           */
+          var regexExcls = regexLiterals > 1
+            ? ''  // Multiline regex literals
+            : '\n\r';
+          /**
+           * @const
+           */
+          var regexAny = regexExcls ? '.' : '[\\S\\s]';
+          /**
+           * @const
+           */
+          var REGEX_LITERAL = (
+              // A regular expression literal starts with a slash that is
+              // not followed by * or / so that it is not confused with
+              // comments.
+              '/(?=[^/*' + regexExcls + '])'
+              // and then contains any number of raw characters,
+              + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
+              // escape sequences (\x5C),
+              +    '|\\x5C' + regexAny
+              // or non-nesting character sets (\x5B\x5D);
+              +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
+              +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
+              // finally closed by a /.
+              + '/');
+          fallthroughStylePatterns.push(
+              ['lang-regex',
+               RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
+               ]);
+        }
+
+        var types = options['types'];
+        if (types) {
+          fallthroughStylePatterns.push([PR_TYPE, types]);
+        }
+
+        var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
+        if (keywords.length) {
+          fallthroughStylePatterns.push(
+              [PR_KEYWORD,
+               new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
+               null]);
+        }
+
+        shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
+
+        var punctuation =
+          // The Bash man page says
+
+          // A word is a sequence of characters considered as a single
+          // unit by GRUB. Words are separated by metacharacters,
+          // which are the following plus space, tab, and newline: { }
+          // | & $ ; < >
+          // ...
+
+          // A word beginning with # causes that word and all remaining
+          // characters on that line to be ignored.
+
+          // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
+          // comment but empirically
+          // $ echo {#}
+          // {#}
+          // $ echo \$#
+          // $#
+          // $ echo }#
+          // }#
+
+          // so /(?:^|[|&;<>\s])/ is more appropriate.
+
+          // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
+          // suggests that this definition is compatible with a
+          // default mode that tries to use a single token definition
+          // to recognize both bash/python style comments and C
+          // preprocessor directives.
+
+          // This definition of punctuation does not include # in the list of
+          // follow-on exclusions, so # will not be broken before if preceeded
+          // by a punctuation character.  We could try to exclude # after
+          // [|&;<>] but that doesn't seem to cause many major problems.
+          // If that does turn out to be a problem, we should change the below
+          // when hc is truthy to include # in the run of punctuation characters
+          // only when not followint [|&;<>].
+          '^.[^\\s\\w.$@\'"`/\\\\]*';
+        if (options['regexLiterals']) {
+          punctuation += '(?!\s*\/)';
+        }
+
+        fallthroughStylePatterns.push(
+            // TODO(mikesamuel): recognize non-latin letters and numerals in idents
+            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
+            [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
+            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
+            [PR_LITERAL,
+             new RegExp(
+                 '^(?:'
+                 // A hex number
+                 + '0x[a-f0-9]+'
+                 // or an octal or decimal number,
+                 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
+                 // possibly in scientific notation
+                 + '(?:e[+\\-]?\\d+)?'
+                 + ')'
+                 // with an optional modifier like UL for unsigned long
+                 + '[a-z]*', 'i'),
+             null, '0123456789'],
+            // Don't treat escaped quotes in bash as starting strings.
+            // See issue 144.
+            [PR_PLAIN,       /^\\[\s\S]?/, null],
+            [PR_PUNCTUATION, new RegExp(punctuation), null]);
+
+        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
+      }
+
+      var decorateSource = sourceDecorator({
+            'keywords': ALL_KEYWORDS,
+            'hashComments': true,
+            'cStyleComments': true,
+            'multiLineStrings': true,
+            'regexLiterals': true
+          });
+
+      /**
+       * Given a DOM subtree, wraps it in a list, and puts each line into its own
+       * list item.
+       *
+       * @param {Node} node modified in place.  Its content is pulled into an
+       *     HTMLOListElement, and each line is moved into a separate list item.
+       *     This requires cloning elements, so the input might not have unique
+       *     IDs after numbering.
+       * @param {number|null|boolean} startLineNum
+       *     If truthy, coerced to an integer which is the 1-indexed line number
+       *     of the first line of code.  The number of the first line will be
+       *     attached to the list.
+       * @param {boolean} isPreformatted true iff white-space in text nodes should
+       *     be treated as significant.
+       */
+      function numberLines(node, startLineNum, isPreformatted) {
+        var nocode = /(?:^|\s)nocode(?:\s|$)/;
+        var lineBreak = /\r\n?|\n/;
+
+        var document = node.ownerDocument;
+
+        var li = document.createElement('li');
+        while (node.firstChild) {
+          li.appendChild(node.firstChild);
+        }
+        // An array of lines.  We split below, so this is initialized to one
+        // un-split line.
+        var listItems = [li];
+
+        function walk(node) {
+          var type = node.nodeType;
+          if (type == 1 && !nocode.test(node.className)) {  // Element
+            if ('br' === node.nodeName.toLowerCase()) {
+              breakAfter(node);
+              // Discard the <BR> since it is now flush against a </LI>.
+              if (node.parentNode) {
+                node.parentNode.removeChild(node);
+              }
+            } else {
+              for (var child = node.firstChild; child; child = child.nextSibling) {
+                walk(child);
+              }
+            }
+          } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
+            var text = node.nodeValue;
+            var match = text.match(lineBreak);
+            if (match) {
+              var firstLine = text.substring(0, match.index);
+              node.nodeValue = firstLine;
+              var tail = text.substring(match.index + match[0].length);
+              if (tail) {
+                var parent = node.parentNode;
+                parent.insertBefore(
+                  document.createTextNode(tail), node.nextSibling);
+              }
+              breakAfter(node);
+              if (!firstLine) {
+                // Don't leave blank text nodes in the DOM.
+                node.parentNode.removeChild(node);
+              }
+            }
+          }
+        }
+
+        // Split a line after the given node.
+        function breakAfter(lineEndNode) {
+          // If there's nothing to the right, then we can skip ending the line
+          // here, and move root-wards since splitting just before an end-tag
+          // would require us to create a bunch of empty copies.
+          while (!lineEndNode.nextSibling) {
+            lineEndNode = lineEndNode.parentNode;
+            if (!lineEndNode) { return; }
+          }
+
+          function breakLeftOf(limit, copy) {
+            // Clone shallowly if this node needs to be on both sides of the break.
+            var rightSide = copy ? limit.cloneNode(false) : limit;
+            var parent = limit.parentNode;
+            if (parent) {
+              // We clone the parent chain.
+              // This helps us resurrect important styling elements that cross lines.
+              // E.g. in <i>Foo<br>Bar</i>
+              // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
+              var parentClone = breakLeftOf(parent, 1);
+              // Move the clone and everything to the right of the original
+              // onto the cloned parent.
+              var next = limit.nextSibling;
+              parentClone.appendChild(rightSide);
+              for (var sibling = next; sibling; sibling = next) {
+                next = sibling.nextSibling;
+                parentClone.appendChild(sibling);
+              }
+            }
+            return rightSide;
+          }
+
+          var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
+
+          // Walk the parent chain until we reach an unattached LI.
+          for (var parent;
+               // Check nodeType since IE invents document fragments.
+               (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
+            copiedListItem = parent;
+          }
+          // Put it on the list of lines for later processing.
+          listItems.push(copiedListItem);
+        }
+
+        // Split lines while there are lines left to split.
+        for (var i = 0;  // Number of lines that have been split so far.
+             i < listItems.length;  // length updated by breakAfter calls.
+             ++i) {
+          walk(listItems[i]);
+        }
+
+        // Make sure numeric indices show correctly.
+        if (startLineNum === (startLineNum|0)) {
+          listItems[0].setAttribute('value', startLineNum);
+        }
+
+        var ol = document.createElement('ol');
+        ol.className = 'linenums';
+        var offset = Math.max(0, ((startLineNum - 1 /* zero index */)) | 0) || 0;
+        for (var i = 0, n = listItems.length; i < n; ++i) {
+          li = listItems[i];
+          // Stick a class on the LIs so that stylesheets can
+          // color odd/even rows, or any other row pattern that
+          // is co-prime with 10.
+          li.className = 'L' + ((i + offset) % 10);
+          if (!li.firstChild) {
+            li.appendChild(document.createTextNode('\xA0'));
+          }
+          ol.appendChild(li);
+        }
+
+        node.appendChild(ol);
+      }
+
+
+      /**
+       * Breaks {@code job.sourceCode} around style boundaries in
+       * {@code job.decorations} and modifies {@code job.sourceNode} in place.
+       * @param {JobT} job
+       * @private
+       */
+      function recombineTagsAndDecorations(job) {
+        var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
+        isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
+        var newlineRe = /\n/g;
+
+        var source = job.sourceCode;
+        var sourceLength = source.length;
+        // Index into source after the last code-unit recombined.
+        var sourceIndex = 0;
+
+        var spans = job.spans;
+        var nSpans = spans.length;
+        // Index into spans after the last span which ends at or before sourceIndex.
+        var spanIndex = 0;
+
+        var decorations = job.decorations;
+        var nDecorations = decorations.length;
+        // Index into decorations after the last decoration which ends at or before
+        // sourceIndex.
+        var decorationIndex = 0;
+
+        // Remove all zero-length decorations.
+        decorations[nDecorations] = sourceLength;
+        var decPos, i;
+        for (i = decPos = 0; i < nDecorations;) {
+          if (decorations[i] !== decorations[i + 2]) {
+            decorations[decPos++] = decorations[i++];
+            decorations[decPos++] = decorations[i++];
+          } else {
+            i += 2;
+          }
+        }
+        nDecorations = decPos;
+
+        // Simplify decorations.
+        for (i = decPos = 0; i < nDecorations;) {
+          var startPos = decorations[i];
+          // Conflate all adjacent decorations that use the same style.
+          var startDec = decorations[i + 1];
+          var end = i + 2;
+          while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
+            end += 2;
+          }
+          decorations[decPos++] = startPos;
+          decorations[decPos++] = startDec;
+          i = end;
+        }
+
+        nDecorations = decorations.length = decPos;
+
+        var sourceNode = job.sourceNode;
+        var oldDisplay = "";
+        if (sourceNode) {
+          oldDisplay = sourceNode.style.display;
+          sourceNode.style.display = 'none';
+        }
+        try {
+          var decoration = null;
+          while (spanIndex < nSpans) {
+            var spanStart = spans[spanIndex];
+            var spanEnd = /** @type{number} */ (spans[spanIndex + 2])
+                || sourceLength;
+
+            var decEnd = decorations[decorationIndex + 2] || sourceLength;
+
+            var end = Math.min(spanEnd, decEnd);
+
+            var textNode = /** @type{Node} */ (spans[spanIndex + 1]);
+            var styledText;
+            if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
+                // Don't introduce spans around empty text nodes.
+                && (styledText = source.substring(sourceIndex, end))) {
+              // This may seem bizarre, and it is.  Emitting LF on IE causes the
+              // code to display with spaces instead of line breaks.
+              // Emitting Windows standard issue linebreaks (CRLF) causes a blank
+              // space to appear at the beginning of every line but the first.
+              // Emitting an old Mac OS 9 line separator makes everything spiffy.
+              if (isIE8OrEarlier) {
+                styledText = styledText.replace(newlineRe, '\r');
+              }
+              textNode.nodeValue = styledText;
+              var document = textNode.ownerDocument;
+              var span = document.createElement('span');
+              span.className = decorations[decorationIndex + 1];
+              var parentNode = textNode.parentNode;
+              parentNode.replaceChild(span, textNode);
+              span.appendChild(textNode);
+              if (sourceIndex < spanEnd) {  // Split off a text node.
+                spans[spanIndex + 1] = textNode
+                    // TODO: Possibly optimize by using '' if there's no flicker.
+                    = document.createTextNode(source.substring(end, spanEnd));
+                parentNode.insertBefore(textNode, span.nextSibling);
+              }
+            }
+
+            sourceIndex = end;
+
+            if (sourceIndex >= spanEnd) {
+              spanIndex += 2;
+            }
+            if (sourceIndex >= decEnd) {
+              decorationIndex += 2;
+            }
+          }
+        } finally {
+          if (sourceNode) {
+            sourceNode.style.display = oldDisplay;
+          }
+        }
+      }
+
+
+      /** Maps language-specific file extensions to handlers. */
+      var langHandlerRegistry = {};
+      /** Register a language handler for the given file extensions.
+        * @param {function (JobT)} handler a function from source code to a list
+        *      of decorations.  Takes a single argument job which describes the
+        *      state of the computation and attaches the decorations to it.
+        * @param {Array.<string>} fileExtensions
+        */
+      function registerLangHandler(handler, fileExtensions) {
+        for (var i = fileExtensions.length; --i >= 0;) {
+          var ext = fileExtensions[i];
+          if (!langHandlerRegistry.hasOwnProperty(ext)) {
+            langHandlerRegistry[ext] = handler;
+          } else if (win['console']) {
+            console['warn']('cannot override language handler %s', ext);
+          }
+        }
+      }
+      function langHandlerForExtension(extension, source) {
+        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
+          // Treat it as markup if the first non whitespace character is a < and
+          // the last non-whitespace character is a >.
+          extension = /^\s*</.test(source)
+              ? 'default-markup'
+              : 'default-code';
+        }
+        return langHandlerRegistry[extension];
+      }
+      registerLangHandler(decorateSource, ['default-code']);
+      registerLangHandler(
+          createSimpleLexer(
+              [],
+              [
+               [PR_PLAIN,       /^[^<?]+/],
+               [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
+               [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
+               // Unescaped content in an unknown language
+               ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
+               ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
+               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
+               ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
+               // Unescaped content in javascript.  (Or possibly vbscript).
+               ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
+               // Contains unescaped stylesheet content
+               ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
+               ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
+              ]),
+          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
+      registerLangHandler(
+          createSimpleLexer(
+              [
+               [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
+               [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
+               ],
+              [
+               [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
+               [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
+               ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
+               [PR_PUNCTUATION,  /^[=<>\/]+/],
+               ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
+               ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
+               ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
+               ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
+               ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
+               ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
+               ]),
+          ['in.tag']);
+      registerLangHandler(
+          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
+      registerLangHandler(sourceDecorator({
+              'keywords': CPP_KEYWORDS,
+              'hashComments': true,
+              'cStyleComments': true,
+              'types': C_TYPES
+            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
+      registerLangHandler(sourceDecorator({
+              'keywords': 'null,true,false'
+            }), ['json']);
+      registerLangHandler(sourceDecorator({
+              'keywords': CSHARP_KEYWORDS,
+              'hashComments': true,
+              'cStyleComments': true,
+              'verbatimStrings': true,
+              'types': C_TYPES
+            }), ['cs']);
+      registerLangHandler(sourceDecorator({
+              'keywords': JAVA_KEYWORDS,
+              'cStyleComments': true
+            }), ['java']);
+      registerLangHandler(sourceDecorator({
+              'keywords': SH_KEYWORDS,
+              'hashComments': true,
+              'multiLineStrings': true
+            }), ['bash', 'bsh', 'csh', 'sh']);
+      registerLangHandler(sourceDecorator({
+              'keywords': PYTHON_KEYWORDS,
+              'hashComments': true,
+              'multiLineStrings': true,
+              'tripleQuotedStrings': true
+            }), ['cv', 'py', 'python']);
+      registerLangHandler(sourceDecorator({
+              'keywords': PERL_KEYWORDS,
+              'hashComments': true,
+              'multiLineStrings': true,
+              'regexLiterals': 2  // multiline regex literals
+            }), ['perl', 'pl', 'pm']);
+      registerLangHandler(sourceDecorator({
+              'keywords': RUBY_KEYWORDS,
+              'hashComments': true,
+              'multiLineStrings': true,
+              'regexLiterals': true
+            }), ['rb', 'ruby']);
+      registerLangHandler(sourceDecorator({
+              'keywords': JSCRIPT_KEYWORDS,
+              'cStyleComments': true,
+              'regexLiterals': true
+            }), ['javascript', 'js', 'ts', 'typescript']);
+      registerLangHandler(sourceDecorator({
+              'keywords': COFFEE_KEYWORDS,
+              'hashComments': 3,  // ### style block comments
+              'cStyleComments': true,
+              'multilineStrings': true,
+              'tripleQuotedStrings': true,
+              'regexLiterals': true
+            }), ['coffee']);
+      registerLangHandler(
+          createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
+
+      /** @param {JobT} job */
+      function applyDecorator(job) {
+        var opt_langExtension = job.langExtension;
+
+        try {
+          // Extract tags, and convert the source code to plain text.
+          var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
+          /** Plain text. @type {string} */
+          var source = sourceAndSpans.sourceCode;
+          job.sourceCode = source;
+          job.spans = sourceAndSpans.spans;
+          job.basePos = 0;
+
+          // Apply the appropriate language handler
+          langHandlerForExtension(opt_langExtension, source)(job);
+
+          // Integrate the decorations and tags back into the source code,
+          // modifying the sourceNode in place.
+          recombineTagsAndDecorations(job);
+        } catch (e) {
+          if (win['console']) {
+            console['log'](e && e['stack'] || e);
+          }
+        }
+      }
+
+      /**
+       * Pretty print a chunk of code.
+       * @param sourceCodeHtml {string} The HTML to pretty print.
+       * @param opt_langExtension {string} The language name to use.
+       *     Typically, a filename extension like 'cpp' or 'java'.
+       * @param opt_numberLines {number|boolean} True to number lines,
+       *     or the 1-indexed number of the first line in sourceCodeHtml.
+       */
+      function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
+        /** @type{number|boolean} */
+        var nl = opt_numberLines || false;
+        /** @type{string|null} */
+        var langExtension = opt_langExtension || null;
+        /** @type{!Element} */
+        var container = document.createElement('div');
+        // This could cause images to load and onload listeners to fire.
+        // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
+        // We assume that the inner HTML is from a trusted source.
+        // The pre-tag is required for IE8 which strips newlines from innerHTML
+        // when it is injected into a <pre> tag.
+        // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
+        // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
+        container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
+        container = /** @type{!Element} */(container.firstChild);
+        if (nl) {
+          numberLines(container, nl, true);
+        }
+
+        /** @type{JobT} */
+        var job = {
+          langExtension: langExtension,
+          numberLines: nl,
+          sourceNode: container,
+          pre: 1,
+          sourceCode: null,
+          basePos: null,
+          spans: null,
+          decorations: null
+        };
+        applyDecorator(job);
+        return container.innerHTML;
+      }
+
+       /**
+        * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
+        * {@code class=prettyprint} and prettify them.
+        *
+        * @param {Function} opt_whenDone called when prettifying is done.
+        * @param {HTMLElement|HTMLDocument} opt_root an element or document
+        *   containing all the elements to pretty print.
+        *   Defaults to {@code document.body}.
+        */
+      function $prettyPrint(opt_whenDone, opt_root) {
+        var root = opt_root || document.body;
+        var doc = root.ownerDocument || document;
+        function byTagName(tn) { return root.getElementsByTagName(tn); }
+        // fetch a list of nodes to rewrite
+        var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
+        var elements = [];
+        for (var i = 0; i < codeSegments.length; ++i) {
+          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
+            elements.push(codeSegments[i][j]);
+          }
+        }
+        codeSegments = null;
+
+        var clock = Date;
+        if (!clock['now']) {
+          clock = { 'now': function () { return +(new Date); } };
+        }
+
+        // The loop is broken into a series of continuations to make sure that we
+        // don't make the browser unresponsive when rewriting a large page.
+        var k = 0;
+
+        var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
+        var prettyPrintRe = /\bprettyprint\b/;
+        var prettyPrintedRe = /\bprettyprinted\b/;
+        var preformattedTagNameRe = /pre|xmp/i;
+        var codeRe = /^code$/i;
+        var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
+        var EMPTY = {};
+
+        function doWork() {
+          var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
+                         clock['now']() + 250 /* ms */ :
+                         Infinity);
+          for (; k < elements.length && clock['now']() < endTime; k++) {
+            var cs = elements[k];
+
+            // Look for a preceding comment like
+            // <?prettify lang="..." linenums="..."?>
+            var attrs = EMPTY;
+            {
+              for (var preceder = cs; (preceder = preceder.previousSibling);) {
+                var nt = preceder.nodeType;
+                // <?foo?> is parsed by HTML 5 to a comment node (8)
+                // like <!--?foo?-->, but in XML is a processing instruction
+                var value = (nt === 7 || nt === 8) && preceder.nodeValue;
+                if (value
+                    ? !/^\??prettify\b/.test(value)
+                    : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
+                  // Skip over white-space text nodes but not others.
+                  break;
+                }
+                if (value) {
+                  attrs = {};
+                  value.replace(
+                      /\b(\w+)=([\w:.%+-]+)/g,
+                    function (_, name, value) { attrs[name] = value; });
+                  break;
+                }
+              }
+            }
+
+            var className = cs.className;
+            if ((attrs !== EMPTY || prettyPrintRe.test(className))
+                // Don't redo this if we've already done it.
+                // This allows recalling pretty print to just prettyprint elements
+                // that have been added to the page since last call.
+                && !prettyPrintedRe.test(className)) {
+
+              // make sure this is not nested in an already prettified element
+              var nested = false;
+              for (var p = cs.parentNode; p; p = p.parentNode) {
+                var tn = p.tagName;
+                if (preCodeXmpRe.test(tn)
+                    && p.className && prettyPrintRe.test(p.className)) {
+                  nested = true;
+                  break;
+                }
+              }
+              if (!nested) {
+                // Mark done.  If we fail to prettyprint for whatever reason,
+                // we shouldn't try again.
+                cs.className += ' prettyprinted';
+
+                // If the classes includes a language extensions, use it.
+                // Language extensions can be specified like
+                //     <pre class="prettyprint lang-cpp">
+                // the language extension "cpp" is used to find a language handler
+                // as passed to PR.registerLangHandler.
+                // HTML5 recommends that a language be specified using "language-"
+                // as the prefix instead.  Google Code Prettify supports both.
+                // http://dev.w3.org/html5/spec-author-view/the-code-element.html
+                var langExtension = attrs['lang'];
+                if (!langExtension) {
+                  langExtension = className.match(langExtensionRe);
+                  // Support <pre class="prettyprint"><code class="language-c">
+                  var wrapper;
+                  if (!langExtension && (wrapper = childContentWrapper(cs))
+                      && codeRe.test(wrapper.tagName)) {
+                    langExtension = wrapper.className.match(langExtensionRe);
+                  }
+
+                  if (langExtension) { langExtension = langExtension[1]; }
+                }
+
+                var preformatted;
+                if (preformattedTagNameRe.test(cs.tagName)) {
+                  preformatted = 1;
+                } else {
+                  var currentStyle = cs['currentStyle'];
+                  var defaultView = doc.defaultView;
+                  var whitespace = (
+                      currentStyle
+                      ? currentStyle['whiteSpace']
+                      : (defaultView
+                         && defaultView.getComputedStyle)
+                      ? defaultView.getComputedStyle(cs, null)
+                      .getPropertyValue('white-space')
+                      : 0);
+                  preformatted = whitespace
+                      && 'pre' === whitespace.substring(0, 3);
+                }
+
+                // Look for a class like linenums or linenums:<n> where <n> is the
+                // 1-indexed number of the first line.
+                var lineNums = attrs['linenums'];
+                if (!(lineNums = lineNums === 'true' || +lineNums)) {
+                  lineNums = className.match(/\blinenums\b(?::(\d+))?/);
+                  lineNums =
+                    lineNums
+                    ? lineNums[1] && lineNums[1].length
+                      ? +lineNums[1] : true
+                    : false;
+                }
+                if (lineNums) { numberLines(cs, lineNums, preformatted); }
+
+                // do the pretty printing
+                var prettyPrintingJob = {
+                  langExtension: langExtension,
+                  sourceNode: cs,
+                  numberLines: lineNums,
+                  pre: preformatted,
+                  sourceCode: null,
+                  basePos: null,
+                  spans: null,
+                  decorations: null
+                };
+                applyDecorator(prettyPrintingJob);
+              }
+            }
+          }
+          if (k < elements.length) {
+            // finish up in a continuation
+            win.setTimeout(doWork, 250);
+          } else if ('function' === typeof opt_whenDone) {
+            opt_whenDone();
+          }
+        }
+
+        doWork();
+      }
+
+      /**
+       * Contains functions for creating and registering new language handlers.
+       * @type {Object}
+       */
+      var PR = win['PR'] = {
+            'createSimpleLexer': createSimpleLexer,
+            'registerLangHandler': registerLangHandler,
+            'sourceDecorator': sourceDecorator,
+            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
+            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
+            'PR_COMMENT': PR_COMMENT,
+            'PR_DECLARATION': PR_DECLARATION,
+            'PR_KEYWORD': PR_KEYWORD,
+            'PR_LITERAL': PR_LITERAL,
+            'PR_NOCODE': PR_NOCODE,
+            'PR_PLAIN': PR_PLAIN,
+            'PR_PUNCTUATION': PR_PUNCTUATION,
+            'PR_SOURCE': PR_SOURCE,
+            'PR_STRING': PR_STRING,
+            'PR_TAG': PR_TAG,
+            'PR_TYPE': PR_TYPE,
+            'prettyPrintOne':
+               IN_GLOBAL_SCOPE
+                 ? (win['prettyPrintOne'] = $prettyPrintOne)
+                 : (prettyPrintOne = $prettyPrintOne),
+            'prettyPrint':
+               IN_GLOBAL_SCOPE
+                 ? (win['prettyPrint'] = $prettyPrint)
+                 : (prettyPrint = $prettyPrint)
+          };
+
+      // Make PR available via the Asynchronous Module Definition (AMD) API.
+      // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
+      // The Asynchronous Module Definition (AMD) API specifies a
+      // mechanism for defining modules such that the module and its
+      // dependencies can be asynchronously loaded.
+      // ...
+      // To allow a clear indicator that a global define function (as
+      // needed for script src browser loading) conforms to the AMD API,
+      // any global define function SHOULD have a property called "amd"
+      // whose value is an object. This helps avoid conflict with any
+      // other existing JavaScript code that could have defined a define()
+      // function that does not conform to the AMD API.
+      var define = win['define'];
+      if (typeof define === "function" && define['amd']) {
+        define("google-code-prettify", [], function () {
+          return PR;
+        });
+      }
+    })();
+
+    return prettyPrint;
+  })();
+
+  // If this script is deferred or async and the document is already
+  // loaded we need to wait for language handlers to load before performing
+  // any autorun.
+  function onLangsLoaded() {
+    if (autorun) {
+      contentLoaded(
+        function () {
+          var n = callbacks.length;
+          var callback = n ? function () {
+            for (var i = 0; i < n; ++i) {
+              (function (i) {
+                win.setTimeout(
+                   function () {
+                     win['exports'][callbacks[i]].apply(win, arguments);
+                   }, 0);
+               })(i);
+            }
+          } : void 0;
+          prettyPrint(callback);
+        });
+    }
+  }
+  checkPendingLanguages();
+
+}());
diff --git a/static/bower_components/google-prettify/styles/demo.html b/static/bower_components/google-prettify/styles/demo.html
new file mode 100644
index 00000000..7d97bb19
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/demo.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Demo</title>
+<script src="../src/prettify.js"></script>
+<script src="../src/lang-css.js"></script>
+<style type="text/css">
+body { margin: 0; padding: 0; }
+pre { margin: 0; }
+#container { width: 40em; display: inline-block; }
+</style>
+<script type="text/javascript">
+/**
+ * Call out to the parent so that it can resize the iframe once this
+ * document's body is loaded.
+ * @param {string} theme
+ */
+function adjustHeightInParent(theme) {
+  if (parent !== window) {
+    try {
+      var div = document.getElementById('container');
+      parent.adjustChildIframeSize(theme, div.offsetWidth, div.offsetHeight);
+    } catch (ex) {
+      // Can happen when this page is opened in its own tab.
+    }
+  } else {
+    // redirect to main page if this page is loaded directly
+    window.location = "./index.html";
+  }
+}
+
+/**
+ * Theme name is specified by iframe in which the page is loaded
+ * @return {string}
+ */
+function getThemeName() {
+  // theme is named in the query part of the URL
+  //var theme = decodeURIComponent(document.location.search.substring(1));
+
+  // theme is named in the "name" property of the embedded iframe
+  var theme = window.frameElement && window.frameElement.getAttribute("name");
+
+  return theme ? theme : 'default';
+}
+
+/**
+ * Load the necessary CSS
+ * @param {string} theme
+ */
+function loadTheme(theme) {
+  var link = document.createElement('link');
+  link.rel = 'stylesheet';
+  link.type = 'text/css';
+  link.href = theme === 'default' ? '../src/prettify.css' : theme + '.css';
+  document.getElementsByTagName('head')[0].appendChild(link);
+}
+
+/**
+ * Called on page load.
+ * This page displays some code styled using theme specified.
+ */
+function onLoadFcn() {
+  // syntax highlight
+  PR.prettyPrint();
+
+  // call to parent we're embedded into
+  var theme = getThemeName();
+  adjustHeightInParent(theme);
+}
+
+(function () {
+  // Load the stylesheet that we're demoing.
+  var themeName = getThemeName();
+  document.title = 'Theme ' + themeName;
+  loadTheme(themeName);
+})();
+</script>
+</head>
+
+<body onload="onLoadFcn();">
+
+<div id="container">
+<pre class="prettyprint lang-html linenums">
+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;HTML Test&lt;/title&gt;
+&lt;script type="text/javascript"&gt;
+// Say hello world until the user starts questioning
+// the meaningfulness of their existence.
+function helloWorld(world) {
+  for (var i = 42; --i &gt;= 0;) {
+    alert('Hello ' + String(world));
+  }
+}
+&lt;/script&gt;
+&lt;style type="text/css"&gt;
+p { color: pink }
+b { color: blue }
+u { color: "umber" }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;h1&gt;Hello world!&lt;/h1&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+</div>
+
+</body>
+</html>
diff --git a/static/bower_components/google-prettify/styles/desert.css b/static/bower_components/google-prettify/styles/desert.css
new file mode 100644
index 00000000..3723668d
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/desert.css
@@ -0,0 +1,34 @@
+/* desert scheme ported from vim to google prettify */
+pre.prettyprint { display: block; background-color: #333 }
+pre .nocode { background-color: none; color: #000 }
+pre .str { color: #ffa0a0 } /* string  - pink */
+pre .kwd { color: #f0e68c; font-weight: bold }
+pre .com { color: #87ceeb } /* comment - skyblue */
+pre .typ { color: #98fb98 } /* type    - lightgreen */
+pre .lit { color: #cd5c5c } /* literal - darkred */
+pre .pun { color: #fff }    /* punctuation */
+pre .pln { color: #fff }    /* plaintext */
+pre .tag { color: #f0e68c; font-weight: bold } /* html/xml tag    - lightyellow */
+pre .atn { color: #bdb76b; font-weight: bold } /* attribute name  - khaki */
+pre .atv { color: #ffa0a0 } /* attribute value - pink */
+pre .dec { color: #98fb98 } /* decimal         - lightgreen */
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE } /* IE indents via margin-left */
+li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,li.L3,li.L5,li.L7,li.L9 { }
+
+@media print {
+  pre.prettyprint { background-color: none }
+  pre .str, code .str { color: #060 }
+  pre .kwd, code .kwd { color: #006; font-weight: bold }
+  pre .com, code .com { color: #600; font-style: italic }
+  pre .typ, code .typ { color: #404; font-weight: bold }
+  pre .lit, code .lit { color: #044 }
+  pre .pun, code .pun { color: #440 }
+  pre .pln, code .pln { color: #000 }
+  pre .tag, code .tag { color: #006; font-weight: bold }
+  pre .atn, code .atn { color: #404 }
+  pre .atv, code .atv { color: #060 }
+}
diff --git a/static/bower_components/google-prettify/styles/doxy.css b/static/bower_components/google-prettify/styles/doxy.css
new file mode 100644
index 00000000..b0e89161
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/doxy.css
@@ -0,0 +1,64 @@
+/* Doxy pretty-printing styles. Used with prettify.js.  */
+
+pre .str, code .str { color: #fec243; } /* string  - eggyolk gold */
+pre .kwd, code .kwd { color: #8470FF; } /* keyword - light slate blue */
+pre .com, code .com { color: #32cd32; font-style: italic; } /* comment - green */
+pre .typ, code .typ { color: #6ecbcc; } /* type - turq green */
+pre .lit, code .lit { color: #d06; } /* literal - cherry red */
+pre .pun, code .pun { color: #8B8970;  } /* punctuation - lemon chiffon4  */
+pre .pln, code .pln { color: #f0f0f0; } /* plaintext - white */
+pre .tag, code .tag { color: #9c9cff; } /* html/xml tag  (bluey)  */
+pre .htm, code .htm { color: #dda0dd; } /* html tag  light purply*/
+pre .xsl, code .xsl { color: #d0a0d0; } /* xslt tag  light purply*/
+pre .atn, code .atn { color: #46eeee; font-weight: normal;} /* html/xml attribute name  - lt turquoise */
+pre .atv, code .atv { color: #EEB4B4; } /* html/xml attribute value - rosy brown2 */
+pre .dec, code .dec { color: #3387CC; } /* decimal - blue */
+
+a {
+  text-decoration: none;
+}
+pre.prettyprint, code.prettyprint {
+  font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';
+  font-weight: bold;
+  font-size: 9pt;
+  background-color: #0f0f0f;
+  -moz-border-radius: 8px;
+  -webkit-border-radius: 8px;
+  -o-border-radius: 8px;
+  -ms-border-radius: 8px;
+  -khtml-border-radius: 8px;
+  border-radius: 8px;
+}  /*  background is black (well, just a tad less dark )  */
+
+pre.prettyprint {
+  width: 95%;
+  margin: 1em auto;
+  padding: 1em;
+  white-space: pre-wrap;
+}
+
+pre.prettyprint a, code.prettyprint a {
+   text-decoration:none;
+}
+/* Specify class=linenums on a pre to get line numbering; line numbers themselves are the same color as punctuation */
+ol.linenums { margin-top: 0; margin-bottom: 0; color: #8B8970; } /* IE indents via margin-left */
+li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,li.L3,li.L5,li.L7,li.L9 { }
+
+/* print is mostly unchanged from default at present  */
+@media print {
+  pre.prettyprint, code.prettyprint { background-color: #fff;  }
+  pre .str, code .str { color: #088; }
+  pre .kwd, code .kwd { color: #006; font-weight: bold; }
+  pre .com, code .com { color: #oc3; font-style: italic; }
+  pre .typ, code .typ { color: #404; font-weight: bold; }
+  pre .lit, code .lit { color: #044; }
+  pre .pun, code .pun { color: #440; }
+  pre .pln, code .pln { color: #000; }
+  pre .tag, code .tag { color: #b66ff7; font-weight: bold; }
+  pre .htm, code .htm { color: #606; font-weight: bold; }
+  pre .xsl, code .xsl { color: #606; font-weight: bold; }
+  pre .atn, code .atn { color: #c71585;  font-weight: normal; }
+  pre .atv, code .atv { color: #088;  font-weight: normal; }
+}
diff --git a/static/bower_components/google-prettify/styles/index.html b/static/bower_components/google-prettify/styles/index.html
new file mode 100644
index 00000000..ba171df7
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/index.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Prettify Themes Gallery</title>
+<style type="text/css">
+iframe { width: 100%; border-style: none; margin: 0; padding: 0; }
+.attribution { padding-left: 1em; }
+</style>
+<script type="text/javascript">
+/**
+ * Called by the demo.html frames loaded per theme to size the iframes
+ * properly and to allow them to tile the page nicely.
+ */
+function adjustChildIframeSize(themeName, width, height) {
+  if (typeof console !== 'undefined' && console.log) {
+    try {
+      console.log('adjusting ' + themeName + ' to ' + width + 'x' + height);
+    } catch (ex) {
+      // Don't bother logging log failure.
+    }
+  }
+  var iframe = document.getElementById(themeName);
+  iframe.style.height = (+height + 16) + 'px';
+  var container = iframe.parentNode;
+  container.style.width = (+width + 16) + 'px';
+  container.style.display = 'inline-block';
+}
+
+/**
+ * Create an iframe to showcase theme.
+ * We pass the theme name to the iframe via its URI query, and it loads
+ * prettify and the theme CSS, and calls back to this page to resize iframe.
+ */
+function appendThemeIFrame(theme) {
+  // title
+  var link = document.createElement('a');
+  link.href = 'https://github.com/google/code-prettify/blob/master/' +
+    (theme.name === 'default' ? 'src/prettify.css' :
+    ('styles/' + encodeURIComponent(theme.name) + '.css'));
+  link.appendChild(document.createTextNode(
+    theme.name.replace(/\b[a-z]/g, function (letter) {
+      // Capitalize first letter of each word
+      return letter.toUpperCase();
+    })));
+  var header = document.createElement('h2');
+  header.className = 'title';
+  header.appendChild(link);
+
+  // attribution
+  var attribution;
+  if (theme.author) {
+    attribution = document.createElement('span');
+    attribution.className = 'attribution';
+    attribution.innerHTML = 'by <em>' + theme.author + '<\/em>';
+  }
+
+  // iframe
+  var iframe = document.createElement('iframe');
+  iframe.id = theme.name;
+  iframe.name = theme.name;  // theme name retrieved in demo.html
+  iframe.src = 'demo.html';
+  //iframe.src = 'demo.html?' + encodeURIComponent(theme.name);
+
+  // insert into page
+  var container = document.createElement('div');
+  container.className = 'container';
+  container.appendChild(header);
+  if (theme.author) { container.appendChild(attribution); }
+  container.appendChild(iframe);
+  document.body.appendChild(container);
+}
+</script>
+</head>
+
+<body>
+<noscript>This page requires JavaScript</noscript>
+
+<h1>Gallery of themes for
+<a href="https://github.com/google/code-prettify">code prettify</a></h1>
+<p>
+Click on a theme name for a link to the file in revision control.
+Print preview this page to see how the themes work on the printed page.
+</p>
+
+<script type="text/javascript">
+var allThemes = [
+  { name: 'default' },
+  { name: 'desert', author: '<a href="https://code.google.com/u/techtonik@gmail.com/">anatoly techtonik<\/a>' },
+  { name: 'sunburst', author: 'David Leibovic' },
+  { name: 'sons-of-obsidian', author: '<a href="http://CodeTunnel.com/blog/post/71/google-code-prettify-obsidian-theme">Alex Ford<\/a>' },
+  { name: 'doxy', author: 'Robert Sperberg' }
+];
+
+(function () {
+  // Produce an iframe per theme.
+  for (var i = 0, n = allThemes.length; i < n; ++i) {
+    appendThemeIFrame(allThemes[i]);
+  }
+})();
+</script>
+
+</body>
+</html>
diff --git a/static/bower_components/google-prettify/styles/sons-of-obsidian.css b/static/bower_components/google-prettify/styles/sons-of-obsidian.css
new file mode 100644
index 00000000..7d24f3b4
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/sons-of-obsidian.css
@@ -0,0 +1,118 @@
+/*
+ * Derived from einaros's Sons of Obsidian theme at
+ * http://studiostyl.es/schemes/son-of-obsidian by
+ * Alex Ford of CodeTunnel:
+ * http://CodeTunnel.com/blog/post/71/google-code-prettify-obsidian-theme
+ */
+
+.str
+{
+    color: #EC7600;
+}
+.kwd
+{
+    color: #93C763;
+}
+.com
+{
+    color: #66747B;
+}
+.typ
+{
+    color: #678CB1;
+}
+.lit
+{
+    color: #FACD22;
+}
+.pun
+{
+    color: #F1F2F3;
+}
+.pln
+{
+    color: #F1F2F3;
+}
+.tag
+{
+    color: #8AC763;
+}
+.atn
+{
+    color: #E0E2E4;
+}
+.atv
+{
+    color: #EC7600;
+}
+.dec
+{
+    color: purple;
+}
+pre.prettyprint
+{
+    border: 0px solid #888;
+}
+ol.linenums
+{
+    margin-top: 0;
+    margin-bottom: 0;
+}
+.prettyprint {
+    background: #000;
+}
+li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9
+{
+    color: #555;
+    list-style-type: decimal;
+}
+li.L1, li.L3, li.L5, li.L7, li.L9 {
+    background: #111;
+}
+@media print
+{
+    .str
+    {
+        color: #060;
+    }
+    .kwd
+    {
+        color: #006;
+        font-weight: bold;
+    }
+    .com
+    {
+        color: #600;
+        font-style: italic;
+    }
+    .typ
+    {
+        color: #404;
+        font-weight: bold;
+    }
+    .lit
+    {
+        color: #044;
+    }
+    .pun
+    {
+        color: #440;
+    }
+    .pln
+    {
+        color: #000;
+    }
+    .tag
+    {
+        color: #006;
+        font-weight: bold;
+    }
+    .atn
+    {
+        color: #404;
+    }
+    .atv
+    {
+        color: #060;
+    }
+}
diff --git a/static/bower_components/google-prettify/styles/sunburst.css b/static/bower_components/google-prettify/styles/sunburst.css
new file mode 100644
index 00000000..ae06306a
--- /dev/null
+++ b/static/bower_components/google-prettify/styles/sunburst.css
@@ -0,0 +1,46 @@
+/* Pretty printing styles. Used with prettify.js. */
+/* Vim sunburst theme by David Leibovic */
+
+pre .str, code .str { color: #65B042; } /* string  - green */
+pre .kwd, code .kwd { color: #E28964; } /* keyword - dark pink */
+pre .com, code .com { color: #AEAEAE; font-style: italic; } /* comment - gray */
+pre .typ, code .typ { color: #89bdff; } /* type - light blue */
+pre .lit, code .lit { color: #3387CC; } /* literal - blue */
+pre .pun, code .pun { color: #fff; } /* punctuation - white */
+pre .pln, code .pln { color: #fff; } /* plaintext - white */
+pre .tag, code .tag { color: #89bdff; } /* html/xml tag    - light blue */
+pre .atn, code .atn { color: #bdb76b; } /* html/xml attribute name  - khaki */
+pre .atv, code .atv { color: #65B042; } /* html/xml attribute value - green */
+pre .dec, code .dec { color: #3387CC; } /* decimal - blue */
+
+pre.prettyprint, code.prettyprint {
+	background-color: #000;
+	border-radius: 8px;
+}
+
+pre.prettyprint {
+	width: 95%;
+	margin: 1em auto;
+	padding: 1em;
+	white-space: pre-wrap;
+}
+
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE; } /* IE indents via margin-left */
+li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }
+/* Alternate shading for lines */
+li.L1,li.L3,li.L5,li.L7,li.L9 { }
+
+@media print {
+  pre .str, code .str { color: #060; }
+  pre .kwd, code .kwd { color: #006; font-weight: bold; }
+  pre .com, code .com { color: #600; font-style: italic; }
+  pre .typ, code .typ { color: #404; font-weight: bold; }
+  pre .lit, code .lit { color: #044; }
+  pre .pun, code .pun { color: #440; }
+  pre .pln, code .pln { color: #000; }
+  pre .tag, code .tag { color: #006; font-weight: bold; }
+  pre .atn, code .atn { color: #404; }
+  pre .atv, code .atv { color: #060; }
+}
diff --git a/static/bower_components/google-prettify/tasks/aliases.js b/static/bower_components/google-prettify/tasks/aliases.js
new file mode 100644
index 00000000..e67aadf9
--- /dev/null
+++ b/static/bower_components/google-prettify/tasks/aliases.js
@@ -0,0 +1,72 @@
+/**
+ * google-code-prettify
+ * https://github.com/google/code-prettify
+ *
+ * @author Amro
+ * @license Apache-2.0
+ */
+
+module.exports = function (grunt) {
+  'use strict';
+
+  var fs = require('fs');
+  var runLanguageHandler = require('./lib/lang-aliases');
+
+  /**
+   * Copy timestamp from source to destination file.
+   * @param {string} src
+   * @param {string} dest
+   * @param {boolean} timestamp
+   */
+  function syncTimestamp(src, dest, timestamp) {
+    if (timestamp) {
+      var stat = fs.lstatSync(src);
+      var fd = fs.openSync(dest, process.platform === 'win32' ? 'r+' : 'r');
+      fs.futimesSync(fd, stat.atime, stat.mtime);
+      fs.closeSync(fd);
+    }
+  }
+
+  /**
+   * Copy file mode from source to destination.
+   * @param {string} src
+   * @param {string} dest
+   * @param {boolean|number} mode
+   */
+  function syncMod(src, dest, mode) {
+    if (mode !== false) {
+      fs.chmodSync(dest, (mode === true) ? fs.lstatSync(src).mode : mode);
+    }
+  }
+
+  // Create copies of language handler files under all registered aliases
+  grunt.registerMultiTask('aliases', 'Create language aliases', function () {
+    var opts = this.options({
+      timestamp: false,
+      mode: false
+    });
+
+    var count = 0;
+    this.filesSrc.forEach(function (src) {
+      // run language handler in sandbox
+      grunt.verbose.subhead('Running ' + src.cyan + ' in sandbox...');
+      var exts = runLanguageHandler(src);
+      grunt.verbose.ok();
+
+      // go over collected extensions
+      exts.forEach(function (ext) {
+        // copy file
+        var dest = src.replace(/\blang-\w+\b/, 'lang-' + ext);
+        grunt.verbose.writeln('Copying ' + src.cyan + ' -> ' + dest.cyan);
+        grunt.file.copy(src, dest);
+
+        // sync timestamp and file mode
+        syncTimestamp(src, dest, opts.timestamp);
+        syncMod(src, dest, opts.mode);
+        count++;
+      });
+    });
+    grunt.log.ok('Copied ' + count.toString().cyan +
+      grunt.util.pluralize(count, ' file/ files'));
+  });
+};
diff --git a/static/bower_components/google-prettify/tasks/gcc.js b/static/bower_components/google-prettify/tasks/gcc.js
new file mode 100644
index 00000000..cd64d29f
--- /dev/null
+++ b/static/bower_components/google-prettify/tasks/gcc.js
@@ -0,0 +1,49 @@
+/**
+ * google-code-prettify
+ * https://github.com/google/code-prettify
+ *
+ * @author Amro
+ * @license Apache-2.0
+ */
+
+module.exports = function (grunt) {
+  'use strict';
+
+  /*
+   * HACK: Custom task to override "closure-compiler:langs" since all lang-*
+   * files are compiled in parallel, launching too many Java processes at once
+   * which easily runs out of memory! This task programmatically creates
+   * separate targets (one file per target) so that lang files are compiled
+   * sequentially (sync) instead of in parallel (async).
+   */
+  grunt.registerMultiTask('gcc', 'Override closure-compiler', function () {
+    // closure-compiler:langs
+    var task = 'closure-compiler';
+    var target = this.target;
+    if (!grunt.task.exists(task)) {
+      grunt.fail.warn(grunt.util.error('Require task "' + task + '".'));
+    }
+
+    // create new targets for each file (one file per target)
+    var count = 0;
+    var opts = this.options();
+    this.files.forEach(function (file, idx) {
+      // simple target config with only: src, dest, and options
+      delete file.orig;
+      file.options = opts;
+
+      // configure new target
+      grunt.config.set([task, target + idx], file);
+      grunt.verbose.writeln('New target ' + (task + ':' + target + idx).cyan);
+      count++;
+    });
+    grunt.log.ok('Configured ' + count.toString().cyan + ' lang targets');
+
+    // remove original multi-file target
+    grunt.config.set([task, target], {});
+
+    // enqueue modified task to run
+    //console.log(grunt.config.get(task));
+    grunt.task.run(task);
+  });
+};
diff --git a/static/bower_components/google-prettify/tasks/lib/lang-aliases.js b/static/bower_components/google-prettify/tasks/lib/lang-aliases.js
new file mode 100644
index 00000000..7272e829
--- /dev/null
+++ b/static/bower_components/google-prettify/tasks/lib/lang-aliases.js
@@ -0,0 +1,92 @@
+/**
+ * google-code-prettify
+ * https://github.com/google/code-prettify
+ *
+ * @author Amro
+ * @license Apache-2.0
+ */
+
+var fs = require('fs');
+var path = require('path');
+var vm = require('vm');
+
+/**
+ * Returns a mock object PR of the prettify API. This is used to collect
+ * registered language file extensions.
+ *
+ * @return {Object} PR object with an additional `extensions` property.
+ */
+function createSandbox() {
+  // collect registered language extensions
+  var sandbox = {};
+  sandbox.extensions = [];
+  // mock prettify.js API
+  sandbox.window = {};
+  sandbox.window.PR = sandbox.PR = {
+    registerLangHandler: function (handler, exts) {
+      sandbox.extensions = sandbox.extensions.concat(exts);
+    },
+    createSimpleLexer: function (sPatterns, fPatterns) {
+      return function (job) {};
+    },
+    sourceDecorator: function (options) {
+      return function (job) {};
+    },
+    prettyPrintOne: function (src, lang, ln) {
+      return src;
+    },
+    prettyPrint: function (done, root) {},
+    PR_ATTRIB_NAME: 'atn',
+    PR_ATTRIB_VALUE: 'atv',
+    PR_COMMENT: 'com',
+    PR_DECLARATION: 'dec',
+    PR_KEYWORD: 'kwd',
+    PR_LITERAL: 'lit',
+    PR_NOCODE: 'nocode',
+    PR_PLAIN: 'pln',
+    PR_PUNCTUATION: 'pun',
+    PR_SOURCE: 'src',
+    PR_STRING: 'str',
+    PR_TAG: 'tag',
+    PR_TYPE: 'typ'
+  };
+  return sandbox;
+}
+
+/**
+ * Runs a language handler file under VM to collect extensions.
+ *
+ * Given a lang-*.js file, runs the language handler in a fake context where
+ * PR.registerLangHandler collects handler names without doing anything else.
+ * This is later used to makes copies of the JS extension under all its
+ * registered language names lang-<EXT>.js
+ *
+ * @param {string} src path to lang-xxx.js language handler
+ * @return {Array<string>} registered file extensions
+ */
+function runLanguageHandler(src) {
+  // execute source code in an isolated sandbox with a mock PR object
+  var sandbox = createSandbox();
+  vm.runInNewContext(fs.readFileSync(src), sandbox, {
+    filename: src
+  });
+
+  // language name
+  var lang = path.basename(src, path.extname(src)).replace(/^lang-/, '');
+
+  // collect and filter extensions
+  var exts = sandbox.extensions.map(function (ext) {
+    // case-insensitive names
+    return ext.toLowerCase();
+  }).filter(function (ext) {
+    // skip self, and internal names like foo-bar-baz or lang.foo
+    return ext !== lang && !/\W/.test(ext);
+  });
+  exts = exts.filter(function (ext, pos) {
+    // remove duplicates
+    return exts.indexOf(ext) === pos;
+  });
+  return exts;
+}
+
+module.exports = runLanguageHandler;
diff --git a/static/bower_components/google-prettify/tests/debug-ie-compat-matrix.html b/static/bower_components/google-prettify/tests/debug-ie-compat-matrix.html
new file mode 100644
index 00000000..caa58ae4
--- /dev/null
+++ b/static/bower_components/google-prettify/tests/debug-ie-compat-matrix.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<!-- try removing above doctype to force IE into quirks mode -->
+<html>
+<head>
+<meta charset="utf-8">
+<title>IE quirk/standard modes</title>
+<style type="text/css">
+code { white-space: pre; padding: 0; margin: 0; display: block; }
+#log { white-space: pre; }
+.pass { color: green; }
+.fail { color: red; }
+</style>
+</head>
+
+<body>
+
+<h1>IE Standard/Quirks Modes Test</h1>
+
+<code id="one-line"
+>one short line,</code>
+
+<hr>
+
+<code id="two-lines"
+>one giant leap for
+cross-browser compatibility</code>
+
+<hr>
+
+<code id="two-lines-mutated"
+>two turtledoves
+a partridge in a pear tree
+zero fencepost errors</code>
+
+<hr>
+
+<h2>Results</h2>
+<div id="report">
+<p id="result"></p>
+<p id="log"></p>
+</div>
+
+<script type="text/javascript">
+// Function under test
+function matrix(quirksMode, ieVersion) {
+  var table = {
+    quirks: {
+      '6': '\r',
+      '7': '\r',
+      '8': '\r',
+      '9': '\r',
+      '10': '\n'
+    },
+    standards: {
+      '6': '\r',
+      '7': '\r',
+      '8': '\r',
+      '9': '\n',
+      '10': '\n'
+    }
+  };
+  if ('boolean' !== typeof quirksMode) {
+    throw new Error(quirksMode);
+  } else if ('number' !== typeof ieVersion ||
+      !table.quirks.hasOwnProperty(+ieVersion)) {
+    throw new Error(ieVersion);
+  }
+  return table[quirksMode ? 'quirks' : 'standards'][ieVersion];
+}
+
+// Configuration we're testing.
+//NOTE: IE11 no longer indentifies as MSIE in user agent string
+var quirksMode = document.compatMode === 'BackCompat';
+var ieMajorVersionNumber = navigator.userAgent.match(/MSIE\s(\d+)/) || NaN;
+if (ieMajorVersionNumber) {
+  ieMajorVersionNumber = +ieMajorVersionNumber[1];
+}
+
+(function () {
+  // DOM elements.
+  var oneLine = document.getElementById('one-line');
+  var twoLines = document.getElementById('two-lines');
+  var twoLinesMutated = document.getElementById('two-lines-mutated');
+
+  var originalHeight = twoLinesMutated.offsetHeight;
+
+  // If the matrix cell being tested is correct, the following should
+  // end up true.
+  var pass = false;
+  var reason = 'unknown';
+
+  // The DOM subtree to modify.
+  var textNode = twoLinesMutated.firstChild;
+
+  if (textNode.nodeType !== 3 /* TEXT */ || textNode.nextSibling) {
+    reason = 'unexpected DOM structure';  // Maybe not normalized.
+  } else {
+    // Perform the action we are testing.
+    try {
+      textNode.nodeValue = twoLines.firstChild.nodeValue.replace(
+        /\r\n?|\n/g, matrix(quirksMode, ieMajorVersionNumber));
+    } catch (ex) {
+      reason = ex.toString();
+    }
+
+    // Check it against known good DOM subtrees.
+    if (Math.abs(twoLinesMutated.offsetHeight - twoLines.offsetHeight) <= 1) {
+      pass = true;
+    } else if (Math.abs(twoLinesMutated.offsetHeight - oneLine.offsetHeight) <= 1) {
+      reason = 'newlines not preserved';
+    } else {
+      // offsetHeight should trigger layout, but might not have???
+    }
+  }
+
+  var container = document.getElementById('result');
+  container.className = (pass ? 'pass' : 'fail');
+  container.appendChild(document.createTextNode(pass ? 'PASS' : 'FAIL'));
+  if (!pass) {
+    document.getElementById('log').appendChild(document.createTextNode(
+      'UserAgent = ' + navigator.userAgent +
+      '\nquirksMode = ' + quirksMode +
+      '\nieMajorVersionNumber = ' + ieMajorVersionNumber +
+      '\nheight before = ' + originalHeight +
+      '\nheight after = ' + twoLinesMutated.offsetHeight +
+      '\nheight expected = ' + twoLines.offsetHeight +
+      '\nreason = ' + reason));
+  }
+})();
+</script>
+
+</body>
+</html>
diff --git a/static/bower_components/google-prettify/tests/extractSourceSpans_test.html b/static/bower_components/google-prettify/tests/extractSourceSpans_test.html
new file mode 100644
index 00000000..60fa520b
--- /dev/null
+++ b/static/bower_components/google-prettify/tests/extractSourceSpans_test.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>extractSourceSpans</title>
+<script src="../js-modules/extractSourceSpans.js"></script>
+<script src="https://cdn.rawgit.com/douglascrockford/JSON-js/master/json2.js"></script>
+<script src="shims.js"></script>
+<link rel="stylesheet" type="text/css" href="test_modules.css">
+</head>
+
+<body>
+<h1>Extract Source Spans Test</h1>
+
+<table>
+  <tr><th colspan="3">Test space preserved in PRE</th></tr>
+  <tr>
+    <td class="input"><pre class="testinput"><b>print </b>'Hello '<br>  + '&lt;World&gt;';</pre></td>
+    <td class="golden"><pre>^print ^'Hello '^\n^  + '&lt;World&gt;';^</pre></td>
+    <td class="actual"></td>
+  </tr>
+  <tr><th colspan="3">Test class="nocode"</th></tr>
+  <tr>
+    <td class="input"><pre class="testinput"><span class="nocode">1. </span><b>print </b>'Hello '<br><span class="nocode">2. </span>  + '&lt;World&gt;';</pre></td>
+    <td class="golden"><pre>^print ^'Hello '^\n^  + '&lt;World&gt;';^</pre></td>
+    <td class="actual"></td>
+  </tr>
+  <tr><th colspan="3">Test whitespace normalized in code</th></tr>
+  <tr>
+    <td class="input"><code class="testinput"><b>print </b>'Hello '
+  + '&lt;World&gt;';</code></td>
+    <td class="golden"><pre>^print ^'Hello ' + '&lt;World&gt;';^</pre></td>
+    <td class="actual"></td>
+  </tr>
+  <tr><th colspan="3">Test XMP</th></tr>
+  <tr>
+    <td class="input"><xmp class="testinput">print 'Hello '
+  + '<World>';
+    
^print 'Hello '\n  + '<World>';^
+ + + Test tabs + +
print 'Hello '
+	+ '<World>';
+
^print 'Hello '\n\t+ '<World>';^
+ + + Test number lines output + +
  • print 'Hello '
  • + '<World>';
+
^print ^'Hello '^\n^  + '<World>';^^
+ + + + +
+

Log

+
+ + + + + diff --git a/static/bower_components/google-prettify/tests/ie-newline-copy-paste.html b/static/bower_components/google-prettify/tests/ie-newline-copy-paste.html new file mode 100644 index 00000000..bfd601de --- /dev/null +++ b/static/bower_components/google-prettify/tests/ie-newline-copy-paste.html @@ -0,0 +1,150 @@ + + + + +IE Newline Copy/Paste Info Gathering + + + + + +

IE newline copy/paste

+ +

+I'm trying to squash, once and for all, the problems with newlines in +<PRE>s in IE. I can't run all versions of IE, so I'd +really appreciate any help from people who have IE open and running. +See bugs #20, +#104, and +#128 for +reference. +

+ +

+Please copy from START through END below +and paste it into the TEXTAREA below. Then hit +Ctrl-A, Ctrl-C to copy the textarea contents, and paste +that into an email. Please also copy and paste the RESULTS +section below and include it in the email response as well and send it to +me or respond to the discussion +list. +

+ +

+In case you're interested, there are two problems: choosing a way to split +lines that doesn't introduce too few or extra newlines, and a way to make sure +that the resulting code can be copy-pasted into a plain text editors such as +the textarea below. This is my attempt to gather information on both issues +by IE version. +

+ +

Cheers.

+ +
+ +

== START ==

+ +
+ +
before
+[manual CR]
+after
+ +
before
[manual BR]
after
+ +
before
+[manual CR+BR]
+after
+ +
before
+
[manual BR+CR] +
after
+ +

== END ==

+ +
before
+[text]
+after
+ +
+ +

RESULTS

+ +
+ +
+ +

TEXTAREA

+ + + + + + diff --git a/static/bower_components/google-prettify/tests/large_input_test.html b/static/bower_components/google-prettify/tests/large_input_test.html new file mode 100644 index 00000000..5c4ff30c --- /dev/null +++ b/static/bower_components/google-prettify/tests/large_input_test.html @@ -0,0 +1,203 @@ + + + + +Tests of Prettifier w/ large data files + + + + + + +

Benchmarks

+
+
+

Results

+
+ + + + + diff --git a/static/bower_components/google-prettify/tests/numberLines_test.html b/static/bower_components/google-prettify/tests/numberLines_test.html new file mode 100644 index 00000000..317333f9 --- /dev/null +++ b/static/bower_components/google-prettify/tests/numberLines_test.html @@ -0,0 +1,135 @@ + + + + +numberLines + + + + + + +

Number Lines Test

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test Nothing to Split
Hello, World!
  1. Hello, World!
Test Normalized Spaces
Hello, World!
  1. Hello, World!
Test BR
Hello,
World!
  1. Hello,
  2. World!
Test line breaks
Hello,
there
World!
  1. Hello,
  2. there
  3. World!
Test line breaks with followers
Hello,
there
World!
  1. Hello,
  2. there
  3. World!
Test nocode
Hello,
there
World!
  1. Hello,
  2. there World!
Test link
Hello,
there
World!
  1. Hello,
  2. there
  3. World!
Test blank lines
One

Three
  1. One
  2.  
  3. Three
+ +
+

Log

+
+ + + + + diff --git a/static/bower_components/google-prettify/tests/prettify_test.html b/static/bower_components/google-prettify/tests/prettify_test.html new file mode 100644 index 00000000..04f55f22 --- /dev/null +++ b/static/bower_components/google-prettify/tests/prettify_test.html @@ -0,0 +1,1438 @@ + + + + +Code Prettifier + + + + + + + +

Test Results

+
+ +
+ +

Bash

+
#!/bin/bash
+
+# Fibonacci numbers
+# Writes an infinite series to stdout, one entry per line
+function fib() {
+  local a=1
+  local b=1
+  while true ; do
+    echo $a
+    local tmp=$a
+    a=$(( $a + $b ))
+    b=$tmp
+  done
+}
+
+# output the 10th element of the series and halt
+fib | head -10 | tail -1
+
+ +

Bash w/ language specified

+
#!/bin/bash
+
+# Fibonacci numbers
+# Writes an infinite series to stdout, one entry per line
+function fib() {
+  local a=1
+  local b=1
+  while true ; do
+    echo $a
+    local tmp=$a
+    a=$(( $a + $b ))
+    b=$tmp
+  done
+}
+
+# output the 10th element of the series and halt
+fib | /usr/bin/*head -10 | tail -1
+
+ +

Bash special characters

+

Issue #165

+
# Comment
+local $x = ${#x[@]}  # Previous is not a comment
+# A comment
+ +

C

+
+#include <stdio.h>
+
+/* the n-th fibonacci number.
+ */
+unsigned int fib(unsigned int n) {
+  unsigned int a = 1, b = 1;
+  unsigned int tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+main() {
+  printf("%u", fib(10));
+}
+
+ +

C w/ language specified

+
+#include <stdio.h>
+
+/* the nth fibonacci number. */
+uint32 fib(unsigned int n) {
+  uint32 a = 1, b = 1;
+  uint32 tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+void main() {
+  size_t size = sizeof(wchar_t);
+  ASSERT_EQ(size, 1);
+  printf("%u", fib(10));
+}
+
+#define ZERO 0 /* a
+  multiline comment */
+
+ +

C++

+
+#include <iostream>
+
+using namespace std;
+
+//! fibonacci numbers with gratuitous use of templates.
+//! \param n an index into the fibonacci series
+//! \param fib0 element 0 of the series
+//! \return the nth element of the fibonacci series
+template <class T>
+T fib(unsigned int n, const T& fib0) {
+  T a(fib0), b(fib0);
+  for (; n; --n) {
+    T tmp(a);
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+int main(int argc, char **argv) {
+  cout << fib(10, 1U);
+}
+
+ +

C++ w/ language specified

+
+#include <iostream>
+
+using namespace std;
+
+//! fibonacci numbers with gratuitous use of templates.
+//! \param n an index into the fibonacci series
+//! \param fib0 element 0 of the series
+//! \return the nth element of the fibonacci series
+template <class T>
+T fib(int n, const T& fib0) {
+  T a(fib0), b(fib0);
+  while (--n >= 0) {
+    T tmp(a);
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+int main(int argc, char **argv) {
+  cout << fib(10, 1U);
+}
+
+ +

Java

+
+package foo;
+
+import java.util.Iterator;
+
+/**
+ * the fibonacci series implemented as an Iterable.
+ */
+public final class Fibonacci implements Iterable<Integer> {
+  /** the next and previous members of the series. */
+  private int a = 1, b = 1;
+
+  @Override
+  public Iterator<Integer> iterator() {
+    return new Iterator<Integer>() {
+      /** the series is infinite. */
+      public boolean hasNext() { return true; }
+      public Integer next() {
+        int tmp = a;
+        a += b;
+        b = tmp;
+        return a;
+      }
+      public void remove() { throw new UnsupportedOperationException(); }
+    };
+  }
+
+  /**
+   * the n<sup>th</sup> element of the given series.
+   * @throws NoSuchElementException if there are less than n elements in the
+   *   given Iterable's {@link Iterable#iterator iterator}.
+   */
+  public static <T>
+  T nth(int n, Iterable<T> iterable) {
+    Iterator<? extends T> it = iterable.iterator();
+    while (--n > 0) {
+      it.next();
+    }
+    return it.next();
+  }
+
+  public static void main(String[] args) {
+    System.out.print(nth(10, new Fibonacci()));
+  }
+}
+
+ +

Java w/ language specified

+

(first line shown is line 12)

+
+package foo;
+
+import java.util.Iterator;
+
+/**
+ * the fibonacci series implemented as an Iterable.
+ */
+public final class Fibonacci implements Iterable<Integer> {
+  /** the next and previous members of the series. */
+  private int a = 1, b = 1;
+
+  @Override
+  public Iterator<Integer> iterator() {
+    return new Iterator<Integer>() {
+      /** the series is infinite. */
+      public boolean hasNext() { return true; }
+      public Integer next() {
+        int tmp = a;
+        a += b;
+        b = tmp;
+        return a;
+      }
+      public void remove() { throw new UnsupportedOperationException(); }
+    };
+  }
+
+  /**
+   * the n<sup>th</sup> element of the given series.
+   * @throws NoSuchElementException if there are less than n elements in the
+   *   given Iterable's {@link Iterable#iterator iterator}.
+   */
+  public static <T>
+  T nth(int n, Iterable<T> iterable) {
+    Iterator<? extends T> in = iterable.iterator();
+    while (--n > 0) {
+      in.next();
+    }
+    return in.next();
+  }
+
+  public static void main(String[] args) {
+    System.out.print(nth(10, new Fibonacci()));
+  }
+}
+
+# not a java comment
+# not keywords: static_cast and namespace
+
+ +

JavaScript

+
+/**
+ * nth element in the fibonacci series.
+ * @param n >= 0
+ * @return the nth element, >= 0.
+ */
+function fib(n) {
+  var a = 1, b = 1;
+  var tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+document.write(fib(10));
+
+ +

JavaScript Regular Expressions

+

Issue #12

+
+/foo/;  // a slash starting a line treated as a regexp beginning
+"foo".match(/fo+$/);
+// this line comment not treated as a regular expressions
+"foo /bar/".test(/"baz"/);  // test string and regexp boundaries
+var division = /\b\d+\/\d+/g;  // test char sets and escaping of specials
+var allSpecials = /([^\(\)\[\]\{\}\-\?\+\*\.\^\$\/]+)\\/;
+var slashInCharset = /[^/]/g, notCloseSq = /[^\]]/;
+
+// test that slash used in numeric context treated as an operator
+1 / 2;
+1. / x;
+x / y;
+(x) / y;
+1 /* foo */ / 2;
+1 /* foo *// 2;
+1/2;
+1./x;
+x/y;
+(x)/y;
+
+// test split over two lines.  line comment should not fool it
+1//
+/2;
+
+x++/y;
+x--/y;
+x[y] / z;
+f() / n;
+
+// test that slash after non postfix operator is start of regexp
+log('matches = ' + /foo/.test(foo));
+
+// test keyword preceders
+return /a regexp/;
+division = notreturn / not_a_regexp / 2;  // keyword suffix does not match
+
+// & not used as prefix operator in javascript but this should still work
+&/foo/;
+
+extends = /extends/;
+
+ +

JavaScript Regular Expressions w/ language specified

+

Issue #12

+
+/foo/;  // a slash starting a line treated as a regexp beginning
+"foo".match(/fo+$/);
+// this line comment not treated as a regular expressions
+"foo /bar/".test(/"baz"/);  // test string and regexp boundaries
+var division = /\b\d+\/\d+/g;  // test char sets and escaping of specials
+var allSpecials = /([^\(\)\[\]\{\}\-\?\+\*\.\^\$\/]+)\\/;
+var slashInCharset = /[^/]/g, notCloseSq = /[^\]]/;
+
+// test that slash used in numeric context treated as an operator
+1 / 2;
+1. / x;
+x / y;
+(x) / y;
+1 /* foo */ / 2;
+1 /* foo *// 2;
+1/2;
+1./x;
+x/y;
+(x)/y;
+
+// test split over two lines.  line comment should not fool it
+1//
+/2;
+
+x++/y;
+x--/y;
+x[y] / z;
+f() / n;
+
+// test that slash after non postfix operator is start of regexp
+log('matches = ' + /foo/.test(foo));
+
+// test keyword preceders
+return /a regexp/;
+division = notreturn / not_a_regexp / 2;  // keyword suffix does not match
+
+// & not used as prefix operator in javascript but this should still work
+&/foo/;
+
+extends = /extends/;
+
+ +

CoffeeScript

+
+class Animal
+  constructor: (@name) ->
+  move: (meters, loc) ->
+    alert @name + " moved " + meters + "m."
+  travel: (path...) ->
+    for place in path
+      @move place.distance, place.location
+
+class Horse extends Animal
+  ###
+  @param name Horse name
+  @param jumper Jumping ability
+  ###
+  constructor: (name, jumper) ->
+    super name
+    @capable = jumper
+  step: ->
+    alert '''
+          Step,
+          step...
+          '''
+  jump: ->
+    @capable
+  move: (meters, where) ->
+    switch where
+      when "ground"
+        @step()
+        super meters
+      when "hurdle"
+        super meters if @jump()
+
+# Create horse
+tom = new Horse "Tommy", yes
+
+street =
+  location: "ground"
+  distance: 12
+car =
+  location: "hurdle"
+  distance: 2
+
+###
+Tell him to travel:
+1. through the street
+2. over the car
+###
+tom.travel street, car
+
+ +

Perl

+
+#!/usr/bin/perl
+
+use strict;
+use integer;
+
+# the nth element of the fibonacci series
+# param n - an int >= 0
+# return an int >= 0
+sub fib($) {
+  my $n = shift, $a = 1, $b = 1;
+  ($a, $b) = ($a + $b, $a) until (--$n < 0);
+  return $a;
+}
+
+print fib(10);
+
+ +

Python

+
+#!/usr/bin/python2.4
+
+def fib():
+  '''
+  a generator that produces the elements of the fibonacci series
+  '''
+
+  a = 1
+  b = 1
+  while True:
+    a, b = a + b, a
+    yield a
+
+def nth(series, n):
+  '''
+  returns the nth element of a series,
+  consuming the earlier elements of the series
+  '''
+
+  for x in series:
+    n = n - 1
+    if n <= 0: return x
+
+print nth(fib(), 10)
+
+ +

Python w/ language specified

+
+#!/usr/bin/python2.4
+
+def fib():
+  '''
+  a generator that produces the fibonacci series's elements
+  '''
+
+  a = 1
+  b = 1
+  while True:
+    a, b = a + b, a
+    yield a
+
+def nth(series, n):
+  '''
+  returns the nth element of a series,
+  consuming the series' earlier elements.
+  '''
+
+  for x in series:
+    n -= 1
+    if n <= 0: return x
+
+print nth(fib(), 10)
+
+/* not a comment and not keywords: null char true */
+
+ +

SQL

+
+/* A multi-line
+ * comment */
+'Another string /* Isn\'t a comment',
+"A string */"
+-- A line comment
+SELECT * FROM users WHERE id IN (1, 2.0, +30e-1);
+-- keywords are case-insensitive.
+-- Note: user-table is a single identifier, not a pair of keywords
+select * from user-table where id in (x, y, z);
+
+ +

XML

+
+<!DOCTYPE series PUBLIC "fibonacci numbers">
+
+<series.root base="1" step="s(n-2) + s(n-1)">
+  <element i="0">1</element>
+  <element i="1">1</element>
+  <element i="2">2</element>
+  <element i="3">3</element>
+  <element i="4">5</element>
+  <element i="5">8</element>
+  ...
+</series.root>
+
+ +

HTML

+
+<html>
+  <head>
+    <title>Fibonacci number</title>
+    <style><!-- BODY { text-decoration: blink } --></style>
+    <script src="foo.js"></script>
+    <script src="bar.js"></script>
+  </head>
+  <body>
+    <noscript>
+      <dl>
+        <dt>Fibonacci numbers</dt>
+        <dd>1</dd>
+        <dd>1</dd>
+        <dd>2</dd>
+        <dd>3</dd>
+        <dd>5</dd>
+        <dd>8</dd>
+        &hellip;
+      </dl>
+    </noscript>
+
+    <script type="text/javascript"><!--
+function fib(n) {
+  var a = 1, b = 1;
+  var tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+document.writeln(fib(10));
+// -->
+    </script>
+  </body>
+</html>
+
+ +

HTML w/ language specified

+
+Fibonacci Numbers
+
+<noscript>
+  <dl style="list-style: disc">
+    <dt>Fibonacci numbers</dt>
+    <dd>1</dd>
+    <dd>1</dd>
+    <dd>2</dd>
+    <dd>3</dd>
+    <dd>5</dd>
+    <dd>8</dd>
+    &hellip;
+  </dl>
+</noscript>
+
+<script type="text/javascript"><!--
+function fib(n) {
+  var a = 1, b = 1;
+  var tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+
+document.writeln(fib(10));
+// -->
+</script>
+
+ +

HTML using <XMP>

+<html> + <head> + <title>Fibonacci number</title> + </head> + <body> + <noscript> + <dl> + <dt>Fibonacci numbers</dt> + <dd>1</dd> + <dd>1</dd> + <dd>2</dd> + <dd>3</dd> + <dd>5</dd> + <dd>8</dd> + &hellip; + </dl> + </noscript> + + <script type="text/javascript"><!-- +function fib(n) { + var a = 1, b = 1; + var tmp; + while (--n >= 0) { + tmp = a; + a += b; + b = tmp; + } + return a; +} + +document.writeln(fib(10)); +// --> + </script> + </body> +</html> + + +

XHTML

+
<xhtml>
+  <head>
+    <title>Fibonacci number</title>
+  </head>
+  <body onload="alert(fib(10))">
+    <script type="text/javascript"><![CDATA[
+function fib(n) {
+  var a = 1, b = 1;
+  var tmp;
+  while (--n >= 0) {
+    tmp = a;
+    a += b;
+    b = tmp;
+  }
+  return a;
+}
+]]>
+    </script>
+  </body>
+</xhtml>
+
+ +

PHP

+
+<html>
+  <head>
+    <title><?= 'Fibonacci numbers' ?></title>
+
+    <?php
+      // PHP has a plethora of comment types
+      /* What is a
+         "plethora"? */
+      function fib($n) {
+        # I don't know.
+        $a = 1;
+        $b = 1;
+        while (--$n >= 0) {
+          echo "$a\n";
+          $tmp = $a;
+          $a += $b;
+          $b = $tmp;
+        }
+      }
+    ?>
+  </head>
+  <body>
+    <?= fib(10) ?>
+  </body>
+</html>
+
+ +

XSL

+

Issue #19

+
+<!-- Test elements and attributes with namespaces -->
+
+<xsl:stylesheet xml:lang="en">
+  <xsl:template match=".">
+    <xsl:text>Hello World</xsl:text>
+  </xsl:template>
+</xsl:stylesheet>
+
+ +

Whitespace

+

+
+

Misc

+
// ends with line comment token
+//
+ +

JavaScript inside HTML <SCRIPT>

+

+Issue #4: +JavaScript Snippets wrapped in HTML SCRIPT tags hides/destroys inner content +

+

The fact that the script tag was not closed properly was causing +PR_splitSourceNodes to end without emitting the script contents.

+
+<script type="text/javascript">
+   var savedTarget=null;                           // The target layer (effectively vidPane)
+   var orgCursor=null;                             // The original mouse style so we can restore it
+   var dragOK=false;                               // True if we're allowed to move the element under mouse
+   var dragXoffset=0;                              // How much we've moved the element on the horozontal
+   var dragYoffset=0;                              // How much we've moved the element on the verticle
+   vidPaneID = document.getElementById('vidPane'); // Our movable layer
+   vidPaneID.style.top='75px';                     // Starting location horozontal
+   vidPaneID.style.left='75px';                    // Starting location verticle
+<script>
+
+ +

Tabs mangled

+

Issue #8: +If tabs are used to indent code inside <pre>, IE6 and 7 won't honor them +after the script runs.

+

Code indented with tabs will be shown aligned to the left margin instead of +the proper indenting shown in Firefox.

+

I'm using Revision 20 of prettify.js, IE 6.0.29.00 in English and IE +7.0.5730.11 in Spanish.

+
+one	Two	three	Four	five	|
+Six	seven	Eight	nine	Ten	|
+eleven	Twelve	thirteen	Fourteen	fifteen	|
+
+ +

Does not recognize <br> as newline

+

Issue #14

+
//comment
int main(int argc, char **argv) +{}
+ +

Comments not ignored

+

Issue #14

+
<!-- There's an HTML comment in my comment -->
+<p>And another one inside the end tag</p>
+
+ +

Missing blank lines

+

Issue #20

+
<html>
+
+<head>
+ +

Code doesn't copy and paste well in IE

+

Issue #21: +To test this bug, disable overriding of _pr_isIE6 in test_base.js +by putting #testcopypaste on the end of the URL and reloading the +page, then copy and paste the above into Notepad.

+
<html>
+  <head>
+    <title>Test</title>
+  </head>
+</html>
+ +

Line numbers and other non-code spans in code

+

Issue #22

+
01: // This is a line of code
+02: /* Multiline comments can
+03:  * span over and around
+04:  * line markers
+And can even be interrupted
+by inline code annotations
+05:  */
+06: class MyClass extends Foo {
+07:   public static void main(String... argv) {
+08:     System.out.print("Hello World");
+09:   }
+10: }
+ +

Lua

+

Issue #24

+
+os=require("os")
+math=require("math")
+
+-- Examples from the language reference
+     a = 'alo\n123"'
+     a = "alo\n123\""
+     a = '\97lo\10\04923"'
+     a = [[alo
+     123"]]
+     a = [==[
+     alo
+     123"]==]
+
+3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56
+
+-- Some comments that demonstrate long brackets
+double_quoted = "Not a long bracket [=["
+--[=[ quoting out
+ [[ foo ]]
+ [==[does not end comment either]==]
+]=]
+past_end_of_comment
+--]=]
+
+-- Example code courtesy Joseph Harmbruster
+#
+do
+  local function ssgeneral(t, n, before)
+    for _, h in ipairs(incs) do
+      for i = h + 1, n do
+        local v = t[i]
+        for j = i - h, 1, -h do
+          local testval = t[j]
+          if not before(v, testval) then break end
+          t[i] = testval; i = j
+        end
+        t[i] = v
+      end 
+    end
+    return t
+  end
+
+  function shellsort(t, before, n)
+    n = n or #t
+    if not before or before == "<" then return ssup(t, n)
+    elseif before == ">" then return ssdown(t, n)
+    else return ssgeneral(t, n, before)
+    end
+  end
+  return shellsort
+end
+ +

VBScript

+

Issue #27

+
+Imports System
+
+Class [class]
+    Shared Sub [shared](ByVal [boolean] As Boolean)
+        If [boolean] Then
+            Console.WriteLine("true")
+        Else
+            Console.WriteLine("false")
+        End If
+    End Sub
+End Class
+
+' Comment
+‘ Second Line comment with a smart quote _
+  continued line using VB6 syntax.
+Module [module]
+    Sub Main()
+        [class].[shared](True)
+
+        ' This prints out: ".
+        Console.WriteLine("""")
+
+        ' This prints out: a"b.
+        Console.WriteLine("a""b")
+
+        ' This prints out: a.
+        Console.WriteLine("a"c)
+
+        ' This prints out: ".
+        Console.WriteLine(""""c)
+
+        REM an old-style comment
+        REMOVE(not_a_comment)
+    End Sub
+End Module
+
+Dim d As Date
+d = # 8/23/1970 3:45:39AM #
+d = # 8/23/1970 #
+d = # 3:45:39AM #
+d = # 3:45:39 #
+d = # 13:45:39 #
+d = # 13:45:39PM #
+
+Dim n As Float
+n = (0.0, .99F, 1.0E-2D, 1.0E+3D, .5E4, 1E3R, 4D)
+
+Dim i As Integer
+i = (0, 123, 45L, &HA0I, &O177S)
+
+ +

Haskell

+

Issue #30

+
+-- A comment
+Not(--"a comment")
+Also.not(--(A.comment))
+
+module Foo(bar) where
+import Blah
+import BlahBlah(blah)
+import Monads(Exception(..), FIO(..),unFIO,handle,runFIO,fixFIO,fio,
+              write,writeln,HasNext(..),HasOutput(..))
+
+{- nested comments
+ - don't work {-yet-} -}
+instance Thingy Foo where
+  a = b
+
+data Foo :: (* -> * -> *) -> * > * -> * where
+  Nil :: Foo a b c
+  Cons :: a b c -> Foo abc -> Foo a b c
+
+str = "Foo\\Bar"
+char = 'x'
+Not.A.Char = 'too long'  -- Don't barf.  Show that 't is a lexical error.
+
+(ident, ident', Fo''o.b'ar)
+
+(0, 12, 0x45, 0xA7, 0o177, 0O377, 0.1, 1.0, 1e3, 0.5E-3, 1.0E+45)
+
+ +

OCaml and F#

+

Issue #33

+

TODO: handle nested (* (* comments *) *) properly.

+
+(*
+ * Print the 10th fibonacci number
+ *)
+
+//// A line comment
+"A string";;
+(0, 125, 0xa0, -1.0, 1e6, 1.2e-3);;  // number literals
+
+#if fibby
+  let
+    rec fib = function (0, a, _) -> a
+                     | (n, a, b) -> fib(n - 1, a + b, a)
+  in
+    print_int(fib(10, 1, 1));;
+#endif
+
+let zed = 'z'
+
+let f' x' = x' + 1
+
+ +

Lisp

+

Issue #42

+
; -*- mode: lisp -*-
+
+(defun back-six-lines () (interactive) (forward-line -6))
+(defun forward-six-lines () (interactive) (forward-line 6))
+
+(global-set-key "\M-l" 'goto-line)
+(global-set-key "\C-z" 'advertised-undo)
+(global-set-key [C-insert] 'clipboard-kill-ring-save)
+(global-set-key [S-insert] 'clipboard-yank)
+(global-set-key [C-up] 'back-six-lines)
+(global-set-key [C-down] 'forward-six-lines)
+
+(setq visible-bell t)
+(setq user-mail-address "foo@bar.com")
+(setq default-major-mode 'text-mode)
+
+(setenv "TERM" "emacs")
+(c-set-offset 'case-label 2)
+(setq c-basic-offset 2)
+(setq perl-indent-level 0x2)
+(setq delete-key-deletes-forward t)
+(setq indent-tabs-mode nil)
+
+;; Text mode
+(add-hook 'text-mode-hook 
+  '(lambda ()
+     (turn-on-auto-fill)
+   )
+)
+
+;; Fundamental mode
+(add-hook 'fundamental-mode-hook 
+  '(lambda ()
+     (turn-on-auto-fill)
+   )
+)
+
+;; Define and cond are keywords in scheme
+(define (sqt x) (sqrt-iter 1.0 2.0 x))
+
+ +

Square brackets in strings

+

Issue #45

+
+throw new RuntimeException("Element [" + element.getName() + 
+  "] missing attribute.");
+variable++;
+
+ +

Protocol Buffers

+
message SearchRequest {
+  required string query = 1;
+  optional int32 page_number = 2;
+  optional int32 result_per_page = 3 [default = 10];
+  enum Corpus {
+    UNIVERSAL = 0;
+    WEB = 1;
+    IMAGES = 2;
+    LOCAL = 3;
+    NEWS = 4;
+    PRODUCTS = 5;
+    VIDEO = 6;
+  }
+  optional Corpus corpus = 4 [default = UNIVERSAL];
+}
+ +

Wiki Syntax

+
+#summary hello world
+#labels HelloWorld WikiWord Hiya
+
+[http://www.google.com/?q=WikiSyntax+site:code.google.com WikiSyntax]
+
+Lorem Ipsum `while (1) print("blah blah");`
+
+   * Bullet
+   * Points
+      * NestedBullet
+
+==DroningOnAndOn==
+{{{
+  // Some EmbeddedSourceCode
+  void main() {
+    Print('hello world');
+  }
+}}}
+
+{{{
+  <!-- Embedded XML -->
+  <foo bar="baz"><boo /><foo>
+}}}
+
+ +

CSS w/ language specified

+
+<!--
+@charset('UTF-8');
+
+/** A url that is not quoted. */
+@import(url(/more-styles.css));
+
+HTML { content-before: 'hello\20'; content-after: 'w\6f rld';
+       -moz-spiff: inherit !important }
+
+/* Test units on numbers. */
+BODY { margin-bottom: 4px; margin-left: 3in; margin-bottom: 0; margin-top: 5% }
+
+/** Test number literals and quoted values. */
+TABLE.foo TR.bar A#visited { color: #001123; font-family: "monospace" }
+/** bolder is not a name, so should be plain.  !IMPORTANT is a keyword
+  * regardless of case.
+  */
+blink { text-decoration: BLINK !IMPORTANT; font-weight: bolder }
+/* Empty url() was causing infinite recursion */
+a { background-image: url(); }
+p#featured{background:#fea}
+-->
+
+ +

CSS inside HTML <STYLE>

+

Issue #79

+
+<style type='text/css'>
+/* desert scheme ported from vim to google prettify */
+code.prettyprint { display: block; padding: 2px; border: 1px solid #888;
+background-color: #333; }
+.str { color: #ffa0a0; } /* string  - pink */
+.kwd { color: #f0e68c; font-weight: bold; }
+.com { color: #87ceeb; } /* comment - skyblue */
+.typ { color: #98fb98; } /* type    - lightgreen */
+.lit { color: #cd5c5c; } /* literal - darkred */
+.pun { color: #fff; }    /* punctuation */
+.pln { color: #fff; }    /* plaintext */
+.tag { color: #f0e68c; font-weight: bold; } /* html/xml tag    - lightyellow*/
+.atn { color: #bdb76b; font-weight: bold; } /* attribute name  - khaki*/
+.atv { color: #ffa0a0; } /* attribute value - pink */
+.dec { color: #98fb98; } /* decimal         - lightgreen */
+</style>
+
+ +

NBSPs

+

Issue #84

+
super("&nbsp;");
+ +

Line breaks and preformatted style

+

Issue #86

+

CODE tag

+

#One +Two words

+

CODE tag with preformatted style

+

#One +Two lines

+

PRE tag

+
#One
+Two lines
+

PRE+CODE tag

+
#One
+Two lines
+

XMP tag

+#One +Two lines +

CODE tag with BR line break

+

#One
+Two lines

+ +

Capital letters in tag names

+

Issue #92

+
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2">
+  <Placemark>
+    <name>Simple placemark</name>
+    <description Lang="en">Attached to the ground. Intelligently places itself 
+       at the height of the underlying terrain.</description>
+    <Point>
+      <coordinates>-122.0822035425683,37.42228990140251,0</coordinates>
+    </Point>
+  </Placemark>
+</kml>
+
+ +

C# verbatim strings

+

Issue #93

+
+// The normal string syntax
+string a = "C:\\";
+// is equivalent to a verbatim string
+string b = @"C:\";
+
+ +

VHDL

+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+-- A line comment
+entity foo_entity is
+
+  generic (-- comment after punc
+    a : natural := 42;
+    x : real := 16#ab.cd#-3
+  );
+  port (
+    clk_i : in  std_logic;
+    b_i   : in  natural range 0 to 100;
+    c_o   : out std_logic_vector(5 downto 0);
+    \a "name"\ : out integer  -- extended identifier
+  );
+
+end entity foo_entity;
+
+architecture foo_architecture of foo_entity is
+  signal bar_s : std_logic_vector(2 downto 0);
+begin
+  
+  bar_s <= b"101";
+
+  dummy_p : process (clk_i)
+  begin
+    if b_i = 1 then
+      c_o <= (others => '0');
+    elsif rising_edge(clk_i) then
+      c_o <= "1011" & bar_s(1 downto 0);
+    end if;
+  end process dummy_p;
+
+end architecture foo_architecture;
+
+ +

YAML

+
+application: mirah-lang
+version: 1
+
+# Here's a comment
+handlers:
+  - url: /red/*
+     servlet: mysite.server.TeamServlet
+     init_params:
+       teamColor: red
+       bgColor: "#CC0000"
+     name: redteam
+  - url: /blue/*
+     servlet: mysite.server.TeamServlet
+     init_params:
+       teamColor: blue
+       bgColor: "#0000CC"
+     name: blueteam
+  - url: /register/*
+     jsp: /register/start.jsp
+  - url: *.special
+     filter: mysite.server.LogFilterImpl
+     init_params:
+       logType: special
+  
+ +

YAML

+
+%YAML 1.1
+---
+!!map {
+  ? !!str ""
+  : !!str "value",
+  ? !!str "explicit key"
+  : !!str "value",
+  ? !!str "simple key"
+  : !!str "value",
+  ? !!seq [
+    !!str "collection",
+    !!str "simple",
+    !!str "key"
+  ]
+  : !!str "value"
+}
+ +

Scala

+
+/* comment 1 */
+/*
+comment 2
+*/
+/* comment / * comment 3 **/
+// strings
+"Hello, World!", "\n",
+`an-identifier`, `\n`,
+'A', '\n',
+'aSymbol,
+"""Hello,
+World""", """Hello,\nWorld""",
+"""Hello, "World"!""",
+"""Hello, \"World\""""
+
+// Numbers
+0
+0123
+0xa0
+0XA0L
+123
+123.45
+1.50F
+0.50
+.50
+123e-1
+123.45e+1
+1.50e2
+0.50e-6
+.50e+42f
+
+// Values
+false, true, null, this;
+
+// Keywords
+class MyClass;
+import foo.bar;
+package baz;
+
+// From scala-lang.org/node/242
+def act() {
+  var pongCount = 0
+  loop {
+    react {
+      case Ping =>
+        if (pongCount % 1000 == 0)
+          Console.println("Pong: ping "+pongCount)
+        sender ! Pong
+        pongCount = pongCount + 1
+      case Stop =>
+        Console.println("Pong: stop")
+        exit()
+    }
+  }
+}
+
+ +

Go

+
+package main  /* Package of which this program is part. */
+
+import fmt "fmt"  // Package implementing formatted I/O.
+
+
+func main() {
+    fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n")  // Semicolon inserted here
+}
+
+/* " */  "foo /* "  /*/  */
+/* ` */  `foo /* `  /*/  */
+
+ +

Erlang

+
+% Sample comment
+
+-module(my_test).
+-include_lib("my_sample_lib.hrl").
+-export([
+    test/2
+]).
+
+%% @doc Define a macro
+-define(my_macro, Variable).
+
+%% @doc My function
+test(Variables, MoreVariables) ->
+    % Inline comment
+    {ok,Scanned,_} = my_lib:do_stuff(),
+
+    Variable = fun(V) -> {ok, V} end,
+
+    try ?my_macro({value, test}) of
+        {value, Result, _} ->
+            {ok, Result}
+    catch
+        Type:Error ->
+            {'error', Type, Error}
+    end.
+
+ +

Rust

+
+// Single line comment
+/* Multi-line (nesting not highlighted properly, sorry)
+comment */
+
+#![feature(code_prettification)]
+
+use std::io::{self, Write};
+
+impl<'a, T: 'a + ?Sized> Foo<'a, 'static> for Bar<'b>
+where T: Iterator<Item = Box<Fn() -> u32>> {
+    fn something(&mut self) -> u32 {
+        if let Some(ref x) = self.foo("multi li\ne
+s\tring") {
+            panic!(r"\things is going wrong!");
+            panic!(r#"Things is "really" goig\n wront!"#);
+            panic!(r##"Raw strings are #"#fancy#"#"##);
+        }
+    }
+}
+
+pub type CowString<'a> = std::cow::Cow<'a, str>;
+
+fn main() {
+    let (i, r) = (1u8, 'c');
+    let s = r#"Take a raw egg,
+        "break" it (or the line),
+        and beat it"#;
+}
+
+ + + diff --git a/static/bower_components/google-prettify/tests/prettify_test.js b/static/bower_components/google-prettify/tests/prettify_test.js new file mode 100644 index 00000000..9d40aa7b --- /dev/null +++ b/static/bower_components/google-prettify/tests/prettify_test.js @@ -0,0 +1,1782 @@ +/** + * maps ids of rewritten code to the expected output. + * For brevity, has been changed to `FOO + * and < /span> has been changed to `END. + */ +var goldens = { + bash: ( + '`COM#!/bin/bash`END`PLN\n' + + '\n' + + '`END`COM# Fibonacci numbers`END`PLN\n' + + '`END`COM# Writes an infinite series to stdout, one entry per line`END' + + '`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDlocal`END`PLN a`END`PUN=`END`LIT1`END`PLN\n' + + ' `END`KWDlocal`END`PLN b`END`PUN=`END`LIT1`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`KWDtrue`END`PLN `END`PUN;`END' + + '`PLN `END`KWDdo`END`PLN\n' + + ' echo $a\n' + + ' `END`KWDlocal`END`PLN tmp`END`PUN=`END`PLN$a\n' + + ' a`END`PUN=`END`PLN$`END`PUN((`END`PLN $a `END`PUN+`END' + + '`PLN $b `END`PUN))`END`PLN\n' + + ' b`END`PUN=`END`PLN$tmp\n' + + ' `END`KWDdone`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`COM# output the 10th element of the series and halt`END`PLN\n' + + 'fib `END`PUN|`END`PLN head `END`PUN-`END`LIT10`END`PLN `END`PUN|`END' + + '`PLN tail `END`PUN-`END`LIT1`END' + ), + bash_lang: ( + '
    `#`COM#!/bin/bash`END' + + '`#1`PLN `END' + + '`#2`COM# Fibonacci numbers`END' + + '`#3`COM# Writes an infinite series to stdout, one entry per line`END' + + '`#4`KWDfunction`END`PLN fib`END`PUN()`END`PLN `END`PUN{`END' + + '`#5`PLN `END`KWDlocal`END`PLN a`END`PUN=`END`LIT1`END' + + '`#6`PLN `END`KWDlocal`END`PLN b`END`PUN=`END`LIT1`END' + + '`#7`PLN `END`KWDwhile`END`PLN true `END`PUN;`END' + + '`PLN `END`KWDdo`END' + + '`#8`PLN echo $a`END' + + '`#9`PLN `END`KWDlocal`END`PLN tmp`END`PUN=`END`PLN$a`END' + + '`#0`PLN a`END`PUN=`END`PLN$`END`PUN((`END`PLN $a `END`PUN+`END' + + '`PLN $b `END`PUN))`END' + + '`#1`PLN b`END`PUN=`END`PLN$tmp`END' + + '`#2`PLN `END`KWDdone`END' + + '`#3`PUN}`END' + + '`#4`PLN `END' + + '`#5`COM# output the 10th element of the series and halt`END' + + '`#6`PLNfib `END`PUN|`END`PLN `END`PUN/`END`PLNusr`END`PUN/`END`PLNbin`END' + + '`PUN/*`END`PLNhead `END`PUN-`END`LIT10`END`PLN `END`PUN|`END' + + '`PLN tail `END`PUN-`END`LIT1`END
' + ), + issue_165: ( + '`COM# Comment`END`PLN\n' + + '`END`KWDlocal`END`PLN $x `END`PUN=`END`PLN $`END`PUN{#`END`PLNx`END`PUN[@]}`END`PLN `END' + + '`COM# Previous is not a comment`END`PLN\n' + + '`END`COM# A comment`END' + ), + c: ( + '`COM#include`END`PLN `END`STR<stdio.h>`END`PLN\n' + + '\n' + + '`END`COM/* the n-th fibonacci number.\n' + + ' *\/`END`PLN\n' + + '`END`KWDunsigned`END`PLN `END`KWDint`END`PLN fib`END`PUN(`END' + + '`KWDunsigned`END`PLN `END`KWDint`END`PLN n`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDunsigned`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' + + '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' + + '`PUN;`END`PLN\n' + + ' `END`KWDunsigned`END`PLN `END`KWDint`END`PLN tmp`END`PUN;`END' + + '`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + 'main`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' printf`END`PUN(`END`STR"%u"`END`PUN,`END`PLN fib`END`PUN(`END' + + '`LIT10`END`PUN));`END`PLN\n' + + '`END`PUN}`END' + ), + c_lang: ( + '`COM#include`END`PLN `END`STR<stdio.h>`END`PLN\n' + + '\n' + + '`END`COM/* the n`END`COMth`END<\/sup>`COM fibonacci number. *\/`END`PLN\n' + + '`END`TYPuint32`END`PLN fib`END`PUN(`END' + + '`KWDunsigned`END`PLN `END`TYPint`END`PLN n`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`TYPuint32`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`TYPuint32`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDvoid`END`PLN main`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`TYPsize_t`END`PLN size `END`PUN=`END`PLN `END`KWDsizeof`END' + + '`PUN(`END`TYPwchar_t`END`PUN);`END`PLN\n' + + ' ASSERT_EQ`END`PUN(`END`PLNsize`END`PUN,`END`PLN `END`LIT1`END' + + '`PUN);`END`PLN\n' + + ' printf`END`PUN(`END`STR"%u"`END`PUN,`END`PLN fib`END`PUN(`END' + + '`LIT10`END`PUN));`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`COM#define`END`PLN ZERO `END`LIT0`END`PLN `END`COM/* a\n' + + ' multiline comment *\/`END' + ), + cpp: ( + '`COM#include`END`PLN `END`STR<iostream>`END`PLN\n' + + '\n' + + '`END`KWDusing`END`PLN `END`KWDnamespace`END`PLN std`END`PUN;`END' + + '`PLN\n' + + '\n' + + '`END`COM//! fibonacci numbers with gratuitous use of templates.`END' + + '`PLN\n' + + '`END`COM//! \\param n an index into the fibonacci series`END`PLN\n' + + '`END`COM//! \\param fib0 element 0 of the series`END`PLN\n' + + '`END`COM//! \\return the nth element of the fibonacci series`END' + + '`PLN\n' + + '`END`KWDtemplate`END`PLN `END`PUN<`END`KWDclass`END`PLN T`END' + + '`PUN>`END`PLN\n' + + 'T fib`END`PUN(`END`KWDunsigned`END`PLN `END`KWDint`END`PLN n`END' + + '`PUN,`END`PLN `END`KWDconst`END`PLN T`END`PUN&`END`PLN fib0' + + '`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' T a`END`PUN(`END`PLNfib0`END`PUN),`END`PLN b`END`PUN(`END' + + '`PLNfib0`END`PUN);`END`PLN\n' + + ' `END`KWDfor`END`PLN `END`PUN(;`END`PLN n`END`PUN;`END' + + '`PLN `END`PUN--`END`PLNn`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' T tmp`END`PUN(`END`PLNa`END`PUN);`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDint`END`PLN main`END`PUN(`END`KWDint`END`PLN argc`END' + + '`PUN,`END`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END' + + '`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' cout `END`PUN<<`END`PLN fib`END`PUN(`END`LIT10`END' + + '`PUN,`END`PLN `END`LIT1U`END`PUN);`END`PLN\n' + + '`END`PUN}`END' + ), + cpp_lang: ( + '`COM#include`END`PLN `END`STR<iostream>`END`PLN\n' + + '\n' + + '`END`KWDusing`END`PLN `END`KWDnamespace`END`PLN std`END`PUN;`END' + + '`PLN\n' + + '\n' + + '`END`COM//! fibonacci numbers with gratuitous use of templates.`END' + + '`PLN\n' + + '`END`COM//! \\param n an index into the fibonacci series`END`PLN\n' + + '`END`COM//! \\param fib0 element 0 of the series`END`PLN\n' + + '`END`COM//! \\return the nth element of the fibonacci series`END' + + '`PLN\n' + + '`END`KWDtemplate`END`PLN `END`PUN<`END`KWDclass`END`PLN T`END' + + '`PUN>`END`PLN\n' + + 'T fib`END`PUN(`END`TYPint`END`PLN n`END' + + '`PUN,`END`PLN `END`KWDconst`END`PLN T`END`PUN&`END`PLN fib0' + + '`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' T a`END`PUN(`END`PLNfib0`END`PUN),`END`PLN b`END`PUN(`END' + + '`PLNfib0`END`PUN);`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' T tmp`END`PUN(`END`PLNa`END`PUN);`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`TYPint`END`PLN main`END`PUN(`END`TYPint`END`PLN argc`END' + + '`PUN,`END`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END' + + '`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' cout `END`PUN<<`END`PLN fib`END`PUN(`END`LIT10`END' + + '`PUN,`END`PLN `END`LIT1U`END`PUN);`END`PLN\n' + + '`END`PUN}`END' + ), + java: ( + '`KWDpackage`END`PLN foo`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDimport`END`PLN java`END`PUN.`END`PLNutil`END`PUN.`END' + + '`TYPIterator`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM/**\n' + + ' * the fibonacci series implemented as an Iterable.\n' + + ' *\/`END`PLN\n' + + '`END`KWDpublic`END`PLN `END`KWDfinal`END`PLN `END`KWDclass`END' + + '`PLN `END`TYPFibonacci`END`PLN `END`KWDimplements`END`PLN `END' + + '`TYPIterable`END`PUN<`END`TYPInteger`END`PUN>`END`PLN `END`' + + 'PUN{`END`PLN\n' + + ' `END' + + '`COM/** the next and previous members of the series. *\/`END' + + '`PLN\n' + + ' `END`KWDprivate`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' + + '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' + + '`PUN;`END`PLN\n' + + '\n' + + ' `END`LIT@Override`END`PLN\n' + + ' `END`KWDpublic`END`PLN `END`TYPIterator`END`PUN<`END' + + '`TYPInteger`END`PUN>`END`PLN iterator`END`PUN()`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDreturn`END`PLN `END`KWDnew`END`PLN `END' + + '`TYPIterator`END`PUN<`END`TYPInteger`END`PUN>()`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`COM/** the series is infinite. *\/`END' + + '`PLN\n' + + ' `END`KWDpublic`END`PLN `END`KWDboolean`END' + + '`PLN hasNext`END`PUN()`END`PLN `END`PUN{`END`PLN `END' + + '`KWDreturn`END`PLN `END`KWDtrue`END`PUN;`END`PLN `END`PUN}`END' + + '`PLN\n' + + ' `END`KWDpublic`END`PLN `END`TYPInteger`END' + + '`PLN `END`KWDnext`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDint`END`PLN tmp `END`PUN=`END' + + '`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END' + + '`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END' + + '`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END' + + '`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDpublic`END`PLN `END`KWDvoid`END' + + '`PLN `END`KWDremove`END`PUN()`END`PLN `END`PUN{`END`PLN `END`KWDthrow`END' + + '`PLN `END`KWDnew`END`PLN `END' + + '`TYPUnsupportedOperationException`END`PUN();`END`PLN `END' + + '`PUN}`END`PLN\n' + + ' `END`PUN};`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '\n' + + ' `END`COM/**\n' + + ' * the n<sup>th</sup> element of the given ' + + 'series.\n' + + ' * @throws NoSuchElementException if there are less than ' + + 'n elements in the\n' + + ' * given Iterable\'s {@link Iterable#iterator ' + + 'iterator}.\n' + + ' *\/`END`PLN\n' + + ' `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END' + + '`PUN<`END`PLNT`END`PUN>`END`PLN\n' + + ' T nth`END`PUN(`END`KWDint`END`PLN n`END`PUN,`END`PLN `END' + + '`TYPIterable`END`PUN<`END`PLNT`END`PUN>`END' + + '`PLN iterable`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`TYPIterator`END`PUN<?`END`PLN ' + + '`END`KWDextends`END`PLN T`END`PUN>`END`PLN it `END`PUN=`END' + + '`PLN iterable`END`PUN.`END`PLNiterator`END`PUN();`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END' + + '`PUN>`END`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' it`END`PUN.`END`KWDnext`END`PUN();`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN it`END`PUN.`END`KWDnext`END' + + '`PUN();`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '\n' + + ' `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END' + + '`PLN main`END`PUN(`END`TYPString`END`PUN[]`END`PLN args`END' + + '`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`TYPSystem`END`PUN.`END`KWDout`END`PUN.`END' + + '`KWDprint`END`PUN(`END`PLNnth`END`PUN(`END`LIT10`END`PUN,`END' + + '`PLN `END`KWDnew`END`PLN `END`TYPFibonacci`END`PUN()));`END' + + '`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '`END`PUN}`END' + ), + java_lang: ( + '
  1. ' + + '`KWDpackage`END`PLN foo`END`PUN;`END' + + '`#2`PLN `END' + + '`#3`KWDimport`END`PLN java`END`PUN.`END`PLNutil`END`PUN.`END' + + '`TYPIterator`END`PUN;`END' + + '`#4`PLN `END' + + '`#5`COM/**`END' + + '`#6`COM * the fibonacci series implemented as an Iterable.`END' + + '`#7`COM *\/`END' + + '`#8`KWDpublic`END`PLN `END`KWDfinal`END`PLN `END`KWDclass`END' + + '`PLN `END`TYPFibonacci`END`PLN `END`KWDimplements`END`PLN `END' + + '`TYPIterable`END`PUN<`END`TYPInteger`END`PUN>`END`PLN `END`' + + 'PUN{`END' + + '`#9`PLN `END' + + '`COM/** the next and previous members of the series. *\/`END' + + '' + + '`#0`PLN `END`KWDprivate`END`PLN `END`KWDint`END`PLN a `END`PUN=`END' + + '`PLN `END`LIT1`END`PUN,`END`PLN b `END`PUN=`END`PLN `END`LIT1`END' + + '`PUN;`END' + + '`#1`PLN `END' + + '`#2`PLN `END`LIT@Override`END' + + '`#3`PLN `END`KWDpublic`END`PLN `END`TYPIterator`END`PUN<`END' + + '`TYPInteger`END`PUN>`END`PLN iterator`END`PUN()`END`PLN `END' + + '`PUN{`END' + + '`#4`PLN `END`KWDreturn`END`PLN `END`KWDnew`END`PLN `END' + + '`TYPIterator`END`PUN<`END`TYPInteger`END`PUN>()`END`PLN `END' + + '`PUN{`END' + + '`#5`PLN `END`COM/** the series is infinite. *\/`END' + + '' + + '`#6`PLN `END`KWDpublic`END`PLN `END`KWDboolean`END' + + '`PLN hasNext`END`PUN()`END`PLN `END`PUN{`END`PLN `END' + + '`KWDreturn`END`PLN `END`KWDtrue`END`PUN;`END`PLN `END`PUN}`END' + + '' + + '`#7`PLN `END`KWDpublic`END`PLN `END`TYPInteger`END' + + '`PLN next`END`PUN()`END`PLN `END`PUN{`END' + + '`#8`PLN `END`KWDint`END`PLN tmp `END`PUN=`END' + + '`PLN a`END`PUN;`END' + + '`#9`PLN a `END`PUN+=`END`PLN b`END`PUN;`END' + + '' + + '`#0`PLN b `END`PUN=`END`PLN tmp`END`PUN;`END' + + '' + + '`#1`PLN `END`KWDreturn`END`PLN a`END`PUN;`END' + + '' + + '`#2`PLN `END`PUN}`END' + + '`#3`PLN `END`KWDpublic`END`PLN `END`KWDvoid`END' + + '`PLN remove`END`PUN()`END`PLN `END`PUN{`END`PLN `END`KWDthrow`END' + + '`PLN `END`KWDnew`END`PLN `END' + + '`TYPUnsupportedOperationException`END`PUN();`END`PLN `END' + + '`PUN}`END' + + '`#4`PLN `END`PUN};`END' + + '`#5`PLN `END`PUN}`END' + + '`#6`PLN `END' + + '`#7`PLN `END`COM/**`END' + + '`#8`COM * the n<sup>th</sup> element of the given ' + + 'series.`END' + + '`#9`COM * @throws NoSuchElementException if there are less than ' + + 'n elements in the`END' + + '`#0`COM * given Iterable\'s {@link Iterable#iterator ' + + 'iterator}.`END' + + '`#1`COM *\/`END' + + '`#2`PLN `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END' + + '`PUN<`END`PLNT`END`PUN>`END' + + '`#3`PLN T nth`END`PUN(`END`KWDint`END`PLN n`END`PUN,`END`PLN `END' + + '`TYPIterable`END`PUN<`END`PLNT`END`PUN>`END' + + '`PLN iterable`END`PUN)`END`PLN `END`PUN{`END' + + '`#4`PLN `END`TYPIterator`END`PUN<?`END`PLN `END' + + '`KWDextends`END`PLN T`END`PUN>`END`PLN in `END`PUN=`END' + + '`PLN iterable`END`PUN.`END`PLNiterator`END`PUN();`END' + + '`#5`PLN `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END' + + '`PUN>`END`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END' + + '`#6`PLN in`END`PUN.`END`PLNnext`END`PUN();`END' + + '`#7`PLN `END`PUN}`END' + + '`#8`PLN `END`KWDreturn`END`PLN in`END`PUN.`END`PLNnext`END' + + '`PUN();`END' + + '`#9`PLN `END`PUN}`END' + + '`#0`PLN `END' + + '`#1`PLN `END`KWDpublic`END`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END' + + '`PLN main`END`PUN(`END`TYPString`END`PUN[]`END`PLN args`END' + + '`PUN)`END`PLN `END`PUN{`END' + + '`#2`PLN `END`TYPSystem`END`PUN.`END`PLNout`END`PUN.`END' + + '`PLNprint`END`PUN(`END`PLNnth`END`PUN(`END`LIT10`END`PUN,`END' + + '`PLN `END`KWDnew`END`PLN `END`TYPFibonacci`END`PUN()));`END' + + '' + + '`#3`PLN `END`PUN}`END' + + '`#4`PUN}`END' + + '`#5`PLN `END' + + '`#6`PUN#`END`PLN not a java comment`END' + + '`#7`PUN#`END`PLN not keywords`END`PUN:`END' + + '`PLN static_cast and namespace`END
' + ), + javascript: ( + '`COM/**\n' + + ' * nth element in the fibonacci series.\n' + + ' * @param n >= 0\n' + + ' * @return the nth element, >= 0.\n' + + ' *\/`END`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + 'document`END`PUN.`END`PLNwrite`END`PUN(`END`PLNfib`END`PUN(`END' + + '`LIT10`END`PUN));`END' + ), + perl: ( + '`COM#!/usr/bin/perl`END`PLN\n' + + '\n' + + '`END`KWDuse`END`PLN strict`END`PUN;`END`PLN\n' + + '`END`KWDuse`END`PLN integer`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM# the nth element of the fibonacci series`END`PLN\n' + + '`END`COM# param n - an int >= 0`END`PLN\n' + + '`END`COM# return an int >= 0`END`PLN\n' + + '`END`KWDsub`END`PLN fib`END`PUN(`END`PLN$`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDmy`END`PLN $n `END`PUN=`END`PLN shift`END`PUN,`END`PLN ' + + '$a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END`PLN $b `END' + + '`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`PUN(`END`PLN$a`END`PUN,`END`PLN $b`END`PUN)`END' + + '`PLN `END`PUN=`END`PLN `END`PUN(`END`PLN$a `END`PUN+`END' + + '`PLN $b`END`PUN,`END`PLN $a`END`PUN)`END`PLN `END`KWDuntil`END' + + '`PLN `END`PUN(--`END`PLN$n `END`PUN<`END`PLN `END`LIT0`END' + + '`PUN);`END`PLN\n' + + ' `END`KWDreturn`END`PLN $a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDprint`END`PLN fib`END`PUN(`END`LIT10`END`PUN);`END' + ), + python: ( + '`COM#!/usr/bin/python2.4`END`PLN\n' + + '\n' + + '`END`KWDdef`END`PLN fib`END`PUN():`END`PLN\n' + + ' `END`STR\'\'\'\n' + + ' a generator that produces the elements of the fibonacci series' + + '\n' + + ' \'\'\'`END`PLN\n' + + '\n' + + ' a `END`PUN=`END`PLN `END`LIT1`END`PLN\n' + + ' b `END`PUN=`END`PLN `END`LIT1`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`KWDTrue`END`PUN:`END`PLN\n' + + ' a`END`PUN,`END`PLN b `END`PUN=`END`PLN a `END`PUN+`END' + + '`PLN b`END`PUN,`END`PLN a\n' + + ' `END`KWDyield`END`PLN a\n' + + '\n' + + '`END`KWDdef`END`PLN nth`END`PUN(`END`PLNseries`END`PUN,`END`PLN n`END' + + '`PUN):`END`PLN\n' + + ' `END`STR\'\'\'\n' + + ' returns the nth element of a series,\n' + + ' consuming the earlier elements of the series\n' + + ' \'\'\'`END`PLN\n' + + '\n' + + ' `END`KWDfor`END`PLN x `END`KWDin`END`PLN series`END`PUN:`END' + + '`PLN\n' + + ' n `END`PUN=`END`PLN n `END`PUN-`END`PLN `END`LIT1`END' + + '`PLN\n' + + ' `END`KWDif`END`PLN n `END`PUN<=`END`PLN `END' + + '`LIT0`END`PUN:`END`PLN `END`KWDreturn`END`PLN x\n' + + '\n' + + '`END`KWDprint`END`PLN nth`END`PUN(`END`PLNfib`END`PUN(),`END`PLN `END' + + '`LIT10`END`PUN)`END' + ), + python_lang: ( + '`COM#!/usr/bin/python2.4`END`PLN\n' + + '\n' + + '`END`KWDdef`END`PLN fib`END`PUN():`END`PLN\n' + + ' `END`STR\'\'\'\n' + + ' a generator that produces the fibonacci series\'s elements' + + '\n' + + ' \'\'\'`END`PLN\n' + + '\n' + + ' a `END`PUN=`END`PLN `END`LIT1`END`PLN\n' + + ' b `END`PUN=`END`PLN `END`LIT1`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`KWDTrue`END`PUN:`END`PLN\n' + + ' a`END`PUN,`END`PLN b `END`PUN=`END`PLN a `END`PUN+`END' + + '`PLN b`END`PUN,`END`PLN a\n' + + ' `END`KWDyield`END`PLN a\n' + + '\n' + + '`END`KWDdef`END`PLN nth`END`PUN(`END`PLNseries`END`PUN,`END`PLN n`END' + + '`PUN):`END`PLN\n' + + ' `END`STR\'\'\'\n' + + ' returns the nth element of a series,\n' + + ' consuming the series\' earlier elements.\n' + + ' \'\'\'`END`PLN\n' + + '\n' + + ' `END`KWDfor`END`PLN x `END`KWDin`END`PLN series`END`PUN:`END' + + '`PLN\n' + + ' n `END`PUN-=`END`PLN `END`LIT1`END' + + '`PLN\n' + + ' `END`KWDif`END`PLN n `END`PUN<=`END`PLN `END' + + '`LIT0`END`PUN:`END`PLN `END`KWDreturn`END`PLN x\n' + + '\n' + + '`END`KWDprint`END`PLN nth`END`PUN(`END`PLNfib`END`PUN(),`END`PLN `END' + + '`LIT10`END`PUN)`END`PLN\n' + + '\n' + + '`END`PUN/*`END`PLN `END`KWDnot`END`PLN a comment `END`KWDand`END' + + '`PLN `END`KWDnot`END`PLN keywords`END`PUN:`END' + + '`PLN null char true `END`PUN*\/`END' + ), + sql_lang: ( + '`COM/* A multi-line\n' + + ' * comment *\/`END`PLN\n' + + '`END`STR\'Another string /* Isn\\\'t a comment\'`END`PUN,`END`PLN\n' + + '`END`STR"A string *\/"`END`PLN\n' + + '`END`COM-- A line comment`END`PLN\n' + + '`END`KWDSELECT`END`PLN `END`PUN*`END`PLN `END`KWDFROM`END' + + '`PLN users `END`KWDWHERE`END`PLN id `END`KWDIN`END`PLN `END' + + '`PUN(`END`LIT1`END`PUN,`END`PLN `END`LIT2.0`END`PUN,`END`PLN `END' + + '`LIT+30e-1`END`PUN);`END`PLN\n' + + '`END`COM-- keywords are case-insensitive.`END`PLN\n' + + '`END`COM-- Note: user-table is a single identifier, not a pair of' + + ' keywords`END`PLN\n' + + '`END`KWDselect`END`PLN `END`PUN*`END`PLN `END`KWDfrom`END' + + '`PLN user-table `END`KWDwhere`END`PLN id `END`KWDin`END`PLN `END' + + '`PUN(`END`PLNx`END`PUN,`END`PLN y`END`PUN,`END`PLN z`END`PUN);`END' + ), + xml: ( + '`DEC<!DOCTYPE series PUBLIC "fibonacci numbers">`END`PLN\n' + + '\n' + + '`END`TAG<series.root`END`PLN `END`ATNbase`END`PUN=`END' + + '`ATV"1"`END`PLN `END' + + '`ATNstep`END`PUN=`END`ATV"s(n-2) + s(n-1)"`END`TAG>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"0"`END' + + '`TAG>`END`PLN1`END`TAG</element>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"1"`END' + + '`TAG>`END`PLN1`END`TAG</element>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"2"`END' + + '`TAG>`END`PLN2`END`TAG</element>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"3"`END' + + '`TAG>`END`PLN3`END`TAG</element>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"4"`END' + + '`TAG>`END`PLN5`END`TAG</element>`END' + + '`PLN\n' + + ' `END`TAG<element`END`PLN `END`ATNi`END`PUN=`END' + + '`ATV"5"`END' + + '`TAG>`END`PLN8`END`TAG</element>`END' + + '`PLN\n' + + ' ...\n' + + '`END`TAG</series.root>`END' + ), + html: ( + '`TAG<html>`END`PLN\n' + + ' `END`TAG<head>`END`PLN\n' + + ' `END`TAG<title>`END`PLNFibonacci number`END' + + '`TAG</title>`END`PLN\n' + + ' `END`TAG<style>`END`COM<!--`END' + + '`PLN BODY `END`PUN{`END`PLN `END`KWDtext-decoration`END`PUN:`END' + + '`PLN blink `END`PUN}`END`PLN `END`COM-->`END`TAG</' + + 'style>`END`PLN\n' + + ' `END`TAG<script`END`PLN `END`ATNsrc`END`PUN=`END' + + '`ATV"foo.js"`END`TAG></script>`END`PLN\n' + + ' `END`TAG<script`END`PLN `END`ATNsrc`END`PUN=`END' + + '`ATV"bar.js"`END`TAG></script>`END`PLN\n' + + ' `END`TAG</head>`END`PLN\n' + + ' `END`TAG<body>`END`PLN\n' + + ' `END`TAG<noscript>`END`PLN\n' + + ' `END`TAG<dl>`END`PLN\n' + + ' `END`TAG<dt>`END' + + '`PLNFibonacci numbers`END`TAG</dt>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN2`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN3`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN5`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN8`END' + + '`TAG</dd>`END`PLN\n' + + ' &hellip;\n' + + ' `END`TAG</dl>`END`PLN\n' + + ' `END`TAG</noscript>`END`PLN\n' + + '\n' + + ' `END`TAG<script`END`PLN `END`ATNtype`END`PUN=`END' + + '`ATV"text/javascript"`END`TAG>`END`PUN<!--`END`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + 'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' + + '`LIT10`END`PUN));`END`PLN\n' + + '`END`COM// -->`END`PLN\n' + + ' `END`TAG</script>`END`PLN\n' + + ' `END`TAG</body>`END`PLN\n' + + '`END`TAG</html>`END' + ), + html_lang: ( + '`PLNFibonacci Numbers\n' + + '\n' + + '`END`TAG<noscript>`END`PLN\n' + + ' `END`TAG<dl`END`PLN `END`ATNstyle`END`PUN=`END' + + '`ATV"`END`KWDlist-style`END`PUN:`END`PLN disc`END`ATV"`END' + + '`TAG>`END`PLN\n' + + ' `END`TAG<dt>`END' + + '`PLNFibonacci numbers`END`TAG</dt>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END`TAG</dd>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END`TAG</dd>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN2`END`TAG</dd>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN3`END`TAG</dd>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN5`END`TAG</dd>`END' + + '`PLN\n' + + ' `END`TAG<dd>`END`PLN8`END`TAG</dd>`END' + + '`PLN\n' + + ' &hellip;\n' + + ' `END`TAG</dl>`END`PLN\n' + + '`END`TAG</noscript>`END`PLN\n' + + '\n' + + '`END`TAG<script`END`PLN `END`ATNtype`END`PUN=`END' + + '`ATV"text/javascript"`END`TAG>`END`PUN<!--`END`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + 'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' + + '`LIT10`END`PUN));`END`PLN\n' + + '`END`COM// -->`END`PLN\n' + + '`END`TAG</script>`END' + ), + html_xmp: ( + '`TAG<html>`END`PLN\n' + + ' `END`TAG<head>`END`PLN\n' + + ' `END`TAG<title>`END`PLNFibonacci number`END' + + '`TAG</title>`END`PLN\n' + + ' `END`TAG</head>`END`PLN\n' + + ' `END`TAG<body>`END`PLN\n' + + ' `END`TAG<noscript>`END`PLN\n' + + ' `END`TAG<dl>`END`PLN\n' + + ' `END`TAG<dt>`END' + + '`PLNFibonacci numbers`END`TAG</dt>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN1`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN2`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN3`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN5`END' + + '`TAG</dd>`END`PLN\n' + + ' `END`TAG<dd>`END`PLN8`END' + + '`TAG</dd>`END`PLN\n' + + ' &hellip;\n' + + ' `END`TAG</dl>`END`PLN\n' + + ' `END`TAG</noscript>`END`PLN\n' + + '\n' + + ' `END`TAG<script`END`PLN `END`ATNtype`END`PUN=`END' + + '`ATV"text/javascript"`END`TAG>`END`PUN<!--`END`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + 'document`END`PUN.`END`PLNwriteln`END`PUN(`END`PLNfib`END`PUN(`END' + + '`LIT10`END`PUN));`END`PLN\n' + + '`END`COM// -->`END`PLN\n' + + ' `END`TAG</script>`END`PLN\n' + + ' `END`TAG</body>`END`PLN\n' + + '`END`TAG</html>`END' + ), + xhtml: ( + '`TAG<xhtml>`END`PLN\n' + + ' `END`TAG<head>`END`PLN\n' + + ' `END`TAG<title>`END' + + '`PLNFibonacci number`END`TAG</title>`END' + + '`PLN\n' + + ' `END`TAG</head>`END`PLN\n' + + ' `END`TAG<body`END`PLN `END`ATNonload`END`PUN=`END' + + '`ATV"`END`PLNalert`END`PUN(`END`PLNfib`END`PUN(`END`LIT10`END' + + '`PUN))`END`ATV"`END`TAG>`END`PLN\n' + + ' `END`TAG<script`END`PLN `END`ATNtype`END' + + '`PUN=`END`ATV"text/javascript"`END`TAG>`END' + + '`PUN<![`END`PLNCDATA`END`PUN[`END`PLN\n' + + '`END`KWDfunction`END`PLN fib`END`PUN(`END`PLNn`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN a `END`PUN=`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN b `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END`PLNn `END`PUN>=`END' + + '`PLN `END`LIT0`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' tmp `END`PUN=`END`PLN a`END`PUN;`END`PLN\n' + + ' a `END`PUN+=`END`PLN b`END`PUN;`END`PLN\n' + + ' b `END`PUN=`END`PLN tmp`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDreturn`END`PLN a`END`PUN;`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '`END`PUN]]>`END`PLN\n' + + ' `END`TAG</script>`END`PLN\n' + + ' `END`TAG</body>`END`PLN\n' + + '`END`TAG</xhtml>`END' + ), + php: ( + '`TAG<html>`END`PLN\n' + + ' `END`TAG<head>`END`PLN\n' + + ' `END`TAG<title>`END`PUN<?=`END' + + '`PLN `END' + + '`STR\'Fibonacci numbers\'`END`PLN `END' + + '`PUN?>`END`TAG</title>`END`PLN\n' + + '\n' + + ' `END`PUN<?`END`PLNphp\n' + + ' `END`COM// PHP has a plethora of comment types' + + '`END`PLN\n' + + ' `END`COM\/* What is a\n' + + ' "plethora"? *\/`END`PLN\n' + + ' `END`KWDfunction`END`PLN fib`END`PUN(`END' + + '`PLN$n`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`COM# I don\'t know.`END`PLN\n' + + ' $a `END`PUN=`END`PLN `END`LIT1`END' + + '`PUN;`END`PLN\n' + + ' $b `END`PUN=`END`PLN `END`LIT1`END' + + '`PUN;`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`PUN(--`END' + + '`PLN$n `END`PUN>=`END`PLN `END`LIT0`END`PUN)`END`PLN `END' + + '`PUN{`END`PLN\n' + + ' echo `END`STR"$a\\n"`END`PUN;`END' + + '`PLN\n' + + ' $tmp `END`PUN=`END`PLN $a`END' + + '`PUN;`END`PLN\n' + + ' $a `END`PUN+=`END`PLN $b`END' + + '`PUN;`END`PLN\n' + + ' $b `END`PUN=`END`PLN $tmp`END' + + '`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`PUN?>`END`PLN\n' + + ' `END`TAG</head>`END`PLN\n' + + ' `END`TAG<body>`END`PLN\n' + + ' `END`PUN<?=`END`PLN fib`END' + + '`PUN(`END`LIT10`END`PUN)`END`PLN `END`PUN?>`END`PLN\n' + + ' `END`TAG</body>`END`PLN\n' + + '`END`TAG</html>`END' + ), + xsl: ( + '`COM<!-- Test elements and attributes with namespaces -->' + + '`END`PLN\n' + + '\n' + + '`END`TAG<xsl:stylesheet`END`PLN `END`ATNxml:lang`END' + + '`PUN=`END`ATV"en"`END`TAG>`END`PLN\n' + + ' `END`TAG<xsl:template`END' + + '`PLN `END`ATNmatch`END`PUN=`END`ATV"."`END' + + '`TAG>`END`PLN\n' + + ' `END`TAG<xsl:text>`END' + + '`PLNHello World`END' + + '`TAG</xsl:text>`END`PLN\n' + + ' `END`TAG</xsl:template>`END`PLN\n' + + '`END`TAG</xsl:stylesheet>`END' + ), + whitespace: '', + misc1: ( + '`COM// ends with line comment token`END`PLN\n' + + '`END`COM//`END' + ), + js_script: ( + '`TAG<script`END`PLN `END' + + '`ATNtype`END`PUN=`END`ATV"text/javascript"`END' + + '`TAG>`END`PLN\n' + + ' var savedTarget=null' + + '; ' + + ' // The target ' + + 'layer (effectively vidPane)\n' + + ' var orgCursor=null' + + '; ' + + ' // The ' + + 'original mouse style so we can restore it\n' + + ' var dragOK=false' + + '; ' + + ' ' + + '// True if we\'re allowed to move the element under mouse' + + '\n' + + ' var dragXoffset=0' + + '; ' + + ' ' + + '// How much we\'ve moved the element on the horozontal' + + '\n' + + ' var dragYoffset=0' + + '; ' + + ' ' + + '// How much we\'ve moved the element on the verticle' + + '\n' + + ' vidPaneID = document.' + + 'getElementById(\'vidPane\');' + + ' // Our movable layer\n' + + ' vidPaneID.style.top' + + '=\'75px\'; ' + + ' // ' + + 'Starting location horozontal\n' + + ' vidPaneID.style.left' + + '=\'75px\'; ' + + ' // ' + + 'Starting location verticle\n' + + '`END`TAG<script>`END' + ), + issue8: ( + '`PLNone`END`PLN\t`END`TYPTwo`END`PLN' + + '\t`END`PLNthree`END`PLN\t`END`TYPFour' + + '`END`PLN\t`END`PLNfive`END`PLN\t' + + '`END`PUN|`END`PLN\n' + + '`END`TYPSix`END`PLN\t`END`PLNseven`END`PLN\t' + + '`END`TYPEight`END`PLN\tnine\t`END`TYPTen`END' + + '`PLN\t`END`PUN|`END`PLN\n' + + '`END`PLNeleven`END`PLN\t`END`TYPTwelve`END`PLN\t`END' + + '`PLNthirteen`END`PLN\t`END' + + '`TYPFourteen`END`PLN\tfifteen\t`END`' + + 'PUN|`END' + ), + js_regexp: ( + '`STR/foo/`END`PUN;`END`PLN `END`COM// a slash starting a line ' + + 'treated as a regexp beginning`END`PLN\n' + + '`END`STR"foo"`END`PUN.`END`PLNmatch`END`PUN(`END`STR/fo+$/`END' + + '`PUN);`END`PLN\n' + + '`END`COM// this line comment not treated as a regular expressions`END' + + '`PLN\n' + + '`END`STR"foo /bar/"`END`PUN.`END`PLNtest`END`PUN(`END`STR/"baz"/`END' + + '`PUN);`END`PLN `END`COM// test string and regexp boundaries' + + '`END`PLN\n' + + '`END`KWDvar`END`PLN division `END`PUN=`END`PLN `END' + + '`STR/\\b\\d+\\/\\d+/`END`PLNg`END`PUN;`END`PLN `END' + + '`COM// test char sets and escaping of specials`END`PLN\n' + + '`END`KWDvar`END`PLN allSpecials `END`PUN=`END`PLN `END' + + '`STR/([^\\(\\)\\[\\]\\{\\}\\-\\?\\+\\*\\.\\^\\$\\/]+)\\\\/`END' + + '`PUN;`END`PLN\n' + + '`END`KWDvar`END`PLN slashInCharset `END`PUN=`END`PLN `END' + + '`STR/[^/]/`END`PLNg`END`PUN,`END`PLN notCloseSq `END`PUN=`END' + + '`PLN `END`STR/[^\\]]/`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test that slash used in numeric context treated as an ' + + 'operator`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1.`END`PLN `END`PUN/`END`PLN x`END`PUN;`END`PLN\n' + + 'x `END`PUN/`END`PLN y`END`PUN;`END`PLN\n' + + '`END`PUN(`END`PLNx`END`PUN)`END`PLN `END`PUN/`END`PLN y`END`PUN;`END' + + '`PLN\n' + + '`END`LIT1`END`PLN `END`COM/* foo *\/`END`PLN `END`PUN/`END`PLN `END' + + '`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1`END`PLN `END`COM/* foo *\/`END`PUN/`END`PLN `END`LIT2`END' + + '`PUN;`END`PLN\n' + + '`END`LIT1`END`PUN/`END`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1.`END`PUN/`END`PLNx`END`PUN;`END`PLN\n' + + 'x`END`PUN/`END`PLNy`END`PUN;`END`PLN\n' + + '`END`PUN(`END`PLNx`END`PUN)/`END`PLNy`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test split over two lines. line comment should not ' + + 'fool it`END`PLN\n' + + '`END`LIT1`END`COM//`END`PLN\n' + + '`END`PUN/`END`LIT2`END`PUN;`END`PLN\n' + + '\n' + + 'x`END`PUN++/`END`PLNy`END`PUN;`END`PLN\n' + + 'x`END`PUN--/`END`PLNy`END`PUN;`END`PLN\n' + + 'x`END`PUN[`END`PLNy`END`PUN]`END`PLN `END`PUN/`END`PLN z`END`PUN;`END' + + '`PLN\n' + + 'f`END`PUN()`END`PLN `END`PUN/`END`PLN n`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test that slash after non postfix operator is start of ' + + 'regexp`END`PLN\n' + + 'log`END`PUN(`END`STR\'matches = \'`END`PLN `END`PUN+`END`PLN `END' + + '`STR/foo/`END`PUN.`END`PLNtest`END`PUN(`END`PLNfoo`END`PUN));`END' + + '`PLN\n' + + '\n' + + '`END`COM// test keyword preceders`END`PLN\n' + + '`END`KWDreturn`END`PLN `END`STR/a regexp/`END`PUN;`END`PLN\n' + + 'division `END`PUN=`END`PLN notreturn `END`PUN/`END`PLN not_a_regexp ' + + '`END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN `END`COM// ' + + 'keyword suffix does not match`END`PLN\n' + + '\n' + + '`END`COM// & not used as prefix operator in javascript but this ' + + 'should still work`END`PLN\n' + + '`END`PUN&`END`STR/foo/`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDextends`END`PLN `END`PUN=`END`PLN `END`STR/extends/`END' + + '`PUN;`END' + ), + js_regexp_lang: ( + '`STR/foo/`END`PUN;`END`PLN `END`COM// a slash starting a line ' + + 'treated as a regexp beginning`END`PLN\n' + + '`END`STR"foo"`END`PUN.`END`PLNmatch`END`PUN(`END`STR/fo+$/`END' + + '`PUN);`END`PLN\n' + + '`END`COM// this line comment not treated as a regular expressions`END' + + '`PLN\n' + + '`END`STR"foo /bar/"`END`PUN.`END`PLNtest`END`PUN(`END`STR/"baz"/`END' + + '`PUN);`END`PLN `END`COM// test string and regexp boundaries' + + '`END`PLN\n' + + '`END`KWDvar`END`PLN division `END`PUN=`END`PLN `END' + + '`STR/\\b\\d+\\/\\d+/`END`PLNg`END`PUN;`END`PLN `END' + + '`COM// test char sets and escaping of specials`END`PLN\n' + + '`END`KWDvar`END`PLN allSpecials `END`PUN=`END`PLN `END' + + '`STR/([^\\(\\)\\[\\]\\{\\}\\-\\?\\+\\*\\.\\^\\$\\/]+)\\\\/`END' + + '`PUN;`END`PLN\n' + + '`END`KWDvar`END`PLN slashInCharset `END`PUN=`END`PLN `END' + + '`STR/[^/]/`END`PLNg`END`PUN,`END`PLN notCloseSq `END`PUN=`END' + + '`PLN `END`STR/[^\\]]/`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test that slash used in numeric context treated as an ' + + 'operator`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1.`END`PLN `END`PUN/`END`PLN x`END`PUN;`END`PLN\n' + + 'x `END`PUN/`END`PLN y`END`PUN;`END`PLN\n' + + '`END`PUN(`END`PLNx`END`PUN)`END`PLN `END`PUN/`END`PLN y`END`PUN;`END' + + '`PLN\n' + + '`END`LIT1`END`PLN `END`COM/* foo *\/`END`PLN `END`PUN/`END`PLN `END' + + '`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1`END`PLN `END`COM/* foo *\/`END`PUN/`END`PLN `END`LIT2`END' + + '`PUN;`END`PLN\n' + + '`END`LIT1`END`PUN/`END`LIT2`END`PUN;`END`PLN\n' + + '`END`LIT1.`END`PUN/`END`PLNx`END`PUN;`END`PLN\n' + + 'x`END`PUN/`END`PLNy`END`PUN;`END`PLN\n' + + '`END`PUN(`END`PLNx`END`PUN)/`END`PLNy`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test split over two lines. line comment should not ' + + 'fool it`END`PLN\n' + + '`END`LIT1`END`COM//`END`PLN\n' + + '`END`PUN/`END`LIT2`END`PUN;`END`PLN\n' + + '\n' + + 'x`END`PUN++/`END`PLNy`END`PUN;`END`PLN\n' + + 'x`END`PUN--/`END`PLNy`END`PUN;`END`PLN\n' + + 'x`END`PUN[`END`PLNy`END`PUN]`END`PLN `END`PUN/`END`PLN z`END`PUN;`END' + + '`PLN\n' + + 'f`END`PUN()`END`PLN `END`PUN/`END`PLN n`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// test that slash after non postfix operator is start of ' + + 'regexp`END`PLN\n' + + 'log`END`PUN(`END`STR\'matches = \'`END`PLN `END`PUN+`END`PLN `END' + + '`STR/foo/`END`PUN.`END`PLNtest`END`PUN(`END`PLNfoo`END`PUN));`END' + + '`PLN\n' + + '\n' + + '`END`COM// test keyword preceders`END`PLN\n' + + '`END`KWDreturn`END`PLN `END`STR/a regexp/`END`PUN;`END`PLN\n' + + 'division `END`PUN=`END`PLN notreturn `END`PUN/`END`PLN not_a_regexp ' + + '`END`PUN/`END`PLN `END`LIT2`END`PUN;`END`PLN `END`COM// ' + + 'keyword suffix does not match`END`PLN\n' + + '\n' + + '`END`COM// & not used as prefix operator in javascript but this ' + + 'should still work`END`PLN\n' + + '`END`PUN&`END`STR/foo/`END`PUN;`END`PLN\n' + + '\n' + + 'extends `END`PUN=`END`PLN `END`STR/extends/`END`PUN;`END' + ), + coffee: ( + '`KWDclass`END`PLN `END`TYPAnimal`END`PLN\n' + + ' constructor`END`PUN:`END`PLN `END`PUN(`END`LIT@name`END`PUN)`END`PLN `END`PUN->`END`PLN\n' + + ' move`END`PUN:`END`PLN `END`PUN(`END`PLNmeters`END`PUN,`END`PLN loc`END`PUN)`END`PLN `END`PUN->`END`PLN\n' + + ' alert `END`LIT@name`END`PLN `END`PUN+`END`PLN `END`STR" moved "`END`PLN `END`PUN+`END`PLN meters `END`PUN+`END`PLN `END`STR"m."`END`PLN\n' + + ' travel`END`PUN:`END`PLN `END`PUN(`END`PLNpath`END`PUN...)`END`PLN `END`PUN->`END`PLN\n' + + ' `END`KWDfor`END`PLN place `END`KWDin`END`PLN path\n' + + ' `END`LIT@move`END`PLN place`END`PUN.`END`PLNdistance`END`PUN,`END`PLN place`END`PUN.`END`PLNlocation\n' + + '\n' + + '`END`KWDclass`END`PLN `END`TYPHorse`END`PLN `END`KWDextends`END`PLN `END`TYPAnimal`END`PLN\n' + + ' `END`COM###\n' + + ' @param name Horse name\n' + + ' @param jumper Jumping ability\n' + + ' ###`END`PLN\n' + + ' constructor`END`PUN:`END`PLN `END`PUN(`END`PLNname`END`PUN,`END`PLN jumper`END`PUN)`END`PLN `END`PUN->`END`PLN\n' + + ' `END`KWDsuper`END`PLN name\n' + + ' `END`LIT@capable`END`PLN `END`PUN=`END`PLN jumper\n' + + ' step`END`PUN:`END`PLN `END`PUN->`END`PLN\n' + + ' alert `END`STR\'\'\'\n' + + ' Step,\n' + + ' step...\n' + + ' \'\'\'`END`PLN\n' + + ' jump`END`PUN:`END`PLN `END`PUN->`END`PLN\n' + + ' `END`LIT@capable`END`PLN\n' + + ' move`END`PUN:`END`PLN `END`PUN(`END`PLNmeters`END`PUN,`END`PLN where`END`PUN)`END`PLN `END`PUN->`END`PLN\n' + + ' switch where\n' + + ' `END`KWDwhen`END`PLN `END`STR"ground"`END`PLN\n' + + ' `END`LIT@step`END`PUN()`END`PLN\n' + + ' `END`KWDsuper`END`PLN meters\n' + + ' `END`KWDwhen`END`PLN `END`STR"hurdle"`END`PLN\n' + + ' `END`KWDsuper`END`PLN meters `END`KWDif`END`PLN `END`LIT@jump`END`PUN()`END`PLN\n' + + '\n' + + '`END`COM# Create horse`END`PLN\n' + + 'tom `END`PUN=`END`PLN `END`KWDnew`END`PLN `END`TYPHorse`END`PLN `END`STR"Tommy"`END`PUN,`END`PLN `END`KWDyes`END`PLN\n' + + '\n' + + 'street `END`PUN=`END`PLN\n' + + ' location`END`PUN:`END`PLN `END`STR"ground"`END`PLN\n' + + ' distance`END`PUN:`END`PLN `END`LIT12`END`PLN\n' + + 'car `END`PUN=`END`PLN\n' + + ' location`END`PUN:`END`PLN `END`STR"hurdle"`END`PLN\n' + + ' distance`END`PUN:`END`PLN `END`LIT2`END`PLN\n' + + '\n' + + '`END`COM###\n' + + 'Tell him to travel:\n' + + '1. through the street\n' + + '2. over the car\n' + + '###`END`PLN\n' + + 'tom`END`PUN.`END`PLNtravel street`END`PUN,`END`PLN car`END' + ), + issue14a: ( + '`COM//comment`END
' + + '`KWDint`END`PLN main`END`PUN(`END`KWDint`END`PLN argc`END`PUN,`END' + + '`PLN `END`KWDchar`END`PLN `END`PUN**`END`PLNargv`END`PUN)`END' + + '`PLN\n' + + '`END`PUN{}`END' + ), + issue14b: ( + '`COM<!-- There\'s an `END`COMHTML`END' + + '`COM comment in my comment -->`END`PLN\n' + + '`END`TAG<p>`END' + + '`PLNAnd another one inside the end tag`END' + + '`TAG</p`END`TAG>`END' + ), + issue20: ( + '`TAG<html>`END`PLN\n' + + '\n' + + '`END`TAG<head>`END' + ), + issue21: ( + '`TAG<html>`END`PLN\n' + + ' `END`TAG<head>`END`PLN\n' + + ' `END`TAG<title>`END`PLNTest`END' + + '`TAG</title>`END`PLN\n' + + ' `END`TAG</head>`END`PLN\n' + + '`END`TAG</html>`END' + ), + issue22: ( + '01: `END`COM// This is a line of code`END`PLN\n' + + '`END02: `END`COM/* Multiline comments can\n' + + '`END03: `END`COM * span over and around\n' + + '`END04: `END`COM * line markers\n' + + '`ENDAnd can even be interrupted`END`COM\n' + + '`ENDby inline code annotations`END`COM\n' + + '`END05: `END`COM *\/`END`PLN\n' + + '`END06: `END`KWDclass`END`PLN `END`TYPMyClass`END' + + '`PLN `END`KWDextends`END`PLN `END`TYPFoo`END`PLN `END`PUN{`END' + + '`PLN\n' + + '`END07: `END`PLN `END`KWDpublic`END' + + '`PLN `END`KWDstatic`END`PLN `END`KWDvoid`END`PLN main`END`PUN(`END' + + '`TYPString`END`PUN...`END`PLN argv`END`PUN)`END`PLN `END`PUN{`END' + + '`PLN\n' + + '`END08: `END`PLN `END`TYPSystem`END' + + '`PUN.`END`PLNout`END`PUN.`END`PLNprint`END`PUN(`END' + + '`STR"Hello World"`END`PUN);`END`PLN\n' + + '`END09: `END`PLN `END`PUN}`END`PLN\n' + + '`END10: `END`PUN}`END' + ), + lua: ( + '`PLNos`END`PUN=`END`PLNrequire`END`PUN(`END`STR"os"`END`PUN)`END`PLN\n' + + 'math`END`PUN=`END`PLNrequire`END`PUN(`END`STR"math"`END`PUN)`END`PLN\n' + + '\n' + + '`END`COM-- Examples from the language reference`END`PLN\n' + + ' a `END`PUN=`END`PLN `END`STR\'alo\\n123"\'`END' + + '`PLN\n' + + ' a `END`PUN=`END`PLN `END`STR"alo\\n123\\""`END' + + '`PLN\n' + + ' a `END`PUN=`END`PLN `END' + + '`STR\'\\97lo\\10\\04923"\'`END`PLN\n' + + ' a `END`PUN=`END`PLN `END`STR[[alo\n' + + ' 123"]]`END`PLN\n' + + ' a `END`PUN=`END`PLN `END`STR[==[\n' + + ' alo\n' + + ' 123"]==]`END`PLN\n' + + '\n' + + '`END`LIT3`END`PLN `END`LIT3.0`END`PLN `END`LIT3.1416`END' + + '`PLN `END`LIT314.16e-2`END`PLN `END`LIT0.31416E1`END' + + '`PLN `END`LIT0xff`END`PLN `END`LIT0x56`END`PLN\n' + + '\n' + + '`END`COM-- Some comments that demonstrate long brackets`END`PLN\n' + + 'double_quoted `END`PUN=`END`PLN `END`STR"Not a long bracket [=["`END' + + '`PLN\n' + + '`END`COM--[=[ quoting out\n' + + ' [[ foo ]]\n' + + ' [==[does not end comment either]==]\n' + + ']=]`END`PLN\n' + + 'past_end_of_comment\n' + + '`END`COM--]=]`END`PLN\n' + + '\n' + + '`END`COM-- Example code courtesy Joseph Harmbruster`END`PLN\n' + + '`END`PUN#`END`PLN\n' + + '`END`KWDdo`END`PLN\n' + + ' `END`KWDlocal`END`PLN `END`KWDfunction`END`PLN ssgeneral`END' + + '`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN,`END`PLN before`END' + + '`PUN)`END`PLN\n' + + ' `END`KWDfor`END`PLN _`END`PUN,`END`PLN h `END`KWDin`END' + + '`PLN ipairs`END`PUN(`END`PLNincs`END`PUN)`END`PLN `END`KWDdo`END' + + '`PLN\n' + + ' `END`KWDfor`END`PLN i `END`PUN=`END`PLN h `END' + + '`PUN+`END`PLN `END`LIT1`END`PUN,`END`PLN n `END`KWDdo`END`PLN\n' + + ' `END`KWDlocal`END`PLN v `END`PUN=`END' + + '`PLN t`END`PUN[`END`PLNi`END`PUN]`END`PLN\n' + + ' `END`KWDfor`END`PLN j `END`PUN=`END' + + '`PLN i `END`PUN-`END`PLN h`END`PUN,`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN `END`PUN-`END`PLNh `END`KWDdo`END`PLN\n' + + ' `END`KWDlocal`END`PLN testval `END' + + '`PUN=`END`PLN t`END`PUN[`END`PLNj`END`PUN]`END`PLN\n' + + ' `END`KWDif`END`PLN `END`KWDnot`END' + + '`PLN before`END`PUN(`END`PLNv`END`PUN,`END`PLN testval`END' + + '`PUN)`END`PLN `END`KWDthen`END`PLN `END`KWDbreak`END`PLN `END' + + '`KWDend`END`PLN\n' + + ' t`END`PUN[`END`PLNi`END`PUN]`END' + + '`PLN `END`PUN=`END`PLN testval`END`PUN;`END`PLN i `END`PUN=`END' + + '`PLN j\n' + + ' `END`KWDend`END`PLN\n' + + ' t`END`PUN[`END`PLNi`END`PUN]`END`PLN `END' + + '`PUN=`END`PLN v\n' + + ' `END`KWDend`END`PLN \n' + + ' `END`KWDend`END`PLN\n' + + ' `END`KWDreturn`END`PLN t\n' + + ' `END`KWDend`END`PLN\n' + + '\n' + + ' `END`KWDfunction`END`PLN shellsort`END`PUN(`END`PLNt`END' + + '`PUN,`END`PLN before`END`PUN,`END`PLN n`END`PUN)`END`PLN\n' + + ' n `END`PUN=`END`PLN n `END`KWDor`END`PLN `END`PUN#`END' + + '`PLNt\n' + + ' `END`KWDif`END`PLN `END`KWDnot`END`PLN before `END' + + '`KWDor`END`PLN before `END`PUN==`END`PLN `END`STR"<"`END' + + '`PLN `END`KWDthen`END`PLN `END`KWDreturn`END`PLN ssup`END`PUN(`END' + + '`PLNt`END`PUN,`END`PLN n`END`PUN)`END`PLN\n' + + ' `END`KWDelseif`END`PLN before `END`PUN==`END`PLN `END' + + '`STR">"`END`PLN `END`KWDthen`END`PLN `END`KWDreturn`END' + + '`PLN ssdown`END`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN)`END' + + '`PLN\n' + + ' `END`KWDelse`END`PLN `END`KWDreturn`END' + + '`PLN ssgeneral`END`PUN(`END`PLNt`END`PUN,`END`PLN n`END`PUN,`END' + + '`PLN before`END`PUN)`END`PLN\n' + + ' `END`KWDend`END`PLN\n' + + ' `END`KWDend`END`PLN\n' + + ' `END`KWDreturn`END`PLN shellsort\n' + + '`END`KWDend`END' + ), + vbs: ( + '`KWDImports`END`PLN System\n' + + '\n' + + '`END`KWDClass`END`PLN [class]\n' + + ' `END`KWDShared`END`PLN `END`KWDSub`END`PLN [shared]`END' + + '`PUN(`END`KWDByVal`END`PLN [boolean] `END`KWDAs`END`PLN `END' + + '`KWDBoolean`END`PUN)`END`PLN\n' + + ' `END`KWDIf`END`PLN [boolean] `END' + + '`KWDThen`END`PLN\n' + + ' Console`END`PUN.`END' + + '`PLNWriteLine`END`PUN(`END`STR"true"`END`PUN)`END`PLN\n' + + ' `END`KWDElse`END`PLN\n' + + ' Console`END`PUN.`END' + + '`PLNWriteLine`END`PUN(`END`STR"false"`END`PUN)`END`PLN\n' + + ' `END`KWDEnd`END`PLN `END`KWDIf`END' + + '`PLN\n' + + ' `END`KWDEnd`END`PLN `END`KWDSub`END`PLN\n' + + '`END`KWDEnd`END`PLN `END`KWDClass`END`PLN\n' + + '\n' + + '`END`COM\' Comment`END`PLN\n' + + '`END`COM\u2018 Second Line comment with a smart quote _\n' + + ' continued line using VB6 syntax.`END`PLN\n' + + '`END`KWDModule`END`PLN [module]\n' + + ' `END`KWDSub`END`PLN Main`END`PUN()`END`PLN\n' + + ' [class]`END`PUN.`END`PLN[shared]`END' + + '`PUN(`END`LITTrue`END`PUN)`END`PLN\n' + + '\n' + + ' `END`COM\' This prints out: \".`END' + + '`PLN\n' + + ' Console`END`PUN.`END`PLNWriteLine`END' + + '`PUN(`END`STR""""`END`PUN)`END`PLN\n' + + '\n' + + ' `END`COM\' This prints out: a"b.`END' + + '`PLN\n' + + ' Console`END`PUN.`END`PLNWriteLine`END' + + '`PUN(`END`STR"a""b"`END`PUN)`END`PLN\n' + + '\n' + + ' `END`COM\' This prints out: a.`END' + + '`PLN\n' + + ' Console`END`PUN.`END`PLNWriteLine`END' + + '`PUN(`END`STR"a"c`END`PUN)`END`PLN\n' + + '\n' + + ' `END`COM\' This prints out: ".`END' + + '`PLN\n' + + ' Console`END`PUN.`END`PLNWriteLine`END' + + '`PUN(`END`STR""""c`END`PUN)`END`PLN\n' + + '\n' + + ' `END`COMREM an old-style comment`END`PLN\n' + + ' REMOVE`END`PUN(`END`PLNnot_a_comment`END`PUN)`END`PLN\n' + + ' `END`KWDEnd`END`PLN `END`KWDSub`END`PLN\n' + + '`END`KWDEnd`END`PLN `END`KWDModule`END`PLN\n' + + '\n' + + '`END`KWDDim`END`PLN d `END`KWDAs`END`PLN `END`KWDDate`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 8/23/1970 3:45:39AM #`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 8/23/1970 #`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 3:45:39AM #`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 3:45:39 #`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 13:45:39 #`END`PLN\n' + + 'd `END`PUN=`END`PLN `END`LIT# 13:45:39PM #`END`PLN\n' + + '\n' + + '`END`KWDDim`END`PLN n `END`KWDAs`END`PLN Float\n' + + 'n `END`PUN=`END`PLN `END`PUN(`END`LIT0.0`END`PUN,`END`PLN `END' + + '`LIT.99F`END`PUN,`END`PLN `END`LIT1.0E-2D`END`PUN,`END`PLN `END' + + '`LIT1.0E+3D`END`PUN,`END`PLN `END`LIT.5E4`END`PUN,`END`PLN `END' + + '`LIT1E3R`END`PUN,`END`PLN `END`LIT4D`END`PUN)`END`PLN\n' + + '\n' + + '`END`KWDDim`END`PLN i `END`KWDAs`END`PLN `END`KWDInteger`END`PLN\n' + + 'i `END`PUN=`END`PLN `END`PUN(`END`LIT0`END`PUN,`END`PLN `END' + + '`LIT123`END`PUN,`END`PLN `END`LIT45L`END`PUN,`END`PLN `END' + + '`LIT&HA0I`END`PUN,`END`PLN `END`LIT&O177S`END`PUN)`END' + ), + haskell: ( + '`COM-- A comment`END`PLN\n' + + 'Not`END`PUN(--`END`STR"a comment"`END`PUN)`END`PLN\n' + + 'Also.not`END`PUN(--(`END`PLNA.comment`END`PUN))`END`PLN\n' + + '\n' + + '`END`KWDmodule`END`PLN Foo`END`PUN(`END`PLNbar`END`PUN)`END`PLN `END' + + '`KWDwhere`END`PLN\n' + + '`END`KWDimport`END`PLN Blah\n' + + '`END`KWDimport`END`PLN BlahBlah`END`PUN(`END`PLNblah`END`PUN)`END' + + '`PLN\n' + + '`END`KWDimport`END`PLN Monads`END`PUN(`END`PLNException`END' + + '`PUN(..),`END`PLN FIO`END`PUN(..),`END`PLNunFIO`END`PUN,`END' + + '`PLNhandle`END`PUN,`END`PLNrunFIO`END`PUN,`END`PLNfixFIO`END' + + '`PUN,`END`PLNfio`END`PUN,`END`PLN\n' + + ' write`END`PUN,`END' + + '`PLNwriteln`END`PUN,`END`PLNHasNext`END`PUN(..),`END' + + '`PLNHasOutput`END`PUN(..))`END`PLN\n' + + '\n' + + '`END`COM{- nested comments\n' + + ' - don\'t work {-yet-}`END`PLN `END`PUN-}`END`PLN\n' + + '`END`KWDinstance`END`PLN Thingy Foo `END`KWDwhere`END`PLN\n' + + ' a `END`PUN=`END`PLN b\n' + + '\n' + + '`END`KWDdata`END`PLN Foo `END`PUN::`END`PLN `END`PUN(*`END`PLN `END' + + '`PUN->`END`PLN `END`PUN*`END`PLN `END`PUN->`END`PLN `END' + + '`PUN*)`END`PLN `END`PUN->`END`PLN `END`PUN*`END`PLN `END' + + '`PUN>`END`PLN `END`PUN*`END`PLN `END`PUN->`END`PLN `END' + + '`PUN*`END`PLN `END`KWDwhere`END`PLN\n' + + ' Nil `END`PUN::`END`PLN Foo a b c\n' + + ' Cons `END`PUN::`END`PLN a b c `END`PUN->`END' + + '`PLN Foo abc `END`PUN->`END`PLN Foo a b c\n' + + '\n' + + 'str `END`PUN=`END`PLN `END`STR"Foo\\\\Bar"`END`PLN\n' + + 'char `END`PUN=`END`PLN `END`STR\'x\'`END`PLN\n' + + 'Not.A.Char `END`PUN=`END`PLN `END`STR\'t`END`PLNoo long\' `END' + + '`COM-- Don\'t barf. Show that \'t is a lexical error.`END' + + '`PLN\n' + + '\n' + + '`END`PUN(`END`PLNident`END`PUN,`END`PLN ident\'`END`PUN,`END' + + '`PLN Fo\'\'o.b\'ar`END`PUN)`END`PLN\n' + + '\n' + + '`END`PUN(`END`LIT0`END`PUN,`END`PLN `END`LIT12`END`PUN,`END`PLN `END' + + '`LIT0x45`END`PUN,`END`PLN `END`LIT0xA7`END`PUN,`END`PLN `END' + + '`LIT0o177`END`PUN,`END`PLN `END`LIT0O377`END`PUN,`END`PLN `END' + + '`LIT0.1`END`PUN,`END`PLN `END`LIT1.0`END`PUN,`END`PLN `END' + + '`LIT1e3`END`PUN,`END`PLN `END`LIT0.5E-3`END`PUN,`END`PLN `END' + + '`LIT1.0E+45`END`PUN)`END' + ), + ml: ( + '`COM(*\n' + + ' * Print the 10th fibonacci number\n' + + ' *)`END`PLN\n' + + '\n' + + '`END`COM//// A line comment`END`PLN\n' + + '`END`STR"A string"`END`PUN;;`END`PLN\n' + + '`END`PUN(`END`LIT0`END`PUN,`END`PLN `END`LIT125`END`PUN,`END' + + '`PLN `END`LIT0xa0`END`PUN,`END`PLN `END`LIT-1.0`END`PUN,`END' + + '`PLN `END`LIT1e6`END`PUN,`END`PLN `END`LIT1.2e-3`END`PUN);;`END' + + '`PLN `END`COM// number literals`END`PLN\n' + + '\n' + + '`END`COM#if fibby`END`PLN\n' + + ' `END`KWDlet`END`PLN\n' + + ' `END`KWDrec`END`PLN fib `END`PUN=`END`PLN `END' + + '`KWDfunction`END`PLN `END`PUN(`END`LIT0`END`PUN,`END`PLN a`END' + + '`PUN,`END`PLN _`END`PUN)`END`PLN `END`PUN->`END`PLN a\n' + + ' ' + + ' `END`PUN|`END`PLN `END`PUN(`END`PLNn`END`PUN,`END`PLN a`END' + + '`PUN,`END`PLN b`END`PUN)`END`PLN `END`PUN->`END`PLN fib`END' + + '`PUN(`END`PLNn `END`PUN-`END`PLN `END`LIT1`END`PUN,`END' + + '`PLN a `END`PUN+`END`PLN b`END`PUN,`END`PLN a`END`PUN)`END' + + '`PLN\n' + + ' `END`KWDin`END`PLN\n' + + ' print_int`END`PUN(`END`PLNfib`END`PUN(`END`LIT10`END' + + '`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT1`END' + + '`PUN));;`END`PLN\n' + + '`END`COM#endif`END`PLN\n' + + '\n' + + '`END`KWDlet`END`PLN zed `END`PUN=`END`PLN `END`STR\'z\'`END`PLN\n' + + '\n' + + '`END`KWDlet`END`PLN f\' x\' `END`PUN=`END`PLN x\' `END`PUN+`END`PLN `END`LIT1`END' + ), + lisp: ( + '`COM; -*- mode: lisp -*-`END`PLN\n' + + '\n' + + '`END`OPN(`END`KWDdefun`END`PLN back-six-lines `END`OPN(`END`CLO)`END' + + '`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END`OPN(`END' + + '`PLNforward-line `END`LIT-6`END`CLO))`END`PLN\n' + + '`END`OPN(`END`KWDdefun`END`PLN forward-six-lines `END`OPN(`END' + + '`CLO)`END`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END' + + '`OPN(`END`PLNforward-line `END`LIT6`END`CLO))`END`PLN\n' + + '\n' + + '`END`OPN(`END`PLNglobal-set-key `END`STR"\\M-l"`END`PLN `END' + + '`LIT\'goto-line`END`CLO)`END`PLN\n' + + '`END`OPN(`END`PLNglobal-set-key `END`STR"\\C-z"`END`PLN `END' + + '`LIT\'advertised-undo`END`CLO)`END`PLN\n' + + '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-insert`END' + + '`PUN]`END`PLN `END`LIT\'clipboard-kill-ring-save`END`CLO)`END' + + '`PLN\n' + + '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNS-insert`END`PUN]`END' + + '`PLN `END`LIT\'clipboard-yank`END`CLO)`END`PLN\n' + + '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-up`END`PUN]`END' + + '`PLN `END`LIT\'back-six-lines`END`CLO)`END`PLN\n' + + '`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-down`END`PUN]`END' + + '`PLN `END`LIT\'forward-six-lines`END`CLO)`END`PLN\n' + + '\n' + + '`END`OPN(`END`KWDsetq`END`PLN visible-bell `END`KWDt`END`CLO)`END' + + '`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN user-mail-address `END' + + '`STR"foo@bar.com"`END`CLO)`END`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN default-major-mode `END' + + '`LIT\'text-mode`END`CLO)`END`PLN\n' + + '\n' + + '`END`OPN(`END`PLNsetenv `END`STR"TERM"`END`PLN `END' + + '`STR"emacs"`END`CLO)`END`PLN\n' + + '`END`OPN(`END`PLNc-set-offset `END`LIT\'case-label`END`PLN `END' + + '`LIT2`END`CLO)`END`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN c-basic-offset `END`LIT2`END`CLO)`END' + + '`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN perl-indent-level `END`LIT0x2`END`CLO)`END' + + '`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN delete-key-deletes-forward `END`KWDt`END' + + '`CLO)`END`PLN\n' + + '`END`OPN(`END`KWDsetq`END`PLN indent-tabs-mode `END`KWDnil`END' + + '`CLO)`END`PLN\n' + + '\n' + + '`END`COM;; Text mode`END`PLN\n' + + '`END`OPN(`END`PLNadd-hook `END`LIT\'text-mode-hook`END`PLN \n' + + ' `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' + + '`CLO)`END`PLN\n' + + ' `END`OPN(`END`PLNturn-on-auto-fill`END`CLO)`END' + + '`PLN\n' + + ' `END`CLO)`END`PLN\n' + + '`END`CLO)`END`PLN\n' + + '\n' + + '`END`COM;; Fundamental mode`END`PLN\n' + + '`END`OPN(`END`PLNadd-hook `END`LIT\'fundamental-mode-hook`END' + + '`PLN \n' + + ' `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' + + '`CLO)`END`PLN\n' + + ' `END`OPN(`END`PLNturn-on-auto-fill`END' + + '`CLO)`END`PLN\n' + + ' `END`CLO)`END`PLN\n' + + '`END`CLO)`END`PLN\n' + + '\n' + + '`END`COM;; Define and cond are keywords in scheme`END`PLN\n' + + '`END`OPN(`END`KWDdefine`END`PLN `END`OPN(`END`PLNsqt x`END`CLO)`END' + + '`PLN `END`OPN(`END`PLNsqrt-iter `END`LIT1.0`END`PLN `END' + + '`LIT2.0`END`PLN x`END`CLO))`END' + ), + issue45: ( + '`KWDthrow`END`PLN `END`KWDnew`END`PLN `END`TYPRuntimeException`END' + + '`PUN(`END`STR"Element ["`END`PLN `END`PUN+`END`PLN element`END' + + '`PUN.`END`PLNgetName`END`PUN()`END`PLN `END`PUN+`END`PLN \n' + + ' `END`STR"] missing attribute."`END`PUN);`END`PLN\n' + + 'variable`END`PUN++;`END' + ), + proto: ( + '`KWDmessage`END`PLN `END`TYPSearchRequest`END`PLN `END`PUN{`END' + + '`PLN\n' + + ' `END`KWDrequired`END`PLN `END`TYPstring`END`PLN query `END' + + '`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' `END`KWDoptional`END`PLN `END`TYPint32`END`PLN page_number `END' + + '`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\n' + + ' `END`KWDoptional`END`PLN `END`TYPint32`END' + + '`PLN result_per_page `END`PUN=`END`PLN `END`LIT3`END`PLN `END' + + '`PUN[`END`KWDdefault`END`PLN `END`PUN=`END`PLN `END`LIT10`END' + + '`PUN];`END`PLN\n' + + ' `END`KWDenum`END`PLN `END`TYPCorpus`END`PLN `END`PUN{`END' + + '`PLN\n' + + ' UNIVERSAL `END`PUN=`END`PLN `END`LIT0`END`PUN;`END' + + '`PLN\n' + + ' WEB `END`PUN=`END`PLN `END`LIT1`END`PUN;`END`PLN\n' + + ' IMAGES `END`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\n' + + ' LOCAL `END`PUN=`END`PLN `END`LIT3`END`PUN;`END`PLN\n' + + ' NEWS `END`PUN=`END`PLN `END`LIT4`END`PUN;`END`PLN\n' + + ' PRODUCTS `END`PUN=`END`PLN `END`LIT5`END`PUN;`END' + + '`PLN\n' + + ' VIDEO `END`PUN=`END`PLN `END`LIT6`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDoptional`END`PLN `END`TYPCorpus`END`PLN corpus `END' + + '`PUN=`END`PLN `END`LIT4`END`PLN `END`PUN[`END`KWDdefault`END' + + '`PLN `END`PUN=`END`PLN UNIVERSAL`END`PUN];`END`PLN\n' + + '`END`PUN}`END' + ), + wiki: ( + '`KWD#summary`END`PLN hello world\n' + + '`END`KWD#labels`END`PLN `END`LITHelloWorld`END`PLN `END' + + '`LITWikiWord`END`PLN Hiya\n' + + '\n' + + '`END`PUN[`END' + + '`STRhttp://www.google.com/?q=WikiSyntax+site:code.google.com`END' + + '`PLN `END`LITWikiSyntax`END`PUN]`END`PLN\n' + + '\n' + + 'Lorem Ipsum ``END`KWDwhile`END`PLN `END`PUN(`END`LIT1`END' + + '`PUN)`END`PLN `END`KWDprint`END`PUN(`END`STR"blah blah"`END' + + '`PUN);`END`PLN`\n' + + '\n' + + ' `END`PUN*`END`PLN Bullet\n' + + ' `END`PUN*`END`PLN Points\n' + + ' `END`PUN*`END`PLN `END`LITNestedBullet`END' + + '`PLN\n' + + '\n' + + '`END`PUN==`END`LITDroningOnAndOn`END`PUN==`END`PLN\n' + + '{{{\n' + + ' `END`COM// Some EmbeddedSourceCode`END`PLN\n' + + ' `END`KWDvoid`END`PLN main`END`PUN()`END`PLN `END`PUN{`END' + + '`PLN\n' + + ' `END`TYPPrint`END`PUN(`END`STR\'hello world\'`END' + + '`PUN);`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '}}}\n' + + '\n' + + '{{{\n' + + ' `END`COM<!-- Embedded XML -->`END`PLN\n' + + ' `END`TAG<foo`END`PLN `END`ATNbar`END`PUN=`END' + + '`ATV"baz"`END`TAG><boo`END`PLN `END' + + '`TAG/><foo>`END`PLN\n' + + '}}}`END' + ), + css: ( + '`COM<!--`END`PLN\n' + + '`END`KWD@charset`END`PUN(`END`STR\'UTF-8\'`END`PUN);`END`PLN\n' + + '\n' + + '`END`COM/** A url that is not quoted. *\/`END`PLN\n' + + '`END`KWD@import`END`PUN(`END`KWDurl`END`PUN(`END`STR/more-styles.css`END' + + '`PUN));`END`PLN\n' + + '\n' + + 'HTML `END`PUN{`END`PLN `END`KWDcontent-before`END`PUN:`END`PLN `END' + + '`STR\'hello\\20\'`END`PUN;`END`PLN `END`KWDcontent-after`END' + + '`PUN:`END`PLN `END`STR\'w\\6f rld\'`END`PUN;`END`PLN\n' + + ' `END`KWD-moz-spiff`END`PUN:`END`PLN `END' + + '`KWDinherit`END`PLN `END`KWD!important`END`PLN `END`PUN}`END' + + '`PLN\n' + + '\n' + + '`END`COM/* Test units on numbers. *\/`END`PLN\n' + + 'BODY `END`PUN{`END`PLN `END`KWDmargin-bottom`END`PUN:`END`PLN `END' + + '`LIT4px`END`PUN;`END`PLN `END`KWDmargin-left`END`PUN:`END' + + '`PLN `END`LIT3in`END`PUN;`END`PLN `END`KWDmargin-bottom`END' + + '`PUN:`END`PLN `END`LIT0`END`PUN;`END`PLN `END`KWDmargin-top`END' + + '`PUN:`END`PLN `END`LIT5%`END`PLN `END`PUN}`END`PLN\n' + + '\n' + + '`END`COM/** Test number literals and quoted values. *\/`END`PLN\n' + + 'TABLE`END`PUN.`END`PLNfoo TR`END`PUN.`END`PLNbar A`END`PUN#`END' + + '`PLNvisited `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END`PLN `END' + + '`LIT#001123`END`PUN;`END`PLN `END`KWDfont-family`END`PUN:`END' + + '`PLN `END`STR"monospace"`END`PLN `END`PUN}`END`PLN\n' + + '`END`COM/** bolder is not a name, so should be plain. ' + + ' !IMPORTANT is a keyword\n' + + ' * regardless of case.\n' + + ' *\/`END`PLN\n' + + 'blink `END`PUN{`END`PLN `END`KWDtext-decoration`END`PUN:`END' + + '`PLN BLINK `END`KWD!IMPORTANT`END`PUN;`END`PLN `END' + + '`KWDfont-weight`END`PUN:`END`PLN bolder `END`PUN}`END`PLN\n' + + '`END`COM/* Empty url() was causing infinite recursion */`END`PLN\n' + + 'a `END`PUN{`END`PLN `END`KWDbackground-image`END`PUN:`END`PLN ' + + '`END`KWDurl`END`PUN();`END`PLN `END`PUN}`END`PLN\n' + + 'p`END`PUN#`END`PLNfeatured`END`PUN{`END`KWDbackground`END`PUN:`END`LIT#fea`END`PUN}`END`PLN\n' + + '`END`COM-->`END' + ), + css_style: ( + '`TAG<style`END`PLN `END`ATNtype`END`PUN=`END`ATV\'text/css\'`END' + + '`TAG>`END`PLN\n' + + '`END`COM/* desert scheme ported from vim to google prettify */`END' + + '`PLN\n' + + 'code`END`PUN.`END`PLNprettyprint `END`PUN{`END`PLN `END' + + '`KWDdisplay`END`PUN:`END`PLN block`END`PUN;`END`PLN `END' + + '`KWDpadding`END`PUN:`END`PLN `END`LIT2px`END`PUN;`END`PLN `END' + + '`KWDborder`END`PUN:`END`PLN `END`LIT1px`END`PLN solid `END' + + '`LIT#888`END`PUN;`END`PLN\n' + + '`END`KWDbackground-color`END`PUN:`END`PLN `END`LIT#333`END`PUN;`END' + + '`PLN `END`PUN}`END`PLN\n' + + '`END`PUN.`END`PLNstr `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#ffa0a0`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* string - pink */`END`PLN\n' + + '`END`PUN.`END`PLNkwd `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#f0e68c`END`PUN;`END`PLN `END`KWDfont-weight`END' + + '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN\n' + + '`END`PUN.`END`PLNcom `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#87ceeb`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* comment - skyblue */`END`PLN\n' + + '`END`PUN.`END`PLNtyp `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#98fb98`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* type - lightgreen */`END`PLN\n' + + '`END`PUN.`END`PLNlit `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#cd5c5c`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* literal - darkred */`END`PLN\n' + + '`END`PUN.`END`PLNpun `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#fff`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* punctuation */`END`PLN\n' + + '`END`PUN.`END`PLNpln `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#fff`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* plaintext */`END`PLN\n' + + '`END`PUN.`END`PLNtag `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#f0e68c`END`PUN;`END`PLN `END`KWDfont-weight`END' + + '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* html/xml tag - lightyellow*/`END`PLN\n' + + '`END`PUN.`END`PLNatn `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#bdb76b`END`PUN;`END`PLN `END`KWDfont-weight`END' + + '`PUN:`END`PLN bold`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* attribute name - khaki*/`END`PLN\n' + + '`END`PUN.`END`PLNatv `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#ffa0a0`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* attribute value - pink */`END`PLN\n' + + '`END`PUN.`END`PLNdec `END`PUN{`END`PLN `END`KWDcolor`END`PUN:`END' + + '`PLN `END`LIT#98fb98`END`PUN;`END`PLN `END`PUN}`END`PLN `END' + + '`COM/* decimal - lightgreen */`END`PLN\n' + + '`END`TAG</style>`END' + ), + issue84: '`KWDsuper`END`PUN(`END`STR"&nbsp;"`END`PUN);`END', + issue86_0: '`COM#One Two words`END', + issue86_1: ( + '`COM#One`END`PLN\n' + + '`END`TYPTwo`END`PLN lines`END' + ), + issue86_2: ( + '`COM#One`END`PLN\n' + + '`END`TYPTwo`END`PLN lines`END' + ), + issue86_3: ( + '`COM#One`END`PLN\n' + + '`END`TYPTwo`END`PLN lines`END' + ), + issue86_4: ( + '`COM#One`END`PLN\n' + + '`END`TYPTwo`END`PLN lines`END' + ), + issue86_5: ( + '`COM#One`END
`PLN ' + + '`END`TYPTwo`END`PLN lines`END' + ), + issue92: ( + '`PUN<?`END`PLNxml version`END`PUN=`END`STR"1.0"`END`PLN encoding`END`PUN=`END' + + '`STR"UTF-8"`END`PUN?>`END`PLN\n' + + '`END`TAG<kml`END`PLN `END`ATNxmlns`END`PUN=`END`ATV"http://www.opengis.net/kml/2.2"`END' + + '`TAG>`END`PLN\n' + + ' `END`TAG<Placemark>`END`PLN\n' + + ' `END`TAG<name>`END`PLNSimple placemark`END`TAG</name>`END`PLN\n' + + ' `END`TAG<description`END' + + '`PLN `END`ATNLang`END`PUN=`END`ATV"en"`END`TAG>`END' + + '`PLNAttached to the ground.' + + ' Intelligently places itself \n' + + ' at the height of the underlying terrain.`END' + + '`TAG</description>`END`PLN\n' + + ' `END`TAG<Point>`END`PLN\n' + + ' `END`TAG<coordinates>`END' + + '`PLN-122.0822035425683,37.42228990140251,0`END`TAG</coordinates>`END`PLN\n' + + ' `END`TAG</Point>`END`PLN\n' + + ' `END`TAG</Placemark>`END`PLN\n' + + '`END`TAG</kml>`END' + ), + cs_verbatim: ( + '`COM// The normal string syntax`END`PLN\n' + + '`END`KWDstring`END`PLN a `END`PUN=`END`PLN `END`STR"C:\\\\"`END`PUN;`END`PLN\n' + + '`END`COM// is equivalent to a verbatim string`END`PLN\n' + + '`END`KWDstring`END`PLN b `END`PUN=`END`PLN `END`STR@"C:\\"`END`PUN;`END' + ), + vhdl: ( + '`KWDlibrary`END`PLN ieee`END`PUN;`END`PLN\n' + + '`END`KWDuse`END`PLN ieee`END`PUN.`END`PLNstd_logic_1164`END`PUN.`END`KWDall`END`PUN;`END`PLN\n' + + '`END`KWDuse`END`PLN ieee`END`PUN.`END`PLNnumeric_std`END`PUN.`END`KWDall`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM-- A line comment`END`PLN\n' + + '`END`KWDentity`END`PLN foo_entity `END`KWDis`END`PLN\n' + + '\n' + + ' `END`KWDgeneric`END`PLN `END`PUN(`END`COM-- comment after punc`END`PLN\n' + + ' a `END`PUN:`END`PLN `END`TYPnatural`END`PLN `END`PUN:=`END' + + '`PLN `END`LIT42`END`PUN;`END`PLN\n' + + ' x `END`PUN:`END`PLN `END`TYPreal`END`PLN `END' + + '`PUN:=`END`PLN `END`LIT16#ab.cd#-3`END`PLN\n' + + ' `END`PUN);`END`PLN\n' + + ' `END`KWDport`END`PLN `END`PUN(`END`PLN\n' + + ' clk_i `END`PUN:`END`PLN `END`KWDin`END`PLN `END`TYPstd_logic`END`PUN;`END`PLN\n' + + ' b_i `END`PUN:`END`PLN `END`KWDin`END`PLN `END`TYPnatural`END`PLN `END`KWDrange`END`PLN `END`LIT0`END`PLN `END`KWDto`END`PLN `END`LIT100`END`PUN;`END`PLN\n' + + ' c_o `END`PUN:`END`PLN `END`KWDout`END`PLN `END`TYPstd_logic_vector`END`PUN(`END`LIT5`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\n' + + ' \\a "name"\\ `END`PUN:`END`PLN `END`KWDout`END`PLN `END`TYPinteger`END`PLN `END`COM-- extended identifier`END`PLN\n' + + ' `END`PUN);`END`PLN\n' + + '\n' + + '`END`KWDend`END`PLN `END`KWDentity`END`PLN foo_entity`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDarchitecture`END`PLN foo_architecture `END`KWDof`END`PLN foo_entity `END`KWDis`END`PLN\n' + + ' `END`KWDsignal`END`PLN bar_s `END`PUN:`END`PLN `END`TYPstd_logic_vector`END`PUN(`END`LIT2`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\n' + + '`END`KWDbegin`END`PLN\n' + + ' \n' + + ' bar_s `END`PUN<=`END`PLN `END`STRb"101"`END`PUN;`END`PLN\n' + + '\n' + + ' dummy_p `END`PUN:`END`PLN `END`KWDprocess`END`PLN `END`PUN(`END`PLNclk_i`END`PUN)`END`PLN\n' + + ' `END`KWDbegin`END`PLN\n' + + ' `END`KWDif`END`PLN b_i `END`PUN=`END`PLN `END`LIT1`END`PLN `END`KWDthen`END`PLN\n' + + ' c_o `END`PUN<=`END`PLN `END`PUN(`END`KWDothers`END`PLN `END`PUN=>`END`PLN `END`STR\'0\'`END`PUN);`END`PLN\n' + + ' `END`KWDelsif`END`PLN rising_edge`END`PUN(`END`PLNclk_i`END`PUN)`END`PLN `END`KWDthen`END`PLN\n' + + ' c_o `END`PUN<=`END`PLN `END`STR"1011"`END`PLN `END`PUN&`END`PLN bar_s`END`PUN(`END`LIT1`END`PLN `END`KWDdownto`END`PLN `END`LIT0`END`PUN);`END`PLN\n' + + ' `END`KWDend`END`PLN `END`KWDif`END`PUN;`END`PLN\n' + + ' `END`KWDend`END`PLN `END`KWDprocess`END`PLN dummy_p`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDend`END`PLN `END`KWDarchitecture`END`PLN foo_architecture`END`PUN;`END' + ), + yaml1: ( + '`KWDapplication: `END`PLNmirah`END`PUN-`END`PLNlang\n' + + '`END`KWDversion: `END`PLN1\n' + + '\n' + + '`END`COM# Here\'s a comment`END`PLN\n' + + '`END`KWDhandlers:\n' + + '`END`PLN `END`PUN-`END`PLN `END`KWDurl: `END`PLN/red/*\n' + + ' `END`KWDservlet: `END`PLNmysite.server.TeamServlet\n' + + ' `END`KWDinit_params:\n' + + '`END`PLN `END`KWDteamColor: `END`PLNred\n' + + ' `END`KWDbgColor: `END`STR"#CC0000"`END`PLN\n' + + ' `END`KWDname: `END`PLNredteam\n' + + ' `END`PUN-`END`PLN `END`KWDurl: `END`PLN/blue/*\n' + + ' `END`KWDservlet: `END`PLNmysite.server.TeamServlet\n' + + ' `END`KWDinit_params:\n' + + '`END`PLN `END`KWDteamColor: `END`PLNblue\n' + + ' `END`KWDbgColor: `END`STR"#0000CC"`END`PLN\n' + + ' `END`KWDname: `END`PLNblueteam\n' + + ' `END`PUN-`END`PLN `END`KWDurl: `END`PLN/register/*\n' + + ' `END`KWDjsp: `END`PLN/register/start.jsp\n' + + ' `END`PUN-`END`PLN `END`KWDurl: `END`PLN*.special\n' + + ' `END`KWDfilter: `END`PLNmysite.server.LogFilterImpl\n' + + ' `END`KWDinit_params:\n' + + '`END`PLN `END`KWDlogType: `END`PLNspecial\n' + + ' `END' + ), + yaml2: ( + '`DEC%YAML 1.1`END`PLN\n' + + '`END`DEC---\n' + + '`END`TYP!!map`END`PLN {\n' + + ' `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR""`END`PLN\n' + + ' `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR"value"`END`PLN,\n' + + ' `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR"explicit key"`END`PLN\n' + + ' `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR"value"`END`PLN,\n' + + ' `END`PUN?`END`PLN `END`TYP!!str`END`PLN `END`STR"simple key"`END`PLN\n' + + ' `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR"value"`END`PLN,\n' + + ' `END`PUN?`END`PLN `END`TYP!!seq`END`PLN [\n' + + ' `END`TYP!!str`END`PLN `END`STR"collection"`END`PLN,\n' + + ' `END`TYP!!str`END`PLN `END`STR"simple"`END`PLN,\n' + + ' `END`TYP!!str`END`PLN `END`STR"key"`END`PLN\n' + + ' ]\n' + + ' `END`PUN:`END`PLN `END`TYP!!str`END`PLN `END`STR"value"`END`PLN\n' + + '}`END' + ), + scala: ( + '`COM/* comment 1 *\/`END`PLN\n' + + '`END`COM/*\n' + + 'comment 2\n' + + '*\/`END`PLN\n' + + '`END`COM/* comment / * comment 3 **\/`END`PLN\n' + + '`END`COM// strings`END`PLN\n' + + '`END`STR"Hello, World!"`END`PUN,`END`PLN `END`STR"\\n"`END`PUN,`END`PLN\n' + + '`END`LIT`an-identifier``END`PUN,`END`PLN `END`LIT`\\n``END`PUN,`END`PLN\n' + + '`END`STR\'A\'`END`PUN,`END`PLN `END`STR\'\\n\'`END`PUN,`END`PLN\n' + + '`END`LIT\'aSymbol`END`PUN,`END`PLN\n' + + '`END`STR"""Hello,\n' + + 'World"""`END`PUN,`END`PLN `END`STR"""Hello,\\nWorld"""`END`PUN,`END`PLN\n' + + '`END`STR"""Hello, "World"!"""`END`PUN,`END`PLN\n' + + '`END`STR"""Hello, \\"World\\""""`END`PLN\n' + + '\n' + + '`END`COM// Numbers`END`PLN\n' + + '`END`LIT0`END`PLN\n' + + '`END`LIT0123`END`PLN\n' + + '`END`LIT0xa0`END`PLN\n' + + '`END`LIT0XA0L`END`PLN\n' + + '`END`LIT123`END`PLN\n' + + '`END`LIT123.45`END`PLN\n' + + '`END`LIT1.50F`END`PLN\n' + + '`END`LIT0.50`END`PLN\n' + + '`END`PUN.`END`LIT50`END`PLN\n' + + '`END`LIT123e-1`END`PLN\n' + + '`END`LIT123.45e+1`END`PLN\n' + + '`END`LIT1.50e2`END`PLN\n' + + '`END`LIT0.50e-6`END`PLN\n' + + '`END`PUN.`END`LIT50e+42f`END`PLN\n' + + '\n' + + '`END`COM// Values`END`PLN\n' + + '`END`LITfalse`END`PUN,`END`PLN `END`LITtrue`END`PUN,`END`PLN `END`LITnull`END`PUN,`END`PLN `END`LITthis`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// Keywords`END`PLN\n' + + '`END`KWDclass`END`PLN `END`TYPMyClass`END`PUN;`END`PLN\n' + + '`END`KWDimport`END`PLN foo`END`PUN.`END`PLNbar`END`PUN;`END`PLN\n' + + '`END`KWDpackage`END`PLN baz`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM// From scala-lang.org/node/242`END`PLN\n' + + '`END`KWDdef`END`PLN act`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN pongCount `END`PUN=`END`PLN `END`LIT0`END`PLN\n' + + ' loop `END`PUN{`END`PLN\n' + + ' react `END`PUN{`END`PLN\n' + + ' `END`KWDcase`END`PLN `END`TYPPing`END`PLN `END`PUN=>`END`PLN\n' + + ' `END`KWDif`END`PLN `END`PUN(`END`PLNpongCount `END`PUN%`END`PLN `END`LIT1000`END`PLN `END`PUN==`END`PLN `END`LIT0`END`PUN)`END`PLN\n' + + ' `END`TYPConsole`END`PUN.`END`PLNprintln`END`PUN(`END`STR"Pong: ping "`END`PUN+`END`PLNpongCount`END`PUN)`END`PLN\n' + + ' sender `END`PUN!`END`PLN `END`TYPPong`END`PLN\n' + + ' pongCount `END`PUN=`END`PLN pongCount `END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + ' `END`KWDcase`END`PLN `END`TYPStop`END`PLN `END`PUN=>`END`PLN\n' + + ' `END`TYPConsole`END`PUN.`END`PLNprintln`END`PUN(`END`STR"Pong: stop"`END`PUN)`END`PLN\n' + + ' exit`END`PUN()`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '`END`PUN}`END' + ), + go: ( + '`PLNpackage main `END`COM/* Package of which this program is part. *\/`END`PLN\n' + + '\n' + + 'import fmt "fmt" `END`COM// Package implementing formatted I/O.`END`PLN\n' + + '\n' + + '\n' + + 'func main() {\n' + + ' fmt.Printf("Hello, world; or \u039a\u03b1\u03bb\u03b7\u03bc\u03ad\u03c1\u03b1 \u03ba\u03cc\u03c3\u03bc\u03b5; or \u3053\u3093\u306b\u3061\u306f \u4e16\u754c\\n") `END`COM// Semicolon inserted here`END`PLN\n' + + '}\n' + + '\n' + + '`END`COM/* " *\/`END`PLN "foo /* " `END`COM/*\/ *\/`END`PLN\n' + + '`END`COM/* ` *\/`END`PLN `foo /* ` `END`COM/*\/ *\/`END' + ), + erlang: ( + '`COM% Sample comment`END`PLN\n' + + '\n' + + '`END`KWD-module`END`PLN(my_test)`END`PUN.`END`PLN\n' + + '`END`KWD-include_lib`END`PLN(`END`STR"my_sample_lib.hrl"`END`PLN)`END`PUN.`END`PLN\n' + + '`END`KWD-export`END`PLN([\n' + + ' test/`END`LIT2`END`PLN\n' + + '])`END`PUN.`END`PLN\n' + + '\n' + + '`END`COM%% @doc Define a macro`END`PLN\n' + + '`END`KWD-define`END`PLN(my_macro`END`PUN,`END`PLN `END`TYPVariable`END`PLN)`END`PUN.`END`PLN\n' + + '\n' + + '`END`COM%% @doc My function`END`PLN\n' + + 'test(`END`TYPVariables`END`PUN,`END`PLN `END`TYPMoreVariables`END`PLN) ->\n' + + ' `END`COM% Inline comment`END`PLN\n' + + ' {ok`END`PUN,`END`TYPScanned`END`PUN,`END`TYP_`END`PLN} = my_lib:do_stuff()`END`PUN,`END`PLN\n' + + '\n' + + ' `END`TYPVariable`END`PLN = `END`KWDfun`END`PLN(`END`TYPV`END`PLN) -> {ok`END`PUN,`END`PLN `END`TYPV`END`PLN} `END`KWDend`END`PUN,`END`PLN\n' + + '\n' + + ' `END`KWDtry`END`PLN `END`LIT?my_macro`END`PLN({value`END`PUN,`END`PLN test}) `END`KWDof`END`PLN\n' + + ' {value`END`PUN,`END`PLN `END`TYPResult`END`PUN,`END`PLN `END`TYP_`END`PLN} ->\n' + + ' {ok`END`PUN,`END`PLN `END`TYPResult`END`PLN}\n' + + ' `END`KWDcatch`END`PLN\n' + + ' `END`TYPType`END`PLN:`END`TYPError`END`PLN ->\n' + + ' {`END`LIT\'error\'`END`PUN,`END`PLN `END`TYPType`END`PUN,`END`PLN `END`TYPError`END`PLN}\n' + + ' `END`KWDend`END`PUN.`END' + ), + rust: ( + '`COM// Single line comment`END`PLN\n' + + '`END`COM/* Multi-line (nesting not highlighted properly, sorry)\n' + + 'comment */`END`PLN\n' + + '\n' + + '`END`ATV#![feature(code_prettification)]`END`PLN\n' + + '\n' + + '`END`KWDuse`END`PLN std`END`PUN::`END`PLNio`END`PUN::{`END`LITself`END`PUN,`END`PLN Write`END`PUN};`END`PLN\n' + + '\n' + + '`END`KWDimpl`END`PUN<`END`TAG\'a`END`PUN,`END`PLN T`END`PUN:`END`PLN `END`TAG\'a`END`PLN `END`PUN+`END`PLN `END`PUN?`END`TYPSized`END`PUN>`END`PLN Foo`END`PUN<`END`TAG\'a`END`PUN,`END`PLN `END`TAG\'static`END`PUN>`END`PLN `END`KWDfor`END`PLN Bar`END`PUN<`END`TAG\'b`END`PUN>`END`PLN\n' + + '`END`KWDwhere`END`PLN T`END`PUN:`END`PLN `END`TYPIterator`END`PUN<`END`PLNItem `END`PUN=`END`PLN `END`TYPBox`END`PUN<`END`TYPFn`END`PUN()`END`PLN `END`PUN->`END`PLN `END`TYPu32`END`PUN>>`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDfn`END`PLN something`END`PUN(&`END`KWDmut`END`PLN `END`LITself`END`PUN)`END`PLN `END`PUN->`END`PLN `END`TYPu32`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDif`END`PLN `END`KWDlet`END`PLN `END`TYPSome`END`PUN(`END`KWDref`END`PLN x`END`PUN)`END`PLN `END`PUN=`END`PLN `END`LITself`END`PUN.`END`PLNfoo`END`PUN(`END`STR"multi li\\ne\n' + + 's\\tring"`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`ATNpanic!`END`PUN(`END`STRr"\\things is going wrong!"`END`PUN);`END`PLN\n' + + ' `END`ATNpanic!`END`PUN(`END`STRr#"Things is "really" goig\\n wront!"#`END`PUN);`END`PLN\n' + + ' `END`ATNpanic!`END`PUN(`END`STRr##"Raw strings are #"#fancy#"#"##`END`PUN);`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDpub`END`PLN `END`KWDtype`END`PLN CowString`END`PUN<`END`TAG\'a`END`PUN>`END`PLN `END`PUN=`END`PLN std`END`PUN::`END`PLNcow`END`PUN::`END`PLNCow`END`PUN<`END`TAG\'a`END`PUN,`END`PLN `END`TYPstr`END`PUN>;`END`PLN\n' + + '\n' + + '`END`KWDfn`END`PLN main`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDlet`END`PLN `END`PUN(`END`PLNi`END`PUN,`END`PLN r`END`PUN)`END`PLN `END`PUN=`END`PLN `END`PUN(`END`LIT1u8`END`PUN,`END`PLN `END`STR\'c\'`END`PUN);`END`PLN\n' + + ' `END`KWDlet`END`PLN s `END`PUN=`END`PLN `END`STRr#"Take a raw egg,\n' + + ' "break" it (or the line),\n' + + ' and beat it"#`END`PUN;`END`PLN\n' + + '`END`PUN}`END' + ) +}; diff --git a/static/bower_components/google-prettify/tests/prettify_test_2.html b/static/bower_components/google-prettify/tests/prettify_test_2.html new file mode 100644 index 00000000..c62e032b --- /dev/null +++ b/static/bower_components/google-prettify/tests/prettify_test_2.html @@ -0,0 +1,1205 @@ + + + + +Code Prettifier + + + + + + + +

Test Results

+
+ +
+ +

XQuery

+

From http://www.patrick-wied.at/static/xquery/prettify/

+
+(: 
+	Took some of Mike Brevoort's xquery code samples because they are nice and show common xquery syntax 
+:)
+ 
+  (:~
+   : Given a sequence of version URIs, publish all of these versions of each document
+   : If there is a version of the same document already published, unpublish it 1st
+   :
+   : When "publish" is referred to, we mean that it is put into the PUBLISHED collection
+   : unpublish removes content from this collection
+   : @param $version_uris - sequence of uris of versions of managed documents to publish
+   :)
+  declare function comoms-dls:publish($version_uris as item()*) {
+      for $uri in $version_uris
+      let $doc := fn:doc($uri)
+      let $managed_base_uri := $doc/node()/property::dls:version/dls:document-uri/text()
+      let $existing :=  comoms-dls:publishedDoc($managed_base_uri)
+      let $unpublishExisting := if($existing) then comoms-dls:unpublishVersion((xdmp:node-uri($existing)))  else ()
+      let $addPermissions := dls:document-add-permissions($uri, (xdmp:permission('mkp-anon', 'read')))
+      return
+          dls:document-add-collections($uri, ("PUBLISHED"))    
+  };
+ 
+  declare function comoms-dls:publishLatest($uri) {
+      (: TODO check if it's in the draft collection probably :)
+ 
+      let $latest_version_uri := comoms-dls:latestVersionUri($uri)
+      let $log:= xdmp:log(fn:concat("latest: ", $latest_version_uri))    
+      let $log:= xdmp:log(fn:concat("uri: ", $uri))            
+      return comoms-dls:publish($latest_version_uri)    
+ 
+  };
+ 
+  declare function comoms-dls:latestVersionUri($uri) {
+      let $latest_version_num :=
+          (
+          for $version in dls:document-history($uri)/dls:version
+          order by fn:number($version//dls:version-id/text()) descending
+          return $version//dls:version-id/text()
+          )[1]
+ 
+ 
+      return dls:document-version-uri($uri, $latest_version_num)
+  };
+ 
+  declare function comoms-dls:unpublish($uris as item()*) {
+      for $uri in $uris
+      return
+          let $published_doc := comoms-dls:publishedDoc($uri)
+          return
+              if($published_doc) then
+                  let $published_version_uri := xdmp:node-uri($published_doc)
+                  return comoms-dls:unpublishVersion($published_version_uri)        
+              else
+                  ()
+  };
+ 
+  declare function comoms-dls:latestPublishedDocAuthor($uri) {
+      let $author_id := doc($uri)/property::dls:version/dls:author/text()
+      return
+          if($author_id) then
+              comoms-user:getUsername($author_id)
+          else
+              ()
+ 
+  };
+ 
+  (:~
+   : Given a sequence of version URIs, unpublish all of these versions of each document
+   :)
+  declare function comoms-dls:unpublishVersion($version_uris as item()*) {
+      for $uri in $version_uris
+      return
+          let $removePermissions := dls:document-remove-permissions($uri, (xdmp:permission('mkp-anon', 'read')))
+          return dls:document-remove-collections($uri, ("PUBLISHED"))        
+  };
+ 
+  (:~
+   : Given the base URI of a managed piece of content, return the document of the node
+   : of the version that is published
+   :)
+  declare function comoms-dls:publishedDoc($uri) {
+      fn:collection("PUBLISHED")[property::dls:version/dls:document-uri = $uri]
+  };
+ 
+ 
+  (:~
+   : Test if any version of the managed document is published
+   :)
+  declare function comoms-dls:isPublished($uri) {
+      if( comoms-dls:publishedDoc($uri)) then
+          fn:true()
+      else
+          fn:false()
+  };
+ 
+ 
+  declare function comoms-dls:publishedState($uri) {
+      let $doc := comoms-dls:publishedDoc($uri)
+      let $published_uri := if($doc) then xdmp:node-uri($doc) else ()
+      let $latest := comoms-dls:latestVersionUri($uri)
+      return
+          if($doc) then
+              if($latest ne $published_uri) then
+                  "stale"
+              else
+                  "published"
+          else
+              "unpublished"
+  };
+ 
+ 
+  declare function comoms-dls:getManagedDocUri($uri) {
+      let $doc := fn:doc($uri)
+      let $managed_uri := $doc/property::dls:version/dls:document-uri/text()
+      let $managed_uri := if($managed_uri) then $managed_uri else $uri
+      return $managed_uri
+  };
+ 
+  (:~
+   : Given a manage content url (e.g. /content/123456.xml) return the appropriate
+   : version of the document based on what stage collection is being viewed and
+   : what's published
+   :
+   : @param $uri a manage content url (e.g. /content/123456.xml) - NOT A VERSIONED URI
+   :)
+  declare function comoms-dls:doc($uri) {
+      let $doc := fn:root(comoms-dls:collection()[property::dls:version/dls:document-uri = $uri][1])
+      return
+          if($doc) then
+              $doc
+          else
+              let $managedDocInCollection := comoms-dls:collection-name() = xdmp:document-get-collections($uri)
+              return
+                  if($managedDocInCollection) then
+                      fn:doc($uri)
+                  else
+                      ()
+  };
+ 
+  (:~
+   : Get the collection to be used when querying for content
+   : THIS or comoms-dls:collection-name() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT
+   :)
+  declare function comoms-dls:collection()  {
+      fn:collection( comoms-dls:collection-name() )
+  };
+ 
+  (:~
+   : Get the collection nameto be used when querying for content
+   : THIS or comoms-dls:collection() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT
+   :)
+  declare function comoms-dls:collection-name() as xs:string {
+      let $default_collection := "PUBLISHED"
+      return
+          if(comoms-user:isAdmin()) then
+              let $pub_stage_collection_cookie := comoms-util:getCookie("COMOMS_COLLECTION")
+              return
+                  if($pub_stage_collection_cookie) then
+                      $pub_stage_collection_cookie
+                  else
+                      $default_collection
+          else
+              $default_collection
+  };
+ 
+  (:~
+   : Check if the published collection is being viewed
+   :)
+  declare function comoms-dls:isViewingPublished() {
+      if(comoms-dls:collection-name() = "PUBLISHED") then
+          fn:true()
+      else
+          fn:false()
+  };
+ 
+  (:~
+   : Get the best URL for the content URI.
+   : This is either the default URI based on detail type or should also take
+   : into account friendly urls and navigation structures to figure out the
+   : best choice
+   :)
+  declare function comoms-dls:contentUrl($uri) {
+ 
+      (: TODO: add friendly URL and nav structure logic 1st :)
+ 
+      let $doc := fn:doc($uri)
+      let $managedDocUri := $doc/property::dls:version/dls:document-uri
+      let $uri := if($managedDocUri) then $managedDocUri else $uri
+      let $type := $doc/node()/fn:name()
+      let $content_id := fn:tokenize( fn:tokenize($uri, "/")[3], "\.")[1]
+      return
+          fn:concat("/", $type, "/", $content_id)
+  };
+ 
+  (:
+   :
+   :  gets list of doc versions and uri.
+   :
+   :)
+  declare function comoms-dls:versionHistory($uri) {
+      let $published_doc := comoms-dls:publishedDoc($uri)
+      let $published_uri := if($published_doc) then xdmp:node-uri($published_doc) else ()
+      return
+      <versions>
+          {
+          for $version in dls:document-history($uri)/dls:version
+            let $version_num := $version/dls:version-id/text()
+            let $created := $version/dls:created/text()
+            let $author_id := $version/dls:author/text()
+            let $author := comoms-user:getUsername($author_id)
+ 
+ 
+            let $note := $version/dls:annotation/text()
+            let $version_uri := xdmp:node-uri(dls:document-version($uri, $version_num))
+            let $published := $published_uri eq $version_uri
+            return
+              <version>
+                  <version-number>{$version_num}</version-number>
+                  <created>{$created}</created>                
+                  <author>{$author}</author>
+                  <published>{$published}</published>
+                  <version-uri>{$version_uri}</version-uri>
+              </version>  
+          }        
+      </versions>
+  };
+ 
+ 
+ 
+ 
+ 
+ 
+  (: ########################################################################### :)
+  (: PRIVATE FUNCTIONS :)
+  (: ########################################################################### :)
+ 
+  declare function comoms-dls:_import() {
+      "xquery version '1.0-ml';
+       import module namespace dls = 'http://marklogic.com/xdmp/dls' at '/MarkLogic/dls.xqy'; "
+  };  
+ 
+(: ----
+---- :)
+xquery version '1.0-ml';
+declare variable $URI as xs:string external;
+ 
+declare function local:document-move-forest($uri as xs:string, $forest-ids as xs:unsignedLong*)
+{
+  xdmp:document-insert(
+    $uri,
+    fn:doc($uri),
+    xdmp:document-get-permissions($uri),
+    xdmp:document-get-collections($uri),
+    xdmp:document-get-quality($uri),
+    $forest-ids
+  )
+};
+ 
+let $xml :=
+  <xml att="blah" att2="blah">
+    sdasd<b>asdasd</b>
+  </xml>
+(: -------- :)
+for $d in fn:doc("depts.xml")/depts/deptno
+let $e := fn:doc("emps.xml")/emps/emp[deptno = $d]
+where fn:count($e) >= 10
+order by fn:avg($e/salary) descending
+return
+   <big-dept>
+      {
+      $d,
+      <headcount>{fn:count($e)}</headcount>,
+      <avgsal>{fn:avg($e/salary)}</avgsal>
+      }
+   </big-dept>
+(: -------- :)
+declare function local:depth($e as node()) as xs:integer
+{
+   (: A node with no children has depth 1 :)
+   (: Otherwise, add 1 to max depth of children :)
+   if (fn:empty($e/*)) then 1
+   else fn:max(for $c in $e/* return local:depth($c)) + 1
+};
+ 
+local:depth(fn:doc("partlist.xml"))
+ 
+(: -------- :)
+<html><head/><body>
+{
+  for $act in doc("hamlet.xml")//ACT
+  let $speakers := distinct-values($act//SPEAKER)
+  return
+    <div>{ string($act/TITLE) }</h1>
+      <ul>
+      {
+        for $speaker in $speakers
+        return <li>{ $speaker }</li>
+      }
+      </ul>
+    </div>
+}
+</body></html>
+(: -------- :)
+{
+	for $book in doc("books.xml")//book
+        return
+	if (contains($book/author/text(),"Herbert") or contains($book/author/text(),"Asimov"))
+		then $book
+	else $book/text()
+	
+	let $let := <x>"test"</x>
+	return element element {
+	attribute attribute { 1 },
+	element test { 'a' },
+	attribute foo { "bar" },
+	fn:doc()[ foo/@bar eq $let ],
+	//x }
+}
+(: -------- :)
+<bib>
+ {
+  for $b in doc("http://bstore1.example.com/bib.xml")/bib/book
+  where $b/publisher = "Addison-Wesley" and $b/@year > 1991
+  return
+    <book year="{ $b/@year }">
+     { $b/title }
+    </book>
+ }
+</bib>
+(: -------- :)
+
+ +

Nemerle

+
+class Set ['a]
+{
+  mutable storage : list ['a] = [];
+  public Add (e : 'a) : void
+  {
+    when (! Contains (e))
+      storage ::= e;
+  }
+  public Contains (e : 'a) : bool
+  {
+    storage.Contains (e)
+  }
+}
+ 
+def s1 = Set ();
+s1.Add (3);
+s1.Add (42);
+assert (s1.Contains (3));
+// s1.Add ("foo"); // error here!
+def s2 = Set ();
+s2.Add ("foo");
+assert (s2.Contains ("foo"));
+
+ +

LaTeX

+
% resume.tex
+% vim:set ft=tex spell:
+\documentclass[10pt,letterpaper]{article}
+\usepackage[letterpaper,margin=0.8in]{geometry}
+\usepackage{mdwlist}
+\usepackage[T1]{fontenc}
+\usepackage{textcomp}
+\pagestyle{empty}
+\setlength{\tabcolsep}{0em}
+
+ +

Escaped quotes in Bash

+

Issue #144

+
+#! /bin/bash
+# toascii.sh
+for i in $(echo $* | fold -w 1);do
+  printf "%x " \'$i;
+done;
+echo
+
+ +

Regular expression in <SCRIPT> body

+

Issue #145

+
+<script type="text/javascript">
+<!--
+        var target = $$.css('backgroundImage').replace(/^url[\(\)'"]/g, '');
+
+        // nice long chain: wrap img element in span
+        $$.wrap('<span style="position: relative;"></span>')
+-->
+</script>
+
+ +

Clojure

+
+; Clojure test comment
+(ns test
+ (:gen-class))
+
+(def foo "bar")
+(defn bar [arg1 arg2 & args]
+  "sample function"
+  (for [arg args]
+    (prn arg)))
+
+(bar "foo" "bar" "blah" :baz)
+
+ +

HTML5 language on CODE

+

The text is specified to be lisp by the class attribute. +Semicolon is normally a valid punctuation character but +in lisp it is a comment so should be colored as a comment +if the className is being properly parsed.

+; foo + +

HTML5 language on nested CODE element

+

The language is attached to a CODE element inside a PRE.

+
; foo
+ +

HTML5 language on nested CODE element not foiled by space

+

The language is attached to a CODE element inside a PRE and there +is space between the PRE element's tags and CODE element's tags.

+
+
+; foo
+
+
+ +

HTML5 nested CODE element language ignored if not only content

+

The below is not treated as lisp despite there being a lisp +language specifier on the contained CODE element, the CODE element +does not wrap all non-space content.

+
+before CODE
+; foo
+
+ +

Language using XML processing instrution

+

The language is attached to an HTML5 comment that looks like an XML +processing instruction.

+ +
; foo
+ +

Language and line numbers using HTML comment

+

The language is attached to a regular HTML5 comment that looks like an XML +processing instruction.

+ +
; foo
+ +

Language and line numbers using HTML comment

+

The language is attached to a regular HTML5 comment that looks like an XML +processing instruction.

+ +
; foo
+ +

Language and line numbers using HTML comment

+

The language is attached to a regular HTML5 comment that looks like an XML +processing instruction.

+ +
; foo
+ +

Don't reprettify prettified content

+

Issue #185

+"No tag backs." + +

Issue #261

+
  1. "No tag backs."
+ +

C type not full word

+

Issue #201

+static Persistent<String> listeners_symbol; + +

Pascal

+
+(* some comment here *)
+PROCEDURE TestCase.AssertEquals(msg:String; expect, act:Longint);
+VAR ex, ac:String;
+BEGIN
+  IF expect <> act THEN
+  BEGIN
+    Str(expect, ex);
+    Fail(Concat(msg,' expected ',ex,' but was ',ac));
+  END;
+
+  factors := new(ArrayListPtr, Init);
+
+  FOR candidate := 2 TO i DO
+  BEGIN
+    WHILE i MOD candidate = 0 DO
+    BEGIN
+      factors^.Add(candidate);
+      i := i DIV candidate;
+    END;
+  END;
+END;
+
+ +

BASIC

+
+200 REM ----- method teardown
+210 PRINT "green"
+220 RETURN
+470 IF af=0 THEN GOTO 520
+480 FOR j=1 TO af
+500 ac=pf(j) : me$=STR$(j)+". factor" : GOSUB 100
+510 NEXT
+530 RETURN
+1000 DATA "one", 1, 0
+
+ +

Dart

+
+part of myLib;
+
+part 'something.dart';
+
+import 'dart:math' as test show foo, bar;
+
+class Point {
+  final num x, y;
+
+  Point(this.x, this.y);
+  Point.zero() : x = 0, y = 0;  // Named constructor
+                                // with an initializer list.
+
+  num distanceTo(Point other) {
+    var dx = x - other.x;
+    var dy = y - other.y;
+    return sqrt(dx * dx + dy * dy);
+  }
+}
+
+// This is a single-line comment.
+
+/*
+This is a
+multiline comment.
+*/
+
+main() {
+  Point p = new Point(7, 12);
+  String thing = 'It\'s awesome!';
+  String thing2 = '''
+This is a test! \'''
+This is the end of the test''';
+  String thing3 = r"""
+This is a raw
+multiline string!""";
+  num x = 0x123ABC;
+  num y = 1.8e-12;
+  bool flag = false;
+  String raw = r"This is a raw string, where \n doesn't matter";
+}
+
+ +

TCL

+
#!/bin/tclsh
+proc fib {n} {
+    set a 0
+    set b 1
+    while {$n > 0} {
+        set tmp $a
+        set a [expr $a + $b]
+        set b $tmp
+        incr n -1
+    }
+    return $a
+}
+
+ +

R, S

+
+### Example R script for syntax highlighting
+
+# This is a comment
+
+## Valid names
+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV0123456789._a <- NULL
+.foo_ <- NULL
+._foo <- NULL
+
+## Invalid names
+0abc <- NULL
+.0abc <- NULL
+abc+cde <- NULL
+
+## Reserved Words
+NA
+NA_integer_
+NA_real_
+NA_character_
+NA_complex_
+NULL
+NaN
+Inf
+## Not reserved
+NULLa <- NULL
+NULL1 <- NULL
+NULL. <- NULL
+NA_foo_ <- NULL
+
+## Numbers
+12345678901
+123456.78901
+123e3
+123E3
+1.23e-3
+1.23e3
+1.23e-3
+## integer constants
+123L
+1.23L
+## imaginary numbers
+123i
+-123i
+123e4i
+123e-4i
+## Hex numbers
+0xabcdefABCDEF01234
+0xabcp123
+0xabcP123
+## Not hex
+0xg
+
+## Special operators %xyz%
+## %xyz%
+1 %% 2
+diag(2) %*% diag(2)
+1 %/% 2
+1 %in% 1:10
+diag(2) %o% diag(2)
+diag(2) %x% diag(2)
+`%foo bar%` <- function(x, y) x + y
+1 %foo bar% 2
+
+## Control Structures (3.2) and Function
+## if, else
+if (TRUE) print("foo") else print("bar")
+## For, in
+for(i in 1:5) {
+    print(i)
+}
+## While, break
+i <- 1
+while (TRUE) {
+    i <- i + 1
+    if (i > 3) break
+}
+## Repeat
+repeat {1+1}
+## Switch
+x <- 3
+switch(x, 2+2, mean(1:10), rnorm(5))
+## Function, dot-dot-dot, return
+foo <- function(...) {
+    return(sum(...))
+}
+# Not keywords
+functiona <- 2 + 2
+function. <- 2 + 2
+function1 <- 2 + 2
+
+
+## Grouping Tokens 10.3.7
+## Parentheses
+1 + (2 + 3)
+## brackets
+foo <- function(a) {
+    a + 1
+}
+
+## Indexing 10.3.8
+## []
+bar <- 1:10
+bar[3]
+## [[]]
+foo <- list(a=1, b=2, c=3)
+foo[["a"]]
+## $
+foo$a
+foo$"a"
+
+## Operators
+2 - 2
+2 + 2
+2 ~ 2
+! TRUE
+?"help"
+1:2
+2 * 2
+2 / 2
+2^2
+2 < 2
+2 > 2
+2 == 2
+2 >= 2
+2 <= 2
+2 != 2
+TRUE & FALSE
+TRUE && FALSE
+TRUE | FALSE
+TRUE || FALSE
+foo <- 2 + 2
+foo = 2 + 2
+2 + 2 -> foo
+foo <<- 2 + 2
+2 + 2 ->> foo
+base:::sum
+base::sum
+
+## Strings
+foo <- "hello, world!"
+foo <- 'hello, world!'
+foo <- "Hello, 'world!"
+foo <- 'Hello, "world!'
+foo <- 'Hello, \'world!\''
+foo <- "Hello, \"world!\""
+foo <- "Hello,
+world!"
+foo <- 'Hello,
+world!'
+
+## Backtick strings
+`foo123 +!"bar'baz` <- 2 + 2
+
+ +

MUMPS

+
+HDR ; -- prt/display header
+ N X,I
+ I '$D(VALMHDR) X:$G(VALM("HDR"))]"" VALM("HDR")
+ ; -- prt hdr line
+ W:'$D(VALMPG1) @IOF K VALMPG1
+ W:VALMCC $C(13)_IOUON_$C(13)_IOINHI_$C(13)       ; -- turn on undln/hi
+ I $E(IOST,1,2)="C-" D IOXY^VALM4(0,0)            ; -- position cursor
+ W $E(VALM("TITLE"),1,30)                         ; -- prt title
+ W:VALMCC IOINORM,IOUON                           ; -- turn off hi
+ W $J("",30-$L(VALM("TITLE")))                    ; -- fill in w/blanks
+ I $E(IOST,1,2)="C-" W $C(13) D IOXY^VALM4(30,0)  ; -- position cursor
+ W $J("",((VALMWD-80)/2)),$$HTE^XLFDT($H,1),$J("",10+((VALMWD-80)/2)),"Page: ",$J(VALMPGE,4)," of ",$J($$PAGE^VALM4(VALMCNT,VALM("LINES")),4)_$S($D(VALMORE):"+",1:" ") ; -- prt rest of hdr
+ W:VALMCC IOUOFF I $E(IOST,1,2)="C-" D IOXY^VALM4(0,0) ; -- turn off undln
+ F I=1:1:VALM("TM")-3 W !,$S('$D(VALMHDR(I)):"",$L(VALMHDR(I))>(VALMWD-1):$$EXTRACT^VALM4($G(VALMHDR(I))),1:VALMHDR(I)) ; -- prt hdr
+ Q
+
+ +

LLVM

+

Hello world module

+
+; Declare the string constant as a global constant.
+@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"
+
+; External declaration of the puts function
+declare i32 @puts(i8* nocapture) nounwind
+
+; Definition of main function
+define i32 @main() {   ; i32()*
+  ; Convert [13 x i8]* to i8  *...
+  %cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0
+
+  ; Call puts function to write out the string to stdout.
+  call i32 @puts(i8* %cast210)
+  ret i32 0
+}
+
+; Named metadata
+!1 = metadata !{i32 42}
+!foo = !{!1, null}
+
+ +

Regex following '!'

+

Issue #217

+
+if(!/^https?:\/\//i.test(val) && foo == 'bar') {
+    val = 'http://' + val;
+}
+
+ +

MATLAB

+

Issue #32

+
+%%%%%%%%%%%%%%%%%% DATA TYPES %%%%%%%%%%%%%%%%%%
+
+v = [1,2,3;4,5,6];
+v(v>4) = 0;
+
+s = struct('key',1, 'key2','string');
+s.key = 2;
+
+C = cell(1,2);
+C{1,1} = 0:9;
+
+double(1)
+single(1)
+uint8(1)
+int8(1)
+
+%%%%%%%%%%%%%%%%%% STRINGS & TRANSPOSE %%%%%%%%%%%%%%%%%%
+
+plot(data');
+legend(labels)
+
+str = 'asdasd';     % this is a string
+str = 'asdas';
+str = 'sdasd''sdasd';
+
+str = ['one' 'two' 'three'];
+str = strcat('one', 'two', 'three');
+
+% matrix transpose
+M = rand(3,3)';
+x = M.';
+x = [10 20; 30, 40]';
+disp(x')
+fprintf('%d\n', x(:)')      % with comment
+{1,2}'                      % another comment
+
+%%%%%%%%%%%%%%%%%% LINE CONTINUATION %%%%%%%%%%%%%%%%%%
+
+[1 20; ...
+30 4]
+
+['gdgsd'...
+'sdfs']
+
+{...
+'sdasd' ;
+'asdsad'}
+
+%%%%%%%%%%%%%%%%%% SYSTEM COMMANDS %%%%%%%%%%%%%%%%%%
+
+!touch file.txt
+
+%%%%%%%%%%%%%%%%%% COMMAND OUTPUT %%%%%%%%%%%%%%%%%%
+
+>> 1+1
+ans =
+     2
+
+>> 1+1
+
+ans =
+
+     2
+
+%%%%%%%%%%%%%%%%%% KEYWORDS %%%%%%%%%%%%%%%%%%
+
+function ret = fcn(in)
+	ret = sum(in.^2);
+end
+
+classdef CC < handle
+	properties (SetAccess = public)
+		x = 0;
+	end
+	methods
+		function this = CC(varargin)
+			this.x = 9;
+		end
+	end
+end
+
+x = [];
+parfor i=1:10
+	x[i] = i;
+end
+
+true ~= false
+
+if x==1
+	true
+elseif
+	false
+else
+	return
+end
+
+while true
+	continue
+	break
+end
+
+try
+	error('aa:aa', 'asdasd')
+catch ME
+	warning(ME)
+end
+
+switch x
+	case 1
+		disp(1)
+	otherwise
+		0
+end
+
+%%%%%%%%%%%%%%%%%% NUM LITERALS %%%%%%%%%%%%%%%%%%
+
+1
+1.
+.1
+1.0
+-1
+-1.
+-.1
+-1.0
++10
++01.
++.1
++1.0
+1e1
+1e-1
+1.e1
+1.e-1
+1.0e1
+1.0e-1
+.1e1
+.1e-1
+-.1e+1
++1.e-1
+
+1i
+.10j
+-1.001i
++1e-100j
+-.10e-01i
+
+% unary vs binary operators
+1+1
+1+ 1
+1 +1
+1 + 1
++1+1
++1+ 1
++1 +1
++1 + 1
+
+%%%%%%%%%%%%%%%%%% COMMENTS %%%%%%%%%%%%%%%%%%
+
+% % comment % %
+   % comment
+% comment
+%# comment
+%% comment
+%#x = sum(x);
+
+%{
+block comment
+%}
+
+%{
+%}
+
+%{
+
+%}
+
+%{
+1
+2
+%}
+
+%{
+% sdf {}
+sdf
+%asda{}
+sfds
+%}
+
+    %{
+dsf
+        %}
+
+%{%}
+
+%{ zzz=10; %}
+
+%{%x=10;%}
+
+%{  x
+a=10;
+%}
+
+%{
+%a=10;
+%}   x
+
+% nested block comments fail
+%{
+dfsdf
+%{
+xxx
+%}
+dfsdf
+%}
+
+% fails here!
+%{
+x=10;
+%%{
+%%}
+y=20;
+%}
+
+ +

Elixir

+
+defmodule Foo.Bar do
+  @moduledoc """
+  Tests syntax highlighting for Elixir
+  """
+
+  use Bitwise
+  require Logger
+  alias __MODULE__, as: This
+
+  @default_token_length 10_000
+
+
+  @spec token(length :: integer) :: String.t
+
+  def token(length \\ @default_token_length), do: String.duplicate("x", length)
+
+
+  defp _not_exported(), do: 0xFF + 0xF_F - 0xff
+
+
+  def other(foo, bar) do
+    fun = fn{_a, b} -> b + 1_3.1_4 end
+    fun.(1.0e+20)
+    _str = "string without #{inspect(42)} interpolation" <> " some more
+    with newlines \
+    and newlines"
+    charlist = 'some\'chars
+    with newlines \
+    and newlines'
+    <<x::utf8, _y::size(8), data::binary>> = "fooo"
+    ls = [1 | [2, 3]]
+    map = %{"baz" => "ban"}
+    map = %{foo: :bar, "yes, this compiles": :"also an atom"}
+    :erlang.time()
+    case {foo, bar} do
+      {1, 2} -> 3
+      _something_else -> :error
+      _ -> :"this won't match"
+    end
+    r = 2
+    _bitwise_not = ~~~r
+
+    ~r/foo/iu # regex sigils are treated as normal ones
+    ~S|we have "quotes" and 'quotes' and| <> " more string"
+    ~c"custom sigil char \"is\" fine too"
+    ~r'hello'
+    ~w[hell\] #o] #sigil does not expand to the comment
+    ~w{hello}
+    ~C<hello>
+  end
+
+end
+
+ +

Kotlin

+
+package test;
+
+import kotlin.Int
+
+// Single line comment
+/*
+ * Multiline
+ * comment
+ */
+
+typealias SomeNumber = Int
+
+val number: Long = 1_000L
+var float: Float = 12.34f
+0xFF_FF
+3.14
+
+314e-2
+0.314e1
+
+protected override fun ifBoolean(condition: Boolean? = null) {}
+
+::ifBoolean
+
+constructor() : super()
+
+"\"true\""
+'a'
+
+"""
+aaaaaaaaaaa
+"""
+
+loop@ for()
+
+break @loop
+
+enum class `true`
+
+data class Person(val name: String)
+
+enum class Size {
+    BIG, MEDIUM, SMALL
+}
+
+class Ball(val color: String, val size: Size) {
+    companion object {}
+
+    fun isBig() = size == Size.BIG
+
+    val isMedium: Boolean
+        get() = size == Size.MEDIUM
+}
+
+fun Boolean?.isNull(): Boolean = this == null
+
+fun Boolean?.getOrThrow(): Boolean = this ?: throw Exception()
+
+ + diff --git a/static/bower_components/google-prettify/tests/prettify_test_2.js b/static/bower_components/google-prettify/tests/prettify_test_2.js new file mode 100644 index 00000000..03e29f5a --- /dev/null +++ b/static/bower_components/google-prettify/tests/prettify_test_2.js @@ -0,0 +1,1072 @@ +/** + * maps ids of rewritten code to the expected output. + * For brevity, has been changed to `FOO + * and < /span> has been changed to `END. + */ +var goldens = { + xquery: ( + '`COM(: \n' + + '\tTook some of Mike Brevoort\'s xquery code samples because they are nice and show common xquery syntax \n' + + ':)`END`PLN\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Given a sequence of version URIs, publish all of these versions of each document\n' + + ' : If there is a version of the same document already published, unpublish it 1st\n' + + ' :\n' + + ' : When "publish" is referred to, we mean that it is put into the PUBLISHED collection\n' + + ' : unpublish removes content from this collection\n' + + ' : @param $version_uris - sequence of uris of versions of managed documents to publish\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publish(`END$version_uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\n' + + ' `END`KWDfor`END`PLN `END$uri`END`PLN `END`KWDin`END`PLN `END$version_uris`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$doc`END`PLN := `ENDfn:doc`END`PLN(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$managed_base_uri`END`PLN := `END$doc`END`PLN/`END`KWDnode`END`PLN()/property::dls:version/dls:document-uri/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$existing`END`PLN := comoms-dls:publishedDoc(`END$managed_base_uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$unpublishExisting`END`PLN := `END`KWDif`END`PLN(`END$existing`END`PLN) `END`KWDthen`END`PLN comoms-dls:unpublishVersion((`ENDxdmp:node-uri`END`PLN(`END$existing`END`PLN))) `END`KWDelse`END`PLN ()\n' + + ' `END`KWDlet`END`PLN `END$addPermissions`END`PLN := `ENDdls:document-add-permissions`END`PLN(`END$uri`END`PLN, (`ENDxdmp:permission`END`PLN(`END`STR\'mkp-anon\'`END`PLN, `END`STR\'read\'`END`PLN)))\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `ENDdls:document-add-collections`END`PLN(`END$uri`END`PLN, (`END`STR"PUBLISHED"`END`PLN)) \n' + + ' };\n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishLatest(`END$uri`END`PLN) {\n' + + ' `END`COM(: TODO check if it\'s in the draft collection probably :)`END`PLN\n' + + ' \n' + + ' `END`KWDlet`END`PLN `END$latest_version_uri`END`PLN := comoms-dls:latestVersionUri(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$log`END`PLN:= `ENDxdmp:log`END`PLN(`ENDfn:concat`END`PLN(`END`STR"latest: "`END`PLN, `END$latest_version_uri`END`PLN)) \n' + + ' `END`KWDlet`END`PLN `END$log`END`PLN:= `ENDxdmp:log`END`PLN(`ENDfn:concat`END`PLN(`END`STR"uri: "`END`PLN, `END$uri`END`PLN)) \n' + + ' `END`KWDreturn`END`PLN comoms-dls:publish(`END$latest_version_uri`END`PLN) \n' + + ' \n' + + ' };\n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:latestVersionUri(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$latest_version_num`END`PLN :=\n' + + ' (\n' + + ' `END`KWDfor`END`PLN `END$version`END`PLN `END`KWDin`END`PLN `ENDdls:document-history`END`PLN(`END$uri`END`PLN)/dls:version\n' + + ' `END`KWDorder`END`PLN `END`KWDby`END`PLN `ENDfn:number`END`PLN(`END$version`END`PLN//dls:version-id/`END`KWDtext`END`PLN()) `END`KWDdescending`END`PLN\n' + + ' `END`KWDreturn`END`PLN `END$version`END`PLN//dls:version-id/`END`KWDtext`END`PLN()\n' + + ' )[1]\n' + + ' \n' + + ' \n' + + ' `END`KWDreturn`END`PLN `ENDdls:document-version-uri`END`PLN(`END$uri`END`PLN, `END$latest_version_num`END`PLN)\n' + + ' };\n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:unpublish(`END$uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\n' + + ' `END`KWDfor`END`PLN `END$uri`END`PLN `END`KWDin`END`PLN `END$uris`END`PLN\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$published_doc`END`PLN := comoms-dls:publishedDoc(`END$uri`END`PLN)\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$published_doc`END`PLN) `END`KWDthen`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$published_version_uri`END`PLN := `ENDxdmp:node-uri`END`PLN(`END$published_doc`END`PLN)\n' + + ' `END`KWDreturn`END`PLN comoms-dls:unpublishVersion(`END$published_version_uri`END`PLN) \n' + + ' `END`KWDelse`END`PLN\n' + + ' ()\n' + + ' };\n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:latestPublishedDocAuthor(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$author_id`END`PLN := `ENDdoc`END`PLN(`END$uri`END`PLN)/property::dls:version/dls:author/`END`KWDtext`END`PLN()\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$author_id`END`PLN) `END`KWDthen`END`PLN\n' + + ' comoms-user:getUsername(`END$author_id`END`PLN)\n' + + ' `END`KWDelse`END`PLN\n' + + ' ()\n' + + ' \n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Given a sequence of version URIs, unpublish all of these versions of each document\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:unpublishVersion(`END$version_uris`END`PLN `END`KWDas`END`PLN `END`KWDitem`END`PLN()*) {\n' + + ' `END`KWDfor`END`PLN `END$uri`END`PLN `END`KWDin`END`PLN `END$version_uris`END`PLN\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$removePermissions`END`PLN := `ENDdls:document-remove-permissions`END`PLN(`END$uri`END`PLN, (`ENDxdmp:permission`END`PLN(`END`STR\'mkp-anon\'`END`PLN, `END`STR\'read\'`END`PLN)))\n' + + ' `END`KWDreturn`END`PLN `ENDdls:document-remove-collections`END`PLN(`END$uri`END`PLN, (`END`STR"PUBLISHED"`END`PLN)) \n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Given the base URI of a managed piece of content, return the document of the node\n' + + ' : of the version that is published\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishedDoc(`END$uri`END`PLN) {\n' + + ' `ENDfn:collection`END`PLN(`END`STR"PUBLISHED"`END`PLN)[property::dls:version/dls:document-uri = `END$uri`END`PLN]\n' + + ' };\n' + + ' \n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Test if any version of the managed document is published\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:isPublished(`END$uri`END`PLN) {\n' + + ' `END`KWDif`END`PLN( comoms-dls:publishedDoc(`END$uri`END`PLN)) `END`KWDthen`END`PLN\n' + + ' `ENDfn:true`END`PLN()\n' + + ' `END`KWDelse`END`PLN\n' + + ' `ENDfn:false`END`PLN()\n' + + ' };\n' + + ' \n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:publishedState(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$doc`END`PLN := comoms-dls:publishedDoc(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$published_uri`END`PLN := `END`KWDif`END`PLN(`END$doc`END`PLN) `END`KWDthen`END`PLN `ENDxdmp:node-uri`END`PLN(`END$doc`END`PLN) `END`KWDelse`END`PLN ()\n' + + ' `END`KWDlet`END`PLN `END$latest`END`PLN := comoms-dls:latestVersionUri(`END$uri`END`PLN)\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$doc`END`PLN) `END`KWDthen`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$latest`END`PLN ne `END$published_uri`END`PLN) `END`KWDthen`END`PLN\n' + + ' `END`STR"stale"`END`PLN\n' + + ' `END`KWDelse`END`PLN\n' + + ' `END`STR"published"`END`PLN\n' + + ' `END`KWDelse`END`PLN\n' + + ' `END`STR"unpublished"`END`PLN\n' + + ' };\n' + + ' \n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:getManagedDocUri(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$doc`END`PLN := `ENDfn:doc`END`PLN(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$managed_uri`END`PLN := `END$doc`END`PLN/property::dls:version/dls:document-uri/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$managed_uri`END`PLN := `END`KWDif`END`PLN(`END$managed_uri`END`PLN) `END`KWDthen`END`PLN `END$managed_uri`END`PLN `END`KWDelse`END`PLN `END$uri`END`PLN\n' + + ' `END`KWDreturn`END`PLN `END$managed_uri`END`PLN\n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Given a manage content url (e.g. /content/123456.xml) return the appropriate\n' + + ' : version of the document based on what stage collection is being viewed and\n' + + ' : what\'s published\n' + + ' :\n' + + ' : @param $uri a manage content url (e.g. /content/123456.xml) - NOT A VERSIONED URI\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:doc(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$doc`END`PLN := `ENDfn:root`END`PLN(comoms-dls:collection()[property::dls:version/dls:document-uri = `END$uri`END`PLN][1])\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$doc`END`PLN) `END`KWDthen`END`PLN\n' + + ' `END$doc`END`PLN\n' + + ' `END`KWDelse`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$managedDocInCollection`END`PLN := comoms-dls:collection-name() = `ENDxdmp:document-get-collections`END`PLN(`END$uri`END`PLN)\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$managedDocInCollection`END`PLN) `END`KWDthen`END`PLN\n' + + ' `ENDfn:doc`END`PLN(`END$uri`END`PLN)\n' + + ' `END`KWDelse`END`PLN\n' + + ' ()\n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Get the collection to be used when querying for content\n' + + ' : THIS or comoms-dls:collection-name() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:collection() {\n' + + ' `ENDfn:collection`END`PLN( comoms-dls:collection-name() )\n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Get the collection nameto be used when querying for content\n' + + ' : THIS or comoms-dls:collection() SHOULD BE USED WHEN BUILDING ANY QUERY FOR MANAGED CONTENT\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:collection-name() `END`KWDas`END`PLN `END`TYPxs:string`END`PLN {\n' + + ' `END`KWDlet`END`PLN `END$default_collection`END`PLN := `END`STR"PUBLISHED"`END`PLN\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(comoms-user:isAdmin()) `END`KWDthen`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$pub_stage_collection_cookie`END`PLN := comoms-util:getCookie(`END`STR"COMOMS_COLLECTION"`END`PLN)\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`KWDif`END`PLN(`END$pub_stage_collection_cookie`END`PLN) `END`KWDthen`END`PLN\n' + + ' `END$pub_stage_collection_cookie`END`PLN\n' + + ' `END`KWDelse`END`PLN\n' + + ' `END$default_collection`END`PLN\n' + + ' `END`KWDelse`END`PLN\n' + + ' `END$default_collection`END`PLN\n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Check if the published collection is being viewed\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:isViewingPublished() {\n' + + ' `END`KWDif`END`PLN(comoms-dls:collection-name() = `END`STR"PUBLISHED"`END`PLN) `END`KWDthen`END`PLN\n' + + ' `ENDfn:true`END`PLN()\n' + + ' `END`KWDelse`END`PLN\n' + + ' `ENDfn:false`END`PLN()\n' + + ' };\n' + + ' \n' + + ' `END`COM(:~\n' + + ' : Get the best URL for the content URI.\n' + + ' : This is either the default URI based on detail type or should also take\n' + + ' : into account friendly urls and navigation structures to figure out the\n' + + ' : best choice\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:contentUrl(`END$uri`END`PLN) {\n' + + ' \n' + + ' `END`COM(: TODO: add friendly URL and nav structure logic 1st :)`END`PLN\n' + + ' \n' + + ' `END`KWDlet`END`PLN `END$doc`END`PLN := `ENDfn:doc`END`PLN(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$managedDocUri`END`PLN := `END$doc`END`PLN/property::dls:version/dls:document-uri\n' + + ' `END`KWDlet`END`PLN `END$uri`END`PLN := `END`KWDif`END`PLN(`END$managedDocUri`END`PLN) `END`KWDthen`END`PLN `END$managedDocUri`END`PLN `END`KWDelse`END`PLN `END$uri`END`PLN\n' + + ' `END`KWDlet`END`PLN `END$type`END`PLN := `END$doc`END`PLN/`END`KWDnode`END`PLN()/`ENDfn:name`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$content_id`END`PLN := `ENDfn:tokenize`END`PLN( `ENDfn:tokenize`END`PLN(`END$uri`END`PLN, `END`STR"/"`END`PLN)[3], `END`STR"\\."`END`PLN)[1]\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `ENDfn:concat`END`PLN(`END`STR"/"`END`PLN, `END$type`END`PLN, `END`STR"/"`END`PLN, `END$content_id`END`PLN)\n' + + ' };\n' + + ' \n' + + ' `END`COM(:\n' + + ' :\n' + + ' : gets list of doc versions and uri.\n' + + ' :\n' + + ' :)`END`PLN\n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:versionHistory(`END$uri`END`PLN) {\n' + + ' `END`KWDlet`END`PLN `END$published_doc`END`PLN := comoms-dls:publishedDoc(`END$uri`END`PLN)\n' + + ' `END`KWDlet`END`PLN `END$published_uri`END`PLN := `END`KWDif`END`PLN(`END$published_doc`END`PLN) `END`KWDthen`END`PLN `ENDxdmp:node-uri`END`PLN(`END$published_doc`END`PLN) `END`KWDelse`END`PLN ()\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`TAG<versions>`END`PLN\n' + + ' {\n' + + ' `END`KWDfor`END`PLN `END$version`END`PLN `END`KWDin`END`PLN `ENDdls:document-history`END`PLN(`END$uri`END`PLN)/dls:version\n' + + ' `END`KWDlet`END`PLN `END$version_num`END`PLN := `END$version`END`PLN/dls:version-id/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$created`END`PLN := `END$version`END`PLN/dls:created/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$author_id`END`PLN := `END$version`END`PLN/dls:author/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$author`END`PLN := comoms-user:getUsername(`END$author_id`END`PLN)\n' + + ' \n' + + ' \n' + + ' `END`KWDlet`END`PLN `END$note`END`PLN := `END$version`END`PLN/dls:annotation/`END`KWDtext`END`PLN()\n' + + ' `END`KWDlet`END`PLN `END$version_uri`END`PLN := `ENDxdmp:node-uri`END`PLN(`ENDdls:document-version`END`PLN(`END$uri`END`PLN, `END$version_num`END`PLN))\n' + + ' `END`KWDlet`END`PLN `END$published`END`PLN := `END$published_uri`END`PLN `END`KWDeq`END`PLN `END$version_uri`END`PLN\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`TAG<version>`END`PLN\n' + + ' `END`TAG<version-number>`END`PLN{`END$version_num`END`PLN}`END`TAG</version-number>`END`PLN\n' + + ' `END`TAG<created>`END`PLN{`END$created`END`PLN}`END`TAG</created>`END`PLN \n' + + ' `END`TAG<author>`END`PLN{`END$author`END`PLN}`END`TAG</author>`END`PLN\n' + + ' `END`TAG<published>`END`PLN{`END$published`END`PLN}`END`TAG</published>`END`PLN\n' + + ' `END`TAG<version-uri>`END`PLN{`END$version_uri`END`PLN}`END`TAG</version-uri>`END`PLN\n' + + ' `END`TAG</version>`END`PLN \n' + + ' } \n' + + ' `END`TAG</versions>`END`PLN\n' + + ' };\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' `END`COM(: ########################################################################### :)`END`PLN\n' + + ' `END`COM(: PRIVATE FUNCTIONS :)`END`PLN\n' + + ' `END`COM(: ########################################################################### :)`END`PLN\n' + + ' \n' + + ' `END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN comoms-dls:_import() {\n' + + ' `END`STR"xquery version \'1.0-ml\';\n' + + ' import module namespace dls = \'http://marklogic.com/xdmp/dls\' at \'/MarkLogic/dls.xqy\'; "`END`PLN\n' + + ' }; \n' + + ' \n' + + '`END`COM(: ----\n' + + '---- :)`END`PLN\n' + + '`END`KWDxquery`END`PLN `END`KWDversion`END`PLN `END`STR\'1.0-ml\'`END`PLN;\n' + + '`END`KWDdeclare`END`PLN `END`KWDvariable`END`PLN `END$URI`END`PLN `END`KWDas`END`PLN `END`TYPxs:string`END`PLN `END`KWDexternal`END`PLN;\n' + + ' \n' + + '`END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN local:document-move-forest(`END$uri`END`PLN `END`KWDas`END`PLN `END`TYPxs:string`END`PLN, `END$forest-ids`END`PLN `END`KWDas`END`PLN `END`TYPxs:unsignedLong`END`PLN*)\n' + + '{\n' + + ' `ENDxdmp:document-insert`END`PLN(\n' + + ' `END$uri`END`PLN,\n' + + ' `ENDfn:doc`END`PLN(`END$uri`END`PLN),\n' + + ' `ENDxdmp:document-get-permissions`END`PLN(`END$uri`END`PLN),\n' + + ' `ENDxdmp:document-get-collections`END`PLN(`END$uri`END`PLN),\n' + + ' `ENDxdmp:document-get-quality`END`PLN(`END$uri`END`PLN),\n' + + ' `END$forest-ids`END`PLN\n' + + ' )\n' + + '};\n' + + ' \n' + + '`END`KWDlet`END`PLN `END$xml`END`PLN :=\n' + + ' `END`TAG<xml`END`PLN att=`END`STR"blah"`END`PLN att2=`END`STR"blah"`END`TAG>`END`PLN\n' + + ' sdasd`END`TAG<b>`END`PLNasdasd`END`TAG</b>`END`PLN\n' + + ' `END`TAG</xml>`END`PLN\n' + + '`END`COM(: -------- :)`END`PLN\n' + + '`END`KWDfor`END`PLN `END$d`END`PLN `END`KWDin`END`PLN `ENDfn:doc`END`PLN(`END`STR"depts.xml"`END`PLN)/depts/deptno\n' + + '`END`KWDlet`END`PLN `END$e`END`PLN := `ENDfn:doc`END`PLN(`END`STR"emps.xml"`END`PLN)/emps/emp[deptno = `END$d`END`PLN]\n' + + '`END`KWDwhere`END`PLN `ENDfn:count`END`PLN(`END$e`END`PLN) >= 10\n' + + '`END`KWDorder`END`PLN `END`KWDby`END`PLN `ENDfn:avg`END`PLN(`END$e`END`PLN/salary) `END`KWDdescending`END`PLN\n' + + '`END`KWDreturn`END`PLN\n' + + ' `END`TAG<big-dept>`END`PLN\n' + + ' {\n' + + ' `END$d`END`PLN,\n' + + ' `END`TAG<headcount>`END`PLN{`ENDfn:count`END`PLN(`END$e`END`PLN)}`END`TAG</headcount>`END`PLN,\n' + + ' `END`TAG<avgsal>`END`PLN{`ENDfn:avg`END`PLN(`END$e`END`PLN/salary)}`END`TAG</avgsal>`END`PLN\n' + + ' }\n' + + ' `END`TAG</big-dept>`END`PLN\n' + + '`END`COM(: -------- :)`END`PLN\n' + + '`END`KWDdeclare`END`PLN `END`KWDfunction`END`PLN local:depth(`END$e`END`PLN `END`KWDas`END`PLN `END`KWDnode`END`PLN()) `END`KWDas`END`PLN `END`TYPxs:integer`END`PLN\n' + + '{\n' + + ' `END`COM(: A node with no children has depth 1 :)`END`PLN\n' + + ' `END`COM(: Otherwise, add 1 to max depth of children :)`END`PLN\n' + + ' `END`KWDif`END`PLN (`ENDfn:empty`END`PLN(`END$e`END`PLN/*)) `END`KWDthen`END`PLN 1\n' + + ' `END`KWDelse`END`PLN `ENDfn:max`END`PLN(`END`KWDfor`END`PLN `END$c`END`PLN `END`KWDin`END`PLN `END$e`END`PLN/* `END`KWDreturn`END`PLN local:depth(`END$c`END`PLN)) + 1\n' + + '};\n' + + ' \n' + + 'local:depth(`ENDfn:doc`END`PLN(`END`STR"partlist.xml"`END`PLN))\n' + + ' \n' + + '`END`COM(: -------- :)`END`PLN\n' + + '`END`TAG<html><head`END`PLN/`END`TAG><body>`END`PLN\n' + + '{\n' + + ' `END`KWDfor`END`PLN `END$act`END`PLN `END`KWDin`END`PLN `ENDdoc`END`PLN(`END`STR"hamlet.xml"`END`PLN)//ACT\n' + + ' `END`KWDlet`END`PLN `END$speakers`END`PLN := `ENDdistinct-values`END`PLN(`END$act`END`PLN//SPEAKER)\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`TAG<div>`END`PLN{ `ENDstring`END`PLN(`END$act`END`PLN/TITLE) }`END`TAG</h1>`END`PLN\n' + + ' `END`TAG<ul>`END`PLN\n' + + ' {\n' + + ' `END`KWDfor`END`PLN `END$speaker`END`PLN `END`KWDin`END`PLN `END$speakers`END`PLN\n' + + ' `END`KWDreturn`END`PLN `END`TAG<li>`END`PLN{ `END$speaker`END`PLN }`END`TAG</li>`END`PLN\n' + + ' }\n' + + ' `END`TAG</ul>`END`PLN\n' + + ' `END`TAG</div>`END`PLN\n' + + '}\n' + + '`END`TAG</body></html>`END`PLN\n' + + '`END`COM(: -------- :)`END`PLN\n' + + '{\n' + + '\t`END`KWDfor`END`PLN `END$book`END`PLN `END`KWDin`END`PLN `ENDdoc`END`PLN(`END`STR"books.xml"`END`PLN)//book\n' + + ' `END`KWDreturn`END`PLN\n' + + '\t`END`KWDif`END`PLN (`ENDcontains`END`PLN(`END$book`END`PLN/author/`END`KWDtext`END`PLN(),`END`STR"Herbert"`END`PLN) `END`KWDor`END`PLN `ENDcontains`END`PLN(`END$book`END`PLN/author/`END`KWDtext`END`PLN(),`END`STR"Asimov"`END`PLN))\n' + + '\t\t`END`KWDthen`END`PLN `END$book`END`PLN\n' + + '\t`END`KWDelse`END`PLN `END$book`END`PLN/`END`KWDtext`END`PLN()\n' + + '\t\n' + + '\t`END`KWDlet`END`PLN `END$let`END`PLN := `END`TAG<x>`END`STR"test"`END`TAG</x>`END`PLN\n' + + '\t`END`KWDreturn`END`PLN `END`KWDelement`END`PLN `END`KWDelement`END`PLN {\n' + + '\t`END`KWDattribute`END`PLN `END`KWDattribute`END`PLN { 1 },\n' + + '\t`END`KWDelement`END`PLN test { `END`STR\'a\'`END`PLN },\n' + + '\t`END`KWDattribute`END`PLN foo { `END`STR"bar"`END`PLN },\n' + + '\t`ENDfn:doc`END`PLN()[ foo/`END`LIT@bar`END`PLN `END`KWDeq`END`PLN `END$let`END`PLN ],\n' + + '\t//x }\n' + + '}\n' + + '`END`COM(: -------- :)`END`PLN\n' + + '`END`TAG<bib>`END`PLN\n' + + ' {\n' + + ' `END`KWDfor`END`PLN `END$b`END`PLN `END`KWDin`END`PLN `ENDdoc`END`PLN(`END`STR"http://bstore1.example.com/bib.xml"`END`PLN)/bib/book\n' + + ' `END`KWDwhere`END`PLN `END$b`END`PLN/publisher = `END`STR"Addison-Wesley"`END`PLN `END`KWDand`END`PLN `END$b`END`PLN/`END`LIT@year`END`PLN > 1991\n' + + ' `END`KWDreturn`END`PLN\n' + + ' `END`TAG<book`END`PLN year=`END`STR"`END`PLN{ `END$b`END`PLN/`END`LIT@year`END`PLN }`END`STR"`END`TAG>`END`PLN\n' + + ' { `END$b`END`PLN/title }\n' + + ' `END`TAG</book>`END`PLN\n' + + ' }\n' + + '`END`TAG</bib>`END`PLN\n' + + '`END`COM(: -------- :)`END' + ), + nemerle: ( + '`KWDclass`END`PLN Set `END`PUN[`END`PLN\'a`END`PUN]`END`PLN\n' + + '`END`PUN{`END`PLN\n' + + ' `END`KWDmutable`END`PLN storage `END`PUN:`END`PLN `END`TYPlist`END`PLN `END`PUN[`END`PLN\'a`END`PUN]`END`PLN `END`PUN=`END`PLN `END`PUN[];`END`PLN\n' + + ' `END`KWDpublic`END`PLN Add `END`PUN(`END`PLNe `END`PUN:`END`PLN \'a`END`PUN)`END`PLN `END`PUN:`END`PLN `END`TYPvoid`END`PLN\n' + + ' `END`PUN{`END`PLN\n' + + ' `END`KWDwhen`END`PLN `END`PUN(!`END`PLN Contains `END`PUN(`END`PLNe`END`PUN))`END`PLN\n' + + ' storage `END`PUN::=`END`PLN e`END`PUN;`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + ' `END`KWDpublic`END`PLN Contains `END`PUN(`END`PLNe `END`PUN:`END`PLN \'a`END`PUN)`END`PLN `END`PUN:`END`PLN `END`TYPbool`END`PLN\n' + + ' `END`PUN{`END`PLN\n' + + ' storage`END`PUN.`END`PLNContains `END`PUN(`END`PLNe`END`PUN)`END`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + ' \n' + + '`END`KWDdef`END`PLN s1 `END`PUN=`END`PLN Set `END`PUN();`END`PLN\n' + + 's1`END`PUN.`END`PLNAdd `END`PUN(`END`LIT3`END`PUN);`END`PLN\n' + + 's1`END`PUN.`END`PLNAdd `END`PUN(`END`LIT42`END`PUN);`END`PLN\n' + + '`END`KWDassert`END`PLN `END`PUN(`END`PLNs1`END`PUN.`END`PLNContains `END`PUN(`END`LIT3`END`PUN));`END`PLN\n' + + '`END`COM// s1.Add ("foo"); // error here!`END`PLN\n' + + '`END`KWDdef`END`PLN s2 `END`PUN=`END`PLN Set `END`PUN();`END`PLN\n' + + 's2`END`PUN.`END`PLNAdd `END`PUN(`END`STR"foo"`END`PUN);`END`PLN\n' + + '`END`KWDassert`END`PLN `END`PUN(`END`PLNs2`END`PUN.`END`PLNContains `END`PUN(`END`STR"foo"`END`PUN));`END' + ), + latex: ( + '`COM% resume.tex`END`PLN\n' + + '`END`COM% vim:set ft=tex spell:`END`PLN\n' + + '`END`KWD\\documentclass`END`PUN[`END`LIT10pt`END`PLN,letterpaper`END`PUN]{`END`PLNarticle`END`PUN}`END`PLN\n' + + '`END`KWD\\usepackage`END`PUN[`END`PLNletterpaper,margin`END`PUN=`END`LIT0.8in`END`PUN]{`END`PLNgeometry`END`PUN}`END`PLN\n' + + '`END`KWD\\usepackage`END`PUN{`END`PLNmdwlist`END`PUN}`END`PLN\n' + + '`END`KWD\\usepackage`END`PUN[`END`PLNT1`END`PUN]{`END`PLNfontenc`END`PUN}`END`PLN\n' + + '`END`KWD\\usepackage`END`PUN{`END`PLNtextcomp`END`PUN}`END`PLN\n' + + '`END`KWD\\pagestyle`END`PUN{`END`PLNempty`END`PUN}`END`PLN\n' + + '`END`KWD\\setlength`END`PUN{`END`KWD\\tabcolsep`END`PUN}{`END`LIT0em`END`PUN}`END' + ), + issue144: ( + '`COM#! /bin/bash`END`PLN\n' + + '`END`COM# toascii.sh`END`PLN\n' + + '`END`KWDfor`END`PLN i `END`KWDin`END`PLN $`END`PUN(`END`PLNecho $`END`PUN*' + + '`END`PLN `END`PUN|`END`PLN fold `END`PUN-`END`PLNw `END`LIT1`END`PUN);`END' + + '`KWDdo`END`PLN\n' + + ' printf `END`STR"%x "`END`PLN \\\'$i`END`PUN;`END`PLN\n' + + '`END`KWDdone`END`PUN;`END`PLN\n' + + 'echo`END' + ), + issue145: ( + '`TAG<script`END`PLN `END`ATNtype`END`PUN=`END`ATV"text/javascript"`END`TAG>`END`PLN\n' + + '`END`PUN<!--`END`PLN\n' + + ' `END`KWDvar`END`PLN target `END`PUN=`END`PLN $$`END`PUN.`END`PLNcss`END`PUN(`END`STR\'backgroundImage\'`END`PUN).`END`PLNreplace`END`PUN(`END`STR/^url[\\(\\)\'"]/`END`PLNg`END`PUN,`END`PLN `END`STR\'\'`END`PUN);`END`PLN\n' + + '\n' + + ' `END`COM// nice long chain: wrap img element in span`END`PLN\n' + + ' $$`END`PUN.`END`PLNwrap`END`PUN(`END`STR\'<span style="position: relative;"></span>\'`END`PUN)`END`PLN\n' + + '`END`PUN-->`END`PLN\n' + + '`END`TAG</script>`END' + ), + clojure: ( + '`COM; Clojure test comment`END`PLN\n' + + '`END`OPN(`END`KWDns`END`PLN test\n' + + ' `END`OPN(`END`TYP:gen-class`END`CLO))`END`PLN\n' + + '\n' + + '`END`OPN(`END`KWDdef`END`PLN foo `END`STR"bar"`END`CLO)`END`PLN\n' + + '`END`OPN(`END`KWDdefn`END`PLN bar `END`OPN[`END`PLNarg1 arg2 & args`END`CLO]`END`PLN\n' + + ' `END`STR"sample function"`END`PLN\n' + + ' `END`OPN(`END`KWDfor`END`PLN `END`OPN[`END`PLNarg args`END`CLO]`END`PLN\n' + + ' `END`OPN(`END`KWDprn`END`PLN arg`END`CLO)))`END`PLN\n' + + '\n' + + '`END`OPN(`END`PLNbar `END`STR"foo"`END`PLN `END`STR"bar"`END`PLN `END`STR"blah"`END`PLN `END`TYP:baz`END`CLO)`END' + ), + html5conv1: '`COM; foo`END', + html5conv2: '`COM; foo`END', + html5conv3: ( + '`PLN\n' + + '`END`COM; foo`END`PLN\n' + + '`END\n' + ), + html5conv4: ( + '`PLNbefore CODE\n' + + '`END`PUN;`END`PLN foo`END\n' + ), + procinstr1: '`COM; foo`END', + procinstr2: '
  1. `COM; foo`END
', + procinstr3: '
  1. `COM; foo`END
', + procinstr4: '`COM; foo`END', + issue185: '`STR"No tag backs."`END', + issue261: '
  1. `STR"No tag backs."`END
', + issue201: ( + '`KWDstatic`END`PLN `END`TYPPersistent`END' + + '`PUN<`END`TYPString`END`PUN>`END`PLN listeners_symbol`END`PUN;`END' + ), + dart: ( + '`KWDpart of`END`PLN myLib`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDpart`END`PLN `END`STR\'something.dart\'`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDimport`END`PLN `END`STR\'dart:math\'`END`PLN `END' + + '`KWDas`END`PLN test `END`KWDshow`END`PLN foo`END`PUN,`END`PLN bar`END`PUN;`END' + + '`PLN\n' + + '\n' + + '`END`KWDclass`END`PLN `END`TYPPoint`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDfinal`END`PLN `END`TYPnum`END`PLN x`END`PUN,`END`PLN y`END`PUN;`END`PLN\n' + + '\n' + + ' `END`TYPPoint`END`PUN(`END`KWDthis`END`PUN.`END`PLNx`END' + + '`PUN,`END`PLN `END`KWDthis`END`PUN.`END`PLNy`END`PUN);`END`PLN\n' + + ' `END`TYPPoint`END`PUN.`END`PLNzero`END`PUN()`END`PLN `END' + + '`PUN:`END`PLN x `END`PUN=`END`PLN `END`LIT0`END`PUN,`END' + + '`PLN y `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN `END' + + '`COM// Named constructor`END`PLN\n' + + ' `END' + + '`COM// with an initializer list.`END`PLN\n' + + '\n' + + ' `END`TYPnum`END`PLN distanceTo`END`PUN(`END`TYPPoint`END`PLN other`END' + + '`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDvar`END`PLN dx `END`PUN=`END`PLN x `END`PUN-`END' + + '`PLN other`END`PUN.`END`PLNx`END`PUN;`END`PLN\n' + + ' `END`KWDvar`END`PLN dy `END`PUN=`END`PLN y `END`PUN-`END' + + '`PLN other`END`PUN.`END`PLNy`END`PUN;`END`PLN\n' + + ' `END`KWDreturn`END`PLN sqrt`END`PUN(`END`PLNdx `END`PUN*`END' + + '`PLN dx `END`PUN+`END`PLN dy `END`PUN*`END`PLN dy`END`PUN);`END' + + '`PLN\n' + + ' `END`PUN}`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`COM// This is a single-line comment.`END`PLN\n' + + '\n' + + '`END`COM/*\n' + + 'This is a\n' + + 'multiline comment.\n' + + '*/`END`PLN\n' + + '\n' + + 'main`END`PUN()`END`PLN `END`PUN{`END`PLN\n' + + ' `END`TYPPoint`END`PLN p `END`PUN=`END`PLN `END`KWDnew`END' + + '`PLN `END`TYPPoint`END`PUN(`END`LIT7`END`PUN,`END`PLN `END' + + '`LIT12`END`PUN);`END`PLN\n' + + ' `END`TYPString`END`PLN thing `END`PUN=`END`PLN `END' + + '`STR\'It\\\'s awesome!\'`END`PUN;`END`PLN\n' + + ' `END`TYPString`END`PLN thing2 `END`PUN=`END`PLN `END' + + '`STR\'\'\'\n' + + 'This is a test! \\\'\'\'\n' + + 'This is the end of the test\'\'\'`END`PUN;`END`PLN\n' + + ' `END`TYPString`END`PLN thing3 `END`PUN=`END`PLN `END' + + '`STRr\"\"\"\n' + + 'This is a raw\n' + + 'multiline string!\"\"\"`END`PUN;`END`PLN\n' + + ' `END`TYPnum`END`PLN x `END`PUN=`END`PLN `END`LIT0x123ABC`END`PUN;`END`PLN\n' + + ' `END`TYPnum`END`PLN y `END`PUN=`END`PLN `END`LIT1.8e-12`END`PUN;`END`PLN\n' + + ' `END`TYPbool`END`PLN flag `END`PUN=`END`PLN `END`KWDfalse`END' + + '`PUN;`END`PLN\n' + + ' `END`TYPString`END`PLN raw `END`PUN=`END`PLN `END' + + '`STRr\"This is a raw string, where \\n doesn\'t matter\"`END' + + '`PUN;`END`PLN\n' + + '`END`PUN}`END' + ), + tcl_lang: ( + '`COM#!/bin/tclsh`END`PLN\n' + + '`END`KWDproc`END`PLN fib `END`OPN{`END`PLNn`END`CLO}`END`PLN `END`OPN{`END`PLN\n' + + ' `END`KWDset`END`PLN a `END`LIT0`END`PLN\n' + + ' `END`KWDset`END`PLN b `END`LIT1`END`PLN\n' + + ' `END`KWDwhile`END`PLN `END`OPN{`END`PUN$`END`PLNn `END`PUN>`END`PLN `END`LIT0`END`CLO}`END`PLN `END`OPN{`END`PLN\n' + + ' `END`KWDset`END`PLN tmp `END`PUN$`END`PLNa\n' + + ' `END`KWDset`END`PLN a `END`PUN[`END`KWDexpr`END`PLN `END`PUN$`END`PLNa `END`PUN+`END`PLN `END`PUN$`END`PLNb`END`PUN]`END`PLN\n' + + ' `END`KWDset`END`PLN b `END`PUN$`END`PLNtmp\n' + + ' `END`KWDincr`END`PLN n `END`LIT-1`END`PLN\n' + + ' `END`CLO}`END`PLN\n' + + ' `END`KWDreturn`END`PLN `END`PUN$`END`PLNa\n' + + '`END`CLO}`END' + ), + r_lang: ( + '`COM### Example R script for syntax highlighting`END`PLN\n' + + '\n' + + '`END`COM# This is a comment`END`PLN\n' + + '\n' + + '`END`COM## Valid names`END`PLN\n' + + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV0123456789._a `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '.foo_ `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '._foo `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '\n' + + '`END`COM## Invalid names`END`PLN\n' + + '`END`LIT0`END`PLNabc `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '`END`LIT.0`END`PLNabc `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + 'abc`END`PUN+`END`PLNcde `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '\n' + + '`END`COM## Reserved Words`END`PLN\n' + + '`END`LITNA`END`PLN\n' + + '`END`LITNA_integer_`END`PLN\n' + + '`END`LITNA_real_`END`PLN\n' + + '`END`LITNA_character_`END`PLN\n' + + '`END`LITNA_complex_`END`PLN\n' + + '`END`LITNULL`END`PLN\n' + + '`END`LITNaN`END`PLN\n' + + '`END`LITInf`END`PLN\n' + + '`END`COM## Not reserved`END`PLN\n' + + 'NULLa `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + 'NULL1 `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + 'NULL. `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + 'NA_foo_ `END`PUN<-`END`PLN `END`LITNULL`END`PLN\n' + + '\n' + + '`END`COM## Numbers`END`PLN\n' + + '`END`LIT12345678901`END`PLN\n' + + '`END`LIT123456.78901`END`PLN\n' + + '`END`LIT123e3`END`PLN\n' + + '`END`LIT123E3`END`PLN\n' + + '`END`LIT1.23e-3`END`PLN\n' + + '`END`LIT1.23e3`END`PLN\n' + + '`END`LIT1.23e-3`END`PLN\n' + + '`END`COM## integer constants`END`PLN\n' + + '`END`LIT123L`END`PLN\n' + + '`END`LIT1.23L`END`PLN\n' + + '`END`COM## imaginary numbers`END`PLN\n' + + '`END`LIT123i`END`PLN\n' + + '`END`LIT-123i`END`PLN\n' + + '`END`LIT123e4i`END`PLN\n' + + '`END`LIT123e-4i`END`PLN\n' + + '`END`COM## Hex numbers`END`PLN\n' + + '`END`LIT0xabcdefABCDEF01234`END`PLN\n' + + '`END`LIT0xabcp123`END`PLN\n' + + '`END`LIT0xabcP123`END`PLN\n' + + '`END`COM## Not hex`END`PLN\n' + + '`END`LIT0`END`PLNxg\n' + + '\n' + + '`END`COM## Special operators %xyz%`END`PLN\n' + + '`END`COM## %xyz%`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN%%`END`PLN `END`LIT2`END`PLN\n' + + 'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%*%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN%/%`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN%in%`END`PLN `END`LIT1`END`PUN:`END`LIT10`END`PLN\n' + + 'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%o%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\n' + + 'diag`END`PUN(`END`LIT2`END`PUN)`END`PLN `END`PUN%x%`END`PLN diag`END`PUN(`END`LIT2`END`PUN)`END`PLN\n' + + '`END`STR`%foo bar%``END`PLN `END`PUN<-`END`PLN `END`KWDfunction`END`PUN(`END`PLNx`END`PUN,`END`PLN y`END`PUN)`END`PLN x `END`PUN+`END`PLN y\n' + + '`END`LIT1`END`PLN `END`PUN%foo bar%`END`PLN `END`LIT2`END`PLN\n' + + '\n' + + '`END`COM## Control Structures (3.2) and Function`END`PLN\n' + + '`END`COM## if, else`END`PLN\n' + + '`END`KWDif`END`PLN `END`PUN(`END`LITTRUE`END`PUN)`END`PLN print`END`PUN(`END`STR"foo"`END`PUN)`END`PLN `END`KWDelse`END`PLN print`END`PUN(`END`STR"bar"`END`PUN)`END`PLN\n' + + '`END`COM## For, in`END`PLN\n' + + '`END`KWDfor`END`PUN(`END`PLNi `END`KWDin`END`PLN `END`LIT1`END`PUN:`END`LIT5`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' print`END`PUN(`END`PLNi`END`PUN)`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '`END`COM## While, break`END`PLN\n' + + 'i `END`PUN<-`END`PLN `END`LIT1`END`PLN\n' + + '`END`KWDwhile`END`PLN `END`PUN(`END`LITTRUE`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' i `END`PUN<-`END`PLN i `END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + ' `END`KWDif`END`PLN `END`PUN(`END`PLNi `END`PUN>`END`PLN `END`LIT3`END`PUN)`END`PLN `END`KWDbreak`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '`END`COM## Repeat`END`PLN\n' + + '`END`KWDrepeat`END`PLN `END`PUN{`END`LIT1+1`END`PUN}`END`PLN\n' + + '`END`COM## Switch`END`PLN\n' + + 'x `END`PUN<-`END`PLN `END`LIT3`END`PLN\n' + + '`END`KWDswitch`END`PUN(`END`PLNx`END`PUN,`END`PLN `END`LIT2+2`END`PUN,`END`PLN mean`END`PUN(`END`LIT1`END`PUN:`END`LIT10`END`PUN),`END`PLN rnorm`END`PUN(`END`LIT5`END`PUN))`END`PLN\n' + + '`END`COM## Function, dot-dot-dot, return`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`KWDfunction`END`PUN(`END`LIT...`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDreturn`END`PUN(`END`PLNsum`END`PUN(`END`LIT...`END`PUN))`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '`END`COM# Not keywords`END`PLN\n' + + 'functiona `END`PUN<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + 'function. `END`PUN<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + 'function1 `END`PUN<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + '\n' + + '\n' + + '`END`COM## Grouping Tokens 10.3.7`END`PLN\n' + + '`END`COM## Parentheses`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN+`END`PLN `END`PUN(`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT3`END`PUN)`END`PLN\n' + + '`END`COM## brackets`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`KWDfunction`END`PUN(`END`PLNa`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' a `END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`COM## Indexing 10.3.8`END`PLN\n' + + '`END`COM## []`END`PLN\n' + + 'bar `END`PUN<-`END`PLN `END`LIT1`END`PUN:`END`LIT10`END`PLN\n' + + 'bar`END`PUN[`END`LIT3`END`PUN]`END`PLN\n' + + '`END`COM## [[]]`END`PLN\n' + + 'foo `END`PUN<-`END`PLN list`END`PUN(`END`PLNa`END`PUN=`END`LIT1`END`PUN,`END`PLN b`END`PUN=`END`LIT2`END`PUN,`END`PLN c`END`PUN=`END`LIT3`END`PUN)`END`PLN\n' + + 'foo`END`PUN[[`END`STR"a"`END`PUN]]`END`PLN\n' + + '`END`COM## $`END`PLN\n' + + 'foo`END`PUN$`END`PLNa\n' + + 'foo`END`PUN$`END`STR"a"`END`PLN\n' + + '\n' + + '`END`COM## Operators`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN-`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN~`END`PLN `END`LIT2`END`PLN\n' + + '`END`PUN!`END`PLN `END`LITTRUE`END`PLN\n' + + '`END`PUN?`END`STR"help"`END`PLN\n' + + '`END`LIT1`END`PUN:`END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN*`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN/`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PUN^`END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN<`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN>`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN==`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN>=`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN<=`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN!=`END`PLN `END`LIT2`END`PLN\n' + + '`END`LITTRUE`END`PLN `END`PUN&`END`PLN `END`LITFALSE`END`PLN\n' + + '`END`LITTRUE`END`PLN `END`PUN&&`END`PLN `END`LITFALSE`END`PLN\n' + + '`END`LITTRUE`END`PLN `END`PUN|`END`PLN `END`LITFALSE`END`PLN\n' + + '`END`LITTRUE`END`PLN `END`PUN||`END`PLN `END`LITFALSE`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + 'foo `END`PUN=`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN `END`PUN->`END`PLN foo\n' + + 'foo `END`PUN<<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN\n' + + '`END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END`PLN `END`PUN->>`END`PLN foo\n' + + 'base`END`PUN:::`END`PLNsum\n' + + 'base`END`PUN::`END`PLNsum\n' + + '\n' + + '`END`COM## Strings`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR"hello, world!"`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR\'hello, world!\'`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR"Hello, \'world!"`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR\'Hello, "world!\'`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR\'Hello, \\\'world!\\\'\'`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR"Hello, \\"world!\\""`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR"Hello,\n' + + 'world!"`END`PLN\n' + + 'foo `END`PUN<-`END`PLN `END`STR\'Hello,\n' + + 'world!\'`END`PLN\n' + + '\n' + + '`END`COM## Backtick strings`END`PLN\n' + + '`END`STR`foo123 +!"bar\'baz``END`PLN `END`PUN<-`END`PLN `END`LIT2`END`PLN `END`PUN+`END`PLN `END`LIT2`END' + ), + mumps: ( + '`PLNHDR `END`COM; -- prt/display header`END`PLN\n' + + ' `END`KWDN`END`PLN `END`KWDX`END`PUN,`END`KWDI`END`PLN\n' + + ' `END`KWDI`END`PLN `END`PUN\'`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN)`END`PLN `END`KWDX`END`PUN:`END`DEC$G`END`PUN(`END`PLNVALM`END`PUN(`END`STR"HDR"`END`PUN))]`END`STR""`END`PLN VALM`END`PUN(`END`STR"HDR"`END`PUN)`END`PLN\n' + + ' `END`COM; -- prt hdr line`END`PLN\n' + + ' `END`KWDW`END`PUN:\'`END`DEC$D`END`PUN(`END`PLNVALMPG1`END`PUN)`END`PLN `END`PUN@`END`PLNIOF `END`KWDK`END`PLN VALMPG1\n' + + ' `END`KWDW`END`PUN:`END`PLNVALMCC `END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOUON`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)_`END`PLNIOINHI`END`PUN_`END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN `END`COM; -- turn on undln/hi`END`PLN\n' + + ' `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN `END`COM; -- position cursor`END`PLN\n' + + ' `END`KWDW`END`PLN `END`DEC$E`END`PUN(`END`PLNVALM`END`PUN(`END`STR"TITLE"`END`PUN),`END`LIT1`END`PUN,`END`LIT30`END`PUN)`END`PLN `END`COM; -- prt title`END`PLN\n' + + ' `END`KWDW`END`PUN:`END`PLNVALMCC IOINORM`END`PUN,`END`PLNIOUON `END`COM; -- turn off hi`END`PLN\n' + + ' `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR""`END`PUN,`END`LIT30`END`PUN-`END`DEC$L`END`PUN(`END`PLNVALM`END`PUN(`END`STR"TITLE"`END`PUN)))`END`PLN `END`COM; -- fill in w/blanks`END`PLN\n' + + ' `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDW`END`PLN `END`DEC$C`END`PUN(`END`LIT13`END`PUN)`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT30`END`PUN,`END`LIT0`END`PUN)`END`PLN `END`COM; -- position cursor`END`PLN\n' + + ' `END`KWDW`END`PLN `END`DEC$J`END`PUN(`END`STR""`END`PUN,((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`PLN$$HTE^XLFDT`END`PUN(`END`DEC$H`END`PUN,`END`LIT1`END`PUN),`END`DEC$J`END`PUN(`END`STR""`END`PUN,`END`LIT10`END`PUN+((`END`PLNVALMWD`END`LIT-80`END`PUN)/`END`LIT2`END`PUN)),`END`STR"Page: "`END`PUN,`END`DEC$J`END`PUN(`END`PLNVALMPGE`END`PUN,`END`LIT4`END`PUN),`END`STR" of "`END`PUN,`END`DEC$J`END`PUN(`END`PLN$$PAGE^VALM4`END`PUN(`END`PLNVALMCNT`END`PUN,`END`PLNVALM`END`PUN(`END`STR"LINES"`END`PUN)),`END`LIT4`END`PUN)_`END`DEC$S`END`PUN(`END`DEC$D`END`PUN(`END`PLNVALMORE`END`PUN):`END`STR"+"`END`PUN,`END`LIT1`END`PUN:`END`STR" "`END`PUN)`END`PLN `END`COM; -- prt rest of hdr`END`PLN\n' + + ' `END`KWDW`END`PUN:`END`PLNVALMCC IOUOFF `END`KWDI`END`PLN `END`DEC$E`END`PUN(`END`PLNIOST`END`PUN,`END`LIT1`END`PUN,`END`LIT2`END`PUN)=`END`STR"C-"`END`PLN `END`KWDD`END`PLN IOXY^VALM4`END`PUN(`END`LIT0`END`PUN,`END`LIT0`END`PUN)`END`PLN `END`COM; -- turn off undln`END`PLN\n' + + ' `END`KWDF`END`PLN `END`KWDI`END`PUN=`END`LIT1`END`PUN:`END`LIT1`END`PUN:`END`PLNVALM`END`PUN(`END`STR"TM"`END`PUN)`END`LIT-3`END`PLN `END`KWDW`END`PLN `END`PUN!,`END`DEC$S`END`PUN(\'`END`DEC$D`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN)):`END`STR""`END`PUN,`END`DEC$L`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))>(`END`PLNVALMWD`END`LIT-1`END`PUN):`END`PLN$`END`DEC$EXTRACT`END`PLN^VALM4`END`PUN(`END`DEC$G`END`PUN(`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))),`END`LIT1`END`PUN:`END`PLNVALMHDR`END`PUN(`END`KWDI`END`PUN))`END`PLN `END`COM; -- prt hdr`END`PLN\n' + + ' `END`KWDQ`END' + ), + basic_lang: ( + '`LIT200`END`PLN `END`COMREM ----- method teardown`END`PLN\n' + + '`END`LIT210`END`PLN `END`KWDPRINT`END`PLN `END`STR"green"`END`PLN\n' + + '`END`LIT220`END`PLN `END`KWDRETURN`END`PLN\n' + + '`END`LIT470`END`PLN `END`KWDIF`END`PLN af`END`PUN=`END`LIT0`END`PLN `END`KWDTHEN`END`PLN `END`KWDGOTO`END`PLN `END`LIT520`END`PLN\n' + + '`END`LIT480`END`PLN `END`KWDFOR`END`PLN j`END`PUN=`END`LIT1`END`PLN `END`KWDTO`END`PLN af\n' + + '`END`LIT500`END`PLN ac`END`PUN=`END`PLNpf`END`PUN(`END`PLNj`END`PUN)`END`PLN `END`PUN:`END`PLN me$`END`PUN=`END`PLNSTR$`END`PUN(`END`PLNj`END`PUN)+`END`STR". factor"`END`PLN `END`PUN:`END`PLN `END`KWDGOSUB`END`PLN `END`LIT100`END`PLN\n' + + '`END`LIT510`END`PLN `END`KWDNEXT`END`PLN\n' + + '`END`LIT530`END`PLN `END`KWDRETURN`END`PLN\n' + + '`END`LIT1000`END`PLN `END`KWDDATA`END`PLN `END`STR"one"`END`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT0`END' + ), + pascal_lang: ( + '`COM(* some comment here *)`END`PLN\n' + + '`END`KWDPROCEDURE`END`PLN TestCase`END`PUN.`END`PLNAssertEquals`END`PUN(`END`PLNmsg`END`PUN:`END`PLNString`END`PUN;`END`PLN expect`END`PUN,`END`PLN act`END`PUN:`END`PLNLongint`END`PUN);`END`PLN\n' + + '`END`KWDVAR`END`PLN ex`END`PUN,`END`PLN ac`END`PUN:`END`PLNString`END`PUN;`END`PLN\n' + + '`END`KWDBEGIN`END`PLN\n' + + ' `END`KWDIF`END`PLN expect `END`PUN<>`END`PLN act `END`KWDTHEN`END`PLN\n' + + ' `END`KWDBEGIN`END`PLN\n' + + ' Str`END`PUN(`END`PLNexpect`END`PUN,`END`PLN ex`END`PUN);`END`PLN\n' + + ' Fail`END`PUN(`END`PLNConcat`END`PUN(`END`PLNmsg`END`PUN,`END`STR\' expected \'`END`PUN,`END`PLNex`END`PUN,`END`STR\' but was \'`END`PUN,`END`PLNac`END`PUN));`END`PLN\n' + + ' `END`KWDEND`END`PUN;`END`PLN\n' + + '\n' + + ' factors `END`PUN:=`END`PLN new`END`PUN(`END`PLNArrayListPtr`END`PUN,`END`PLN Init`END`PUN);`END`PLN\n' + + '\n' + + ' `END`KWDFOR`END`PLN candidate `END`PUN:=`END`PLN `END`LIT2`END`PLN `END`KWDTO`END`PLN i `END`KWDDO`END`PLN\n' + + ' `END`KWDBEGIN`END`PLN\n' + + ' `END`KWDWHILE`END`PLN i `END`KWDMOD`END`PLN candidate `END`PUN=`END`PLN `END`LIT0`END`PLN `END`KWDDO`END`PLN\n' + + ' `END`KWDBEGIN`END`PLN\n' + + ' factors`END`PUN^.`END`PLNAdd`END`PUN(`END`PLNcandidate`END`PUN);`END`PLN\n' + + ' i `END`PUN:=`END`PLN i `END`KWDDIV`END`PLN candidate`END`PUN;`END`PLN\n' + + ' `END`KWDEND`END`PUN;`END`PLN\n' + + ' `END`KWDEND`END`PUN;`END`PLN\n' + + '`END`KWDEND`END`PUN;`END' + ), + kotlin: ( + '`KWDpackage`END`PLN test`END`PUN;`END`PLN\n' + + '\n' + + '`END`KWDimport`END`PLN kotlin`END`PUN.`END`TYPInt`END`PLN\n' + + '\n' + + '`END`COM// Single line comment`END`PLN\n' + + '`END`COM/*\n' + + ' * Multiline\n' + + ' * comment\n' + + ' */`END`PLN\n' + + '\n' + + '`END`KWDtypealias`END`PLN `END`TYPSomeNumber`END`PLN `END`PUN=`END`PLN `END`TYPInt`END`PLN\n' + + '\n' + + '`END`KWDval`END`PLN number`END`PUN:`END`PLN `END`TYPLong`END`PLN `END`PUN=`END`PLN `END`LIT1_000L`END`PLN\n' + + '`END`KWDvar`END`PLN float`END`PUN:`END`PLN `END`TYPFloat`END`PLN `END`PUN=`END`PLN `END`LIT12.34f`END`PLN\n' + + '`END`LIT0xFF_FF`END`PLN\n' + + '`END`LIT3.14`END`PLN\n' + + '\n' + + '`END`LIT314e-2`END`PLN\n' + + '`END`LIT0.314e1`END`PLN\n' + + '\n' + + '`END`KWDprotected`END`PLN `END`KWDoverride`END`PLN `END`KWDfun`END`PLN ifBoolean`END`PUN(`END`PLNcondition`END`PUN:`END`PLN `END`TYPBoolean`END`PUN?`END`PLN `END`PUN=`END`PLN `END`LITnull`END`PUN)`END' + + '`PLN `END`PUN{}`END`PLN\n' + + '\n' + + '`END`PUN::`END`PLNifBoolean\n' + + '\n' + + '`END`KWDconstructor`END`PUN()`END`PLN `END`PUN:`END`PLN `END`KWDsuper`END`PUN()`END`PLN\n' + + '\n' + + '`END`STR"\\\"true\\\""`END`PLN\n' + + '`END`STR\'a\'`END`PLN\n' + + '\n' + + '`END`STR"""\n' + + 'aaaaaaaaaaa\n' + + '"""`END`PLN\n' + + '\n' + + '`END`LITloop@`END`PLN `END`KWDfor`END`PUN()`END`PLN\n' + + '\n' + + '`END`KWDbreak`END`PLN `END`LIT@loop`END`PLN\n' + + '\n' + + '`END`KWDenum class`END`PLN `END`TYP\`true\``END`PLN\n' + + '\n' + + '`END`KWDdata class`END`PLN `END`TYPPerson`END`PUN(`END`KWDval`END`PLN name`END`PUN:`END`PLN `END`TYPString`END`PUN)`END`PLN\n' + + '\n' + + '`END`KWDenum class`END`PLN `END`TYPSize`END`PLN `END`PUN{`END`PLN\n' + + ' BIG`END`PUN,`END`PLN MEDIUM`END`PUN,`END`PLN SMALL\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDclass`END`PLN `END`TYPBall`END`PUN(`END`KWDval`END`PLN color`END`PUN:`END`PLN `END`TYPString`END`PUN,`END`PLN `END`KWDval`END`PLN size`END`PUN:`END`PLN `END`TYPSize`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' `END`KWDcompanion object`END`PLN `END`PUN{}`END`PLN\n' + + '\n' + + ' `END`KWDfun`END`PLN isBig`END`PUN()`END`PLN `END`PUN=`END`PLN size `END`PUN==`END`PLN `END`TYPSize`END`PUN.`END`PLNBIG\n' + + '\n' + + ' `END`KWDval`END`PLN isMedium`END`PUN:`END`PLN `END`TYPBoolean`END`PLN\n' + + ' `END`KWDget`END`PUN()`END`PLN `END`PUN=`END`PLN size `END`PUN==`END`PLN `END`TYPSize`END`PUN.`END`PLNMEDIUM\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`KWDfun`END`PLN `END`TYPBoolean`END`PUN?.`END`PLNisNull`END`PUN():`END`PLN `END`TYPBoolean`END`PLN `END`PUN=`END`PLN `END`KWDthis`END`PLN `END`PUN==`END`PLN `END`LITnull`END`PLN\n' + + '\n' + + '`END`KWDfun`END`PLN `END`TYPBoolean`END`PUN?.`END`PLNgetOrThrow`END`PUN():`END`PLN `END`TYPBoolean`END`PLN `END`PUN=`END`PLN `END`KWDthis`END`PLN `END`PUN?:`END`PLN `END`KWDthrow`END`PLN `END`TYPException`END`PUN()`END' + ), + llvm: ( + '`COM; Declare the string constant as a global constant.`END`PLN\n' + + '@.str `END`PUN=`END`PLN `END`KWDprivate`END`PLN `END`KWDunnamed_addr`END`PLN `END`KWDconstant`END`PLN `END`PUN[`END`LIT13`END`PLN `END`KWDx`END`PLN `END`KWDi8`END`PUN]`END`PLN `END`KWDc`END`STR"hello world\\0A\\00"`END`PLN\n' + + '\n' + + '`END`COM; External declaration of the puts function`END`PLN\n' + + '`END`KWDdeclare`END`PLN `END`KWDi32`END`PLN @puts`END`PUN(`END`KWDi8`END`PUN*`END`PLN `END`KWDnocapture`END`PUN)`END`PLN `END`KWDnounwind`END`PLN\n' + + '\n' + + '`END`COM; Definition of main function`END`PLN\n' + + '`END`KWDdefine`END`PLN `END`KWDi32`END`PLN @main`END`PUN()`END`PLN `END`PUN{`END`PLN `END`COM; i32()*`END`PLN\n' + + ' `END`COM; Convert [13 x i8]* to i8 *...`END`PLN\n' + + ' %cast210 `END`PUN=`END`PLN `END`KWDgetelementptr`END`PLN `END`PUN[`END`LIT13`END`PLN `END`KWDx`END`PLN `END`KWDi8`END`PUN]*`END`PLN @.str`END`PUN,`END`PLN `END`KWDi64`END`PLN `END`LIT0`END`PUN,`END`PLN `END`KWDi64`END`PLN `END`LIT0`END`PLN\n' + + '\n' + + ' `END`COM; Call puts function to write out the string to stdout.`END`PLN\n' + + ' `END`KWDcall`END`PLN `END`KWDi32`END`PLN @puts`END`PUN(`END`KWDi8`END`PUN*`END`PLN %cast210`END`PUN)`END`PLN\n' + + ' `END`KWDret`END`PLN `END`KWDi32`END`PLN `END`LIT0`END`PLN\n' + + '`END`PUN}`END`PLN\n' + + '\n' + + '`END`COM; Named metadata`END`PLN\n' + + '!1 `END`PUN=`END`PLN `END`KWDmetadata`END`PLN !`END`PUN{`END`KWDi32`END`PLN `END`LIT42`END`PUN}`END`PLN\n' + + '!foo `END`PUN=`END`PLN !`END`PUN{`END`PLN!1`END`PUN,`END`PLN `END`KWDnull`END`PUN}`END' + ), + issue217: ( + '`KWDif`END`PUN(!`END`STR/^https?:\\/\\//`END`PLNi`END`PUN.`END`PLNtest`END`PUN(`END`PLNval`END`PUN)`END`PLN `END`PUN&&`END`PLN foo `END`PUN==`END`PLN `END`STR\'bar\'`END`PUN)`END`PLN `END`PUN{`END`PLN\n' + + ' val `END`PUN=`END`PLN `END`STR\'http://\'`END`PLN `END`PUN+`END`PLN val`END`PUN;`END`PLN\n' + + '`END`PUN}`END' + ), + matlab: ( + '`COM%%%%%%%%%%%%%%%%%% DATA TYPES %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`ENDv`END`PLN `END`PUN=`END`PLN `END`TAG[`END`LIT1`END`PUN,`END`LIT2`END`PUN,`END`LIT3`END`PUN;`END`LIT4`END`PUN,`END`LIT5`END`PUN,`END`LIT6`END`TAG]`END`PUN;`END`PLN\n' + + '`ENDv`END`TAG(`ENDv`END`PUN>`END`LIT4`END`TAG)`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN\n' + + '\n' + + '`ENDs`END`PLN `END`PUN=`END`PLN `END`TYPstruct`END`TAG(`END`STR\'key\'`END`PUN,`END`LIT1`END`PUN,`END`PLN `END`STR\'key2\'`END`PUN,`END`STR\'string\'`END`TAG)`END`PUN;`END`PLN\n' + + '`ENDs.key`END`PLN `END`PUN=`END`PLN `END`LIT2`END`PUN;`END`PLN\n' + + '\n' + + '`ENDC`END`PLN `END`PUN=`END`PLN `END`TYPcell`END`TAG(`END`LIT1`END`PUN,`END`LIT2`END`TAG)`END`PUN;`END`PLN\n' + + '`ENDC`END`TAG{`END`LIT1`END`PUN,`END`LIT1`END`TAG}`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN:`END`LIT9`END`PUN;`END`PLN\n' + + '\n' + + '`END`TYPdouble`END`TAG(`END`LIT1`END`TAG)`END`PLN\n' + + '`END`TYPsingle`END`TAG(`END`LIT1`END`TAG)`END`PLN\n' + + '`END`TYPuint8`END`TAG(`END`LIT1`END`TAG)`END`PLN\n' + + '`END`TYPint8`END`TAG(`END`LIT1`END`TAG)`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% STRINGS & TRANSPOSE %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END`FUNplot`END`TAG(`ENDdata`END\'`END`TAG)`END`PUN;`END`PLN\n' + + '`END`FUNlegend`END`TAG(`ENDlabels`END`TAG)`END`PLN\n' + + '\n' + + '`ENDstr`END`PLN `END`PUN=`END`PLN `END`STR\'asdasd\'`END`PUN;`END`PLN `END`COM% this is a string`END`PLN\n' + + '`ENDstr`END`PLN `END`PUN=`END`PLN `END`STR\'asdas\'`END`PUN;`END`PLN\n' + + '`ENDstr`END`PLN `END`PUN=`END`PLN `END`STR\'sdasd\'\'sdasd\'`END`PUN;`END`PLN\n' + + '\n' + + '`ENDstr`END`PLN `END`PUN=`END`PLN `END`TAG[`END`STR\'one\'`END`PLN `END`STR\'two\'`END`PLN `END`STR\'three\'`END`TAG]`END`PUN;`END`PLN\n' + + '`ENDstr`END`PLN `END`PUN=`END`PLN `END`FUNstrcat`END`TAG(`END`STR\'one\'`END`PUN,`END`PLN `END`STR\'two\'`END`PUN,`END`PLN `END`STR\'three\'`END`TAG)`END`PUN;`END`PLN\n' + + '\n' + + '`END`COM% matrix transpose`END`PLN\n' + + '`ENDM`END`PLN `END`PUN=`END`PLN `END`FUNrand`END`TAG(`END`LIT3`END`PUN,`END`LIT3`END`TAG)`END\'`END`PUN;`END`PLN\n' + + '`ENDx`END`PLN `END`PUN=`END`PLN `ENDM`END`PUN.`END\'`END`PUN;`END`PLN\n' + + '`ENDx`END`PLN `END`PUN=`END`PLN `END`TAG[`END`LIT10`END`PLN `END`LIT20`END`PUN;`END`PLN `END`LIT30`END`PUN,`END`PLN `END`LIT40`END`TAG]`END\'`END`PUN;`END`PLN\n' + + '`END`FUNdisp`END`TAG(`ENDx`END\'`END`TAG)`END`PLN\n' + + '`END`FUNfprintf`END`TAG(`END`STR\'%d\\n\'`END`PUN,`END`PLN `ENDx`END`TAG(`END`PUN:`END`TAG)`END\'`END`TAG)`END`PLN `END`COM% with comment`END`PLN\n' + + '`END`TAG{`END`LIT1`END`PUN,`END`LIT2`END`TAG}`END\'`END`PLN `END`COM% another comment`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% LINE CONTINUATION %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END`TAG[`END`LIT1`END`PLN `END`LIT20`END`PUN;`END`PLN `END...\n' + + '`END`LIT30`END`PLN `END`LIT4`END`TAG]`END`PLN\n' + + '\n' + + '`END`TAG[`END`STR\'gdgsd\'`END...\n' + + '`END`STR\'sdfs\'`END`TAG]`END`PLN\n' + + '\n' + + '`END`TAG{`END...\n' + + '`END`STR\'sdasd\'`END`PLN `END`PUN;`END`PLN\n' + + '`END`STR\'asdsad\'`END`TAG}`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% SYSTEM COMMANDS %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END!touch file.txt`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% COMMAND OUTPUT %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END>> `END`LIT1+1`END`PLN\n' + + '`ENDans`END`PLN `END`PUN=`END`PLN\n' + + ' `END`LIT2`END`PLN\n' + + '\n' + + '`END>> `END`LIT1+1`END`PLN\n' + + '\n' + + '`ENDans`END`PLN `END`PUN=`END`PLN\n' + + '\n' + + ' `END`LIT2`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% KEYWORDS %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END`KWDfunction`END`PLN `ENDret`END`PLN `END`PUN=`END`PLN `ENDfcn`END`TAG(`ENDin`END`TAG)`END`PLN\n' + + ' `ENDret`END`PLN `END`PUN=`END`PLN `END`FUNsum`END`TAG(`ENDin`END`PUN.^`END`LIT2`END`TAG)`END`PUN;`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`END`KWDclassdef`END`PLN `ENDCC`END`PLN `END`PUN<`END`PLN `END`FUNhandle`END`PLN\n' + + ' `ENDproperties`END`PLN `END`TAG(`ENDSetAccess`END`PLN `END`PUN=`END`PLN `ENDpublic`END`TAG)`END`PLN\n' + + ' `ENDx`END`PLN `END`PUN=`END`PLN `END`LIT0`END`PUN;`END`PLN\n' + + ' `END`KWDend`END`PLN\n' + + ' `END`FUNmethods`END`PLN\n' + + ' `END`KWDfunction`END`PLN `ENDthis`END`PLN `END`PUN=`END`PLN `ENDCC`END`TAG(`ENDvarargin`END`TAG)`END`PLN\n' + + ' `ENDthis.x`END`PLN `END`PUN=`END`PLN `END`LIT9`END`PUN;`END`PLN\n' + + ' `END`KWDend`END`PLN\n' + + ' `END`KWDend`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`ENDx`END`PLN `END`PUN=`END`PLN `END`TAG[]`END`PUN;`END`PLN\n' + + '`END`KWDparfor`END`PLN `ENDi`END`PUN=`END`LIT1`END`PUN:`END`LIT10`END`PLN\n' + + ' `ENDx`END`TAG[`ENDi`END`TAG]`END`PLN `END`PUN=`END`PLN `ENDi`END`PUN;`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`ENDtrue`END`PLN `END`PUN~=`END`PLN `ENDfalse`END`PLN\n' + + '\n' + + '`END`KWDif`END`PLN `ENDx`END`PUN==`END`LIT1`END`PLN\n' + + ' `ENDtrue`END`PLN\n' + + '`END`KWDelseif`END`PLN\n' + + ' `ENDfalse`END`PLN\n' + + '`END`KWDelse`END`PLN\n' + + ' `END`KWDreturn`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`END`KWDwhile`END`PLN `ENDtrue`END`PLN\n' + + ' `END`KWDcontinue`END`PLN\n' + + ' `END`KWDbreak`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`END`KWDtry`END`PLN\n' + + ' `END`FUNerror`END`TAG(`END`STR\'aa:aa\'`END`PUN,`END`PLN `END`STR\'asdasd\'`END`TAG)`END`PLN\n' + + '`END`KWDcatch`END`PLN `ENDME`END`PLN\n' + + ' `END`FUNwarning`END`TAG(`ENDME`END`TAG)`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`END`KWDswitch`END`PLN `ENDx`END`PLN\n' + + ' `END`KWDcase`END`PLN `END`LIT1`END`PLN\n' + + ' `END`FUNdisp`END`TAG(`END`LIT1`END`TAG)`END`PLN\n' + + ' `END`KWDotherwise`END`PLN\n' + + ' `END`LIT0`END`PLN\n' + + '`END`KWDend`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% NUM LITERALS %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END`LIT1`END`PLN\n' + + '`END`LIT1.`END`PLN\n' + + '`END`LIT.1`END`PLN\n' + + '`END`LIT1.0`END`PLN\n' + + '`END`LIT-1`END`PLN\n' + + '`END`LIT-1.`END`PLN\n' + + '`END`LIT-.1`END`PLN\n' + + '`END`LIT-1.0`END`PLN\n' + + '`END`LIT+10`END`PLN\n' + + '`END`LIT+01.`END`PLN\n' + + '`END`LIT+.1`END`PLN\n' + + '`END`LIT+1.0`END`PLN\n' + + '`END`LIT1e1`END`PLN\n' + + '`END`LIT1e-1`END`PLN\n' + + '`END`LIT1.e1`END`PLN\n' + + '`END`LIT1.e-1`END`PLN\n' + + '`END`LIT1.0e1`END`PLN\n' + + '`END`LIT1.0e-1`END`PLN\n' + + '`END`LIT.1e1`END`PLN\n' + + '`END`LIT.1e-1`END`PLN\n' + + '`END`LIT-.1e+1`END`PLN\n' + + '`END`LIT+1.e-1`END`PLN\n' + + '\n' + + '`END`LIT1i`END`PLN\n' + + '`END`LIT.10j`END`PLN\n' + + '`END`LIT-1.001i`END`PLN\n' + + '`END`LIT+1e-100j`END`PLN\n' + + '`END`LIT-.10e-01i`END`PLN\n' + + '\n' + + '`END`COM% unary vs binary operators`END`PLN\n' + + '`END`LIT1+1`END`PLN\n' + + '`END`LIT1`END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + '`END`LIT1`END`PLN `END`LIT+1`END`PLN\n' + + '`END`LIT1`END`PLN `END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + '`END`LIT+1+1`END`PLN\n' + + '`END`LIT+1`END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + '`END`LIT+1`END`PLN `END`LIT+1`END`PLN\n' + + '`END`LIT+1`END`PLN `END`PUN+`END`PLN `END`LIT1`END`PLN\n' + + '\n' + + '`END`COM%%%%%%%%%%%%%%%%%% COMMENTS %%%%%%%%%%%%%%%%%%`END`PLN\n' + + '\n' + + '`END`COM% % comment % %`END`PLN\n' + + ' `END`COM% comment`END`PLN\n' + + '`END`COM% comment`END`PLN\n' + + '`END`COM%# comment`END`PLN\n' + + '`END`COM%% comment`END`PLN\n' + + '`END`COM%#x = sum(x);`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + 'block comment\n' + + '%}`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + '%}`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + '\n' + + '%}`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + '1\n' + + '2\n' + + '%}`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + '% sdf {}\n' + + 'sdf\n' + + '%asda{}\n' + + 'sfds\n' + + '%}`END`PLN\n' + + '\n' + + ' `END`COM%{\n' + + 'dsf\n' + + ' %}`END`PLN\n' + + '\n' + + '`END`COM%{%}`END`PLN\n' + + '\n' + + '`END`COM%{ zzz=10; %}`END`PLN\n' + + '\n' + + '`END`COM%{%x=10;%}`END`PLN\n' + + '\n' + + '`END`COM%{ x\n' + + 'a=10;\n' + + '%}`END`PLN\n' + + '\n' + + '`END`COM%{\n' + + '%a=10;\n' + + '%}`END`PLN `ENDx`END`PLN\n' + + '\n' + + '`END`COM% nested block comments fail`END`PLN\n' + + '`END`COM%{\n' + + 'dfsdf\n' + + '%{\n' + + 'xxx\n' + + '%}`END`PLN\n' + + '`ENDdfsdf`END`PLN\n' + + '`END`COM%}`END`PLN\n' + + '\n' + + '`END`COM% fails here!`END`PLN\n' + + '`END`COM%{\n' + + 'x=10;\n' + + '%%{\n' + + '%%}`END`PLN\n' + + '`ENDy`END`PUN=`END`LIT20`END`PUN;`END`PLN\n' + + '`END`COM%}`END' + ), + elixir: ('`KWDdefmodule`END`PLN `END`TYPFoo`END`PUN.`END`TYPBar`END`PLN `END`KWDdo`END`PLN\n' + +' `END`ATN@moduledoc`END`PLN `END`STR"""\n' + +' Tests syntax highlighting for Elixir\n' + +' """`END`PLN\n' + +'\n' + +' `END`KWDuse`END`PLN `END`TYPBitwise`END`PLN\n' + +' `END`KWDrequire`END`PLN `END`TYPLogger`END`PLN\n' + +' `END`KWDalias`END`PLN `END`ATN__MODULE__`END`PUN,`END`PLN `END`LITas:`END`PLN `END`TYPThis`END`PLN\n' + +'\n' + +' `END`ATN@default_token_length`END`PLN `END`LIT10_000`END`PLN\n' + +'\n' + +'\n' + +' `END`ATN@spec`END`PLN token`END`PUN(`END`PLNlength `END`PUN::`END`PLN integer`END`PUN)`END`PLN `END`PUN::`END`PLN `END`TYPString`END`PUN.`END`PLNt\n' + +'\n' + +' `END`KWDdef`END`PLN token`END`PUN(`END`PLNlength `END`PUN\\\\`END`PLN `END`ATN@default_token_length`END`PUN),`END`PLN `END`KWDdo`END`PUN:`END`PLN `END`TYPString`END`PUN.`END`PLNduplicate`END`PUN(`END`STR"x"`END`PUN,`END`PLN length`END`PUN)`END`PLN\n' + +'\n' + +'\n' + +' `END`KWDdefp`END`PLN `END`COM_not_exported`END`PUN(),`END`PLN `END`KWDdo`END`PUN:`END`PLN `END`LIT0xFF`END`PLN `END`PUN+`END`PLN `END`LIT0xF_F`END`PLN `END`PUN-`END`PLN `END`LIT0xff`END`PLN\n' + +'\n' + +'\n' + +' `END`KWDdef`END`PLN other`END`PUN(`END`PLNfoo`END`PUN,`END`PLN bar`END`PUN)`END`PLN `END`KWDdo`END`PLN\n' + +' fun `END`PUN=`END`PLN `END`KWDfn`END`PUN{`END`COM_a`END`PUN,`END`PLN b`END`PUN}`END`PLN `END`PUN->`END`PLN b `END`PUN+`END`PLN `END`LIT1_3.1_4`END`PLN `END`KWDend`END`PLN\n' + +' fun`END`PUN.(`END`LIT1.0e+20`END`PUN)`END`PLN\n' + +' `END`COM_str`END`PLN `END`PUN=`END`PLN `END`STR"string without #{inspect(42)} interpolation"`END`PLN `END`PUN<>`END`PLN `END`STR" some more\n' + +' with newlines \\\n' + +' and newlines"`END`PLN\n' + +' charlist `END`PUN=`END`PLN `END`LIT\'some\\\'chars\n' + +' with newlines \\\n' + +' and newlines\'`END`PLN\n' + +' `END`PUN<<`END`PLNx`END`PUN::`END`PLNutf8`END`PUN,`END`PLN `END`COM_y`END`PUN::`END`PLNsize`END`PUN(`END`LIT8`END`PUN),`END`PLN data`END`PUN::`END`PLNbinary`END`PUN>>`END`PLN `END`PUN=`END`PLN `END`STR"fooo"`END`PLN\n' + +' ls `END`PUN=`END`PLN `END`PUN[`END`LIT1`END`PLN `END`PUN|`END`PLN `END`PUN[`END`LIT2`END`PUN,`END`PLN `END`LIT3`END`PUN]]`END`PLN\n' + +' map `END`PUN=`END`PLN `END`PUN%{`END`STR"baz"`END`PLN `END`PUN=>`END`PLN `END`STR"ban"`END`PUN}`END`PLN\n' + +' map `END`PUN=`END`PLN `END`PUN%{`END`LITfoo:`END`PLN `END`LIT:bar`END`PUN,`END`PLN `END`LIT"yes, this compiles":`END`PLN `END`LIT:"also an atom"`END`PUN}`END`PLN\n' + +' `END`LIT:erlang`END`PUN.`END`PLNtime`END`PUN()`END`PLN\n' + +' `END`KWDcase`END`PLN `END`PUN{`END`PLNfoo`END`PUN,`END`PLN bar`END`PUN}`END`PLN `END`KWDdo`END`PLN\n' + +' `END`PUN{`END`LIT1`END`PUN,`END`PLN `END`LIT2`END`PUN}`END`PLN `END`PUN->`END`PLN `END`LIT3`END`PLN\n' + +' `END`COM_something_else`END`PLN `END`PUN->`END`PLN `END`LIT:error`END`PLN\n' + +' `END`COM_`END`PLN `END`PUN->`END`PLN `END`LIT:"this won\'t match"`END`PLN\n' + +' `END`KWDend`END`PLN\n' + +' r `END`PUN=`END`PLN `END`LIT2`END`PLN\n' + +' `END`COM_bitwise_not`END`PLN `END`PUN=`END`PLN `END`PUN~~~`END`PLNr\n' + +'\n' + +' `END`ATV~r/foo/iu`END`PLN `END`COM# regex sigils are treated as normal ones`END`PLN\n' + +' `END`ATV~S|we have "quotes" and \'quotes\' and|`END`PLN `END`PUN<>`END`PLN `END`STR" more string"`END`PLN\n' + +' `END`ATV~c"custom sigil char \\"is\\" fine too"`END`PLN\n' + +' `END`ATV~r\'hello\'`END`PLN\n' + +' `END`ATV~w[hell\\] #o]`END`PLN `END`COM#sigil does not expand to the comment`END`PLN\n' + +' `END`ATV~w{hello}`END`PLN\n' + +' `END`ATV~C<hello>`END`PLN\n' + +' `END`KWDend`END`PLN\n' + +'\n' + +'`END`KWDend`END') +}; diff --git a/static/bower_components/google-prettify/tests/recombineTagsAndDecorations_test.html b/static/bower_components/google-prettify/tests/recombineTagsAndDecorations_test.html new file mode 100644 index 00000000..f6997230 --- /dev/null +++ b/static/bower_components/google-prettify/tests/recombineTagsAndDecorations_test.html @@ -0,0 +1,119 @@ + + + + +recombineTagsAndDecorations + + + + + + + + +

Recombine Tags And Decorations Test

+ + + + + + + + + + + + + + + + + + + + + + + +
Test Single Decoration
"Hello, World!"[0, 'str']"Hello, World!"
Test Single Span
print "Hello, <World>!";[0, 'kwd', 5, 'pln', 6, 'str', 14, 'tag', 21, 'str', 23, 'pun']print "Hello, <World>!";
Test Interleaved
print "Hello, <World>!";[0, 'kwd', 5, 'pln', 6, 'str', 14, 'tag', 21, 'str', 23, 'pun']print "Hello, <World>!";
+ +
+

Log

+
+ + + + + diff --git a/static/bower_components/google-prettify/tests/run_prettify_test.html b/static/bower_components/google-prettify/tests/run_prettify_test.html new file mode 100644 index 00000000..e71370e6 --- /dev/null +++ b/static/bower_components/google-prettify/tests/run_prettify_test.html @@ -0,0 +1,78 @@ + + + + +Run_Prettify Test + + + + + + +

run_prettify test

+

Note: try appending ?loader to this page URL to test the +minified version instead.

+ +

Test

+
+<div style="color: #f00">
+  Hello, World!
+</div>
+
+ +

Log

+
+ + + diff --git a/static/bower_components/google-prettify/tests/shims.js b/static/bower_components/google-prettify/tests/shims.js new file mode 100644 index 00000000..77cb9dc9 --- /dev/null +++ b/static/bower_components/google-prettify/tests/shims.js @@ -0,0 +1,105 @@ +/** + * Shim for ES5 Date.now + * for older browsers (IE < 9, FF < 3, etc.) + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Polyfill + */ +(function () { + if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; + } +})(); + +/** + * Shim for HTML5 getElementsByClassName + * for older browsers (IE < 9, FF < 3, etc.) + */ +(function () { + if (!document.getElementsByClassName) { + document.getElementsByClassName = function (className) { + className = className.replace(/\s+/g, ' ').replace(/^\s*|\s*$/g, ' '); + var results = []; + function walk(node) { + if (node.nodeType !== 1) { return; } + // This test should be order-insensitive. + if ((' ' + node.className + ' ').indexOf(className) >= 0) { + results[results.length] = node; + } + for (var child = node.firstChild; child; child = child.nextSibling) { + walk(child); + } + } + walk(document.body); + return results; + }; + } +})(); + +/** + * Shim for "fixing" IE's lack of support (IE < 9) for applying slice + * on host objects like NamedNodeMap, NodeList, and HTMLCollection + * (technically, since host objects have been implementation-dependent, + * at least before ES2015, IE hasn't needed to work this way). + * Also works on strings, fixes IE < 9 to allow an explicit undefined + * for the 2nd argument (as in Firefox), and prevents errors when + * called on other DOM objects. + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice#Streamlining_cross-browser_behavior + */ +(function () { + 'use strict'; + var _slice = Array.prototype.slice; + + try { + // Can't be used with DOM elements in IE < 9 + _slice.call(document.documentElement); + } catch (e) { // Fails in IE < 9 + // This will work for genuine arrays, array-like objects, + // NamedNodeMap (attributes, entities, notations), + // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes), + // and will not fail on other DOM objects (as do DOM elements in IE < 9) + Array.prototype.slice = function(begin, end) { + // IE < 9 gets unhappy with an undefined end argument + end = (typeof end !== 'undefined') ? end : this.length; + + // For native Array objects, we use the native slice function + if (Object.prototype.toString.call(this) === '[object Array]') { + return _slice.call(this, begin, end); + } + + // For array like object we handle it ourselves. + var i, cloned = [], + size, len = this.length; + + // Handle negative value for "begin" + var start = begin || 0; + start = (start >= 0) ? start : Math.max(0, len + start); + + // Handle negative value for "end" + var upTo = (typeof end === 'number') ? Math.min(end, len) : len; + if (end < 0) { + upTo = len + end; + } + + // Actual expected size of the slice + size = upTo - start; + + if (size > 0) { + cloned = new Array(size); + if (this.charAt) { + for (i = 0; i < size; i++) { + cloned[i] = this.charAt(start + i); + } + } else { + for (i = 0; i < size; i++) { + cloned[i] = this[start + i]; + } + } + } + + return cloned; + }; + } +}()); diff --git a/static/bower_components/google-prettify/tests/test_base.js b/static/bower_components/google-prettify/tests/test_base.js new file mode 100644 index 00000000..6590c6a3 --- /dev/null +++ b/static/bower_components/google-prettify/tests/test_base.js @@ -0,0 +1,412 @@ +/** + * @license + * Copyright (C) 2015 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Dynamically load script + * + * @param {string} url JavaScript file + * @param {Function=} opt_func onload callback + */ +function injectJS(url, opt_func) { + var el = document.createElement('script'); + if (typeof opt_func === 'function') { + el.onload = el.onerror = el.onreadystatechange = function () { + if (el && (!el.readyState || /loaded|complete/.test(el.readyState))) { + el.onerror = el.onload = el.onreadystatechange = null; + el = null; + opt_func(); + } + }; + } + el.type = 'text/javascript'; + el.src = url; + document.getElementsByTagName('head')[0].appendChild(el); +} + +/** + * Dynamically load stylesheet + * + * @param {string} url CSS file + */ +function injectCSS(url) { + var el = document.createElement('link'); + el.rel = 'stylesheet'; + el.type = 'text/css'; + el.href = url; + document.getElementsByTagName('head')[0].appendChild(el); +} + +/** + * Perform syntax highlighting and execute tests to verify results. + * + * @param {Object} goldens a mapping from IDs of prettyprinted + * chunks to an abbreviated form of the expected output. See "var goldens" + * in prettify_test.html and prettify_test_2.html for examples. + */ +function runTests(goldens) { + // Regexp literals defined here so that the interpreter doesn't have to + // compile them each time the function containing them is called. + /** @const {RegExp} */ + var ampRe = /&/g; + /** @const {RegExp} */ + var ltRe = //g; + /** @const {RegExp} */ + var quotRe = /\"/g; + /** @const {RegExp} */ + var nbspRe = /\xa0/g; + /** @const {RegExp} */ + var newlineRe = /[\r\n]/g; + /** @const {RegExp} */ + var voidElemsRe = /^(?:br|hr|link|img)$/; + + /** @type {?boolean} */ + var innerHtmlWorks = null; + + /** + * Get timestamp in milliseconds unit. + * + * @return {number} + */ + function now() { + return (Date.now ? Date.now() : (new Date()).getTime()); + } + + /** + * Escapes HTML special characters to HTML. + * + * @param {string} str the HTML to escape + * @return {string} output escaped HTML + */ + function textToHtml(str) { + return str + .replace(ampRe, '&') + .replace(ltRe, '<') + .replace(gtRe, '>'); + } + + /** + * Like {@link textToHtml} but escapes double quotes to be attribute safe. + * + * @param {string} str the HTML to escape + * @return {string} output escaped HTML + */ + function attribToHtml(str) { + return textToHtml(str).replace(quotRe, '"'); + } + + /** + * convert a plain text string to HTML by escaping HTML special chars. + * + * @param {string} plainText + * @return {string} + */ + function htmlEscape(plainText) { + return attribToHtml(plainText).replace(nbspRe, ' '); + } + + /** + * Traverse node and manually build `innerHTML`. + * + * @param {Node} node DOM node + * @param {string} out HTML content + * @param {boolean=} opt_sortAttrs if attributes should be sorted + */ + function normalizedHtml(node, out, opt_sortAttrs) { + switch (node.nodeType) { + case 1: // ELEMENT_NODE + // start-tag + var name = node.tagName.toLowerCase(); + out.push('<', name); + // attributes + var attrs = node.attributes; + var n = attrs.length; + if (n) { + if (opt_sortAttrs) { + // sort attributes by name + var sortedAttrs = []; + for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; } + sortedAttrs.sort(function (a, b) { + return (a.name < b.name) ? -1 : (a.name === b.name ? 0 : 1); + }); + attrs = sortedAttrs; + } + for (var i = 0; i < n; ++i) { + var attr = attrs[i]; + // specified: vs. + if (!attr.specified) { continue; } + out.push(' ', attr.name.toLowerCase(), + '="', attribToHtml(attr.value), '"'); + } + } + out.push('>'); + // children + for (var child = node.firstChild; child; child = child.nextSibling) { + normalizedHtml(child, out, opt_sortAttrs); + } + // end-tag + if (node.firstChild || !voidElemsRe.test(name)) { + out.push('<\/', name, '>'); + } + break; + case 3: // TEXT_NODE + case 4: // CDATA_SECTION_NODE + out.push(textToHtml(node.nodeValue)); + break; + } + } + + /** + * get normalized markup. innerHTML varies enough across browsers that we + * can't use it. + * + * @param {Node} node + * @return {string} + */ + function normalizedInnerHtml(node) { + // manually build innerHTML with sorted attributes + var out = []; + for (var child = node.firstChild; child; child = child.nextSibling) { + normalizedHtml(child, out, true); + } + out = out.join(''); + + // more normalization to work around problems with non-ascii chars in + // regexps in Safari + for (var i = 0; (i = out.indexOf('\xa0')) >= 0;) { + out = out.substring(0, i) + ' ' + out.substring(i + 1); + } + return out.replace(/\r\n?/g, '\n'); + } + + /** + * Are newlines and adjacent spaces significant in the given node's + * `innerHTML`? + * + * @param {Node} node DOM node + * @param {string} content its HTML content + * @return {boolean} is it preformatted + */ + function isPreformatted(node, content) { + // PRE means preformatted, and is a very common case, so don't create + // unnecessary computed style objects. + if ('PRE' === node.tagName) { return true; } + if (!newlineRe.test(content)) { return true; } // Don't care + var whitespace = ''; + // For disconnected nodes, IE has no currentStyle. + if (node.currentStyle) { + whitespace = node.currentStyle.whiteSpace; + } else if (window.getComputedStyle) { + // Firefox makes a best guess if node is disconnected whereas Safari + // returns the empty string. + whitespace = window.getComputedStyle(node, null).whiteSpace; + } + return !whitespace || whitespace === 'pre'; + } + + /** + * Get `innerHTML` of a node + * + * @param {Node} node DOM node + * @return {string} HTML content + */ + function getInnerHtml(node) { + // innerHTML is hopelessly broken in Safari 2.0.4 when the content is + // an HTML description of well formed XML and the containing tag is a PRE + // tag, so we detect that case and emulate innerHTML. + if (null === innerHtmlWorks) { + var testNode = document.createElement('pre'); + testNode.appendChild( + document.createTextNode('\n')); + innerHtmlWorks = !/)[\r\n]+/g, '$1') + .replace(/(?:[\r\n]+[ \t]*)+/g, ' '); + } + return content; + } else { + var out = []; + for (var child = node.firstChild; child; child = child.nextSibling) { + normalizedHtml(child, out); + } + return out.join(''); + } + } + + /** + * number of characters in common from the beginning. + * + * @param {string} a + * @param {string} b + * @return {number} + */ + function commonPrefix(a, b) { + var n = Math.min(a.length, b.length); + var i; + for (i = 0; i < n; ++i) { + if (a.charAt(i) !== b.charAt(i)) { break; } + } + return i; + } + + /** + * number of characters in common at the end up to max. + * + * @param {string} a + * @param {string} b + * @param {number} max + * @return {number} + */ + function commonSuffix(a, b, max) { + var n = Math.min(a.length - max, b.length - max); + var i; + for (i = 0; i < n; ++i) { + if (a.charAt(a.length - i - 1) !== b.charAt(b.length - i - 1)) { break; } + } + return i; + } + + /** + * Replace whitespace characters with printable graphical representations. + * + * @param {string} txt + * @return {string} + */ + function showAllCharacters(txt) { + // space = \xb7, \u02f0, \u2219, \u2423, \u2420 + // htab = \xbb, \u21e5, \u25b8, \u2409 + // newline = \xac, \xb6, \u21b5, \u2424 + // vtab = \u240B + // ffeed = \u240C + return txt + .replace(/ /g, '\xb7') + .replace(/(\r?\n)/g, '\u21b5$1') + .replace(/\t/g, '\u25b8') + .replace(/\v/g, '\u240B') + .replace(/\f/g, '\u240C'); + } + + /** + * Find differences between two texts, and return an HTML report. + * + * @param {string} golden text + * @param {string} actual text + * @return {string} HTML representation + */ + function diffTexts(golden, actual) { + if (true) { + golden = showAllCharacters(golden); + actual = showAllCharacters(actual); + } + var npre = commonPrefix(golden, actual); + var npost = commonSuffix(golden, actual, npre); + return ( + '
Golden<\/th>' + + htmlEscape(golden.substring(0, npre)) + + '»' + + htmlEscape(golden.substring(npre, golden.length - npost)) + + '<\/span>«' + + htmlEscape(golden.substring(golden.length - npost)) + + '<\/code><\/td><\/tr>
Actual<\/th>' + + htmlEscape(actual.substring(0, npre)) + + '»' + + htmlEscape(actual.substring(npre, actual.length - npost)) + + '<\/span>«' + + htmlEscape(actual.substring(actual.length - npost)) + + '<\/code><\/td><\/tr><\/table>' + ); + } + + /** + * Convert golden from abbreviated form back to original text + * + * @param {string} golden + * @return {string} + */ + function expandGolden(golden) { + return golden.replace(/`([A-Z]{3})/g, function (_, lbl) { + // convert abbreviations that start with ` + return (lbl === 'END' ? '<\/span>' : + ''); + }) + // line numbers + .replace(/`#(?![0-9])/, '
  • ') + .replace(/`#([0-9])/g, '<\/li>
  • '); + } + + /** + * Compare tests results against expected outcomes. + * + * @param {Object} goldens + * @return {{html: Array, pass: integer, fail: integer}} HTML report + */ + function runComparison(goldens) { + var out = []; + var npass = 0; + var nfail = 0; + for (var id in goldens) { + // compare actual against expexted + var golden = expandGolden(goldens[id]); + var actual = normalizedInnerHtml(document.getElementById(id)); + var diff = golden !== actual; + out.push('
    ' + (diff ? 'FAIL' : 'PASS') + + ': ' + id + '<\/a><\/div>'); + if (diff) { + ++nfail; + // write out difference + out.push( + diffTexts(golden, actual).replace(/<br>/g, '<br>\n')); + } else { + ++npass; + } + } + out.unshift( + '

    \u2714 ' + npass + ' passing<\/p>', + '

    \u2718 ' + nfail + ' failing<\/p>'); + out.push('

    Tests ' + + (nfail ? 'failed' : 'passed') + '<\/h3>'); + return { + html: out, + pass: npass, + fail: nfail + }; + } + + // for more accurate timing, no continuation. + // This file must be loaded after prettify.js for this to work. + window.PR_SHOULD_USE_CONTINUATION = false; + + // time syntax highlighting + var t = now(); // tic + PR.prettyPrint(function () { + t = now() - t; // toc + + // verify results against golden and write HTML report + var report = runComparison(goldens); + document.title += (' \u2014 ' + (report.fail ? 'FAIL' : 'PASS')); + report.html.unshift('

    Took ' + t + ' ms<\/p>'); + document.getElementById('report').innerHTML = report.html.join('\n'); + }); +} diff --git a/static/bower_components/google-prettify/tests/test_in_node b/static/bower_components/google-prettify/tests/test_in_node new file mode 100644 index 00000000..1cd5c625 --- /dev/null +++ b/static/bower_components/google-prettify/tests/test_in_node @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +var path = require('path'); +var Browser = require('zombie'); +var htmlToText = require('html-to-text'); + +var optsZombie = { + debug: false, + silent: false, + waitDuration: '10s', + runScripts: true +}; +var optsHTT = { + wordwrap: 80, // process.stdout.columns + tables: true, + ignoreHref: true, + preserveNewlines: true, + singleNewLineParagraphs: true +}; + +var jobs = process.argv.slice(2); +var returnCode = 0; +var browser = null; + +// start processing pages +startBrowser(); + +function startBrowser() { + // close any previous browser sessions + if (browser) { + //browser.window.close(); + browser.destroy(); + } + + // next URL + var url = jobs.shift(); + if (url === undefined) { + console.log('>> Complete'); + process.exit(returnCode); + return; + } else if (!/^(?:https?|ftp):/.test(url)) { + // rewrite local path as a file:// URL + url = encodeURI('file://' + path.resolve(url).replace(/\\/g, '/')); + } + + // load page + console.log('>> Loading %s ...', url); + browser = new Browser(optsZombie); + if (optsZombie.debug) { browser.debug(); } + browser.visit(url).then(checkCb).catch(problemCb); +} + +function problemCb(err) { + // log error, and process next page + console.warn('>> ' + err); + returnCode = 1; + startBrowser(); +} + +function checkCb() { + var done = false; + + // check for errors + function onProb(err) { + console.warn('>> ' + err); + returnCode = 1; + done = true; + } + (browser.errors || []).forEach(onProb); + (browser.document.errors || []).forEach(onProb); + + // retrieve and log results + var report = browser.html('#report'); + if (report && report.length) { + done = true; + //console.log(browser.text('#report')); + console.log(htmlToText.fromString( + // HACK: replace

    tags with

    + // https://github.com/werk85/node-html-to-text/issues/71 + report.replace(/(<\/?)div/ig, '$1p'), optsHTT)); + } + + // process next page if done, otherwise wait for page to complete loading + if (done) { + startBrowser(); + } else { + browser.wait().then(checkCb).catch(problemCb); + } +} diff --git a/static/bower_components/google-prettify/tests/test_modules.css b/static/bower_components/google-prettify/tests/test_modules.css new file mode 100644 index 00000000..ecc8141e --- /dev/null +++ b/static/bower_components/google-prettify/tests/test_modules.css @@ -0,0 +1,90 @@ +/* tests table */ +table { + border-collapse: collapse; + border-spacing: 0; +} +table, th, td { + border: 1px solid black; +} +td, th { + padding: 2px; +} +tr { + vertical-align: top; +} +th { + background-color: #FFD; +} +td { + font-family: monospace; +} + +/* tests */ +.input, .golden, .actual, .decorations { + white-space: pre; +} + +/* results */ +.ok { + background-color: #DFD; +} +.failure, .error { + background-color: #FDD; +} +.ok:after { + color: green; + content: '\a[PASS]'; + font-weight: bold; +} +.failure:after { + color: red; + content: '\a[FAIL]'; + font-weight: bold; +} +.error:after { + color: #AF7817; + content: '\a[ERROR]'; + font-weight: bold; +} + +/* used in extractSourceSpans_test.html */ +.break { + padding-left: 2px; + border-right-style: dotted !important; +} +.odd, .even { + border-style: solid; + border-width: 1px; +} +.even { + background-color: #fff; + border-color: #888; +} +.odd { + background-color: #ddd; + border-color: #000; +} + +/* log */ +#report { + margin-left: 1em; +} +.pass { + color: green; +} +.fail, .err { + color: red; +} + +/* diff tables */ +table.diff { + table-layout: fixed; + max-width: 100%; +} +.diff th { + width: 50px; +} +.diff td { + white-space: pre-wrap; + word-wrap: break-word; +} diff --git a/static/bower_components/google-prettify/tests/test_styles.css b/static/bower_components/google-prettify/tests/test_styles.css new file mode 100644 index 00000000..47e4b369 --- /dev/null +++ b/static/bower_components/google-prettify/tests/test_styles.css @@ -0,0 +1,61 @@ +/** + * @license + * Copyright (C) 2015 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* used by test_base.js */ +#report { + margin-left: 1em; +} +.pass { + color: green; +} +.fail { + color: red; +} +.mismatch { + background-color: #faa; + font-weight: bold; +} + +/* diff tables */ +table.diff { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + width: 100%; +} +.diff th, .diff td { + border: 1px solid black; +} +.diff th { + background-color: #FFD; + width: 50px; +} +.diff td { + white-space: pre-wrap; + word-wrap: break-word; +} + +/* used in prettify_test.html issue 22 */ +.annot { + background-color: #eef; + border: 1px dotted #88f; + margin: 2px 2px 2px 3em; + padding: 0 2px 0 2px; +} +.nocode { + background-color: #f8f8f8; +} diff --git a/static/bower_components/google-prettify/tools/closure-compiler/amd-externs.js b/static/bower_components/google-prettify/tools/closure-compiler/amd-externs.js new file mode 100644 index 00000000..512d05aa --- /dev/null +++ b/static/bower_components/google-prettify/tools/closure-compiler/amd-externs.js @@ -0,0 +1,8 @@ +/** + * @param {string} id + * @param {Array.} dependencies + * @param {Function} factory + */ +function define(id, dependencies, factory) {} +/** @type {*} */ +define.amd; diff --git a/static/bower_components/google-prettify/tools/closure-compiler/console-externs.js b/static/bower_components/google-prettify/tools/closure-compiler/console-externs.js new file mode 100644 index 00000000..58f43aa0 --- /dev/null +++ b/static/bower_components/google-prettify/tools/closure-compiler/console-externs.js @@ -0,0 +1,5 @@ +var console = {}; +/** + * @param {string} message + */ +console.warn = function (message, var_args) {}; diff --git a/static/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..7d936048 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-a11y-keys-behavior/.gitignore b/static/bower_components/iron-a11y-keys-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-a11y-keys-behavior/.travis.yml b/static/bower_components/iron-a11y-keys-behavior/.travis.yml new file mode 100644 index 00000000..26583689 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + XJ31r/5USVGZRtziCLfr8qM1pJKKQMUN1AeYbCdDFEc6i293WxZneR8PwUVhvyptu+qdyd28uy24sH+Ob7kShFbZTUaif5P4gqHPekrYToI0aHyhmVX7C1LmT7nEL8IcT62NhUwh+83eHTAdodkXgnhfQhPn9FHV24Dkvwm8OKhhzEhtTgUGVuGX9j9FyNV6n1+gf4X3Zq63+NkEUh5vpolpue4W7ul2u0sf4l0fzg9pvKPCmywUwX2i7wwAEf3CJghMu2xup54OzXTEkjjSou/ebt1ZnxaUNV1+dblfUne0v9wTD0dPF8H3DwgewwzcZSbOZmj6lFVHRzmLzWcRJOEKdDrpJkjpg7HIhNPGCKDUcNylekafqi7ezhzrkzFwkh6JCdAj7He4mv/X/OUDNjNCClB7Ms/+WPZwtACvIcR2/pvgZ+1PHbIkbIInyAe6iVMMR0oUecei/X+d04DH7iW7rrODVEu6qdibsJki0R0lR2184rrDO9pGek4rLu9sUQBDNgEM6ZLEXXByO8lpG4xStRdkg0/uR5i1/Q8kux4gIJ9yV8WLANkS8NVlmuJgIi6kbh5n4VVKaihGhbBUuTt2aL7fLnH2I6YRwjyNI9TOIRxwk4afppFYUuq6Fv+nfPcdqDOi5Y2AOXLJ3Yvco0+H57nXe/Ny29gFVW4Kftg= + - secure: >- + huEi/Ja2qnLatb7EJ4Jdc/XAeKphhdH6G+px7/XZY33oDawjStxakx0N/MpT0LPE1BdEWOYTzc17CzKv9R2L3ybWksqXyv/Zs+1NMTmpEAS/54Sk4E61aE3nrV5cfS2R8dBGbJhFoH1W237BDsbw9A4XhsTvhxlIsluWsZgeurbleGg+DgAmg8KlHGRddsfBFgXEk+Khhj6KPsbgPUiWhXpdnXKBPJKF7fJEAbsGR4aFK2eFbYd1OAgJg2Aye0n93IHe+SsxcKRUYteg6UK9V8fk7q5PBlvaodly4F3gH82l+zbnhcTFVW+qN0s6xDBTQzsQ55eTlO3pEezIo3u/1Lq41Yoe6scEkLs63pSYqoB3kakbhLMDJAen080ggdNg9evqvgyznKFYM7sqEcPu+KxHd043DyLTTW11y9lZ/hV3xSTdG4W8mV7+ILbIi54wMaYAcWSGMTOVM0JC/KDoVjze3tzDmfcZwiutLPBFgfrkfJQf3fyqcgvhoLKtHaWHI+76XDsXwEOS2Q5OX9oDtjoZaZ7r8Gp4dqwaKYceOrlsLbaZOLh5nJ4WnDbf4AqZkeM22QWWIfUN6aK+yhsDpQ/d+xJ+/WFENDADrMEKp0Lf3CkzAAcpHp3u65B9qsqweD5/5Je9t0GsA/NvK2xCasnNz6inYy4tAx9i4NWPcOY= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md b/static/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-a11y-keys-behavior/README.md b/static/bower_components/iron-a11y-keys-behavior/README.md new file mode 100644 index 00000000..b0949871 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/README.md @@ -0,0 +1,58 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-keys-behavior)_ + + +##Polymer.IronA11yKeysBehavior + +`Polymer.IronA11yKeysBehavior` provides a normalized interface for processing +keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). +The element takes care of browser differences with respect to Keyboard events +and uses an expressive syntax to filter key presses. + +Use the `keyBindings` prototype property to express what combination of keys +will trigger the callback. A key binding has the format +`"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or +`"KEY:EVENT": "callback"` are valid as well). Some examples: + +```javascript + keyBindings: { + 'space': '_onKeydown', // same as 'space:keydown' + 'shift+tab': '_onKeydown', + 'enter:keypress': '_onKeypress', + 'esc:keyup': '_onKeyup' + } +``` + +The callback will receive with an event containing the following information in `event.detail`: + +```javascript + _onKeydown: function(event) { + console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab" + console.log(event.detail.key); // KEY only, e.g. "tab" + console.log(event.detail.event); // EVENT, e.g. "keydown" + console.log(event.detail.keyboardEvent); // the original KeyboardEvent + } +``` + +Use the `keyEventTarget` attribute to set up event handlers on a specific +node. + +See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html) +for an example. + + diff --git a/static/bower_components/iron-a11y-keys-behavior/bower.json b/static/bower_components/iron-a11y-keys-behavior/bower.json new file mode 100644 index 00000000..9ad8c923 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-a11y-keys-behavior", + "version": "1.1.9", + "description": "A behavior that enables keybindings for greater a11y.", + "keywords": [ + "web-components", + "web-component", + "polymer", + "a11y", + "input" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git" + }, + "main": "iron-a11y-keys-behavior.html", + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-a11y-keys-behavior/demo/index.html b/static/bower_components/iron-a11y-keys-behavior/demo/index.html new file mode 100644 index 00000000..2c3fec7c --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/demo/index.html @@ -0,0 +1,24 @@ + + + + + + Iron A11y Keys Behavior demo + + + + + +

    + +
    + + diff --git a/static/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html b/static/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html new file mode 100644 index 00000000..5914bb99 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html @@ -0,0 +1,105 @@ + + + + + + + + + + + diff --git a/static/bower_components/iron-a11y-keys-behavior/index.html b/static/bower_components/iron-a11y-keys-behavior/index.html new file mode 100644 index 00000000..c53ba6cf --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/index.html @@ -0,0 +1,24 @@ + + + + + + iron-a11y-keys-behavior + + + + + + + + + + diff --git a/static/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html b/static/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html new file mode 100644 index 00000000..840d3571 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html @@ -0,0 +1,496 @@ + + + + + diff --git a/static/bower_components/iron-a11y-keys-behavior/test/basic-test.html b/static/bower_components/iron-a11y-keys-behavior/test/basic-test.html new file mode 100644 index 00000000..d6947aca --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/test/basic-test.html @@ -0,0 +1,445 @@ + + + + + + + iron-a11y-keys + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-a11y-keys-behavior/test/index.html b/static/bower_components/iron-a11y-keys-behavior/test/index.html new file mode 100644 index 00000000..d00850a0 --- /dev/null +++ b/static/bower_components/iron-a11y-keys-behavior/test/index.html @@ -0,0 +1,28 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..1cc85c0c --- /dev/null +++ b/static/bower_components/iron-behaviors/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-behaviors/.gitignore b/static/bower_components/iron-behaviors/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-behaviors/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-behaviors/.travis.yml b/static/bower_components/iron-behaviors/.travis.yml new file mode 100644 index 00000000..0c05730a --- /dev/null +++ b/static/bower_components/iron-behaviors/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: H49pcRc5C6G+ti/ehtT74GZdsUsM/xCvEVJBmKq8rpck7s18R6BbH37RkF2XgYfO4rVa1Bl4KU4Wf5S6aIDYzdaq/phGtFQ04NmDYGbmBhRjwfgxlW4dJ7mkXqXCvNZkxJtAJpgzgVG+xu/I6GsO1Lp4VjGENvVYSsrkGIlSA34= + - secure: Zq+hvOlL1RmTtMfAtO3bxqYnB7X6MY199cVCKo2J/EbsMvOHII1JvEU1+s2/UG9tgoiXkd7N2OfFOivlbQ75BDIwtvkq32KZNrUEC6vRGhbMBc8JCKkdFB/XHh1mNhQcn6Js656PhZIj2WteZYMSGYDUj7KcBBMacRZQKWuB0OU= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-behaviors/CONTRIBUTING.md b/static/bower_components/iron-behaviors/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-behaviors/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-behaviors/README.md b/static/bower_components/iron-behaviors/README.md new file mode 100644 index 00000000..0a0629ec --- /dev/null +++ b/static/bower_components/iron-behaviors/README.md @@ -0,0 +1,22 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-behaviors) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-behaviors)_ + + + + + diff --git a/static/bower_components/iron-behaviors/bower.json b/static/bower_components/iron-behaviors/bower.json new file mode 100644 index 00000000..fd877fe3 --- /dev/null +++ b/static/bower_components/iron-behaviors/bower.json @@ -0,0 +1,32 @@ +{ + "name": "iron-behaviors", + "version": "1.0.17", + "description": "Provides a set of behaviors for the iron elements", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-behaviors.git" + }, + "main": [ + "iron-button-state.html", + "iron-control-state.html" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "paper-input": "polymerelements/paper-input#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-behaviors/demo/index.html b/static/bower_components/iron-behaviors/demo/index.html new file mode 100644 index 00000000..51fe2d64 --- /dev/null +++ b/static/bower_components/iron-behaviors/demo/index.html @@ -0,0 +1,48 @@ + + + + + + + + + + simple-button + + + + + + + + + +
    +

    Normal

    + + Hello World + +

    Toggles

    + + Hello World + +

    Disabled

    + + Hello World +
    + + diff --git a/static/bower_components/iron-behaviors/demo/simple-button.html b/static/bower_components/iron-behaviors/demo/simple-button.html new file mode 100644 index 00000000..bfa6a2b3 --- /dev/null +++ b/static/bower_components/iron-behaviors/demo/simple-button.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/index.html b/static/bower_components/iron-behaviors/index.html new file mode 100644 index 00000000..220deb00 --- /dev/null +++ b/static/bower_components/iron-behaviors/index.html @@ -0,0 +1,27 @@ + + + + + + Iron Behaviors + + + + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/iron-button-state.html b/static/bower_components/iron-behaviors/iron-button-state.html new file mode 100644 index 00000000..8114e2dd --- /dev/null +++ b/static/bower_components/iron-behaviors/iron-button-state.html @@ -0,0 +1,228 @@ + + + + + + + diff --git a/static/bower_components/iron-behaviors/iron-control-state.html b/static/bower_components/iron-behaviors/iron-control-state.html new file mode 100644 index 00000000..f34d0579 --- /dev/null +++ b/static/bower_components/iron-behaviors/iron-control-state.html @@ -0,0 +1,110 @@ + + + + + diff --git a/static/bower_components/iron-behaviors/test/active-state.html b/static/bower_components/iron-behaviors/test/active-state.html new file mode 100644 index 00000000..8735aafb --- /dev/null +++ b/static/bower_components/iron-behaviors/test/active-state.html @@ -0,0 +1,280 @@ + + + + + active-state + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/test/disabled-state.html b/static/bower_components/iron-behaviors/test/disabled-state.html new file mode 100644 index 00000000..b342cfd1 --- /dev/null +++ b/static/bower_components/iron-behaviors/test/disabled-state.html @@ -0,0 +1,82 @@ + + + + + disabled-state + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/test/focused-state.html b/static/bower_components/iron-behaviors/test/focused-state.html new file mode 100644 index 00000000..3b75c704 --- /dev/null +++ b/static/bower_components/iron-behaviors/test/focused-state.html @@ -0,0 +1,161 @@ + + + + + focused-state + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/test/index.html b/static/bower_components/iron-behaviors/test/index.html new file mode 100644 index 00000000..39e7f544 --- /dev/null +++ b/static/bower_components/iron-behaviors/test/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/static/bower_components/iron-behaviors/test/test-elements.html b/static/bower_components/iron-behaviors/test/test-elements.html new file mode 100644 index 00000000..92f6da88 --- /dev/null +++ b/static/bower_components/iron-behaviors/test/test-elements.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..2d520b47 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-checked-element-behavior/.gitignore b/static/bower_components/iron-checked-element-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-checked-element-behavior/.travis.yml b/static/bower_components/iron-checked-element-behavior/.travis.yml new file mode 100644 index 00000000..1f61d970 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: zj5WTkJrZAy1QK0j65jHEsHluT4B/PZl0u3iVEWnyd4CSUbHh3rS5NytZTA8wZ63DYnUcrdbhPeIQI3UKaVBUM2MO/K4MwsC2YTRpifpCLbC+wlRV9WRZNZ9CJ3hu6leshOBWHzZucUWAcKtyQRm66rAU+90ZaJcrBPC/xtgPG1n/Bm2aygr5IA36vJy80Zpwk1+yFmb08eu7jpzNVhcFor+VX0gBW3rxeX0kvzhHGn0bTLxKztNB56Oe+bzx6vU8ACjBcSylouOtPJVIk/iIh7AIDHDcpoZGzmwtVnwAV2mJQtu3V8hQ2kE8eXpDloBGID+AUfTF3YSOVQo34I1yv4T+FlB7uxWrgJo80X5IRXUe15+OoXqraZ25v736RPdTWPjV2b6cWHqdOa45wODkDY0KZ9SrmwZibF3vcfVOG21llW2jF/HC5FvDIiM7gv1ro5jsFbEIwv7ligh0KKa+TOZBphL4sEtMrpxR/zXLqBLXUbKL54A+AefHelxjDIqT3oKQylesrGZ58fEF7Fx5xDSYGJwhIEwTLsEQWIWw8sWB34yRtDBIPocqh8nNZ9pJBOdhK3oC5KK44IQnE44YrIzLRRinHzRVoywpUb5OJDxxSSvOwcqmTYbkFmRJMzfJCEj/EtYsEokmSFv8zIRRDetvenBTGouNK/VsU9xQpA= + - secure: Q3xN3fRvTQuy/HKlkYFFnVrFo01r6Q8zgzHHK8yKNKio9T/BM0+iIMYP8mRY+qvCQxCboXuUawG6gsxxT2Zn/p7SgNZ+UHq7DcLmocqxmECdGfqra6Hy9Y7BZVYPWlWIADkNUjI0RfOz69/3o/TAFlt4Cnw3BX3ip0o0Rri5/jzj0Nn+xSF+onyMnpH2gQvUE77MHvCuWTPki3R86Bz8RRzbTwKYwVa0oVca7jzdPtOjqzsnz8k9X0HVwQEpHGjqgTP3lg8EotON0rac/ayWs3J3bk9ye5AfvdTCYcZnDcz8POAN6FeC2Xey7oqQO4N8vFagru88mC3AmN67ZYqwI0fmDEYre20lnXFAFBFzsiu4FvKMgFYi/C5tG5ngSR5XcXwLskax82Un7yYYRzVbyhFSxxWZCqIC4cJ5d+E0Wex4eEYDwAlZ9AFP/hRJ2qrBVUbzXeGVMkHlg4qtdUIzHRkMUmjvEWVzTvk0Xa2wD+S0mYPcBwQcscoZy9zqdJM4hfbG9IGi02/DyrTOL3IuNH8WHHvGWS4ajDhSRkGCV4I5VtGKQ/Y3RA/pU6AaI7tVcDhbxOyIPKuOXO6PWuZOiJhhPQ/kceMkUXeh0TmsDtSBpe5OKCnjsdSn02lTT5yYf4nlVIVczP9p6zBerXorzZk1/S3CRBtqYZPgRrefbCw= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-checked-element-behavior/CONTRIBUTING.md b/static/bower_components/iron-checked-element-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-checked-element-behavior/README.md b/static/bower_components/iron-checked-element-behavior/README.md new file mode 100644 index 00000000..c65e58f0 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/README.md @@ -0,0 +1,27 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-checked-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-checked-element-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-checked-element-behavior)_ + + +##Polymer.IronCheckedElementBehavior + +Use `Polymer.IronCheckedElementBehavior` to implement a custom element +that has a `checked` property, which can be used for validation if the +element is also `required`. Element instances implementing this behavior +will also be registered for use in an `iron-form` element. + + diff --git a/static/bower_components/iron-checked-element-behavior/bower.json b/static/bower_components/iron-checked-element-behavior/bower.json new file mode 100644 index 00000000..f645217c --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/bower.json @@ -0,0 +1,34 @@ +{ + "name": "iron-checked-element-behavior", + "version": "1.0.5", + "description": "Implements an element that has a checked attribute and can be added to a form", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": "iron-checked-element-behavior.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0", + "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-checked-element-behavior/demo/index.html b/static/bower_components/iron-checked-element-behavior/demo/index.html new file mode 100644 index 00000000..788a64f0 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/demo/index.html @@ -0,0 +1,39 @@ + + + + + + + + + iron-checked-element-behavior demo + + + + + + +
    +
    +

    Not required

    +
    + +
    +
    +
    +

    Required

    +
    + +
    +
    +
    + + diff --git a/static/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html b/static/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html new file mode 100644 index 00000000..24c5c125 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/index.html b/static/bower_components/iron-checked-element-behavior/index.html new file mode 100644 index 00000000..1975dc5a --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-checked-element-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html b/static/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html new file mode 100644 index 00000000..3ed2ffea --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html @@ -0,0 +1,120 @@ + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/test/basic.html b/static/bower_components/iron-checked-element-behavior/test/basic.html new file mode 100644 index 00000000..4c13dd8c --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/test/basic.html @@ -0,0 +1,152 @@ + + + + + + iron-checked-element-behavior basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/test/index.html b/static/bower_components/iron-checked-element-behavior/test/index.html new file mode 100644 index 00000000..1ddeca33 --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/test/index.html @@ -0,0 +1,31 @@ + + + iron-checked-element-behavior tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-checked-element-behavior/test/simple-checkbox.html b/static/bower_components/iron-checked-element-behavior/test/simple-checkbox.html new file mode 100644 index 00000000..95228fae --- /dev/null +++ b/static/bower_components/iron-checked-element-behavior/test/simple-checkbox.html @@ -0,0 +1,26 @@ + + + + + + diff --git a/static/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..544b51e7 --- /dev/null +++ b/static/bower_components/iron-collapse/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-collapse/.gitignore b/static/bower_components/iron-collapse/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-collapse/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-collapse/.travis.yml b/static/bower_components/iron-collapse/.travis.yml new file mode 100644 index 00000000..b9efff23 --- /dev/null +++ b/static/bower_components/iron-collapse/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + UKNKHUjbp8O3UiVmnCmmprLR573ZXak9znhIvy0Uvxpkga7DFvfKvYRFCXQI/eV2I9YOI1FgVjlPfH8Id1NOWdMLdNjAI7G5p4FWisgu36kfat853HDYemoxx0C9nqPwakPGCJ9duL1w0dwje2sEHndk1cdwkU3TMsgkawdOJbU= + - secure: >- + cWudj1yh2mzialubEqhSHBG/CPLtI9ZeUPaI1+N3hiPzvuxqGaEbkpzEmlZrdAfuy9axCQStg88dgKRSv+TdMbcDKpzQqfClxTf9baKgrSgzVoMReY0kjHumCJz1tIVIz74ggp/gdQVFyS9CiA82pHTnxDl/drwPIHa2S8ST02U= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-collapse/CONTRIBUTING.md b/static/bower_components/iron-collapse/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-collapse/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-collapse/README.md b/static/bower_components/iron-collapse/README.md new file mode 100644 index 00000000..4fee0505 --- /dev/null +++ b/static/bower_components/iron-collapse/README.md @@ -0,0 +1,66 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-collapse.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-collapse) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-collapse)_ + + +##<iron-collapse> + +`iron-collapse` creates a collapsible block of content. By default, the content +will be collapsed. Use `opened` or `toggle()` to show/hide the content. + +```html + + + +
    Content goes here...
    +
    + +... + +toggle: function() { + this.$.collapse.toggle(); +} +``` + +`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide +the content. So avoid putting padding/margin/border on the collapsible directly, +and instead put a div inside and style that. + +```html + + + +
    +
    Content goes here...
    +
    +
    +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-collapse-transition-duration` | Animation transition duration | `300ms` | + + diff --git a/static/bower_components/iron-collapse/bower.json b/static/bower_components/iron-collapse/bower.json new file mode 100644 index 00000000..a2e6b279 --- /dev/null +++ b/static/bower_components/iron-collapse/bower.json @@ -0,0 +1,34 @@ +{ + "name": "iron-collapse", + "version": "1.3.0", + "description": "Provides a collapsable container", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "container" + ], + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/PolymerElements/iron-collapse" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-collapse", + "ignore": [], + "dependencies": { + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "polymer": "Polymer/polymer#^1.5.0" + }, + "devDependencies": { + "web-component-tester": "^4.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-collapse.html" +} diff --git a/static/bower_components/iron-collapse/demo/index.html b/static/bower_components/iron-collapse/demo/index.html new file mode 100644 index 00000000..79a873c3 --- /dev/null +++ b/static/bower_components/iron-collapse/demo/index.html @@ -0,0 +1,104 @@ + + + + + + + iron-collapse demo + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/hero.svg b/static/bower_components/iron-collapse/hero.svg new file mode 100644 index 00000000..408ae52e --- /dev/null +++ b/static/bower_components/iron-collapse/hero.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/index.html b/static/bower_components/iron-collapse/index.html new file mode 100644 index 00000000..b5d20077 --- /dev/null +++ b/static/bower_components/iron-collapse/index.html @@ -0,0 +1,31 @@ + + + + + + + + + + iron-collapse + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/iron-collapse.html b/static/bower_components/iron-collapse/iron-collapse.html new file mode 100644 index 00000000..75a79e70 --- /dev/null +++ b/static/bower_components/iron-collapse/iron-collapse.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/a11y.html b/static/bower_components/iron-collapse/test/a11y.html new file mode 100644 index 00000000..ddd3472b --- /dev/null +++ b/static/bower_components/iron-collapse/test/a11y.html @@ -0,0 +1,74 @@ + + + + + + + iron-collapse-a11y + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/basic.html b/static/bower_components/iron-collapse/test/basic.html new file mode 100644 index 00000000..c47686cc --- /dev/null +++ b/static/bower_components/iron-collapse/test/basic.html @@ -0,0 +1,199 @@ + + + + + + + iron-collapse-basic + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/flex.html b/static/bower_components/iron-collapse/test/flex.html new file mode 100644 index 00000000..6b109259 --- /dev/null +++ b/static/bower_components/iron-collapse/test/flex.html @@ -0,0 +1,152 @@ + + + + + + + iron-collapse-flex + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/horizontal.html b/static/bower_components/iron-collapse/test/horizontal.html new file mode 100644 index 00000000..61121b69 --- /dev/null +++ b/static/bower_components/iron-collapse/test/horizontal.html @@ -0,0 +1,97 @@ + + + + + + iron-collapse-horizontal + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/index.html b/static/bower_components/iron-collapse/test/index.html new file mode 100644 index 00000000..5ccf5324 --- /dev/null +++ b/static/bower_components/iron-collapse/test/index.html @@ -0,0 +1,35 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-collapse/test/nested.html b/static/bower_components/iron-collapse/test/nested.html new file mode 100644 index 00000000..ecfbc5ef --- /dev/null +++ b/static/bower_components/iron-collapse/test/nested.html @@ -0,0 +1,131 @@ + + + + + + iron-collapse-nested + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..0bd8a806 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-fit-behavior/.gitignore b/static/bower_components/iron-fit-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-fit-behavior/.travis.yml b/static/bower_components/iron-fit-behavior/.travis.yml new file mode 100644 index 00000000..04f7693a --- /dev/null +++ b/static/bower_components/iron-fit-behavior/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + L4lSnuQZDY+YcXYzBZSRKjJJ1rZf18Lc/8YDgQPfkMkAItrRHGR8vblBoKiPAmtvgNxztcpZxAXTiDy1vAeVv54QnX9b1JsuOs7rrQxB4BS04Dj7LdT6DDu1p/V09MJBN11lzLVxgpxljbumwGWE4gfpDl2+rjbBt7cRV5VkVnE= + - secure: >- + H7dHZ9FQvJszK2UMNZJiZmzOPET3muO/XvlkUc1x3KcUlV5/tD/404V05XfFMowH7DavHFYleZkb89deYjq9PHncO9c4bp4SHD7HKN4FaGyhzfpXjg66v3dZH/OcERjaas337uUE2jo/x1jCq4HJCz2bMVh+bvd4du1C/2OWarc= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-fit-behavior/CONTRIBUTING.md b/static/bower_components/iron-fit-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-fit-behavior/README.md b/static/bower_components/iron-fit-behavior/README.md new file mode 100644 index 00000000..8dbc78e3 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/README.md @@ -0,0 +1,57 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-fit-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-fit-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-fit-behavior)_ + + +##Polymer.IronFitBehavior + +`Polymer.IronFitBehavior` fits an element in another element using `max-height` and `max-width`, and +optionally centers it in the window or another element. + +The element will only be sized and/or positioned if it has not already been sized and/or positioned +by CSS. + +| CSS properties | Action | +| --- | --- | +| `position` set | Element is not centered horizontally or vertically | +| `top` or `bottom` set | Element is not vertically centered | +| `left` or `right` set | Element is not horizontally centered | +| `max-height` set | Element respects `max-height` | +| `max-width` set | Element respects `max-width` | + +`Polymer.IronFitBehavior` can position an element into another element using +`verticalAlign` and `horizontalAlign`. This will override the element's css position. + +```html +
    + + Positioned into the container + +
    +``` + +Use `noOverlap` to position the element around another element without overlapping it. + +```html +
    + + Positioned around the container + +
    +``` + + diff --git a/static/bower_components/iron-fit-behavior/bower.json b/static/bower_components/iron-fit-behavior/bower.json new file mode 100644 index 00000000..b120cf48 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-fit-behavior", + "version": "1.2.6", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Fits an element inside another element", + "private": true, + "main": "iron-fit-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-fit-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-fit-behavior/demo/index.html b/static/bower_components/iron-fit-behavior/demo/index.html new file mode 100644 index 00000000..2c716e06 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/demo/index.html @@ -0,0 +1,166 @@ + + + + + + + iron-fit-behavior demo + + + + + + + + + + + + + + + +

    + An element with IronFitBehavior can be centered in + fitInto or positioned around a positionTarget +

    + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/demo/simple-fit.html b/static/bower_components/iron-fit-behavior/demo/simple-fit.html new file mode 100644 index 00000000..2dc83fb7 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/demo/simple-fit.html @@ -0,0 +1,41 @@ + + + + + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/index.html b/static/bower_components/iron-fit-behavior/index.html new file mode 100644 index 00000000..5ffa7d61 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-fit-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/iron-fit-behavior.html b/static/bower_components/iron-fit-behavior/iron-fit-behavior.html new file mode 100644 index 00000000..e23d4f32 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/iron-fit-behavior.html @@ -0,0 +1,612 @@ + + + + + diff --git a/static/bower_components/iron-fit-behavior/test/index.html b/static/bower_components/iron-fit-behavior/test/index.html new file mode 100644 index 00000000..fd047ea3 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/test/index.html @@ -0,0 +1,31 @@ + + + iron-fit-behavior tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/test/iron-fit-behavior.html b/static/bower_components/iron-fit-behavior/test/iron-fit-behavior.html new file mode 100644 index 00000000..0957ccce --- /dev/null +++ b/static/bower_components/iron-fit-behavior/test/iron-fit-behavior.html @@ -0,0 +1,1029 @@ + + + + + + iron-fit-behavior tests + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-fit-behavior/test/test-fit.html b/static/bower_components/iron-fit-behavior/test/test-fit.html new file mode 100644 index 00000000..80626087 --- /dev/null +++ b/static/bower_components/iron-fit-behavior/test/test-fit.html @@ -0,0 +1,41 @@ + + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..b79eca40 --- /dev/null +++ b/static/bower_components/iron-flex-layout/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-flex-layout/.gitignore b/static/bower_components/iron-flex-layout/.gitignore new file mode 100644 index 00000000..1eb1fa5e --- /dev/null +++ b/static/bower_components/iron-flex-layout/.gitignore @@ -0,0 +1,2 @@ +bower_components + diff --git a/static/bower_components/iron-flex-layout/.travis.yml b/static/bower_components/iron-flex-layout/.travis.yml new file mode 100644 index 00000000..6bd14cba --- /dev/null +++ b/static/bower_components/iron-flex-layout/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + idlCNYtNQ7rLGCSl2NuZ++XZEwofpojkakXhL8m34pCX1ZwhGRprHsvNE7h7tz8SIV+mUjuUT8DaM7rlgZ+bLyw/Hq7G15DdmU5puUsCVibFFBBEhh82lxkdK/Rlfo+ytt0MFsbTJljEoqTSbnL0fSeC0cN/7wf6yEQs/+mTR0I= + - secure: >- + i/rAHa9rxszmbE+RbQ2b7ln6OYzrcoUssdPk36lNeJk/B1HjBS9cfg1PMwSAw+t6yvAN3I0fbOOl4dlGB1K5T4kAtmcAcC3fbptJL08IvK9K15pz/rMEzIBWLXj9oVJliwBZR2GFH+5zv6aFdEwQxh1leBnHQwmKgl24QX8XGO4= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-flex-layout/CONTRIBUTING.md b/static/bower_components/iron-flex-layout/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-flex-layout/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-flex-layout/README.md b/static/bower_components/iron-flex-layout/README.md new file mode 100644 index 00000000..db013a23 --- /dev/null +++ b/static/bower_components/iron-flex-layout/README.md @@ -0,0 +1,39 @@ +[![Build status](https://travis-ci.org/PolymerElements/iron-flex-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-flex-layout) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/iron-flex-layout) + +##<iron-flex-layout> + +The `` component provides simple ways to use +[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes), +also known as flexbox. This component provides two different ways to use flexbox: + +1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html). +The layout class stylesheet provides a simple set of class-based flexbox rules, that +let you specify layout properties directly in markup. You must include this file +in every element that needs to use them. + +Sample use: + + + + + +
    +
    cross axis start alignment
    +
    + +1. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html). +The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function. + + + +Please note that the old [/deep/ layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes) +are deprecated, and should not be used. To continue using layout properties +directly in markup, please switch to using the new `dom-module`-based +[layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html). +Please note that the new version does not use `/deep/`, and therefore requires you +to import the `dom-modules` in every element that needs to use them. + +A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `` is available. + + diff --git a/static/bower_components/iron-flex-layout/bower.json b/static/bower_components/iron-flex-layout/bower.json new file mode 100644 index 00000000..30c6afe4 --- /dev/null +++ b/static/bower_components/iron-flex-layout/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-flex-layout", + "version": "1.3.2", + "description": "Provide flexbox-based layouts", + "keywords": [ + "web-components", + "polymer", + "layout" + ], + "main": "iron-flex-layout.html", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-flex-layout.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-flex-layout/classes/iron-flex-layout.html b/static/bower_components/iron-flex-layout/classes/iron-flex-layout.html new file mode 100644 index 00000000..5fa7ce65 --- /dev/null +++ b/static/bower_components/iron-flex-layout/classes/iron-flex-layout.html @@ -0,0 +1,317 @@ + + + + + + + diff --git a/static/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html b/static/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html new file mode 100644 index 00000000..5dcde193 --- /dev/null +++ b/static/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html @@ -0,0 +1,313 @@ + + + + + diff --git a/static/bower_components/iron-flex-layout/demo/index.html b/static/bower_components/iron-flex-layout/demo/index.html new file mode 100644 index 00000000..4bc2d410 --- /dev/null +++ b/static/bower_components/iron-flex-layout/demo/index.html @@ -0,0 +1,396 @@ + + + + + + + iron-flex-layout demo + + + + + + + + + + + + + + +
    +

    Horizontal and vertical layout

    + + + + +

    Flexible children

    + + + + +

    Flexible children in vertical layouts

    + + + + +

    Flex ratios

    + + + + +

    Cross-axis stretch alignment (default)

    + + + + +

    Cross-axis center alignment

    + + + + +

    Cross-axis start alignment

    + + + + +

    Cross-axis end alignment

    + + + + +

    Justification, start justified

    + + + + +

    Justification, center justified

    + + + + +

    Justification, end justified

    + + + + +

    Justification, equal space between elements

    + + + + +

    Justification, equal space around each element

    + + + + +

    Self alignment

    + + + + +

    Wrapping

    + + + + +

    Reversed layouts

    + + + + +

    General purpose rules

    + + + +
    + + diff --git a/static/bower_components/iron-flex-layout/index.html b/static/bower_components/iron-flex-layout/index.html new file mode 100644 index 00000000..7d3b0881 --- /dev/null +++ b/static/bower_components/iron-flex-layout/index.html @@ -0,0 +1,24 @@ + + + + + + iron-flex-layout + + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/iron-flex-layout-classes.html b/static/bower_components/iron-flex-layout/iron-flex-layout-classes.html new file mode 100644 index 00000000..6bf47f8c --- /dev/null +++ b/static/bower_components/iron-flex-layout/iron-flex-layout-classes.html @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/iron-flex-layout.html b/static/bower_components/iron-flex-layout/iron-flex-layout.html new file mode 100644 index 00000000..a14a872b --- /dev/null +++ b/static/bower_components/iron-flex-layout/iron-flex-layout.html @@ -0,0 +1,405 @@ + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/test/index.html b/static/bower_components/iron-flex-layout/test/index.html new file mode 100644 index 00000000..90e12a78 --- /dev/null +++ b/static/bower_components/iron-flex-layout/test/index.html @@ -0,0 +1,31 @@ + + + + + iron-flex-behavior tests + + + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html b/static/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html new file mode 100644 index 00000000..3173b308 --- /dev/null +++ b/static/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html @@ -0,0 +1,412 @@ + + + + + iron-flex-layout-classes tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-flex-layout/test/iron-flex-layout.html b/static/bower_components/iron-flex-layout/test/iron-flex-layout.html new file mode 100644 index 00000000..f2090878 --- /dev/null +++ b/static/bower_components/iron-flex-layout/test/iron-flex-layout.html @@ -0,0 +1,434 @@ + + + + + iron-flex-layout tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-form-element-behavior/.gitignore b/static/bower_components/iron-form-element-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-form-element-behavior/.travis.yml b/static/bower_components/iron-form-element-behavior/.travis.yml new file mode 100644 index 00000000..6d4a6216 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: EN5HtbAeaCE1IzGk5JlSq7GWcANh/zYgbpZn1y0VocfkZfzOv8cIh8Zmr4Q6shII6K07Fyx1LQuAjsURqX9mc3AmfMHgPIbpZGpOKrjvt1Vf0bPN+uIC9vIFj3sLQj12gcfJg48EXk6HWsHscCZ3+am1xvRflhNEY3TjHPrUTgkF+KLbBEfb4mCZwVc4dln76ffvTQ/cPI9eYczNp1q9wWpYvn794qRLtAkKuQ5Z1b6hunOAx/hzCjGNbJDO3gkxO68dzzSp9YDIhKEFAUlMDalwLRr7sNgB4sNeDCg4mmie5fe6xk831HvBYFxZxmXD1uS6/Hvd8MiBDiols3lwz8uEUnPyrwDlxUkjn2sl5S+gO8CcHU2mShUCl73JfBtyWDKPSfQLR5QHEk4eqNzNn2HinAE/aezi4/TVCY7P3ujeK8sFlTsb9vlywnlJO3fqyZ+lBwZ4CbNjOTs1L2W+guT1Oq30PJ5TVxU2mvmIMtdpPveZB0iM/PM9FECsb303KeV5Zomk4dp2MxirK1O/4mPAHIz9UUpGopGOtpuODnRV4Lq7V9HaDxYOZzAHZDK4mJ1y6tSRH/yMUTEidhG2j5F6MXmhbKXj3I0oR95xx1RH+b8myErvUBlto4jR21Pd+mOVlkU78CBSN9XGhtBQjklF5+aC8YeH1DEv6mTn2o8= + - secure: q3AjjaoaTZcdAdjIvzSf8Q1SdEg1mY6lBkeoDTMKJcftJ8zz1qIfjGzEuycSVVnOJhZ6WmvMMBxdThQCymF1wzT++SV+u34DYSFoZ5EhjM0TFhP63PRuhbE3DquPaISpM5aCH7epV4nMFD7PFE1BP4u/qiETAgPeAoY9LMT/JPclOfcQ3euwks3TSM6O8g7Ro1h1ElywCQ1souzkcjvJ3FxsqysJb7Mg/n9bmtwnkol/mrBaP6JzQMURUyswx7ZPj3qiFoA9ZLiNirzf+O781A4msKursjYrKr6TZtB6xcMlEg89YhFBXrLE9IEEM/fNp+vPNhaIA5VjYRy8iIK402RXpbh7/AlPD7yMFITeMSfT+Bqldur+pi0oN1N9SeWrmk6P+bdfdkdyGl1CVKP4S35z8cyFRgmvxO4/UG65cb66AdMeNVBEQsi2flCWgPyaTmOQ53YryCs7cFRu3zSMnU3F/gWqlmletgxGhFOBHTtEmr2A9QBLgg+EvB/83wj2dEEfMlIpoeq83/2PaE8hKAWyqPga7t532vU5AIFNOUk9vGzRCxsqGKF2j0/zFBdgHSLYCsWVrbjxmxdu6Fzi8ZATeqjDoc0eaIPhBkekOvDrUtUSHA9sSSG8j69GGUL4+WkoCMB74dz+GXz85fMJlMZWBXPtazDlNXYfU60T/1E= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/static/bower_components/iron-form-element-behavior/CONTRIBUTING.md b/static/bower_components/iron-form-element-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..7b101415 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-form-element-behavior/README.md b/static/bower_components/iron-form-element-behavior/README.md new file mode 100644 index 00000000..b68d08fb --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/README.md @@ -0,0 +1,23 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-form-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form-element-behavior) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-form-element-behavior)_ + + +##Polymer.IronFormElementBehavior + + + Polymer.IronFormElementBehavior enables a custom element to be included + in an `iron-form`. + + diff --git a/static/bower_components/iron-form-element-behavior/bower.json b/static/bower_components/iron-form-element-behavior/bower.json new file mode 100644 index 00000000..865f9b54 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-form-element-behavior", + "version": "1.0.6", + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "main": "iron-form-element-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "description": "Enables a custom element to be included in an iron-form", + "keywords": [ + "web-components", + "polymer", + "form" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-form-element-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-form-element-behavior/demo/index.html b/static/bower_components/iron-form-element-behavior/demo/index.html new file mode 100644 index 00000000..e919d0bc --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/demo/index.html @@ -0,0 +1,67 @@ + + + + + + iron-form-element-behavior demo + + + + + + + + + + + + + + +
    +
    +
    + Element with iron-form-element-behavior +
    + Element without iron-form-element-behavior +
    + Element with iron-form-element-behavior +
    + +

    Elements tracked by the form:

    + +
      +
    +
    +
    + + + + + + diff --git a/static/bower_components/iron-form-element-behavior/demo/simple-element.html b/static/bower_components/iron-form-element-behavior/demo/simple-element.html new file mode 100644 index 00000000..45027692 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/demo/simple-element.html @@ -0,0 +1,27 @@ + + + + + diff --git a/static/bower_components/iron-form-element-behavior/demo/simple-form.html b/static/bower_components/iron-form-element-behavior/demo/simple-form.html new file mode 100644 index 00000000..4dc5dc6b --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/demo/simple-form.html @@ -0,0 +1,53 @@ + + + + diff --git a/static/bower_components/iron-form-element-behavior/index.html b/static/bower_components/iron-form-element-behavior/index.html new file mode 100644 index 00000000..8d748c05 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-form-element-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-form-element-behavior/iron-form-element-behavior.html b/static/bower_components/iron-form-element-behavior/iron-form-element-behavior.html new file mode 100644 index 00000000..cd9c6b4a --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/iron-form-element-behavior.html @@ -0,0 +1,86 @@ + + + + + diff --git a/static/bower_components/iron-form-element-behavior/test/basic.html b/static/bower_components/iron-form-element-behavior/test/basic.html new file mode 100644 index 00000000..5947a1e4 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/test/basic.html @@ -0,0 +1,71 @@ + + + + + iron-form-element-behavior + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-form-element-behavior/test/index.html b/static/bower_components/iron-form-element-behavior/test/index.html new file mode 100644 index 00000000..3b2badac --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/test/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-form-element-behavior/test/simple-element.html b/static/bower_components/iron-form-element-behavior/test/simple-element.html new file mode 100644 index 00000000..b1aa3002 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/test/simple-element.html @@ -0,0 +1,23 @@ + + + + + diff --git a/static/bower_components/iron-form-element-behavior/test/simple-form.html b/static/bower_components/iron-form-element-behavior/test/simple-form.html new file mode 100644 index 00000000..7fa38d88 --- /dev/null +++ b/static/bower_components/iron-form-element-behavior/test/simple-form.html @@ -0,0 +1,19 @@ + + + + diff --git a/static/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..61da83fb --- /dev/null +++ b/static/bower_components/iron-icon/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-icon/.gitignore b/static/bower_components/iron-icon/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-icon/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-icon/.travis.yml b/static/bower_components/iron-icon/.travis.yml new file mode 100644 index 00000000..2db9ed51 --- /dev/null +++ b/static/bower_components/iron-icon/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: TTp7q3OKEpaFqnqbYczhMd8iXTa1Ya0jOQVq1OhljpJogLWb78qvHLHgnxgMWkw+/KDyE5KHW1CXhYUQa7C9QF2Zn7uoN27+7+4q7HuK3pTuUtqdfstLVuLHQrfK6VqUT4XjSpeMzNX/HxuD3EMBH0bMBR4CIr76sLJOuIL/XF8= + - secure: damHvQXygRYIJG/8Vmqh7U4zxoi5224JIZiZVQL6I5z//s5zqHq6AqwDyfOoc0zWndJCwE8NvOzKD/lmVYXIsPcY95kkZS45Dbye0krYWUzKnv42rDi/7olXcg647iAEDVhW3BRHmA+opzQtKUpAkXl97DtPVkszLL1ReyNyv3A= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-icon/CONTRIBUTING.md b/static/bower_components/iron-icon/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-icon/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-icon/README.md b/static/bower_components/iron-icon/README.md new file mode 100644 index 00000000..0649f738 --- /dev/null +++ b/static/bower_components/iron-icon/README.md @@ -0,0 +1,22 @@ +[![Build status](https://travis-ci.org/PolymerElements/iron-icon.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icon) + +##<iron-icon> + +The `iron-icon` element displays an icon. By default an icon renders as a 24px square. + + +```html + + +``` diff --git a/static/bower_components/iron-icon/bower.json b/static/bower_components/iron-icon/bower.json new file mode 100644 index 00000000..46239e00 --- /dev/null +++ b/static/bower_components/iron-icon/bower.json @@ -0,0 +1,35 @@ +{ + "name": "iron-icon", + "private": true, + "version": "1.0.12", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "An element that supports displaying an icon", + "main": "iron-icon.html", + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icon.git" + }, + "ignore": [], + "dependencies": { + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "iron-iconset": "polymerelements/iron-iconset#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-icon/demo/async.html b/static/bower_components/iron-icon/demo/async.html new file mode 100644 index 00000000..eaf40d1b --- /dev/null +++ b/static/bower_components/iron-icon/demo/async.html @@ -0,0 +1,62 @@ + + + + + iron-icon demo + + + + + + + +
    +

    + This demo is for an <iron-icon> with an asynchronously loaded + iconset. +

    + +
    Waiting to load iconset...
    + +
    + + + +

    <iron-icon icon="example:location">

    + + +
    +
    + + + diff --git a/static/bower_components/iron-icon/demo/index.html b/static/bower_components/iron-icon/demo/index.html new file mode 100644 index 00000000..999ed35b --- /dev/null +++ b/static/bower_components/iron-icon/demo/index.html @@ -0,0 +1,48 @@ + + + + + iron-icon demo + + + + + + + + +
    +

    This demo is for a single <iron-icon>. If you're looking for the + whole set of available icons, check out the <iron-icons> demo.

    + +
    + + + +

    <iron-icon icon="example:location">

    + + + +

    <iron-icon src="location.png">

    + +
    +
    + + diff --git a/static/bower_components/iron-icon/demo/location.png b/static/bower_components/iron-icon/demo/location.png new file mode 100644 index 00000000..9bb74236 Binary files /dev/null and b/static/bower_components/iron-icon/demo/location.png differ diff --git a/static/bower_components/iron-icon/hero.svg b/static/bower_components/iron-icon/hero.svg new file mode 100644 index 00000000..19f01c2f --- /dev/null +++ b/static/bower_components/iron-icon/hero.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icon/index.html b/static/bower_components/iron-icon/index.html new file mode 100644 index 00000000..487bb5c3 --- /dev/null +++ b/static/bower_components/iron-icon/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icon/iron-icon.html b/static/bower_components/iron-icon/iron-icon.html new file mode 100644 index 00000000..64ee2ac1 --- /dev/null +++ b/static/bower_components/iron-icon/iron-icon.html @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icon/test/index.html b/static/bower_components/iron-icon/test/index.html new file mode 100644 index 00000000..4414532e --- /dev/null +++ b/static/bower_components/iron-icon/test/index.html @@ -0,0 +1,27 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-icon/test/iron-icon.html b/static/bower_components/iron-icon/test/iron-icon.html new file mode 100644 index 00000000..4dd9a8d2 --- /dev/null +++ b/static/bower_components/iron-icon/test/iron-icon.html @@ -0,0 +1,246 @@ + + + + + + + iron-icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..95ef5d37 --- /dev/null +++ b/static/bower_components/iron-icons/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-icons/.gitignore b/static/bower_components/iron-icons/.gitignore new file mode 100644 index 00000000..bb1944ea --- /dev/null +++ b/static/bower_components/iron-icons/.gitignore @@ -0,0 +1,3 @@ +util/node_modules +material-design-icons +bower_components diff --git a/static/bower_components/iron-icons/.travis.yml b/static/bower_components/iron-icons/.travis.yml new file mode 100644 index 00000000..14377dc0 --- /dev/null +++ b/static/bower_components/iron-icons/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + L3XJmmXJlYZYyvlKoZ25HpEC1FcTtWejNk2xRQKAH4cg8+oNMjE80OxkaIVHtZlatpLdIIYk79p+9OtGiskXZ1QsAjHtrxWE5YRSSz3nL/XyZqUu7tjiNtrih6PiEvocmwMCCdRGMSXwVl1YoUUYM0DWxHdykd0EMXYYkYe+yQo= + - secure: >- + PSLkHUoiTj6UxN+7KtZG2miLmeuDuGN4c+ksviIP4/4lh5x7xic7CIeMmf2HLd18MR8CwCHjfMrIrxYF/IusILn6fdQ8rdBw+XhEF7xP+8UqqgF6YjGHs/xPDYYiGtisEc2OOg+vzqXIMhmKTg2vVlhuNq16eggGsRDcsEhEong= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - true || xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then true || wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-icons/CONTRIBUTING.md b/static/bower_components/iron-icons/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-icons/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-icons/README.md b/static/bower_components/iron-icons/README.md new file mode 100644 index 00000000..05d4a3ac --- /dev/null +++ b/static/bower_components/iron-icons/README.md @@ -0,0 +1,49 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-icons.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icons) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-icons)_ + + +##<iron-icons> + +`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set. + +The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project. + +Example loading icon set: + +```html + +``` + +To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id. + +Example using the directions-bus icon from the maps icon set: + +```html + +``` + +To load a subset of icons from one of the default `iron-icons` sets, you can +use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you +to select individual icons, and creates an iconset from them that you can +use directly in your elements. + +See [iron-icon](./iron-icon) for more information about working with icons. + +See [iron-iconset](./iron-iconset) and [iron-iconset-svg](./iron-iconset-svg) for more information about how to create a custom iconset. + + diff --git a/static/bower_components/iron-icons/av-icons.html b/static/bower_components/iron-icons/av-icons.html new file mode 100644 index 00000000..764d6229 --- /dev/null +++ b/static/bower_components/iron-icons/av-icons.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/bower.json b/static/bower_components/iron-icons/bower.json new file mode 100644 index 00000000..0d9f3233 --- /dev/null +++ b/static/bower_components/iron-icons/bower.json @@ -0,0 +1,38 @@ +{ + "name": "iron-icons", + "version": "1.2.0", + "description": "A set of icons for use with iron-icon", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "main": "iron-icons.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icons" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-icons", + "dependencies": { + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [ + "util", + "update-icons.sh" + ] +} diff --git a/static/bower_components/iron-icons/communication-icons.html b/static/bower_components/iron-icons/communication-icons.html new file mode 100644 index 00000000..a9e1839a --- /dev/null +++ b/static/bower_components/iron-icons/communication-icons.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/demo/index.html b/static/bower_components/iron-icons/demo/index.html new file mode 100644 index 00000000..0dfbf365 --- /dev/null +++ b/static/bower_components/iron-icons/demo/index.html @@ -0,0 +1,116 @@ + + + + + iron-icons demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/device-icons.html b/static/bower_components/iron-icons/device-icons.html new file mode 100644 index 00000000..190f8962 --- /dev/null +++ b/static/bower_components/iron-icons/device-icons.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/editor-icons.html b/static/bower_components/iron-icons/editor-icons.html new file mode 100644 index 00000000..bc7084db --- /dev/null +++ b/static/bower_components/iron-icons/editor-icons.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/hardware-icons.html b/static/bower_components/iron-icons/hardware-icons.html new file mode 100644 index 00000000..3268e5ad --- /dev/null +++ b/static/bower_components/iron-icons/hardware-icons.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/hero.svg b/static/bower_components/iron-icons/hero.svg new file mode 100644 index 00000000..52949be5 --- /dev/null +++ b/static/bower_components/iron-icons/hero.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/image-icons.html b/static/bower_components/iron-icons/image-icons.html new file mode 100644 index 00000000..bb1a4da3 --- /dev/null +++ b/static/bower_components/iron-icons/image-icons.html @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/index.html b/static/bower_components/iron-icons/index.html new file mode 100644 index 00000000..fa5b89bb --- /dev/null +++ b/static/bower_components/iron-icons/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/iron-icons.html b/static/bower_components/iron-icons/iron-icons.html new file mode 100644 index 00000000..739131cc --- /dev/null +++ b/static/bower_components/iron-icons/iron-icons.html @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/maps-icons.html b/static/bower_components/iron-icons/maps-icons.html new file mode 100644 index 00000000..d6ad092f --- /dev/null +++ b/static/bower_components/iron-icons/maps-icons.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/notification-icons.html b/static/bower_components/iron-icons/notification-icons.html new file mode 100644 index 00000000..272b95b0 --- /dev/null +++ b/static/bower_components/iron-icons/notification-icons.html @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/places-icons.html b/static/bower_components/iron-icons/places-icons.html new file mode 100644 index 00000000..fa4827bf --- /dev/null +++ b/static/bower_components/iron-icons/places-icons.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/social-icons.html b/static/bower_components/iron-icons/social-icons.html new file mode 100644 index 00000000..a0424735 --- /dev/null +++ b/static/bower_components/iron-icons/social-icons.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-icons/update-icons.sh b/static/bower_components/iron-icons/update-icons.sh new file mode 100644 index 00000000..a380444d --- /dev/null +++ b/static/bower_components/iron-icons/update-icons.sh @@ -0,0 +1,140 @@ +#!/bin/bash +# +# @license +# Copyright (c) 2014 The Polymer Project Authors. All rights reserved. +# This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +# The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +# The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +# Code distributed by Google as part of the polymer project is also +# subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +# +set -e + +ICONSRC="material-design-icons/" +ORIGIN="git://github.com/google/material-design-icons.git" + +# bootstrap a sparse SVG only checkout +bootstrap() { + mkdir -p ${ICONSRC} + pushd ${ICONSRC} + git init + git config core.sparsecheckout true + echo "*/svg/production/*_24px.svg" >> .git/info/sparse-checkout + git remote add -f origin ${ORIGIN} + popd +} + +header() { +cat > $1 < + + + + + +ENDL +} + +footer(){ +cat >> $1 < + +ENDL +} + +contains() { + local e + for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done + return 1; +} + +build() { +# dirname of path to current script +local runfrom="${0%[/\\]*}" +local folder="$1" + +# put these sets into one big "icons" set +local default=(action alert content file navigation toggle) + +local name="icons" +local file="../iron-icons.html" + +# special docs header for iron-icons.html +cat > $file <<'ENDL' + + + + + + +ENDL + +# find all the default icons, sort by basename (in perl), run concat +find "${default[@]/#/$folder}" -name "*24px.svg" | xargs $runfrom/concat-svg.js | sort >> $file + +footer $file + +local dir +for dir in $folder/*/; do + if contains "`basename $dir`" "${default[@]}"; then + continue + fi + echo $dir + name=`basename $dir` + file="../$name-icons.html" + header $file $name + find $dir -name "*24px.svg" | xargs $runfrom/concat-svg.js | sort >> $file + footer $file +done +} + +[ -d ${ICONSRC} ] || bootstrap + +pushd ${ICONSRC} +git pull origin master +popd + +pushd util +npm install +build ../${ICONSRC} +popd diff --git a/static/bower_components/iron-icons/util/concat-svg.js b/static/bower_components/iron-icons/util/concat-svg.js new file mode 100644 index 00000000..69bdd819 --- /dev/null +++ b/static/bower_components/iron-icons/util/concat-svg.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node +/* + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ + +var fs = require('fs'); +var cheerio = require('cheerio'); +var path = require('path'); + +var cheerioOptions = {xmlMode: true}; +var files = process.argv.slice(2); + +function read(file) { + var content = fs.readFileSync(file, 'utf8'); + return cheerio.load(content, cheerioOptions); +} + +function transmogrify($, name) { + var node = $('svg'); + // remove spacer rectangles + node.find('[fill=none]').remove(); + // remove fill attribute + node.find('[fill]').each(function(i, e) { + $(e).attr('fill', null); + }); + // remove empty groups + var innerHTML = $.xml(node.children()); + // add parent group with icon name as id + var output = '' + innerHTML + ''; + // print icon svg + console.log(output); +} + +function path2IconName(file) { + parts = path.basename(file).split('_'); + // remove ic_ + parts.shift(); + // remove _24px.svg + parts.pop(); + return parts.join('-'); +} + +files.forEach(function(file) { + var name = path2IconName(file); + var $ = read(file); + transmogrify($, name); +}); diff --git a/static/bower_components/iron-icons/util/package.json b/static/bower_components/iron-icons/util/package.json new file mode 100644 index 00000000..802d2a04 --- /dev/null +++ b/static/bower_components/iron-icons/util/package.json @@ -0,0 +1,9 @@ +{ + "name": "concat-svg", + "version": "0.0.0", + "description": "", + "main": "concat-svg.js", + "dependencies": { + "cheerio": "^0.17.0" + } +} diff --git a/static/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..9f7691f5 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-iconset-svg/.gitignore b/static/bower_components/iron-iconset-svg/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-iconset-svg/.travis.yml b/static/bower_components/iron-iconset-svg/.travis.yml new file mode 100644 index 00000000..9847a10d --- /dev/null +++ b/static/bower_components/iron-iconset-svg/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: FVt0rYGSWqJW3i57y9CQHuDaa97UDwZuGc5ts+TDpbuR3DVP8LxB9MT1ApA2bqhg101hPzhWJWIK3Siotkb7eAlsiWgVhdNr8t5eZBPOOnjLiU6PNCF6ZGCZRJHQ6q4xQ2DycGug8OfwMw63yewLEYmVBppeAlStnPUfDWURlJ8= + - secure: X7cWxU13zLWoahM/BNBPSvgnI396zMmLzVHDHX6zAQL7gFL+PS4Dz6WjooO3Jx79ks2E8REUzWB8IFY3FohVAncXA///PAaqNLX0k2et4aOTOs5tcsCWL4nj8tKA6vjZIZ61rCjWTyNRR+o2QPsY9QQgi3Y+6bzLguWoPuycRbE= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-iconset-svg/CONTRIBUTING.md b/static/bower_components/iron-iconset-svg/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-iconset-svg/README.md b/static/bower_components/iron-iconset-svg/README.md new file mode 100644 index 00000000..971ab0c7 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/README.md @@ -0,0 +1,56 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-iconset-svg.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-iconset-svg) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-iconset-svg)_ + + +##<iron-iconset-svg> + +The `iron-iconset-svg` element allows users to define their own icon sets +that contain svg icons. The svg icon elements should be children of the +`iron-iconset-svg` element. Multiple icons should be given distinct id's. + +Using svg elements to create icons has a few advantages over traditional +bitmap graphics like jpg or png. Icons that use svg are vector based so +they are resolution independent and should look good on any device. They +are stylable via css. Icons can be themed, colorized, and even animated. + +Example: + +```html + + + + + + + + + + +``` + +This will automatically register the icon set "my-svg-icons" to the iconset +database. To use these icons from within another element, make a +`iron-iconset` element and call the `byId` method +to retrieve a given iconset. To apply a particular icon inside an +element use the `applyIcon` method. For example: + +```javascript +iconset.applyIcon(iconNode, 'car'); +``` + + diff --git a/static/bower_components/iron-iconset-svg/bower.json b/static/bower_components/iron-iconset-svg/bower.json new file mode 100644 index 00000000..fba891cd --- /dev/null +++ b/static/bower_components/iron-iconset-svg/bower.json @@ -0,0 +1,34 @@ +{ + "name": "iron-iconset-svg", + "description": "Manages a set of svg icons", + "version": "1.1.0", + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-iconset-svg.git" + }, + "dependencies": { + "polymer": "polymer/polymer#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "main": "iron-iconset-svg.html", + "ignore": [] +} diff --git a/static/bower_components/iron-iconset-svg/demo/index.html b/static/bower_components/iron-iconset-svg/demo/index.html new file mode 100644 index 00000000..53b291aa --- /dev/null +++ b/static/bower_components/iron-iconset-svg/demo/index.html @@ -0,0 +1,70 @@ + + + + + + + iron-iconset-svg + + + + + + + + + +
    + + + + +
    + + + diff --git a/static/bower_components/iron-iconset-svg/demo/svg-sample-icons.html b/static/bower_components/iron-iconset-svg/demo/svg-sample-icons.html new file mode 100644 index 00000000..3eed843f --- /dev/null +++ b/static/bower_components/iron-iconset-svg/demo/svg-sample-icons.html @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-iconset-svg/index.html b/static/bower_components/iron-iconset-svg/index.html new file mode 100644 index 00000000..487bb5c3 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-iconset-svg/iron-iconset-svg.html b/static/bower_components/iron-iconset-svg/iron-iconset-svg.html new file mode 100644 index 00000000..f2a79454 --- /dev/null +++ b/static/bower_components/iron-iconset-svg/iron-iconset-svg.html @@ -0,0 +1,241 @@ + + + + + + diff --git a/static/bower_components/iron-iconset-svg/test/index.html b/static/bower_components/iron-iconset-svg/test/index.html new file mode 100644 index 00000000..65e4abfd --- /dev/null +++ b/static/bower_components/iron-iconset-svg/test/index.html @@ -0,0 +1,27 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-iconset-svg/test/iron-iconset-svg.html b/static/bower_components/iron-iconset-svg/test/iron-iconset-svg.html new file mode 100644 index 00000000..c982abcf --- /dev/null +++ b/static/bower_components/iron-iconset-svg/test/iron-iconset-svg.html @@ -0,0 +1,233 @@ + + + + + + + iron-iconset-svg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-localstorage/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-localstorage/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..25acb2fb --- /dev/null +++ b/static/bower_components/iron-localstorage/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-localstorage/.gitignore b/static/bower_components/iron-localstorage/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-localstorage/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-localstorage/.travis.yml b/static/bower_components/iron-localstorage/.travis.yml new file mode 100644 index 00000000..83a2a718 --- /dev/null +++ b/static/bower_components/iron-localstorage/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: KmeaX0PfIDo1jNKiVJSaeWEyAMvg4aW82cDTQq6/FJk9BMD1+FsgkphtfL6o4yXBe3a7+Pn5gEqgB9TjEzvV9O22oT0MCe7bEymme33UZxe01DTjs2W2LFKwnvb/rmHHVbQZU4OlZNqXjXfYUeQYclWrd1BShvD2/Ec9aMExxBE= + - secure: MzUlfYmnx7eqLi69X8mb0r3gQ2QwWC2OBxFkvxmHJpZ8rBymgUJTj2GB8bHqh7AKzK1E1O+Wt+JsJPhF52ATuYkpa7QG5PUrQwWZJgRkOV4RZxdTviqRulK24lxIH/3nDk4Hxt94/PMNChdG8hGNUVQGgM4x3wjlCj+r/u2TqiA= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-localstorage/CONTRIBUTING.md b/static/bower_components/iron-localstorage/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-localstorage/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-localstorage/README.md b/static/bower_components/iron-localstorage/README.md new file mode 100644 index 00000000..eb9ec299 --- /dev/null +++ b/static/bower_components/iron-localstorage/README.md @@ -0,0 +1,88 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-localstorage.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-localstorage) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-localstorage)_ + + +##<iron-localstorage> + +Element access to Web Storage API (window.localStorage). + +Keeps `value` property in sync with localStorage. + +Value is saved as json by default. + +### Usage: + +`ls-sample` will automatically save changes to its value. + +```html + + + + + +``` + +### Tech notes: + +* `value.*` is observed, and saved on modifications. You must use + path change notification methods such as `set()` to modify value + for changes to be observed. + + +* Set `auto-save-disabled` to prevent automatic saving. + + +* Value is saved as JSON by default. + + +* To delete a key, set value to null + + + +Element listens to StorageAPI `storage` event, and will reload upon receiving it. + +__Warning__: do not bind value to sub-properties until Polymer +[bug 1550](https://github.com/Polymer/polymer/issues/1550) +is resolved. Local storage will be blown away. +` + + + + + iron-localstorage + + + + + + + + + + +
    + + + +
    + + + + diff --git a/static/bower_components/iron-localstorage/hero.svg b/static/bower_components/iron-localstorage/hero.svg new file mode 100644 index 00000000..257ea828 --- /dev/null +++ b/static/bower_components/iron-localstorage/hero.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-localstorage/index.html b/static/bower_components/iron-localstorage/index.html new file mode 100644 index 00000000..246af101 --- /dev/null +++ b/static/bower_components/iron-localstorage/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-localstorage/iron-localstorage.html b/static/bower_components/iron-localstorage/iron-localstorage.html new file mode 100644 index 00000000..338335e9 --- /dev/null +++ b/static/bower_components/iron-localstorage/iron-localstorage.html @@ -0,0 +1,252 @@ + + + + + + + diff --git a/static/bower_components/iron-localstorage/test/basic.html b/static/bower_components/iron-localstorage/test/basic.html new file mode 100644 index 00000000..ec09e150 --- /dev/null +++ b/static/bower_components/iron-localstorage/test/basic.html @@ -0,0 +1,121 @@ + + + + + + iron-localstorage-basic + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-localstorage/test/index.html b/static/bower_components/iron-localstorage/test/index.html new file mode 100644 index 00000000..069144a4 --- /dev/null +++ b/static/bower_components/iron-localstorage/test/index.html @@ -0,0 +1,28 @@ + + + + iron-localstorage tests + + + + + + + diff --git a/static/bower_components/iron-localstorage/test/raw.html b/static/bower_components/iron-localstorage/test/raw.html new file mode 100644 index 00000000..0e73ed98 --- /dev/null +++ b/static/bower_components/iron-localstorage/test/raw.html @@ -0,0 +1,65 @@ + + + + + + iron-localstorage-raw + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-localstorage/test/value-binding.html b/static/bower_components/iron-localstorage/test/value-binding.html new file mode 100644 index 00000000..87b6cb60 --- /dev/null +++ b/static/bower_components/iron-localstorage/test/value-binding.html @@ -0,0 +1,101 @@ + + + + + + iron-localstorage-value-binding + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-media-query/.gitignore b/static/bower_components/iron-media-query/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-media-query/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-media-query/.travis.yml b/static/bower_components/iron-media-query/.travis.yml new file mode 100644 index 00000000..b680b690 --- /dev/null +++ b/static/bower_components/iron-media-query/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: My9uxlkp4fZwSHKqo1RUv4yBhNl46XfbaiOsOStqJdI9l7hBfudSl7V2OZeLuV2pEDJC1z1ZqVU6C/K0/iTf7i66cd9g0iH5N+1qex8p2AcuP1evPWbwLw8moHH+M5E14MMXD8sPX4KauS8azmgRm61pppD5ZgKfCaeGZg7Tczs= + - secure: LgnZP4BNGBkTZhf8Vr7r9LdrOwq2/58TqqYkFFloEGBRT6HmumNSRwNbIwOh1U9jSTVkqjC2rn4G27u4XlEIs+QTD2PVSSEKy7Vbn0KxSNCvCGaOB1ZaxWTwZa7nkg09ZFRCHGh+WIbuV+BxyzsjOqlN82GSzFNSb3rxhqDM6dU= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/static/bower_components/iron-media-query/CONTRIBUTING.md b/static/bower_components/iron-media-query/CONTRIBUTING.md new file mode 100644 index 00000000..7b101415 --- /dev/null +++ b/static/bower_components/iron-media-query/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-media-query/README.md b/static/bower_components/iron-media-query/README.md new file mode 100644 index 00000000..a2c553d9 --- /dev/null +++ b/static/bower_components/iron-media-query/README.md @@ -0,0 +1,28 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-media-query.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-media-query) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-media-query)_ + + +##<iron-media-query> + + +`iron-media-query` can be used to data bind to a CSS media query. +The `query` property is a bare CSS media query. +The `query-matches` property is a boolean representing whether the page matches that media query. + +Example: + + + + diff --git a/static/bower_components/iron-media-query/bower.json b/static/bower_components/iron-media-query/bower.json new file mode 100644 index 00000000..c6930721 --- /dev/null +++ b/static/bower_components/iron-media-query/bower.json @@ -0,0 +1,32 @@ +{ + "name": "iron-media-query", + "version": "1.0.8", + "description": "Lets you bind to a CSS media query", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "media" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-media-query" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-media-query", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-media-query.html" +} diff --git a/static/bower_components/iron-media-query/demo/index.html b/static/bower_components/iron-media-query/demo/index.html new file mode 100644 index 00000000..8a57dae6 --- /dev/null +++ b/static/bower_components/iron-media-query/demo/index.html @@ -0,0 +1,93 @@ + + + + + + iron-media-query demo + + + + + + + + + + + +
    +

    <iron-media-query>

    + + +
    + + + diff --git a/static/bower_components/iron-media-query/hero.svg b/static/bower_components/iron-media-query/hero.svg new file mode 100644 index 00000000..0a7982b9 --- /dev/null +++ b/static/bower_components/iron-media-query/hero.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-media-query/index.html b/static/bower_components/iron-media-query/index.html new file mode 100644 index 00000000..174afb5b --- /dev/null +++ b/static/bower_components/iron-media-query/index.html @@ -0,0 +1,29 @@ + + + + + + + + + iron-media-query + + + + + + + + + + + + + diff --git a/static/bower_components/iron-media-query/iron-media-query.html b/static/bower_components/iron-media-query/iron-media-query.html new file mode 100644 index 00000000..60cb84b8 --- /dev/null +++ b/static/bower_components/iron-media-query/iron-media-query.html @@ -0,0 +1,121 @@ + + + + + + + diff --git a/static/bower_components/iron-media-query/test/basic.html b/static/bower_components/iron-media-query/test/basic.html new file mode 100644 index 00000000..8649ceba --- /dev/null +++ b/static/bower_components/iron-media-query/test/basic.html @@ -0,0 +1,118 @@ + + + + + + + iron-media-query-basic + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-media-query/test/index.html b/static/bower_components/iron-media-query/test/index.html new file mode 100644 index 00000000..30e527f5 --- /dev/null +++ b/static/bower_components/iron-media-query/test/index.html @@ -0,0 +1,26 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..da2172d0 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-menu-behavior/.gitignore b/static/bower_components/iron-menu-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-menu-behavior/.travis.yml b/static/bower_components/iron-menu-behavior/.travis.yml new file mode 100644 index 00000000..273c658f --- /dev/null +++ b/static/bower_components/iron-menu-behavior/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: CbYi/0VAtpLB+NDHdD/I9q2ldILrmyc3wxKdO5vEtMvRKYgsddQ/hXGovV3c6Hy9sAXD5sKtNi60BBG5E2XuydshjYAZiytfeNjFIvDu5627Xljjt90e/r1hg3tNHRRQihH73nPECfp/X+g+yBNCX3f0+2ExAh0DMs1DXt7Dl7Q= + - secure: kLFlOTh9IjctY7DIJ3KEw5OPrqHNTzoArdabfAtisBMWahuJptKFmYCp/t+zPSL27IVqJakaqPrwGrBUi+4h3wVWredNhfl2lCpMfQfBMcHC5kBVkf2xjJyDa5Y3bP7jPq6YnWYAqEl6pBWYiHU6yWBc6BEdJ6FsTWFbLFTnY7w= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-menu-behavior/CONTRIBUTING.md b/static/bower_components/iron-menu-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-menu-behavior/README.md b/static/bower_components/iron-menu-behavior/README.md new file mode 100644 index 00000000..f8d90c65 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/README.md @@ -0,0 +1,30 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-menu-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-menu-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-menu-behavior)_ + + +##Polymer.IronMenuBehavior + +`Polymer.IronMenuBehavior` implements accessible menu behavior. + + + +##Polymer.IronMenubarBehavior + +`Polymer.IronMenubarBehavior` implements accessible menubar behavior. + + diff --git a/static/bower_components/iron-menu-behavior/bower.json b/static/bower_components/iron-menu-behavior/bower.json new file mode 100644 index 00000000..6fd4434a --- /dev/null +++ b/static/bower_components/iron-menu-behavior/bower.json @@ -0,0 +1,37 @@ +{ + "name": "iron-menu-behavior", + "version": "1.2.0", + "description": "Provides accessible menu behavior", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "behavior", + "menu" + ], + "main": [ + "iron-menu-behavior.html", + "iron-menubar-behavior.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-menu-behavior" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-menu-behavior", + "ignore": [], + "dependencies": { + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "polymer": "Polymer/polymer#^1.2.4", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-menu-behavior/demo/index.html b/static/bower_components/iron-menu-behavior/demo/index.html new file mode 100644 index 00000000..11da8329 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/demo/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + iron-menu-behavior demo + + + + + + + + + + + + +
    +
    +

    Simple menu

    + +
    + +
    +

    Multi-select menu

    + +
    + +
    +
    +

    Simple menubar

    +
    + + Item 0 + Item 1 + Item 2 + Item 3 + +
    +
    +
    +

    Multi-select menubar

    +
    + + Item 0 + Item 1 + Item 2 + Item 3 + +
    +
    +
    + +
    + + diff --git a/static/bower_components/iron-menu-behavior/demo/simple-menu.html b/static/bower_components/iron-menu-behavior/demo/simple-menu.html new file mode 100644 index 00000000..da16eeba --- /dev/null +++ b/static/bower_components/iron-menu-behavior/demo/simple-menu.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/demo/simple-menubar.html b/static/bower_components/iron-menu-behavior/demo/simple-menubar.html new file mode 100644 index 00000000..0176ad0f --- /dev/null +++ b/static/bower_components/iron-menu-behavior/demo/simple-menubar.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/index.html b/static/bower_components/iron-menu-behavior/index.html new file mode 100644 index 00000000..2c643c4a --- /dev/null +++ b/static/bower_components/iron-menu-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-menu-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/iron-menu-behavior.html b/static/bower_components/iron-menu-behavior/iron-menu-behavior.html new file mode 100644 index 00000000..ac546996 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/iron-menu-behavior.html @@ -0,0 +1,376 @@ + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/iron-menubar-behavior.html b/static/bower_components/iron-menu-behavior/iron-menubar-behavior.html new file mode 100644 index 00000000..f3b65186 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/iron-menubar-behavior.html @@ -0,0 +1,81 @@ + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/index.html b/static/bower_components/iron-menu-behavior/test/index.html new file mode 100644 index 00000000..851835ba --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/index.html @@ -0,0 +1,33 @@ + + + iron-menu-behavior tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/iron-menu-behavior.html b/static/bower_components/iron-menu-behavior/test/iron-menu-behavior.html new file mode 100644 index 00000000..ea1322a9 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/iron-menu-behavior.html @@ -0,0 +1,559 @@ + + + + + + iron-menu-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/iron-menubar-behavior.html b/static/bower_components/iron-menu-behavior/test/iron-menubar-behavior.html new file mode 100644 index 00000000..78af4ea4 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/iron-menubar-behavior.html @@ -0,0 +1,162 @@ + + + + + + iron-menubar-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/test-menu.html b/static/bower_components/iron-menu-behavior/test/test-menu.html new file mode 100644 index 00000000..aa8eab28 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/test-menu.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/test-menubar.html b/static/bower_components/iron-menu-behavior/test/test-menubar.html new file mode 100644 index 00000000..66ce6fde --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/test-menubar.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-menu-behavior/test/test-nested-menu.html b/static/bower_components/iron-menu-behavior/test/test-nested-menu.html new file mode 100644 index 00000000..9eab85f2 --- /dev/null +++ b/static/bower_components/iron-menu-behavior/test/test-nested-menu.html @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/static/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..2e817113 --- /dev/null +++ b/static/bower_components/iron-meta/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-meta/.gitignore b/static/bower_components/iron-meta/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-meta/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-meta/.travis.yml b/static/bower_components/iron-meta/.travis.yml new file mode 100644 index 00000000..39e072ea --- /dev/null +++ b/static/bower_components/iron-meta/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: mjikUCoN+UpTbFHwbGXUoKp4vtZ2qNN1JYW79WcOik7fCFmvdFzfYQPDa6y9aJvU3kgkDndGdR/ynLG4kejZjmqTS5fYtdHEwpPVPapbVYnquJvCJKbMN4S2QpGCoq51pjKQ8U3Ys6G5HkmdcDfw3SKk1uMgVzKV7fEI+6WnZ/M= + - secure: LHDnBtwK7yO2X4GNmIaAl7t85WWc1U189OiPqemD27+jTcKml0by1n9Mu/yrg94jYgeXab9mHgU3uMtIdQstNNwTDu8CgmmIP4H2EWopHrTi3KM7Z7aeofPgMJsVFXwg+WhNlcCfhEsygHZWTxjJXM4fcGOrFPDa4+BTgRa2hEE= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-meta/CONTRIBUTING.md b/static/bower_components/iron-meta/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-meta/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-meta/README.md b/static/bower_components/iron-meta/README.md new file mode 100644 index 00000000..3f2ebb32 --- /dev/null +++ b/static/bower_components/iron-meta/README.md @@ -0,0 +1,110 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-meta.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-meta) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-meta)_ + + +##<iron-meta> + +`iron-meta` is a generic element you can use for sharing information across the DOM tree. +It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any +instance of iron-meta has access to the shared +information. You can use `iron-meta` to share whatever you want (or create an extension +[like x-meta] for enhancements). + +The `iron-meta` instances containing your actual data can be loaded in an import, +or constructed in any way you see fit. The only requirement is that you create them +before you try to access them. + +Examples: + +If I create an instance like this: + +```html + +``` + +Note that value="foo/bar" is the metadata I've defined. I could define more +attributes or use child nodes to define additional metadata. + +Now I can access that element (and it's metadata) from any iron-meta instance +via the byKey method, e.g. + +```javascript +meta.byKey('info'); +``` + +Pure imperative form would be like: + +```javascript +document.createElement('iron-meta').byKey('info'); +``` + +Or, in a Polymer element, you can include a meta in your template: + +```html + +... +this.$.meta.byKey('info'); +``` + + + +##<iron-meta-query> + +`iron-meta` is a generic element you can use for sharing information across the DOM tree. +It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any +instance of iron-meta has access to the shared +information. You can use `iron-meta` to share whatever you want (or create an extension +[like x-meta] for enhancements). + +The `iron-meta` instances containing your actual data can be loaded in an import, +or constructed in any way you see fit. The only requirement is that you create them +before you try to access them. + +Examples: + +If I create an instance like this: + +```html + +``` + +Note that value="foo/bar" is the metadata I've defined. I could define more +attributes or use child nodes to define additional metadata. + +Now I can access that element (and it's metadata) from any iron-meta instance +via the byKey method, e.g. + +```javascript +meta.byKey('info'); +``` + +Pure imperative form would be like: + +```javascript +document.createElement('iron-meta').byKey('info'); +``` + +Or, in a Polymer element, you can include a meta in your template: + +```html + +... +this.$.meta.byKey('info'); +``` + + diff --git a/static/bower_components/iron-meta/bower.json b/static/bower_components/iron-meta/bower.json new file mode 100644 index 00000000..d457e06e --- /dev/null +++ b/static/bower_components/iron-meta/bower.json @@ -0,0 +1,30 @@ +{ + "name": "iron-meta", + "version": "1.1.2", + "keywords": [ + "web-components", + "polymer" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Useful for sharing information across a DOM tree", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-meta.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.4", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-meta.html", + "ignore": [] +} diff --git a/static/bower_components/iron-meta/demo/index.html b/static/bower_components/iron-meta/demo/index.html new file mode 100644 index 00000000..0fc39e30 --- /dev/null +++ b/static/bower_components/iron-meta/demo/index.html @@ -0,0 +1,76 @@ + + + + + + + + + iron-meta + + + + + + + +
    +

    <iron-meta>

    +

    Key Query

    + + + + The value stored at key="info" is . +
    + +
    +

    Type Query

    + + + + + + + The value(s) stored at type="type1" are:
    .

    The value(s) stored at type="type2" are:
    . +
    + + + + + diff --git a/static/bower_components/iron-meta/hero.svg b/static/bower_components/iron-meta/hero.svg new file mode 100644 index 00000000..8d36c506 --- /dev/null +++ b/static/bower_components/iron-meta/hero.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-meta/index.html b/static/bower_components/iron-meta/index.html new file mode 100644 index 00000000..dce83623 --- /dev/null +++ b/static/bower_components/iron-meta/index.html @@ -0,0 +1,27 @@ + + + + + + + + iron-meta + + + + + + + + + + + diff --git a/static/bower_components/iron-meta/iron-meta.html b/static/bower_components/iron-meta/iron-meta.html new file mode 100644 index 00000000..73d66ccc --- /dev/null +++ b/static/bower_components/iron-meta/iron-meta.html @@ -0,0 +1,333 @@ + + + + + + + diff --git a/static/bower_components/iron-meta/test/basic.html b/static/bower_components/iron-meta/test/basic.html new file mode 100644 index 00000000..c561dc3c --- /dev/null +++ b/static/bower_components/iron-meta/test/basic.html @@ -0,0 +1,48 @@ + + + + + + + iron-meta-basic + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-meta/test/index.html b/static/bower_components/iron-meta/test/index.html new file mode 100644 index 00000000..2fb0d690 --- /dev/null +++ b/static/bower_components/iron-meta/test/index.html @@ -0,0 +1,29 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-meta/test/iron-meta.html b/static/bower_components/iron-meta/test/iron-meta.html new file mode 100644 index 00000000..c4dc2500 --- /dev/null +++ b/static/bower_components/iron-meta/test/iron-meta.html @@ -0,0 +1,195 @@ + + + + + + + iron-meta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..9925d374 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-overlay-behavior/.gitignore b/static/bower_components/iron-overlay-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-overlay-behavior/.travis.yml b/static/bower_components/iron-overlay-behavior/.travis.yml new file mode 100644 index 00000000..cc9cef45 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + ZE4MrCc8vi6hb2WDctjBf9Y7wmYm0tbknPCX0TR+ks0eEXt2ZkWOvMGCw6sKvL1SsrUzhSOQiAc3IFCZBZ6vA1DUCo6S+4O8IvH+VawsK34arI7PIN7UhTDRmudzDwYKJHToRGVFffM1Y5vmNOBNj7hyiQp/UP0hz8vWLpQKyNw= + - secure: >- + IDwaZdFRon3lTOOZsoGXFUTJayvthgm5JTigYlOtVq6CVlJQBShveehe08fHAhb0XkpFyTFxBsricOUc2DOlyK9ds+DE9rRlIml+BuCrmvfCFvxX4loRg5tibKrRT9mrHNhJRwZiL4WbsGTskMpWGorgkO9qMJSJ9sAabjCJrmM= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/iron-overlay-behavior/CONTRIBUTING.md b/static/bower_components/iron-overlay-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-overlay-behavior/README.md b/static/bower_components/iron-overlay-behavior/README.md new file mode 100644 index 00000000..d4ac2af5 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/README.md @@ -0,0 +1,78 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-overlay-behavior)_ + + +##Polymer.IronOverlayBehavior + +Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays +on top of other content. It includes an optional backdrop, and can be used to implement a variety +of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once. + +See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html) +for an example. + +### Closing and canceling + +An overlay may be hidden by closing or canceling. The difference between close and cancel is user +intent. Closing generally implies that the user acknowledged the content on the overlay. By default, +it will cancel whenever the user taps outside it or presses the escape key. This behavior is +configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties. +`close()` should be called explicitly by the implementer when the user interacts with a control +in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled' +event. Call `preventDefault` on this event to prevent the overlay from closing. + +### Positioning + +By default the element is sized and positioned to fit and centered inside the window. You can +position and size it manually using CSS. See `Polymer.IronFitBehavior`. + +### Backdrop + +Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is +appended to `` and is of type ``. See its doc page for styling +options. + +In addition, `with-backdrop` will wrap the focus within the content in the light DOM. +Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) +to achieve a different behavior. + +### Limitations + +The element is styled to appear on top of other content by setting its `z-index` property. You +must ensure no element has a stacking context with a higher `z-index` than its parent stacking +context. You should place this element as a child of `` whenever possible. + + + +##<iron-overlay-backdrop> + +`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a +singleton. + +### Styling + +The following custom properties and mixins are available for styling. + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-overlay-backdrop-background-color` | Backdrop background color | #000 | +| `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6 | +| `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {} | +| `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {} | + + diff --git a/static/bower_components/iron-overlay-behavior/bower.json b/static/bower_components/iron-overlay-behavior/bower.json new file mode 100644 index 00000000..2637d8fa --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/bower.json @@ -0,0 +1,37 @@ +{ + "name": "iron-overlay-behavior", + "version": "1.10.3", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Provides a behavior for making an element an overlay", + "private": true, + "main": "iron-overlay-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior", + "overlay" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-overlay-behavior.git" + }, + "dependencies": { + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-overlay-behavior/demo/index.html b/static/bower_components/iron-overlay-behavior/demo/index.html new file mode 100644 index 00000000..4933bf7d --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/demo/index.html @@ -0,0 +1,188 @@ + + + + + + + simple-overlay demo + + + + + + + + + + + + + + + + + + +

    An element with IronOverlayBehavior can be opened, closed, toggled.

    + + + + +

    Use with-backdrop to add a backdrop to your overlay. Tabbing will be trapped within the overlay.

    + + + + +

    Use restore-focus-on-close to return the focus to the element that opened the overlay when it gets closed.

    + + + + +

    The child with autofocus gets focused when opening the overlay.

    + + + + +

    Multiple overlays can be opened.

    + + + + +

    Use always-on-top to keep the overlay on top of others.

    + + + + +

    An element with IronOverlayBehavior can be scrollable or contain scrollable content.

    + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/demo/simple-overlay.html b/static/bower_components/iron-overlay-behavior/demo/simple-overlay.html new file mode 100644 index 00000000..047f0477 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/demo/simple-overlay.html @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/index.html b/static/bower_components/iron-overlay-behavior/index.html new file mode 100644 index 00000000..d69e3044 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-overlay-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/iron-focusables-helper.html b/static/bower_components/iron-overlay-behavior/iron-focusables-helper.html new file mode 100644 index 00000000..084ad7d2 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/iron-focusables-helper.html @@ -0,0 +1,220 @@ + + + + + diff --git a/static/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html b/static/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html new file mode 100644 index 00000000..432a57e1 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/iron-overlay-behavior.html b/static/bower_components/iron-overlay-behavior/iron-overlay-behavior.html new file mode 100644 index 00000000..ae085c53 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/iron-overlay-behavior.html @@ -0,0 +1,637 @@ + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/iron-overlay-manager.html b/static/bower_components/iron-overlay-behavior/iron-overlay-manager.html new file mode 100644 index 00000000..4ae388ee --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/iron-overlay-manager.html @@ -0,0 +1,365 @@ + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/index.html b/static/bower_components/iron-overlay-behavior/test/index.html new file mode 100644 index 00000000..2dac121a --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/index.html @@ -0,0 +1,33 @@ + + + iron-overlay-behavior tests + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/iron-focusables-helper.html b/static/bower_components/iron-overlay-behavior/test/iron-focusables-helper.html new file mode 100644 index 00000000..a400b4c5 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/iron-focusables-helper.html @@ -0,0 +1,182 @@ + + + + + + + iron-focusables-helper tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/iron-overlay-backdrop.html b/static/bower_components/iron-overlay-behavior/test/iron-overlay-backdrop.html new file mode 100644 index 00000000..89c2e9af --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/iron-overlay-backdrop.html @@ -0,0 +1,85 @@ + + + + + + + iron-overlay-backdrop tests + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html b/static/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html new file mode 100644 index 00000000..f6c3621a --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html @@ -0,0 +1,1282 @@ + + + + + + + iron-overlay-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/test-buttons-wrapper.html b/static/bower_components/iron-overlay-behavior/test/test-buttons-wrapper.html new file mode 100644 index 00000000..669b8ab5 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/test-buttons-wrapper.html @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/test-buttons.html b/static/bower_components/iron-overlay-behavior/test/test-buttons.html new file mode 100644 index 00000000..05434a01 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/test-buttons.html @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/test-menu-button.html b/static/bower_components/iron-overlay-behavior/test/test-menu-button.html new file mode 100644 index 00000000..24c78d90 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/test-menu-button.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/test-overlay.html b/static/bower_components/iron-overlay-behavior/test/test-overlay.html new file mode 100644 index 00000000..6b8b32b2 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/test-overlay.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-overlay-behavior/test/test-overlay2.html b/static/bower_components/iron-overlay-behavior/test/test-overlay2.html new file mode 100644 index 00000000..23eac8e0 --- /dev/null +++ b/static/bower_components/iron-overlay-behavior/test/test-overlay2.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..b890b594 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-resizable-behavior/.gitignore b/static/bower_components/iron-resizable-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-resizable-behavior/.travis.yml b/static/bower_components/iron-resizable-behavior/.travis.yml new file mode 100644 index 00000000..c3d2acac --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: Bsp8pa19FCij3Eee0P5eOE8ZrbylrYL99R9EIxH6rcDH+rxMhK0BIfSiXTPSFRk2iqJp++RIZN8kUu5GddetiXreRZDtnhXBA2QoYteIAS8Hzy9u2EggqI0UdGqbCiFHDVD/rEQyhSPiIfWHGCg/Moeo9J2k/eC2w6I8I9C15Zw= + - secure: j9xIW/banUkkNaLrWVGcTsasAp64zEmZJQO+eY8ExINx3uLbDh5h6Foc7xWhJ4Yu7aey3+nH5BWKYimtPTYoXUD2nIWU31yBNbqU/+G6vIppDbgPHMRcVnRiO7YZ0yW1JunvKs+1lOPhOw4ibztJjGkQ2ZK9q6ZSJvQKRbo6Au0= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/iron-resizable-behavior/CONTRIBUTING.md b/static/bower_components/iron-resizable-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-resizable-behavior/README.md b/static/bower_components/iron-resizable-behavior/README.md new file mode 100644 index 00000000..2f37628c --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/README.md @@ -0,0 +1,36 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-resizable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-resizable-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-resizable-behavior)_ + + +##Polymer.IronResizableBehavior + +`IronResizableBehavior` is a behavior that can be used in Polymer elements to +coordinate the flow of resize events between "resizers" (elements that control the +size or hidden state of their children) and "resizables" (elements that need to be +notified when they are resized or un-hidden by their parents in order to take +action on their new measurements). + +Elements that perform measurement should add the `IronResizableBehavior` behavior to +their element definition and listen for the `iron-resize` event on themselves. +This event will be fired when they become showing after having been hidden, +when they are resized explicitly by another resizable, or when the window has been +resized. + +Note, the `iron-resize` event is non-bubbling. + + diff --git a/static/bower_components/iron-resizable-behavior/bower.json b/static/bower_components/iron-resizable-behavior/bower.json new file mode 100644 index 00000000..77d19684 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-resizable-behavior", + "version": "1.0.5", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Coordinates the flow of resizeable elements", + "private": true, + "main": "iron-resizable-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-resizable-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/iron-resizable-behavior/demo/index.html b/static/bower_components/iron-resizable-behavior/demo/index.html new file mode 100644 index 00000000..2896c50d --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/demo/index.html @@ -0,0 +1,29 @@ + + + + + + + iron-resizable-behavior demo + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/demo/src/x-app.html b/static/bower_components/iron-resizable-behavior/demo/src/x-app.html new file mode 100644 index 00000000..c4bfa67f --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/demo/src/x-app.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/index.html b/static/bower_components/iron-resizable-behavior/index.html new file mode 100644 index 00000000..b9b88095 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/index.html @@ -0,0 +1,25 @@ + + + + + + + iron-resizable-behavior + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/iron-resizable-behavior.html b/static/bower_components/iron-resizable-behavior/iron-resizable-behavior.html new file mode 100644 index 00000000..b6a0dc29 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/iron-resizable-behavior.html @@ -0,0 +1,195 @@ + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/test/basic.html b/static/bower_components/iron-resizable-behavior/test/basic.html new file mode 100644 index 00000000..d3183c02 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/test/basic.html @@ -0,0 +1,223 @@ + + + + + + + iron-resizable-behavior tests + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/test/index.html b/static/bower_components/iron-resizable-behavior/test/index.html new file mode 100644 index 00000000..fa83bf6e --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/test/index.html @@ -0,0 +1,29 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html b/static/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html new file mode 100644 index 00000000..91490046 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html @@ -0,0 +1,88 @@ + + + + + + + iron-resizable-behavior tests + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-resizable-behavior/test/test-elements.html b/static/bower_components/iron-resizable-behavior/test/test-elements.html new file mode 100644 index 00000000..d70561e1 --- /dev/null +++ b/static/bower_components/iron-resizable-behavior/test/test-elements.html @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/.gitignore b/static/bower_components/iron-scroll-target-behavior/.gitignore new file mode 100644 index 00000000..1eb1fa5e --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/.gitignore @@ -0,0 +1,2 @@ +bower_components + diff --git a/static/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md b/static/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..7b101415 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-scroll-target-behavior/README.md b/static/bower_components/iron-scroll-target-behavior/README.md new file mode 100644 index 00000000..eeb6a6f7 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/README.md @@ -0,0 +1,5 @@ +# iron-scroll-target-behavior + +`Polymer.IronScrollTargetBehavior` allows an element to respond to scroll events from a designated scroll target. + +Elements that consume this behavior can override the `_scrollHandler` method to add logic on the scroll event. \ No newline at end of file diff --git a/static/bower_components/iron-scroll-target-behavior/bower.json b/static/bower_components/iron-scroll-target-behavior/bower.json new file mode 100644 index 00000000..511fd391 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-scroll-target-behavior", + "version": "1.0.0", + "description": "Allows to define a scroller target", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": [ + "iron-scroll-target.html" + ], + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "scroll" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-scroll-target-behavior.git" + }, + "homepage": "https://github.com/PolymerElements/iron-scroll-target-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-scroll-target-behavior/demo/document.html b/static/bower_components/iron-scroll-target-behavior/demo/document.html new file mode 100644 index 00000000..dc46d11b --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/demo/document.html @@ -0,0 +1,38 @@ + + + + + + + iron-scroll-target-behavior using the document scroll + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html b/static/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html new file mode 100644 index 00000000..e7e94606 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html @@ -0,0 +1,50 @@ + + + + + + + iron-scroll-target-behavior using a scrolling region + + + + + + + + + + + + + +
    + +
    + + + diff --git a/static/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html b/static/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html new file mode 100644 index 00000000..80999028 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/index.html b/static/bower_components/iron-scroll-target-behavior/index.html new file mode 100644 index 00000000..e48685ab --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/index.html @@ -0,0 +1,28 @@ + + + + + + + iron-scroll-target-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html b/static/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html new file mode 100644 index 00000000..fd87fc42 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html @@ -0,0 +1,225 @@ + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/test/basic.html b/static/bower_components/iron-scroll-target-behavior/test/basic.html new file mode 100644 index 00000000..1d5396cc --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/test/basic.html @@ -0,0 +1,225 @@ + + + + + + iron-scroll-target-behavior test + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/test/index.html b/static/bower_components/iron-scroll-target-behavior/test/index.html new file mode 100644 index 00000000..dda52096 --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/test/index.html @@ -0,0 +1,30 @@ + + + + + + + + Tests + + + + + + + + + diff --git a/static/bower_components/iron-scroll-target-behavior/test/x-scrollable.html b/static/bower_components/iron-scroll-target-behavior/test/x-scrollable.html new file mode 100644 index 00000000..7c72117b --- /dev/null +++ b/static/bower_components/iron-scroll-target-behavior/test/x-scrollable.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..07a3448a --- /dev/null +++ b/static/bower_components/iron-selector/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-selector/.gitignore b/static/bower_components/iron-selector/.gitignore new file mode 100644 index 00000000..b13058c3 --- /dev/null +++ b/static/bower_components/iron-selector/.gitignore @@ -0,0 +1,2 @@ +bower_components +.DS_Store diff --git a/static/bower_components/iron-selector/.travis.yml b/static/bower_components/iron-selector/.travis.yml new file mode 100644 index 00000000..d1b0332b --- /dev/null +++ b/static/bower_components/iron-selector/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: ltCkwJM0nkTS9WjikyjqBsB5J2hQon4UnVVrINk4y+Vq4v9PQJH3+83nya0jnxilKaeAJs4d2/OS02F9GkqYpsSmDz7OgXPfk0hrHA8UksvvpSALfnukleIAN2YTOcxXJKeNHcfpqCKPk1dGeNQOEM61H+QgTBIyFB3sMugygqs= + - secure: TJuu1WdpFLTaBN/prBafm8Pld/BQCySNuuG1nATbF3fqiOpgehXu8Z5URAz5syUhqZAyEmuRMxvXpEVD/t1jrtaXVwkdCFkkQ4ckkP4gTIeSGA/Puw8sveB2q7QAqXyTmeFkocNlh8fxV+B07o0SPWdhcvdZnDVU9VrpSqL+92M= +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" +dist: trusty diff --git a/static/bower_components/iron-selector/CONTRIBUTING.md b/static/bower_components/iron-selector/CONTRIBUTING.md new file mode 100644 index 00000000..f147978a --- /dev/null +++ b/static/bower_components/iron-selector/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-selector/README.md b/static/bower_components/iron-selector/README.md new file mode 100644 index 00000000..9d2ef310 --- /dev/null +++ b/static/bower_components/iron-selector/README.md @@ -0,0 +1,91 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-selector.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-selector) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-selector)_ + + +##<iron-selector> + + `iron-selector` is an element which can be used to manage a list of elements + that can be selected. Tapping on the item will make the item selected. The `selected` indicates + which item is being selected. The default is to use the index of the item. + + Example: + +```html + +
    Item 1
    +
    Item 2
    +
    Item 3
    +
    +``` + + If you want to use the attribute value of an element for `selected` instead of the index, + set `attrForSelected` to the name of the attribute. For example, if you want to select item by + `name`, set `attrForSelected` to `name`. + + Example: + +```html + +
    Foo
    +
    Bar
    +
    Zot
    +
    +``` + + You can specify a default fallback with `fallbackSelection` in case the `selected` attribute does + not match the `attrForSelected` attribute of any elements. + + Example: + +```html + +
    Foo
    +
    Bar
    +
    Default
    +
    +``` + + Note: When the selector is multi, the selection will set to `fallbackSelection` iff + the number of matching elements is zero. + + `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element. + + Example: + +```html + + + ... + + +
    Item 1
    +
    Item 2
    +
    Item 3
    +
    +``` + + + + + + diff --git a/static/bower_components/iron-selector/bower.json b/static/bower_components/iron-selector/bower.json new file mode 100644 index 00000000..8aad3d47 --- /dev/null +++ b/static/bower_components/iron-selector/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-selector", + "version": "1.5.2", + "description": "Manages a set of elements that can be selected", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": "iron-selector.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "selector" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-selector.git" + }, + "homepage": "https://github.com/PolymerElements/iron-selector", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-selector/demo/index.html b/static/bower_components/iron-selector/demo/index.html new file mode 100644 index 00000000..66724a19 --- /dev/null +++ b/static/bower_components/iron-selector/demo/index.html @@ -0,0 +1,101 @@ + + + + + + + iron-selector + + + + + + + + + + + + + + +
    +
    +

    Basic

    +
    + +
    Item 0
    +
    Item 1
    +
    Item 2
    +
    Item 3
    +
    Item 4
    +
    +
    +
    + +
    +

    Multi-select

    +
    + +
    Item 0
    +
    Item 1
    +
    Item 2
    +
    Item 3
    +
    Item 4
    +
    +
    +
    + +
    +

    Example with attr-for-selected

    +
    + +
    Foo
    +
    Bar
    +
    Baz
    +
    Qux
    +
    Quux
    +
    +
    +
    + +
    +

    Example with fallback-selection

    +
    + +
    Foo
    +
    Bar
    +
    Baz
    +
    Qux
    +
    Quux
    +
    Default
    +
    +
    +
    +
    + + + diff --git a/static/bower_components/iron-selector/index.html b/static/bower_components/iron-selector/index.html new file mode 100644 index 00000000..a27840bc --- /dev/null +++ b/static/bower_components/iron-selector/index.html @@ -0,0 +1,28 @@ + + + + + + + iron-selector + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/iron-multi-selectable.html b/static/bower_components/iron-selector/iron-multi-selectable.html new file mode 100644 index 00000000..9993151d --- /dev/null +++ b/static/bower_components/iron-selector/iron-multi-selectable.html @@ -0,0 +1,154 @@ + + + + + + diff --git a/static/bower_components/iron-selector/iron-selectable.html b/static/bower_components/iron-selector/iron-selectable.html new file mode 100644 index 00000000..25cfe91e --- /dev/null +++ b/static/bower_components/iron-selector/iron-selectable.html @@ -0,0 +1,388 @@ + + + + + + diff --git a/static/bower_components/iron-selector/iron-selection.html b/static/bower_components/iron-selector/iron-selection.html new file mode 100644 index 00000000..408ccae9 --- /dev/null +++ b/static/bower_components/iron-selector/iron-selection.html @@ -0,0 +1,119 @@ + + + + + + diff --git a/static/bower_components/iron-selector/iron-selector.html b/static/bower_components/iron-selector/iron-selector.html new file mode 100644 index 00000000..0ecc9fbc --- /dev/null +++ b/static/bower_components/iron-selector/iron-selector.html @@ -0,0 +1,87 @@ + + + + + + + diff --git a/static/bower_components/iron-selector/test/activate-event.html b/static/bower_components/iron-selector/test/activate-event.html new file mode 100644 index 00000000..40aa4fdd --- /dev/null +++ b/static/bower_components/iron-selector/test/activate-event.html @@ -0,0 +1,150 @@ + + + + + + + iron-selector-activate-event + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/attr-for-selected-elements.html b/static/bower_components/iron-selector/test/attr-for-selected-elements.html new file mode 100644 index 00000000..d9e4c4fc --- /dev/null +++ b/static/bower_components/iron-selector/test/attr-for-selected-elements.html @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/static/bower_components/iron-selector/test/attr-for-selected.html b/static/bower_components/iron-selector/test/attr-for-selected.html new file mode 100644 index 00000000..cc0dd148 --- /dev/null +++ b/static/bower_components/iron-selector/test/attr-for-selected.html @@ -0,0 +1,229 @@ + + + + + + + iron-selector attr-for-selected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/basic.html b/static/bower_components/iron-selector/test/basic.html new file mode 100644 index 00000000..08866bb3 --- /dev/null +++ b/static/bower_components/iron-selector/test/basic.html @@ -0,0 +1,263 @@ + + + + + + + iron-selector-basic + + + + + + + + + + + + + + + + + + + +

    + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/content-element.html b/static/bower_components/iron-selector/test/content-element.html new file mode 100644 index 00000000..7d1d6040 --- /dev/null +++ b/static/bower_components/iron-selector/test/content-element.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/content.html b/static/bower_components/iron-selector/test/content.html new file mode 100644 index 00000000..af27cf80 --- /dev/null +++ b/static/bower_components/iron-selector/test/content.html @@ -0,0 +1,169 @@ + + + + + + + iron-selector-content + + + + + + + + + + + + + + + + +
    item0
    +
    item1
    +
    item2
    +
    item3
    +
    + + + item0 +
    + item1 + item2 +
    + item3 +
    + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/excluded-local-names.html b/static/bower_components/iron-selector/test/excluded-local-names.html new file mode 100644 index 00000000..4b8d4257 --- /dev/null +++ b/static/bower_components/iron-selector/test/excluded-local-names.html @@ -0,0 +1,96 @@ + + + + + + + iron-selector-selected-attribute + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/index.html b/static/bower_components/iron-selector/test/index.html new file mode 100644 index 00000000..3cfe559a --- /dev/null +++ b/static/bower_components/iron-selector/test/index.html @@ -0,0 +1,43 @@ + + + + Tests + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/multi.html b/static/bower_components/iron-selector/test/multi.html new file mode 100644 index 00000000..39b70b94 --- /dev/null +++ b/static/bower_components/iron-selector/test/multi.html @@ -0,0 +1,375 @@ + + + + + + + iron-selector-multi + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    vim
    +
    + + + + + + diff --git a/static/bower_components/iron-selector/test/next-previous.html b/static/bower_components/iron-selector/test/next-previous.html new file mode 100644 index 00000000..e161c1b1 --- /dev/null +++ b/static/bower_components/iron-selector/test/next-previous.html @@ -0,0 +1,135 @@ + + + + + + + iron-selector-next-previous + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/numeric-ids.html b/static/bower_components/iron-selector/test/numeric-ids.html new file mode 100644 index 00000000..f8b58242 --- /dev/null +++ b/static/bower_components/iron-selector/test/numeric-ids.html @@ -0,0 +1,73 @@ + + + + + + + iron-selector-numeric-ids + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/selected-attribute.html b/static/bower_components/iron-selector/test/selected-attribute.html new file mode 100644 index 00000000..35e7cece --- /dev/null +++ b/static/bower_components/iron-selector/test/selected-attribute.html @@ -0,0 +1,129 @@ + + + + + + + iron-selector-selected-attribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-selector/test/template-repeat.html b/static/bower_components/iron-selector/test/template-repeat.html new file mode 100644 index 00000000..b1ab6a6f --- /dev/null +++ b/static/bower_components/iron-selector/test/template-repeat.html @@ -0,0 +1,104 @@ + + + + + + + iron-selector-template-repeat + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..a69a2fdc --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/iron-validatable-behavior/.gitignore b/static/bower_components/iron-validatable-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/iron-validatable-behavior/.travis.yml b/static/bower_components/iron-validatable-behavior/.travis.yml new file mode 100644 index 00000000..e4dd52cd --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: AsXK1s4viLG4eumYMxE0bJasVbWrpQ7JaUboMoK4Nzhmunx01udikRRAJifl3nkcc4m2GpzCb4Kmtyh5hxyLA05uE416VzmfDq3dGJKsNAQXbSescSVik63llq4HXAdOvek2eSo5wOVGNHslscIed5K2bJajXfPMIODJyBxo8aE= + - secure: V/H/0+/R8owujbwe3IDbND8v5zs4pWTe0hRCLefjgR9ci2lmNNP54Zb97nOZnLQqynafDSyrngL3+RP5F0fk1dC++cpuxQNKoYPwDFPZ41LAxp5dgtyxkb+J4eWtq0UilWF5thVt4oB1OWwPGtxMmSl+imXXKtq4a4Ov++t2Apo= +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" +dist: trusty diff --git a/static/bower_components/iron-validatable-behavior/CONTRIBUTING.md b/static/bower_components/iron-validatable-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..f147978a --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/iron-validatable-behavior/README.md b/static/bower_components/iron-validatable-behavior/README.md new file mode 100644 index 00000000..6fff76e4 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/README.md @@ -0,0 +1,42 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-validatable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-validatable-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-validatable-behavior)_ + + +##Polymer.IronValidatableBehavior + +`Use Polymer.IronValidatableBehavior` to implement an element that validates user input. +Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input. + +By default, an `` element validates its fields when the user presses the submit button. +To validate a form imperatively, call the form's `validate()` method, which in turn will +call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your +custom element will get a public `validate()`, which +will return the validity of the element, and a corresponding `invalid` attribute, +which can be used for styling. + +To implement the custom validation logic of your element, you must override +the protected `_getValidity()` method of this behaviour, rather than `validate()`. +See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html) +for an example. + +### Accessibility + +Changing the `invalid` property, either manually or by calling `validate()` will update the +`aria-invalid` attribute. + + diff --git a/static/bower_components/iron-validatable-behavior/bower.json b/static/bower_components/iron-validatable-behavior/bower.json new file mode 100644 index 00000000..2ebf2bcb --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-validatable-behavior", + "version": "1.1.1", + "description": "Provides a behavior for an element that validates user input", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": "iron-validatable-behavior.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-validatable-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-validatable-behavior", + "ignore": [], + "dependencies": { + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/iron-validatable-behavior/demo/cats-only.html b/static/bower_components/iron-validatable-behavior/demo/cats-only.html new file mode 100644 index 00000000..83ef9ba6 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/demo/cats-only.html @@ -0,0 +1,46 @@ + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/demo/index.html b/static/bower_components/iron-validatable-behavior/demo/index.html new file mode 100644 index 00000000..84b96a8d --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/demo/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + iron-validatable-behavior demo + + + + + + + + + + + +
    +

    <iron-validatable-behavior>

    + + + +
    + + + + + diff --git a/static/bower_components/iron-validatable-behavior/demo/validatable-input.html b/static/bower_components/iron-validatable-behavior/demo/validatable-input.html new file mode 100644 index 00000000..19cf4775 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/demo/validatable-input.html @@ -0,0 +1,46 @@ + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/index.html b/static/bower_components/iron-validatable-behavior/index.html new file mode 100644 index 00000000..cfaa5b17 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-validatable-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/iron-validatable-behavior.html b/static/bower_components/iron-validatable-behavior/iron-validatable-behavior.html new file mode 100644 index 00000000..803731be --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/iron-validatable-behavior.html @@ -0,0 +1,149 @@ + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/test/cats-only.html b/static/bower_components/iron-validatable-behavior/test/cats-only.html new file mode 100644 index 00000000..f1669936 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/test/cats-only.html @@ -0,0 +1,30 @@ + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/test/dogs-only.html b/static/bower_components/iron-validatable-behavior/test/dogs-only.html new file mode 100644 index 00000000..1b462a41 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/test/dogs-only.html @@ -0,0 +1,30 @@ + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/test/index.html b/static/bower_components/iron-validatable-behavior/test/index.html new file mode 100644 index 00000000..605c95ad --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/test/index.html @@ -0,0 +1,32 @@ + + + iron-validatable-behavior tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html b/static/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html new file mode 100644 index 00000000..a8040ef4 --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html @@ -0,0 +1,88 @@ + + + + + + iron-validatable-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/iron-validatable-behavior/test/test-validatable.html b/static/bower_components/iron-validatable-behavior/test/test-validatable.html new file mode 100644 index 00000000..c4af269d --- /dev/null +++ b/static/bower_components/iron-validatable-behavior/test/test-validatable.html @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/static/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md b/static/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..08943a1e --- /dev/null +++ b/static/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/neon-animation/.gitignore b/static/bower_components/neon-animation/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/neon-animation/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/neon-animation/.travis.yml b/static/bower_components/neon-animation/.travis.yml new file mode 100644 index 00000000..ff26525f --- /dev/null +++ b/static/bower_components/neon-animation/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +env: + global: + - secure: coZBjQTrTsejOS2utVzo0hhyYRF40H2KoN30G44tRxVKV/0orSm1HJbvG2YDb/tmAFtEObJmNlYonu1I3G9RVncn9y69nRf8BjLHrpOIhNvesug7kPUuprj5KRoLo9O0UyIYmUh6i4YGt1aAeR/Wq/XVifSNIXnAVguzntbSmqvWJdqj8+FHmNzyo5269+tnOzTruXByrUcSZnvNgHjCYFZOY00a29cyK6fTdd0Qbzi9cvhEDfx1j6uXzYah7bdA8caunW1HvxwI+jiV8yEVySB7eku+SHA+8JJUIIZEL1iCASAqqVbTUoOxtfgbTXQRJdVAuDNj1J+AqFVtuJpJl4xvX97dF9FVQvgyLW9fpeb7rojdU0TSazBpVi7LLvocQjofp8bbAtbJ8Z0BN+/3DgM33uDTF8DeBGj2WmR+49F2oPnYh7FwjhbiOVqkOKyolqrRpK0PYczVdHusR6+cONkGcLzO9G5nakWzE9diJSW+nw9qD3bVL99ZzHK+6U7+R75KJdxj0V7VA1lkvWRlchxXrpsEoM0AQEUf97LsvkTpXPQ4Wf9XkCxFRAicSTeDijLCPy3ti0L6D6x9sBZwV5d3ODnkdxCAy2aY7g2YEWuuBDZC+W1ggQ3Xe705GwbBNk22HikA6XOVX9lb3xm7SnenfDGkFhNDzRijoGg96jU= + - secure: hJ6VMaJqDh5HPdeERIqoOcdWZJTAOTeS/Lr6FLCWEOOvYPxwRi/L1pKbVuYf2ugeS2Z0TEvAS7RdfjRuC+NGFhsmpnpBlxAyJhVKcXrhHKVtoFK04xaCD2wDMkPaZiDZQRGF/H6/PyuoB4Tqss3aN/DC9eSMwY9HFfoeYRIwiJeb8Kq09pBtvoxU151VQt+jlmyCVw7rhNDTAazaCGKicgvbAtxSJ6xNswNfqOrtCYB+WW5CpUE+qqTjjbistSQJu3hjk2UwFMLJZXtJWdkcD88vNdHy3mtNZQNtE8x+ckNVqgJ98DyAN7HLUU0GvzTOiOGFfwr+bpl6Td8klR2YoQOW4ypluAetcDN9X7tKOxDQaaI8AyPLXPWi9JcESEGAeLzpfkWZ6clrQmqfLdVDsqYKPldF9m7Ozjdhq40r3qFdQAdEI29dBOKOalaZXgWnvU2wu5FBtWnBMSk89zOYC5wGR0E+wOMMMRu90LuMQY40Myhqso5iUFL5qhrn41I8ZfFi0EyOgEeKzYH3zrdo7/msEkCXxI0SKfG1CGSQSOT2luO6Xu6xIuf7qoWYKJiJQ40ObsRKn0cA4GQpNZe/dgKMRH2zzfKW6d2BSAsZGTDJG14XcDi9d/zz7djgboMjc/A6sH8L3c8BkbUa4wuyJRNu7VBZQHq5yrnHpxC6SbA= +dist: trusty diff --git a/static/bower_components/neon-animation/CONTRIBUTING.md b/static/bower_components/neon-animation/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/neon-animation/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/neon-animation/README.md b/static/bower_components/neon-animation/README.md new file mode 100644 index 00000000..29c07539 --- /dev/null +++ b/static/bower_components/neon-animation/README.md @@ -0,0 +1,306 @@ +# neon-animation + +`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/). + +*Warning: The API may change.* + +* [A basic animatable element](#basic) +* [Animation configuration](#configuration) + * [Animation types](#configuration-types) + * [Configuration properties](#configuration-properties) + * [Using multiple animations](#configuration-multiple) + * [Running animations encapsulated in children nodes](#configuration-encapsulation) +* [Page transitions](#page-transitions) + * [Shared element animations](#shared-element) + * [Declarative page transitions](#declarative-page) +* [Included animations](#animations) +* [Demos](#demos) + + +## A basic animatable element + +Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation. + +```js +Polymer({ + is: 'my-animatable', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + animationConfig: { + value: function() { + return { + // provided by neon-animation/animations/scale-down-animation.html + name: 'scale-down-animation', + node: this + } + } + } + }, + listeners: { + // this event is fired when the animation finishes + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + animate: function() { + // run scale-down-animation + this.playAnimation(); + }, + _onNeonAnimationFinish: function() { + console.log('animation done!'); + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html) + + +## Animation configuration + + +### Animation types + +An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration. + +```js +Polymer({ + is: 'my-dialog', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + opened: { + type: Boolean + }, + animationConfig: { + value: function() { + return { + 'entry': { + // provided by neon-animation/animations/scale-up-animation.html + name: 'scale-up-animation', + node: this + }, + 'exit': { + // provided by neon-animation/animations/fade-out-animation.html + name: 'fade-out-animation', + node: this + } + } + } + } + }, + listeners: { + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + show: function() { + this.opened = true; + this.style.display = 'inline-block'; + // run scale-up-animation + this.playAnimation('entry'); + }, + hide: function() { + this.opened = false; + // run fade-out-animation + this.playAnimation('exit'); + }, + _onNeonAnimationFinish: function() { + if (!this.opened) { + this.style.display = 'none'; + } + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html) + +You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations: + +```js +properties: { + entryAnimation: { + value: 'scale-up-animation' + }, + exitAnimation: { + value: 'fade-out-animation' + } +} +``` + + +### Configuration properties + +You can pass additional parameters to configure an animation in the animation configuration object. +All animations should accept the following properties: + + * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`. + * `node`: The target node to apply the animation to. Defaults to `this`. + * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The + properties include the following: + * `duration`: The duration of the animation in milliseconds. + * `delay`: The delay before the start of the animation in milliseconds. + * `easing`: A timing function for the animation. Matches the CSS timing function values. + +Animations may define additional configuration properties and they are listed in their documentation. + + +### Using multiple animations + +Set the animation configuration to an array to combine animations, like this: + +```js +animationConfig: { + value: function() { + return { + // fade-in-animation is run with a 50ms delay from slide-down-animation + 'entry': [{ + name: 'slide-down-animation', + node: this + }, { + name: 'fade-in-animation', + node: this, + timing: {delay: 50} + }] + } + } +} +``` + + +### Running animations encapsulated in children nodes + +You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property. + +```js +animationConfig: { + value: function() { + return { + // run fade-in-animation on this, and the entry animation on this.$.myAnimatable + 'entry': [ + {name: 'fade-in-animation', node: this}, + {animatable: this.$.myAnimatable, type: 'entry'} + ] + } + } +} +``` + + +## Page transitions + +*The artist formerly known as ``* + +The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page. + + +### Shared element animations + +Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation. + +In the incoming page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the incoming page defines the 'entry' animation + 'entry': { + name: 'hero-animation', + id: 'hero', + toPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.hero + } + } + } +} +``` + +In the outgoing page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the outgoing page defines the 'exit' animation + 'exit': { + name: 'hero-animation', + id: 'hero', + fromPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.otherHero + } + } + } +} +``` + + +### Declarative page transitions + +For convenience, if you define the `entry-animation` and `exit-animation` attributes on ``, those animations will apply for all page transitions. + +For example: + +```js + + 1 + 2 + 3 + 4 + 5 + +``` + +The new page will slide in from the right, and the old page slide away to the left. + + +## Included animations + +Single element animations: + + * `fade-in-animation` Animates opacity from `0` to `1`; + * `fade-out-animation` Animates opacity from `1` to `0`; + * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`; + * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`; + * `slide-down-animation` Animates transform from `none` to `translateY(100%)`; + * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`; + * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`; + * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`; + * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`; + * `slide-right-animation` Animates transform from `none` to `translateX(100%)`; + * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`; + * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`; + * `transform-animation` Animates a custom transform. + +Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties. + +Shared element animations + + * `hero-animation` Animates an element such that it looks like it scales and transforms from another element. + * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element. + +Group animations + * `cascaded-animation` Applys an animation to an array of elements with a delay between each. + + +## Demos + + * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html) + * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html) + * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width) + * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html) + * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html) diff --git a/static/bower_components/neon-animation/animations/cascaded-animation.html b/static/bower_components/neon-animation/animations/cascaded-animation.html new file mode 100644 index 00000000..53997533 --- /dev/null +++ b/static/bower_components/neon-animation/animations/cascaded-animation.html @@ -0,0 +1,95 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/fade-in-animation.html b/static/bower_components/neon-animation/animations/fade-in-animation.html new file mode 100644 index 00000000..cdb74e30 --- /dev/null +++ b/static/bower_components/neon-animation/animations/fade-in-animation.html @@ -0,0 +1,49 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/fade-out-animation.html b/static/bower_components/neon-animation/animations/fade-out-animation.html new file mode 100644 index 00000000..82cc3997 --- /dev/null +++ b/static/bower_components/neon-animation/animations/fade-out-animation.html @@ -0,0 +1,49 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/hero-animation.html b/static/bower_components/neon-animation/animations/hero-animation.html new file mode 100644 index 00000000..176bee78 --- /dev/null +++ b/static/bower_components/neon-animation/animations/hero-animation.html @@ -0,0 +1,83 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/opaque-animation.html b/static/bower_components/neon-animation/animations/opaque-animation.html new file mode 100644 index 00000000..e3a00725 --- /dev/null +++ b/static/bower_components/neon-animation/animations/opaque-animation.html @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/reverse-ripple-animation.html b/static/bower_components/neon-animation/animations/reverse-ripple-animation.html new file mode 100644 index 00000000..f1f9de96 --- /dev/null +++ b/static/bower_components/neon-animation/animations/reverse-ripple-animation.html @@ -0,0 +1,87 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/ripple-animation.html b/static/bower_components/neon-animation/animations/ripple-animation.html new file mode 100644 index 00000000..d97186c3 --- /dev/null +++ b/static/bower_components/neon-animation/animations/ripple-animation.html @@ -0,0 +1,93 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/scale-down-animation.html b/static/bower_components/neon-animation/animations/scale-down-animation.html new file mode 100644 index 00000000..1dcb1713 --- /dev/null +++ b/static/bower_components/neon-animation/animations/scale-down-animation.html @@ -0,0 +1,65 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/scale-up-animation.html b/static/bower_components/neon-animation/animations/scale-up-animation.html new file mode 100644 index 00000000..42ec3f32 --- /dev/null +++ b/static/bower_components/neon-animation/animations/scale-up-animation.html @@ -0,0 +1,65 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-down-animation.html b/static/bower_components/neon-animation/animations/slide-down-animation.html new file mode 100644 index 00000000..9db28dd1 --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-down-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-from-bottom-animation.html b/static/bower_components/neon-animation/animations/slide-from-bottom-animation.html new file mode 100644 index 00000000..d1156e93 --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-from-bottom-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-from-left-animation.html b/static/bower_components/neon-animation/animations/slide-from-left-animation.html new file mode 100644 index 00000000..5386c9b0 --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-from-left-animation.html @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-from-right-animation.html b/static/bower_components/neon-animation/animations/slide-from-right-animation.html new file mode 100644 index 00000000..2afb591f --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-from-right-animation.html @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-from-top-animation.html b/static/bower_components/neon-animation/animations/slide-from-top-animation.html new file mode 100644 index 00000000..c0a48811 --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-from-top-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-left-animation.html b/static/bower_components/neon-animation/animations/slide-left-animation.html new file mode 100644 index 00000000..da80a6bd --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-left-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-right-animation.html b/static/bower_components/neon-animation/animations/slide-right-animation.html new file mode 100644 index 00000000..99b5794e --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-right-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/slide-up-animation.html b/static/bower_components/neon-animation/animations/slide-up-animation.html new file mode 100644 index 00000000..6464e78e --- /dev/null +++ b/static/bower_components/neon-animation/animations/slide-up-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/animations/transform-animation.html b/static/bower_components/neon-animation/animations/transform-animation.html new file mode 100644 index 00000000..2e504442 --- /dev/null +++ b/static/bower_components/neon-animation/animations/transform-animation.html @@ -0,0 +1,70 @@ + + + + + + + + + diff --git a/static/bower_components/neon-animation/bower.json b/static/bower_components/neon-animation/bower.json new file mode 100644 index 00000000..8af634ef --- /dev/null +++ b/static/bower_components/neon-animation/bower.json @@ -0,0 +1,52 @@ +{ + "name": "neon-animation", + "description": "A system for animating Polymer-based web components", + "version": "1.2.4", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "web-animations" + ], + "main": [ + "neon-animated-pages.html", + "neon-animatable-behavior.html", + "neon-animation-behavior.html", + "neon-animation-runner-behavior.html", + "neon-shared-element-animatable-behavior.html", + "neon-shared-element-animation-behavior.html", + "neon-animatable.html", + "neon-animations.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/neon-animation" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/neon-animation", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "web-animations-js": "web-animations/web-animations-js#^2.2.0" + }, + "devDependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0" + } +} diff --git a/static/bower_components/neon-animation/demo/card/index.html b/static/bower_components/neon-animation/demo/card/index.html new file mode 100644 index 00000000..44993465 --- /dev/null +++ b/static/bower_components/neon-animation/demo/card/index.html @@ -0,0 +1,166 @@ + + + + + neon-animated-pages demo: card + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/card/x-card.html b/static/bower_components/neon-animation/demo/card/x-card.html new file mode 100644 index 00000000..92885d29 --- /dev/null +++ b/static/bower_components/neon-animation/demo/card/x-card.html @@ -0,0 +1,94 @@ + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/card/x-cards-list.html b/static/bower_components/neon-animation/demo/card/x-cards-list.html new file mode 100644 index 00000000..b817698f --- /dev/null +++ b/static/bower_components/neon-animation/demo/card/x-cards-list.html @@ -0,0 +1,75 @@ + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/declarative/index.html b/static/bower_components/neon-animation/demo/declarative/index.html new file mode 100644 index 00000000..26ba53ff --- /dev/null +++ b/static/bower_components/neon-animation/demo/declarative/index.html @@ -0,0 +1,132 @@ + + + + + neon-animated-pages demo: declarative + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/doc/index.html b/static/bower_components/neon-animation/demo/doc/index.html new file mode 100644 index 00000000..8b3875e7 --- /dev/null +++ b/static/bower_components/neon-animation/demo/doc/index.html @@ -0,0 +1,70 @@ + + + + + neon-animation demo: basic + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/doc/my-animatable.html b/static/bower_components/neon-animation/demo/doc/my-animatable.html new file mode 100644 index 00000000..5063f74b --- /dev/null +++ b/static/bower_components/neon-animation/demo/doc/my-animatable.html @@ -0,0 +1,68 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/doc/my-dialog.html b/static/bower_components/neon-animation/demo/doc/my-dialog.html new file mode 100644 index 00000000..bd3344c0 --- /dev/null +++ b/static/bower_components/neon-animation/demo/doc/my-dialog.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/dropdown/animated-dropdown.html b/static/bower_components/neon-animation/demo/dropdown/animated-dropdown.html new file mode 100644 index 00000000..9a61530f --- /dev/null +++ b/static/bower_components/neon-animation/demo/dropdown/animated-dropdown.html @@ -0,0 +1,90 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/dropdown/index.html b/static/bower_components/neon-animation/demo/dropdown/index.html new file mode 100644 index 00000000..b238474c --- /dev/null +++ b/static/bower_components/neon-animation/demo/dropdown/index.html @@ -0,0 +1,54 @@ + + + + + neon-animated-pages demo: dropdown + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/grid/animated-grid.html b/static/bower_components/neon-animation/demo/grid/animated-grid.html new file mode 100644 index 00000000..a2689364 --- /dev/null +++ b/static/bower_components/neon-animation/demo/grid/animated-grid.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html b/static/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html new file mode 100644 index 00000000..63d35bbf --- /dev/null +++ b/static/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/grid/index.html b/static/bower_components/neon-animation/demo/grid/index.html new file mode 100644 index 00000000..b102dba4 --- /dev/null +++ b/static/bower_components/neon-animation/demo/grid/index.html @@ -0,0 +1,64 @@ + + + + + neon-animated-pages demo: grid + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/index.html b/static/bower_components/neon-animation/demo/index.html new file mode 100644 index 00000000..1e4e1204 --- /dev/null +++ b/static/bower_components/neon-animation/demo/index.html @@ -0,0 +1,45 @@ + + + + + neon-animated pages demo + + + + + + + + + + +
    +
    +

    Sample demos

    + +
    +
    + + diff --git a/static/bower_components/neon-animation/demo/list/full-view.html b/static/bower_components/neon-animation/demo/list/full-view.html new file mode 100644 index 00000000..565618c2 --- /dev/null +++ b/static/bower_components/neon-animation/demo/list/full-view.html @@ -0,0 +1,118 @@ + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/list/index.html b/static/bower_components/neon-animation/demo/list/index.html new file mode 100644 index 00000000..eabb02e5 --- /dev/null +++ b/static/bower_components/neon-animation/demo/list/index.html @@ -0,0 +1,35 @@ + + + + + neon-animated-pages demo: list + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/list/list-demo.html b/static/bower_components/neon-animation/demo/list/list-demo.html new file mode 100644 index 00000000..45808c8c --- /dev/null +++ b/static/bower_components/neon-animation/demo/list/list-demo.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/list/list-view.html b/static/bower_components/neon-animation/demo/list/list-view.html new file mode 100644 index 00000000..ddb05502 --- /dev/null +++ b/static/bower_components/neon-animation/demo/list/list-view.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/load/animated-grid.html b/static/bower_components/neon-animation/demo/load/animated-grid.html new file mode 100644 index 00000000..c1d52c1a --- /dev/null +++ b/static/bower_components/neon-animation/demo/load/animated-grid.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/load/full-page.html b/static/bower_components/neon-animation/demo/load/full-page.html new file mode 100644 index 00000000..61a11bd7 --- /dev/null +++ b/static/bower_components/neon-animation/demo/load/full-page.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/load/index.html b/static/bower_components/neon-animation/demo/load/index.html new file mode 100644 index 00000000..54c8d68a --- /dev/null +++ b/static/bower_components/neon-animation/demo/load/index.html @@ -0,0 +1,48 @@ + + + + + neon-animated-pages demo: load + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/reprojection/animated-grid.html b/static/bower_components/neon-animation/demo/reprojection/animated-grid.html new file mode 100644 index 00000000..f1244b44 --- /dev/null +++ b/static/bower_components/neon-animation/demo/reprojection/animated-grid.html @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html b/static/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html new file mode 100644 index 00000000..83b8a917 --- /dev/null +++ b/static/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html @@ -0,0 +1,120 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/reprojection/index.html b/static/bower_components/neon-animation/demo/reprojection/index.html new file mode 100644 index 00000000..591d63c6 --- /dev/null +++ b/static/bower_components/neon-animation/demo/reprojection/index.html @@ -0,0 +1,63 @@ + + + + + neon-animated-pages demo: grid + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/reprojection/reprojected-pages.html b/static/bower_components/neon-animation/demo/reprojection/reprojected-pages.html new file mode 100644 index 00000000..e71f2e05 --- /dev/null +++ b/static/bower_components/neon-animation/demo/reprojection/reprojected-pages.html @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/shared-styles.html b/static/bower_components/neon-animation/demo/shared-styles.html new file mode 100644 index 00000000..4e48c8c4 --- /dev/null +++ b/static/bower_components/neon-animation/demo/shared-styles.html @@ -0,0 +1,47 @@ + + + + + diff --git a/static/bower_components/neon-animation/demo/tiles/circles-page.html b/static/bower_components/neon-animation/demo/tiles/circles-page.html new file mode 100644 index 00000000..70a4a752 --- /dev/null +++ b/static/bower_components/neon-animation/demo/tiles/circles-page.html @@ -0,0 +1,107 @@ + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/tiles/index.html b/static/bower_components/neon-animation/demo/tiles/index.html new file mode 100644 index 00000000..f509f0b5 --- /dev/null +++ b/static/bower_components/neon-animation/demo/tiles/index.html @@ -0,0 +1,70 @@ + + + + + neon-animated-pages demo: tiles + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/demo/tiles/squares-page.html b/static/bower_components/neon-animation/demo/tiles/squares-page.html new file mode 100644 index 00000000..52fe7e18 --- /dev/null +++ b/static/bower_components/neon-animation/demo/tiles/squares-page.html @@ -0,0 +1,100 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/guides/neon-animation.md b/static/bower_components/neon-animation/guides/neon-animation.md new file mode 100644 index 00000000..69727b86 --- /dev/null +++ b/static/bower_components/neon-animation/guides/neon-animation.md @@ -0,0 +1,314 @@ +--- +title: neon-animation +summary: "A short guide to neon-animation and neon-animated-pages" +tags: ['animation','core-animated-pages'] +elements: ['neon-animation','neon-animated-pages'] +updated: 2015-05-26 +--- + +# neon-animation + +`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/). + +*Warning: The API may change.* + +* [A basic animatable element](#basic) +* [Animation configuration](#configuration) + * [Animation types](#configuration-types) + * [Configuration properties](#configuration-properties) + * [Using multiple animations](#configuration-multiple) + * [Running animations encapsulated in children nodes](#configuration-encapsulation) +* [Page transitions](#page-transitions) + * [Shared element animations](#shared-element) + * [Declarative page transitions](#declarative-page) +* [Included animations](#animations) +* [Demos](#demos) + + +## A basic animatable element + +Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation. + +```js +Polymer({ + is: 'my-animatable', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + animationConfig: { + value: function() { + return { + // provided by neon-animation/animations/scale-down-animation.html + name: 'scale-down-animation', + node: this + } + } + } + }, + listeners: { + // this event is fired when the animation finishes + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + animate: function() { + // run scale-down-animation + this.playAnimation(); + }, + _onNeonAnimationFinish: function() { + console.log('animation done!'); + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html) + + +## Animation configuration + + +### Animation types + +An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration. + +```js +Polymer({ + is: 'my-dialog', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + opened: { + type: Boolean + }, + animationConfig: { + value: function() { + return { + 'entry': { + // provided by neon-animation/animations/scale-up-animation.html + name: 'scale-up-animation', + node: this + }, + 'exit': { + // provided by neon-animation-animations/fade-out-animation.html + name: 'fade-out-animation', + node: this + } + } + } + } + }, + listeners: { + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + show: function() { + this.opened = true; + this.style.display = 'inline-block'; + // run scale-up-animation + this.playAnimation('entry'); + }, + hide: function() { + this.opened = false; + // run fade-out-animation + this.playAnimation('exit'); + }, + _onNeonAnimationFinish: function() { + if (!this.opened) { + this.style.display = 'none'; + } + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html) + +You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations: + +```js +properties: { + entryAnimation: { + value: 'scale-up-animation' + }, + exitAnimation: { + value: 'fade-out-animation' + } +} +``` + + +### Configuration properties + +You can pass additional parameters to configure an animation in the animation configuration object. +All animations should accept the following properties: + + * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`. + * `node`: The target node to apply the animation to. Defaults to `this`. + * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The + properties include the following: + * `duration`: The duration of the animation in milliseconds. + * `delay`: The delay before the start of the animation in milliseconds. + * `easing`: A timing function for the animation. Matches the CSS timing function values. + +Animations may define additional configuration properties and they are listed in their documentation. + + +### Using multiple animations + +Set the animation configuration to an array to combine animations, like this: + +```js +animationConfig: { + value: function() { + return { + // fade-in-animation is run with a 50ms delay from slide-down-animation + 'entry': [{ + name: 'slide-down-animation', + node: this + }, { + name: 'fade-in-animation', + node: this, + timing: {delay: 50} + }] + } + } +} +``` + + +### Running animations encapsulated in children nodes + +You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property. + +```js +animationConfig: { + value: function() { + return { + // run fade-in-animation on this, and the entry animation on this.$.myAnimatable + 'entry': [ + {name: 'fade-in-animation', node: this}, + {animatable: this.$.myAnimatable, type: 'entry'} + ] + } + } +} +``` + + +## Page transitions + +*The artist formerly known as ``* + +The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page. + + +### Shared element animations + +Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation. + +In the incoming page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the incoming page defines the 'entry' animation + 'entry': { + name: 'hero-animation', + id: 'hero', + toPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.hero + } + } + } +} +``` + +In the outgoing page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the outgoing page defines the 'exit' animation + 'exit': { + name: 'hero-animation', + id: 'hero', + fromPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.otherHero + } + } + } +} +``` + + +### Declarative page transitions + +For convenience, if you define the `entry-animation` and `exit-animation` attributes on ``, those animations will apply for all page transitions. + +For example: + +```js + + 1 + 2 + 3 + 4 + 5 + +``` + +The new page will slide in from the right, and the old page slide away to the left. + + +## Included animations + +Single element animations: + + * `fade-in-animation` Animates opacity from `0` to `1`; + * `fade-out-animation` Animates opacity from `1` to `0`; + * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`; + * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`; + * `slide-down-animation` Animates transform from `none` to `translateY(100%)`; + * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`; + * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`; + * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`; + * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`; + * `slide-right-animation` Animates transform from `none` to `translateX(100%)`; + * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`; + * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`; + * `transform-animation` Animates a custom transform. + +Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties. + +Shared element animations + + * `hero-animation` Animates an element such that it looks like it scales and transforms from another element. + * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element. + +Group animations + * `cascaded-animation` Applys an animation to an array of elements with a delay between each. + + +## Demos + + * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html) + * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html) + * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width) + * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html) + * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html) diff --git a/static/bower_components/neon-animation/index.html b/static/bower_components/neon-animation/index.html new file mode 100644 index 00000000..6f5feedf --- /dev/null +++ b/static/bower_components/neon-animation/index.html @@ -0,0 +1,30 @@ + + + + + + + + + neon-animation + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/neon-animatable-behavior.html b/static/bower_components/neon-animation/neon-animatable-behavior.html new file mode 100644 index 00000000..dd58a6cf --- /dev/null +++ b/static/bower_components/neon-animation/neon-animatable-behavior.html @@ -0,0 +1,150 @@ + + + + + diff --git a/static/bower_components/neon-animation/neon-animatable.html b/static/bower_components/neon-animation/neon-animatable.html new file mode 100644 index 00000000..267ae5ed --- /dev/null +++ b/static/bower_components/neon-animation/neon-animatable.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/neon-animated-pages.html b/static/bower_components/neon-animation/neon-animated-pages.html new file mode 100644 index 00000000..983cb471 --- /dev/null +++ b/static/bower_components/neon-animation/neon-animated-pages.html @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/neon-animation-behavior.html b/static/bower_components/neon-animation/neon-animation-behavior.html new file mode 100644 index 00000000..6939d342 --- /dev/null +++ b/static/bower_components/neon-animation/neon-animation-behavior.html @@ -0,0 +1,86 @@ + + + + + + diff --git a/static/bower_components/neon-animation/neon-animation-runner-behavior.html b/static/bower_components/neon-animation/neon-animation-runner-behavior.html new file mode 100644 index 00000000..67c11b68 --- /dev/null +++ b/static/bower_components/neon-animation/neon-animation-runner-behavior.html @@ -0,0 +1,129 @@ + + + + + + diff --git a/static/bower_components/neon-animation/neon-animation.html b/static/bower_components/neon-animation/neon-animation.html new file mode 100644 index 00000000..da645048 --- /dev/null +++ b/static/bower_components/neon-animation/neon-animation.html @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/static/bower_components/neon-animation/neon-animations.html b/static/bower_components/neon-animation/neon-animations.html new file mode 100644 index 00000000..67c4df4c --- /dev/null +++ b/static/bower_components/neon-animation/neon-animations.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/neon-shared-element-animatable-behavior.html b/static/bower_components/neon-animation/neon-shared-element-animatable-behavior.html new file mode 100644 index 00000000..e63173d3 --- /dev/null +++ b/static/bower_components/neon-animation/neon-shared-element-animatable-behavior.html @@ -0,0 +1,43 @@ + + + + + + diff --git a/static/bower_components/neon-animation/neon-shared-element-animation-behavior.html b/static/bower_components/neon-animation/neon-shared-element-animation-behavior.html new file mode 100644 index 00000000..7787615b --- /dev/null +++ b/static/bower_components/neon-animation/neon-shared-element-animation-behavior.html @@ -0,0 +1,72 @@ + + + + + + diff --git a/static/bower_components/neon-animation/test/index.html b/static/bower_components/neon-animation/test/index.html new file mode 100644 index 00000000..81555a2b --- /dev/null +++ b/static/bower_components/neon-animation/test/index.html @@ -0,0 +1,28 @@ + + + + neon-animation tests + + + + + + + diff --git a/static/bower_components/neon-animation/test/neon-animated-pages-descendant-selection.html b/static/bower_components/neon-animation/test/neon-animated-pages-descendant-selection.html new file mode 100644 index 00000000..0904a395 --- /dev/null +++ b/static/bower_components/neon-animation/test/neon-animated-pages-descendant-selection.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/test/neon-animated-pages-lazy.html b/static/bower_components/neon-animation/test/neon-animated-pages-lazy.html new file mode 100644 index 00000000..86ef1988 --- /dev/null +++ b/static/bower_components/neon-animation/test/neon-animated-pages-lazy.html @@ -0,0 +1,73 @@ + + + + + + neon-animated-pages tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/test/neon-animated-pages.html b/static/bower_components/neon-animation/test/neon-animated-pages.html new file mode 100644 index 00000000..98220b67 --- /dev/null +++ b/static/bower_components/neon-animation/test/neon-animated-pages.html @@ -0,0 +1,101 @@ + + + + + + neon-animated-pages tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/test/test-resizable-pages.html b/static/bower_components/neon-animation/test/test-resizable-pages.html new file mode 100644 index 00000000..7330a1ff --- /dev/null +++ b/static/bower_components/neon-animation/test/test-resizable-pages.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/neon-animation/web-animations.html b/static/bower_components/neon-animation/web-animations.html new file mode 100644 index 00000000..c8718540 --- /dev/null +++ b/static/bower_components/neon-animation/web-animations.html @@ -0,0 +1,11 @@ + + + diff --git a/static/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..0a145b76 --- /dev/null +++ b/static/bower_components/paper-behaviors/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-behaviors/.gitignore b/static/bower_components/paper-behaviors/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-behaviors/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-behaviors/.travis.yml b/static/bower_components/paper-behaviors/.travis.yml new file mode 100644 index 00000000..49d73573 --- /dev/null +++ b/static/bower_components/paper-behaviors/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: TYkyKHfqK31bPGX+x388nfvBWtoGhD7lwYYLdunZi2pwvR2N3ngzblklwK/ADgYVDC0y+lZaJsrODvQW2cUxVdQP8p+DifXoOig5b8S2H7HFFFf83gaXv0SJ50rIaKLQmXfBdI0ICFzeQOeJ9TlKvtF3/yn/LDpYftuzgbXIyp4= + - secure: eUlJabqBW3P+MRieHvRcr446jhpV2YYRfZasOh3zh2vkAVsi5R5mPJXVBwk6xP4tdNPbRo0M3boKnMHjoK8AgFolxQwXpVaoOt/oiFUsBFIUNcwKnSdfnadQa6ON5VoDmPd9UhDwES/gq7i906XkV/1jwRKKhPkx1DCyCBfuTvM= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/paper-behaviors/CONTRIBUTING.md b/static/bower_components/paper-behaviors/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-behaviors/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-behaviors/README.md b/static/bower_components/paper-behaviors/README.md new file mode 100644 index 00000000..43475db7 --- /dev/null +++ b/static/bower_components/paper-behaviors/README.md @@ -0,0 +1,44 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-behaviors) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-behaviors)_ + + + + +##Polymer.PaperCheckedElementBehavior + +Use `Polymer.PaperCheckedElementBehavior` to implement a custom element +that has a `checked` property similar to `Polymer.IronCheckedElementBehavior` +and is compatible with having a ripple effect. + + + +##Polymer.PaperInkyFocusBehavior + +`Polymer.PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus. + + + +##Polymer.PaperRippleBehavior + +`Polymer.PaperRippleBehavior` dynamically implements a ripple +when the element has focus via pointer or keyboard. + +NOTE: This behavior is intended to be used in conjunction with and after +`Polymer.IronButtonState` and `Polymer.IronControlState`. + + diff --git a/static/bower_components/paper-behaviors/bower.json b/static/bower_components/paper-behaviors/bower.json new file mode 100644 index 00000000..84393684 --- /dev/null +++ b/static/bower_components/paper-behaviors/bower.json @@ -0,0 +1,42 @@ +{ + "name": "paper-behaviors", + "version": "1.0.12", + "description": "Common behaviors across the paper elements", + "authors": [ + "The Polymer Authors" + ], + "main": [ + "paper-button-behavior.html", + "paper-checked-element-behavior.html", + "paper-inky-focus-behavior.html" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "behavior" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-behaviors" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-behaviors", + "dependencies": { + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0", + "paper-ripple": "PolymerElements/paper-ripple#^1.0.0", + "polymer": "Polymer/polymer#^1.2.1" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-material": "PolymerElements/paper-material#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/paper-behaviors/demo/index.html b/static/bower_components/paper-behaviors/demo/index.html new file mode 100644 index 00000000..0303fefc --- /dev/null +++ b/static/bower_components/paper-behaviors/demo/index.html @@ -0,0 +1,45 @@ + + + + + + + + + paper-behaviors demo + + + + + + + + + +

    Normal

    + Hello World + +

    Toggles

    + Hello World + +

    Disabled

    + Hello World + +

    Radio button with focus state

    + + + diff --git a/static/bower_components/paper-behaviors/demo/paper-button.html b/static/bower_components/paper-behaviors/demo/paper-button.html new file mode 100644 index 00000000..238bb170 --- /dev/null +++ b/static/bower_components/paper-behaviors/demo/paper-button.html @@ -0,0 +1,64 @@ + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/demo/paper-radio-button.html b/static/bower_components/paper-behaviors/demo/paper-radio-button.html new file mode 100644 index 00000000..b8470860 --- /dev/null +++ b/static/bower_components/paper-behaviors/demo/paper-radio-button.html @@ -0,0 +1,112 @@ + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/index.html b/static/bower_components/paper-behaviors/index.html new file mode 100644 index 00000000..37184eaa --- /dev/null +++ b/static/bower_components/paper-behaviors/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/paper-button-behavior.html b/static/bower_components/paper-behaviors/paper-button-behavior.html new file mode 100644 index 00000000..c4d13302 --- /dev/null +++ b/static/bower_components/paper-behaviors/paper-button-behavior.html @@ -0,0 +1,97 @@ + + + + + + + diff --git a/static/bower_components/paper-behaviors/paper-checked-element-behavior.html b/static/bower_components/paper-behaviors/paper-checked-element-behavior.html new file mode 100644 index 00000000..79812a66 --- /dev/null +++ b/static/bower_components/paper-behaviors/paper-checked-element-behavior.html @@ -0,0 +1,57 @@ + + + + + + + diff --git a/static/bower_components/paper-behaviors/paper-inky-focus-behavior.html b/static/bower_components/paper-behaviors/paper-inky-focus-behavior.html new file mode 100644 index 00000000..3ecb9ac1 --- /dev/null +++ b/static/bower_components/paper-behaviors/paper-inky-focus-behavior.html @@ -0,0 +1,51 @@ + + + + + + + diff --git a/static/bower_components/paper-behaviors/paper-ripple-behavior.html b/static/bower_components/paper-behaviors/paper-ripple-behavior.html new file mode 100644 index 00000000..aaacf34f --- /dev/null +++ b/static/bower_components/paper-behaviors/paper-ripple-behavior.html @@ -0,0 +1,126 @@ + + + + + + diff --git a/static/bower_components/paper-behaviors/test/index.html b/static/bower_components/paper-behaviors/test/index.html new file mode 100644 index 00000000..693054c0 --- /dev/null +++ b/static/bower_components/paper-behaviors/test/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/paper-button-behavior.html b/static/bower_components/paper-behaviors/test/paper-button-behavior.html new file mode 100644 index 00000000..ff859252 --- /dev/null +++ b/static/bower_components/paper-behaviors/test/paper-button-behavior.html @@ -0,0 +1,113 @@ + + + + + + paper-button-behavior + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/paper-checked-element-behavior.html b/static/bower_components/paper-behaviors/test/paper-checked-element-behavior.html new file mode 100644 index 00000000..363cf4c7 --- /dev/null +++ b/static/bower_components/paper-behaviors/test/paper-checked-element-behavior.html @@ -0,0 +1,94 @@ + + + + + + paper-checked-element-behavior + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/paper-radio-button-behavior.html b/static/bower_components/paper-behaviors/test/paper-radio-button-behavior.html new file mode 100644 index 00000000..0418057d --- /dev/null +++ b/static/bower_components/paper-behaviors/test/paper-radio-button-behavior.html @@ -0,0 +1,58 @@ + + + + + + paper-radio-button-behavior + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/paper-ripple-behavior.html b/static/bower_components/paper-behaviors/test/paper-ripple-behavior.html new file mode 100644 index 00000000..9139dc8e --- /dev/null +++ b/static/bower_components/paper-behaviors/test/paper-ripple-behavior.html @@ -0,0 +1,335 @@ + + + + + + paper-ripple-behavior + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/shadowed-ripple.html b/static/bower_components/paper-behaviors/test/shadowed-ripple.html new file mode 100644 index 00000000..1ebad13e --- /dev/null +++ b/static/bower_components/paper-behaviors/test/shadowed-ripple.html @@ -0,0 +1,55 @@ + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/test-button.html b/static/bower_components/paper-behaviors/test/test-button.html new file mode 100644 index 00000000..3bbf356e --- /dev/null +++ b/static/bower_components/paper-behaviors/test/test-button.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-behaviors/test/test-radio-button.html b/static/bower_components/paper-behaviors/test/test-radio-button.html new file mode 100644 index 00000000..945a08e1 --- /dev/null +++ b/static/bower_components/paper-behaviors/test/test-radio-button.html @@ -0,0 +1,41 @@ + + + + + + + + + + + diff --git a/static/bower_components/paper-button/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-button/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..48a50e98 --- /dev/null +++ b/static/bower_components/paper-button/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-button/.gitignore b/static/bower_components/paper-button/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-button/.travis.yml b/static/bower_components/paper-button/.travis.yml new file mode 100644 index 00000000..24e1389d --- /dev/null +++ b/static/bower_components/paper-button/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: YhRb8f1f4y3Rjs5wnp4sCzIcEcL07HOBoJcEp6U/KVgIIk/sBxkxMVmZsoUeABrNbKcdE6Gn6OS2K1lFq4VThKppJ0yjvESa1p0FjmQ0Nf1xCYxc46n936xj87khZy3rrTGHxwcOY5vAa5mvNzXI4BYxjmSjmqRsQwsJBsJHWVw= + - secure: eQjSTRxQKF5vyRa6yK2o+j5xWK480hHCKDh7RJQISEVhyzAaCzPZNmWf2pmaDj+ZoZZrahBcoRwOZAiVdHDaKQ+VLHbEECzV3OVV32/9DHi608BPCBdxVR2MDTtZVt3fGVhPQwCnFhwRTWtVVGx8y8HnTDMv/r4xW1OMSThPsbM= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/paper-button/CONTRIBUTING.md b/static/bower_components/paper-button/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-button/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-button/README.md b/static/bower_components/paper-button/README.md new file mode 100644 index 00000000..6b36c916 --- /dev/null +++ b/static/bower_components/paper-button/README.md @@ -0,0 +1,73 @@ + +[![Build status](https://travis-ci.org/PolymerElements/paper-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-button) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-button) + +##<paper-button> + +Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html) + +`paper-button` is a button. When the user touches the button, a ripple effect emanates +from the point of contact. It may be flat or raised. A raised button is styled with a +shadow. + +Example: + + +```html +link +raised +toggles +disabled +``` diff --git a/static/bower_components/paper-button/bower.json b/static/bower_components/paper-button/bower.json new file mode 100644 index 00000000..2046471c --- /dev/null +++ b/static/bower_components/paper-button/bower.json @@ -0,0 +1,41 @@ +{ + "name": "paper-button", + "version": "1.0.14", + "description": "Material design button", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "button" + ], + "main": "paper-button.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-button.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-button", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-material": "PolymerElements/paper-material#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/paper-button/demo/index.html b/static/bower_components/paper-button/demo/index.html new file mode 100644 index 00000000..c2130909 --- /dev/null +++ b/static/bower_components/paper-button/demo/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + paper-button demo + + + + + + + + + + + +
    +

    Buttons can be flat, raised, toggleable, or disabled

    + + + + +

    Buttons can have icons

    + + + + +

    Buttons can hide the ripple effect using the noink attribute

    + + + + +

    Buttons can be styled using custom properties

    + + + + +

    Buttons can be used as a link

    + + + +
    + + diff --git a/static/bower_components/paper-button/index.html b/static/bower_components/paper-button/index.html new file mode 100644 index 00000000..487bb5c3 --- /dev/null +++ b/static/bower_components/paper-button/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-button/paper-button.html b/static/bower_components/paper-button/paper-button.html new file mode 100644 index 00000000..dd74dc66 --- /dev/null +++ b/static/bower_components/paper-button/paper-button.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-button/test/index.html b/static/bower_components/paper-button/test/index.html new file mode 100644 index 00000000..50048191 --- /dev/null +++ b/static/bower_components/paper-button/test/index.html @@ -0,0 +1,24 @@ + + + + paper-button tests + + + + + + + diff --git a/static/bower_components/paper-button/test/paper-button.html b/static/bower_components/paper-button/test/paper-button.html new file mode 100644 index 00000000..54200e63 --- /dev/null +++ b/static/bower_components/paper-button/test/paper-button.html @@ -0,0 +1,108 @@ + + + + + + paper-button basic tests + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..f544977f --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-dialog-behavior/.gitignore b/static/bower_components/paper-dialog-behavior/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-dialog-behavior/.travis.yml b/static/bower_components/paper-dialog-behavior/.travis.yml new file mode 100644 index 00000000..7319854a --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: ZBrrZGA8OWY95x8yHSsKUNrQfowhRe/s/pMZhHgnoppnZ1+bDfpoms+ggOdvH0TgURAAdF+1Wq1mTCgNp0FYLJ3Oe34XseDIxiA3wXSQO/E2m4Cfj/w4fRvaSy8ikdz5urQJET33SjDKdggm1FmWmnt6vSVgW/mg8M7AW2KWDcE= + - secure: P5UKkTar39Q1k0VwtF5LhOphqNiW3r+DSnN1vRNA4oKZPrt6l3dJE1hpA9+1x1m6SryG856lLekPM6/fVZuC7nyDKFLz4vU/EWhiGdyWN1lHhE2MDh281TsCtzK56S0uJxdmlIpSiWTFWIrrEiiewN2b8dXy3FSPfy0Fo1sGn54= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" +dist: trusty diff --git a/static/bower_components/paper-dialog-behavior/CONTRIBUTING.md b/static/bower_components/paper-dialog-behavior/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-dialog-behavior/README.md b/static/bower_components/paper-dialog-behavior/README.md new file mode 100644 index 00000000..ba8acc40 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/README.md @@ -0,0 +1,54 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-dialog-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-dialog-behavior)_ + + +##Polymer.PaperDialogBehavior + +Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to implement a Material Design +dialog. + +For example, if `` implements this behavior: + +```html + +

    Header

    +
    Dialog body
    +
    + Cancel + Accept +
    +
    +``` + +`paper-dialog-shared-styles.html` provide styles for a header, content area, and an action area for buttons. +Use the `

    ` tag for the header and the `buttons` class for the action area. You can use the +`paper-dialog-scrollable` element (in its own repository) if you need a scrolling content area. + +Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls to close the +dialog. If the user dismisses the dialog with `dialog-confirm`, the `closingReason` will update +to include `confirmed: true`. + +### Accessibility + +This element has `role="dialog"` by default. Depending on the context, it may be more appropriate +to override this attribute with `role="alertdialog"`. + +If `modal` is set, the element will set `aria-modal` and prevent the focus from exiting the element. +It will also ensure that focus remains in the dialog. + + diff --git a/static/bower_components/paper-dialog-behavior/bower.json b/static/bower_components/paper-dialog-behavior/bower.json new file mode 100644 index 00000000..cbe17d39 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/bower.json @@ -0,0 +1,40 @@ +{ + "name": "paper-dialog-behavior", + "version": "1.2.7", + "description": "Implements a behavior used for material design dialogs", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "dialog", + "overlay", + "behavior" + ], + "main": "paper-dialog-behavior.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-dialog-behavior" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-dialog-behavior", + "ignore": [], + "dependencies": { + "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.1.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0", + "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-listbox": "PolymerElements/paper-listbox#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/paper-dialog-behavior/demo/index.html b/static/bower_components/paper-dialog-behavior/demo/index.html new file mode 100644 index 00000000..193dddcc --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/demo/index.html @@ -0,0 +1,102 @@ + + + + + + + + + + paper-dialog-behavior demo + + + + + + + + + + + + + + + + + +

    An element with PaperDialogBehavior can be opened, closed, toggled. Use h2 for the title

    + + + + +

    An element with PaperDialogBehavior can be modal. Use the attributes dialog-dismiss and dialog-confirm on the children to close it.

    + + + + +

    Use paper-dialog-scrollable for scrolling content

    + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/demo/simple-dialog.html b/static/bower_components/paper-dialog-behavior/demo/simple-dialog.html new file mode 100644 index 00000000..a2043723 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/demo/simple-dialog.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/hero.svg b/static/bower_components/paper-dialog-behavior/hero.svg new file mode 100644 index 00000000..564ccd38 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/hero.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/index.html b/static/bower_components/paper-dialog-behavior/index.html new file mode 100644 index 00000000..af98b85a --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-dialog-behavior + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/paper-dialog-behavior.html b/static/bower_components/paper-dialog-behavior/paper-dialog-behavior.html new file mode 100644 index 00000000..6b45ddd1 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/paper-dialog-behavior.html @@ -0,0 +1,140 @@ + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/paper-dialog-common.css b/static/bower_components/paper-dialog-behavior/paper-dialog-common.css new file mode 100644 index 00000000..560b0a56 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/paper-dialog-common.css @@ -0,0 +1,57 @@ +/* +@license +Copyright (c) 2015 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + +:host { + display: block; + margin: 24px 40px; + + background: var(--paper-dialog-background-color, --primary-background-color); + color: var(--paper-dialog-color, --primary-text-color); + + @apply(--paper-font-body1); + @apply(--shadow-elevation-16dp); + @apply(--paper-dialog); +} + +:host > ::content > * { + margin-top: 20px; + padding: 0 24px; +} + +:host > ::content > .no-padding { + padding: 0; +} + +:host > ::content > *:first-child { + margin-top: 24px; +} + +:host > ::content > *:last-child { + margin-bottom: 24px; +} + +:host > ::content h2 { + position: relative; + margin: 0; + @apply(--paper-font-title); + + @apply(--paper-dialog-title); +} + +:host > ::content .buttons { + position: relative; + padding: 8px 8px 8px 24px; + margin: 0; + + color: var(--paper-dialog-button-color, --primary-color); + + @apply(--layout-horizontal); + @apply(--layout-end-justified); +} diff --git a/static/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html b/static/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html new file mode 100644 index 00000000..35ea74bd --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/paper-dialog-shared-styles.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/test/index.html b/static/bower_components/paper-dialog-behavior/test/index.html new file mode 100644 index 00000000..cb0a8702 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/test/index.html @@ -0,0 +1,31 @@ + + + paper-dialog tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/test/paper-dialog-behavior.html b/static/bower_components/paper-dialog-behavior/test/paper-dialog-behavior.html new file mode 100644 index 00000000..d7c260e7 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/test/paper-dialog-behavior.html @@ -0,0 +1,408 @@ + + + + + + + paper-dialog-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/test/test-buttons.html b/static/bower_components/paper-dialog-behavior/test/test-buttons.html new file mode 100644 index 00000000..9f0d09c4 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/test/test-buttons.html @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/static/bower_components/paper-dialog-behavior/test/test-dialog.html b/static/bower_components/paper-dialog-behavior/test/test-dialog.html new file mode 100644 index 00000000..ccaf4e81 --- /dev/null +++ b/static/bower_components/paper-dialog-behavior/test/test-dialog.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..823a0209 --- /dev/null +++ b/static/bower_components/paper-dialog/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-dialog/.gitignore b/static/bower_components/paper-dialog/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-dialog/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-dialog/.travis.yml b/static/bower_components/paper-dialog/.travis.yml new file mode 100644 index 00000000..7a3743aa --- /dev/null +++ b/static/bower_components/paper-dialog/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: QgTx1GfP8J91Uzv03iETT60WI0ZhgvbT5tFkDp53oeQrNvXwZMCDN9BE+LsvE+3WJdhwV//gD3B72y+nSTa89UGSHwXaLiXPxL1OW7B/36X0ri1yPVVW9TJNramsVmjkFbjqbD6txUPE/j2STYIxGueng3R/bzt/Vx/ZjHnTJSVkyfQ0HCmMvgVvKBzP6wHHoggXcXeRhViQUbHW2v32Ptj2lw/qukQxv0rggugz/m+4miLFMEtAFlSJ+9Q4rA8pXMgrDJbd7T7BPNs9yeP0rVNab+dRE0wMkv0iRk0cL1ZPH/FB5F6everMc/7zc3mCEVXJM0fbj1XQVM640C413ncpDz/zK24e3lew4Erf7Ld9dl/xWRr60zBvGfFHz5JSBzL4/OsvnRFHfpxd6nwyVJhjv9uqyGNNqaDZ1AaPZ/ZCVDq+7KyJhM/Pug18cEzcDhUc0u5SIdjLnaiqgqAx0axAUdGPAN9Ssb58kDaqgt38VfoCc7ki/Qsk84ylxVu10vAeK4piklUb/PtR0gTKQ4GcYWnwZBgTlSthRFheOEp5BSDsKXi8Y2UCb/FJr1+oMbjbHLKnKvq7UDaLXXXKfvF1RjF1npgtYw4HBbHQ8Rsr7ZT2gU/85UDfpTgFNlpRWwajpEGQ7eK/CKQZnE8eGy+DR0KNuXxBkZpW5xOyq4g= + - secure: GzJ6KvrESPTW2J2fqjTq4tXzaSLdjVuWHp4LV7isIBQk5qeh0l+AN/ZRzYj63AdhKBeQG68lLMayV/GFtJsKkLQWn1xZzxVjwdpWQjwnKWtoGYkwdHzuY6FNfLL9FTIGu5G6RCmfFfTDsUHkhSXW+cBaN7nJWtojXAOrr+9ivfU6acfoON8RN8m5N2o5uVJgwwlveYnCYayRHC50neHOVC1IzQlagW9TdpKMqHeg0XpSFhdjQua3ETiAiQDjpQz1BeNZh+/DjnlV08zAx64bjZTh441100HRP0qg4/Y6IcX/qCiRdQHYBvIAoka+ZySPu1zYfvn+7eJYwQ4shSuElKX9y6g+uk3g5djJJ7yoKIQnsYlO1yPB0E8fvIhP2K/ZCwXK86snR+pIfrpVudQy4RZObuvyJIqxmaUjlTg1zU/S0ZNqOnXtqO6pG6YNH1JpAt0Bdzy7hT/q44ROlBPYuZK8shzzLa4KBr3Rb7kknyi5YXempGjhLnUFFd+gGQUkfqoDmyLreDyO95Ch8+YOcTjAzWh/yrEw1of0l/an9TxtWjnFaioJDcVS/dQphufMHgxyushDaocm/My06ZNWfwe69IbH7lqdDn9aW8hdn9cgIKw/sNqVtksN0/tnoURD/8wuHmepzsCR7xs9NrAozaynK+NdPfDdUtLRjtcEy0A= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/paper-dialog/CONTRIBUTING.md b/static/bower_components/paper-dialog/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-dialog/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-dialog/README.md b/static/bower_components/paper-dialog/README.md new file mode 100644 index 00000000..a958f067 --- /dev/null +++ b/static/bower_components/paper-dialog/README.md @@ -0,0 +1,75 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-dialog.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-dialog)_ + + +##<paper-dialog> + +Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html) + +`` is a dialog with Material Design styling and optional animations when it is +opened or closed. It provides styles for a header, content area, and an action area for buttons. +You can use the `` element (in its own repository) if you need a scrolling +content area. To autofocus a specific child element after opening the dialog, give it the `autofocus` +attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics. + +For example, the following code implements a dialog with a header, scrolling content area and +buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened. + +```html + +

    Header

    + + Lorem ipsum... + +
    + Cancel + Accept +
    +
    +``` + +### Styling + +See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling +this element. + +### Animations + +Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog +is opened or closed. See the documentation in +[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info. + +For example: + +```html + + + + +

    Header

    +
    Dialog body
    +
    +``` + +### Accessibility + +See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this +element. + + diff --git a/static/bower_components/paper-dialog/bower.json b/static/bower_components/paper-dialog/bower.json new file mode 100644 index 00000000..e7882a55 --- /dev/null +++ b/static/bower_components/paper-dialog/bower.json @@ -0,0 +1,40 @@ +{ + "name": "paper-dialog", + "description": "A Material Design dialog", + "version": "1.1.0", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "dialog", + "overlay" + ], + "main": "paper-dialog.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-dialog" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-dialog", + "ignore": [], + "dependencies": { + "neon-animation": "PolymerElements/neon-animation#^1.0.0", + "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#^1.0.0", + "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.7.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0", + "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-menu": "PolymerElements/paper-menu#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/paper-dialog/demo/index.html b/static/bower_components/paper-dialog/demo/index.html new file mode 100644 index 00000000..fc1a1a6d --- /dev/null +++ b/static/bower_components/paper-dialog/demo/index.html @@ -0,0 +1,226 @@ + + + + + + + + + + + paper-dialog demo + + + + + + + + + + + + + + + + + + + + + + +

    Dialog layouts

    + + + + +

    Styling and positioning

    + + + + +

    Position with positionTarget

    + + + + +

    Transitions with neon-animation

    + + + + + + + diff --git a/static/bower_components/paper-dialog/hero.svg b/static/bower_components/paper-dialog/hero.svg new file mode 100644 index 00000000..36283185 --- /dev/null +++ b/static/bower_components/paper-dialog/hero.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog/index.html b/static/bower_components/paper-dialog/index.html new file mode 100644 index 00000000..6304b8dc --- /dev/null +++ b/static/bower_components/paper-dialog/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-dialog + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog/paper-dialog.html b/static/bower_components/paper-dialog/paper-dialog.html new file mode 100644 index 00000000..512ca048 --- /dev/null +++ b/static/bower_components/paper-dialog/paper-dialog.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog/test/index.html b/static/bower_components/paper-dialog/test/index.html new file mode 100644 index 00000000..3d0c8eec --- /dev/null +++ b/static/bower_components/paper-dialog/test/index.html @@ -0,0 +1,31 @@ + + + paper-dialog tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-dialog/test/paper-dialog.html b/static/bower_components/paper-dialog/test/paper-dialog.html new file mode 100644 index 00000000..02ed5090 --- /dev/null +++ b/static/bower_components/paper-dialog/test/paper-dialog.html @@ -0,0 +1,92 @@ + + + + + + + paper-dialog tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-fab/.gitignore b/static/bower_components/paper-fab/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-fab/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-fab/.travis.yml b/static/bower_components/paper-fab/.travis.yml new file mode 100644 index 00000000..1b3779df --- /dev/null +++ b/static/bower_components/paper-fab/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: VfHayJiPODWEeYR7kWmUHR+sa+aqeYDqW77EKZdFn0zJSTTKnjiDQ6CAgOgaiE7KLZyWloDlkCbxGfk6guw/zko3sQeklDhdhg9mcmhmPHW8chu5upqNFFUXE3AUz/o/ZsyFgeTyhO4uztndLDdj7nD57ynGNNAkQlG3ddmaDXT7cJ2p+zq8h7u4rJYTaQBoaJGHx4sN+LOq7oDOkKv/I2rGd9TVyBR2TbCugi+CpkED2FNLFppt93wIHEJqFPAASMMswXS8U3z2RDV14NMRZTOBRxaM9rAlVMZjycLZ3Isuh4lOPMQdtwACk/MaZkxNnn8Gyo0KSGQYABIPGoVJGcRa+7Vhkq/5o3sMh5Hte3QgZGjpiugBO94qJjDBp2lApMJltWm95QktRbem7RZfjfc8EI1h32nW2liK9ikiq7SWDbnOd4IwDIwKyiNg3CgopKJQBimAzrwf5V08cxWdiaB76y+TqxiUAq7iPe6zfaaYKzyCOlAPruFL0Xnjsz/U1OnxGXxgdBE+/8HBRJO7+lQroP6NndEAMyxNGV9fQq3YmIYhgxaYtslgynJdig38cQIz2J2onsi13VliDZAfRvHkQzj8pkF0I2gNUl/JWbaOpd4xkwALyQ8ytm+uzIDN/Op2sWpqDuuhw/D4H3jn0KHH6syuVqLOB1g1I6EFCjY= + - secure: IPGL6X6NaL5HmkZ9c0Xb8N539NJ7wnWlxbOCAtzgq2IiDj9tQPR+T7o1BOHEWJttnRceniM6bEkeQU2i0VThwnLDs5zEq5HkJ4FJHCCQOpgIG3V9VRnbou5OUTYx32bRR/TlAgfFDTu220fczfzFlLFk5PEeuZuMQb2OeqNaf5pppl8lu+F08O8XO9vsLXZzXbPYrBwrv6vR6VlhEcpqhW7Yr05q1nnuevak6kMv5O9rWX0zhDfa1u5D40njQ5wVP5txVykoJtyKYaB3SoXXhqfJ0xtdDnAGD+dTWjTbzS6GzUY+WcSx9Lc9agYy9vnhGgpPzMm7LY2vaegJjFYlO//x2CN7caXNjRtZGnUVAyfCq4l5GBgr038MNhiSvSyrghpaoxih6gqEai5iFoDUXYLYwwzhPpAUu+53l6p+EVQPwpvBGshocmTXkf45+RKJL2uLFdUwI0GX0+g4yeBabDAl/KqQyGhBUQSIRIXjEj4A86JajkFcdBEN7MUgYDVoR+XVCqQLdUVGSFovEE5r7+3OAHMpt2lfVp+q+s6LBR2LLuP270inVGCA/+1gaelKbf5Sf24pwaaofkMU36IJcnUOUczkdNUvYfUqHgDwkrf4rDBSUqZVa82ZjkWV9BPkVItCMUc2HT4zQikGmHr0m8mD1uPdYQftENLHDK0Su0Y= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/static/bower_components/paper-fab/CONTRIBUTING.md b/static/bower_components/paper-fab/CONTRIBUTING.md new file mode 100644 index 00000000..f147978a --- /dev/null +++ b/static/bower_components/paper-fab/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-fab/README.md b/static/bower_components/paper-fab/README.md new file mode 100644 index 00000000..a1fb4bab --- /dev/null +++ b/static/bower_components/paper-fab/README.md @@ -0,0 +1,56 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-fab.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-fab) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-fab)_ + + +##<paper-fab> + +Material design: [Floating Action Button](https://www.google.com/design/spec/components/buttons-floating-action-button.html) + +`paper-fab` is a floating action button. It contains an image placed in the center and +comes in two sizes: regular size and a smaller size by applying the attribute `mini`. When +the user touches the button, a ripple effect emanates from the center of the button. + +You may import `iron-icons` to use with this element, or provide a URL to a custom icon. +See `iron-iconset` for more information about how to use a custom icon set. + +Example: + +```html + + + + + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-fab-background` | The background color of the button | `--accent-color` | +| `--paper-fab-keyboard-focus-background` | The background color of the button when focused | `--paper-pink-900` | +| `--paper-fab-disabled-background` | The background color of the button when it's disabled | `--paper-grey-300` | +| `--paper-fab-disabled-text` | The text color of the button when it's disabled | `--paper-grey-500` | +| `--paper-fab` | Mixin applied to the button | `{}` | +| `--paper-fab-mini` | Mixin applied to a mini button | `{}` | +| `--paper-fab-disabled` | Mixin applied to a disabled button | `{}` | +| `--paper-fab-iron-icon` | Mixin applied to the iron-icon within the button | `{}` | + + diff --git a/static/bower_components/paper-fab/bower.json b/static/bower_components/paper-fab/bower.json new file mode 100644 index 00000000..e6a98ba8 --- /dev/null +++ b/static/bower_components/paper-fab/bower.json @@ -0,0 +1,39 @@ +{ + "name": "paper-fab", + "version": "1.2.0", + "description": "A material design floating action button", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "button" + ], + "main": "paper-fab.html", + "ignore": [], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-fab.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-fab", + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-material": "PolymerElements/paper-material#^1.0.5", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/paper-fab/demo/index.html b/static/bower_components/paper-fab/demo/index.html new file mode 100644 index 00000000..06e3d674 --- /dev/null +++ b/static/bower_components/paper-fab/demo/index.html @@ -0,0 +1,90 @@ + + + + + + + + + + paper-fab demo + + + + + + + + + + + +
    +

    FABs can be enabled or disabled

    + + + + +

    FABs can be made smaller using the mini attribute

    + + + + +

    FABs can hide the ripple effect using the noink attribute

    + + + + +

    FABs can be styled using custom properties

    + + + +
    + + diff --git a/static/bower_components/paper-fab/index.html b/static/bower_components/paper-fab/index.html new file mode 100644 index 00000000..b0ced26a --- /dev/null +++ b/static/bower_components/paper-fab/index.html @@ -0,0 +1,24 @@ + + + + + + paper-fab + + + + + + + + + + diff --git a/static/bower_components/paper-fab/paper-fab.html b/static/bower_components/paper-fab/paper-fab.html new file mode 100644 index 00000000..3244cb1f --- /dev/null +++ b/static/bower_components/paper-fab/paper-fab.html @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-fab/test/a11y.html b/static/bower_components/paper-fab/test/a11y.html new file mode 100644 index 00000000..7029aff5 --- /dev/null +++ b/static/bower_components/paper-fab/test/a11y.html @@ -0,0 +1,67 @@ + + + + + + paper-fab a11y tests + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-fab/test/basic.html b/static/bower_components/paper-fab/test/basic.html new file mode 100644 index 00000000..a0ae42d3 --- /dev/null +++ b/static/bower_components/paper-fab/test/basic.html @@ -0,0 +1,141 @@ + + + + + + paper-fab basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-fab/test/index.html b/static/bower_components/paper-fab/test/index.html new file mode 100644 index 00000000..ca535dbf --- /dev/null +++ b/static/bower_components/paper-fab/test/index.html @@ -0,0 +1,26 @@ + + + + paper-fab tests + + + + + + + diff --git a/static/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..c80193d9 --- /dev/null +++ b/static/bower_components/paper-icon-button/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-icon-button/.gitignore b/static/bower_components/paper-icon-button/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-icon-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-icon-button/.travis.yml b/static/bower_components/paper-icon-button/.travis.yml new file mode 100644 index 00000000..00278f42 --- /dev/null +++ b/static/bower_components/paper-icon-button/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + HdHTMNdAamEtP+Nl5/mL2X7IKba4p2+ljpDSnvkA6gyoLzrWRZAyUjJxGjVRutQejTa8ZLOGXnBYKugSIMrGv8cblvngbhEmIHd2HBnPjd140KNwtsCtzPRDMdJMrvekVOXgpCkecmGq9G/j0WOoOnYY9oJrHB5dFy0y7LfPy6w= + - secure: >- + XjZRR/HW23UneacknoaYle/dg2Diupr9p9UOWLR7w6ejvwIP99nUF0Bh4trZkUiXBBt29HOBoETwBTMizDHNg8vKe544EgR26Fq4Lwk5EuEHy3xeyroiHlwc56ZC9Obye1kdM3QjU6rzJ7F9NuRL2E0ttgZjt/OnM+vKx3kqGOY= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/paper-icon-button/CONTRIBUTING.md b/static/bower_components/paper-icon-button/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-icon-button/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-icon-button/README.md b/static/bower_components/paper-icon-button/README.md new file mode 100644 index 00000000..089c4c7b --- /dev/null +++ b/static/bower_components/paper-icon-button/README.md @@ -0,0 +1,95 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-icon-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-icon-button) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-icon-button)_ + + +##<paper-icon-button> + +Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons) + +`paper-icon-button` is a button with an image placed at the center. When the user touches +the button, a ripple effect emanates from the center of the button. + +`paper-icon-button` includes a default icon set. Use `icon` to specify which icon +from the icon set to use. + + +```html + + + +``` + +See [`iron-iconset`](iron-iconset) for more information about +how to use a custom icon set. + +Example: + +```html + + + + +``` + +To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button` +will already receive focus, you may want to prevent the anchor tag from receiving focus +as well by setting its tabindex to -1. + +```html + + + +``` + +### Styling + +Style the button with CSS as you would a normal DOM element. If you are using the icons +provided by `iron-icons`, they will inherit the foreground color of the button. + +```html +/* make a red "favorite" button */ + +``` + +By default, the ripple is the same color as the foreground at 25% opacity. You may +customize the color using the `--paper-icon-button-ink-color` custom property. + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color` | +| `--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color` | +| `--paper-icon-button` | Mixin for a button | `{}` | +| `--paper-icon-button-disabled` | Mixin for a disabled button | `{}` | +| `--paper-icon-button-hover` | Mixin for button on hover | `{}` | + + + + diff --git a/static/bower_components/paper-icon-button/bower.json b/static/bower_components/paper-icon-button/bower.json new file mode 100644 index 00000000..8c2b55cc --- /dev/null +++ b/static/bower_components/paper-icon-button/bower.json @@ -0,0 +1,40 @@ +{ + "name": "paper-icon-button", + "private": true, + "version": "1.1.4", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design icon button", + "main": [ + "paper-icon-button.html", + "paper-icon-button-light.html" + ], + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "button", + "icon", + "control" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-icon-button.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/paper-icon-button/demo/index.html b/static/bower_components/paper-icon-button/demo/index.html new file mode 100644 index 00000000..98d496f8 --- /dev/null +++ b/static/bower_components/paper-icon-button/demo/index.html @@ -0,0 +1,103 @@ + + + + + paper-icon-button demo + + + + + + + + + + + + +
    +

    Buttons can use iron-icons or external images, and can be disabled

    + + + + +

    Buttons can hide the ripple effect using the noink attribute

    + + + + +

    Buttons can be styled using regular CSS and custom properties

    + + + + +

    Buttons can be resized

    + + + + +

    Buttons can be used as a link

    + + + +
    + + diff --git a/static/bower_components/paper-icon-button/demo/paper-icon-button-light.html b/static/bower_components/paper-icon-button/demo/paper-icon-button-light.html new file mode 100644 index 00000000..6bae8e37 --- /dev/null +++ b/static/bower_components/paper-icon-button/demo/paper-icon-button-light.html @@ -0,0 +1,57 @@ + + + + + paper-icon-button-light demo + + + + + + + + + + + + +
    +

    paper-icon-button-light can contain iron-icons or external images and can be disabled

    + + + +
    + + diff --git a/static/bower_components/paper-icon-button/index.html b/static/bower_components/paper-icon-button/index.html new file mode 100644 index 00000000..78f963c7 --- /dev/null +++ b/static/bower_components/paper-icon-button/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-icon-button/paper-icon-button-light.html b/static/bower_components/paper-icon-button/paper-icon-button-light.html new file mode 100644 index 00000000..cb5379a4 --- /dev/null +++ b/static/bower_components/paper-icon-button/paper-icon-button-light.html @@ -0,0 +1,98 @@ + + + + + + + + + + diff --git a/static/bower_components/paper-icon-button/paper-icon-button.html b/static/bower_components/paper-icon-button/paper-icon-button.html new file mode 100644 index 00000000..b69330fb --- /dev/null +++ b/static/bower_components/paper-icon-button/paper-icon-button.html @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-icon-button/test/a11y.html b/static/bower_components/paper-icon-button/test/a11y.html new file mode 100644 index 00000000..a56c9f45 --- /dev/null +++ b/static/bower_components/paper-icon-button/test/a11y.html @@ -0,0 +1,92 @@ + + + + + + paper-icon-button a11y tests + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-icon-button/test/basic.html b/static/bower_components/paper-icon-button/test/basic.html new file mode 100644 index 00000000..fa3afad8 --- /dev/null +++ b/static/bower_components/paper-icon-button/test/basic.html @@ -0,0 +1,75 @@ + + + + + + paper-icon-button basic tests + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-icon-button/test/index.html b/static/bower_components/paper-icon-button/test/index.html new file mode 100644 index 00000000..2069ec79 --- /dev/null +++ b/static/bower_components/paper-icon-button/test/index.html @@ -0,0 +1,26 @@ + + + + paper-icon-button tests + + + + + + + diff --git a/static/bower_components/paper-item/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-item/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..c38fb3e5 --- /dev/null +++ b/static/bower_components/paper-item/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-item/.gitignore b/static/bower_components/paper-item/.gitignore new file mode 100644 index 00000000..fbe05fc9 --- /dev/null +++ b/static/bower_components/paper-item/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/static/bower_components/paper-item/.travis.yml b/static/bower_components/paper-item/.travis.yml new file mode 100644 index 00000000..c4d7b180 --- /dev/null +++ b/static/bower_components/paper-item/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: NCk3KK+wbaXMzp8XAY6FeL+TSdI0AlPI3/tl0OpsUIaU2EiCjQuzf/UpyzCW5XZMEVFF4q/eDjrPkqJodHfpngj36mpkfmfqj9DrgDmYsV9BDvsTd8KmLsA6H8D6p7Qer+r1JMMB8PvX44vdhQ6GhZD1HFNYK1Ekpt0TkYwWKNw= + - secure: TGgUEQe6FJS+GuYk94d//8YQmDLUu0ekMvPSIs8TQ2QkdBK4SL+2bSXZt44BbDEOwc9P4NCPSUx/RMiCAqsc5OGRJImzb/zqPNIDTeKG6q72HPBBBD3Sk0CrEpTQbOK/Flaa/B7RYR0U1kuljSmRS7lPG19nnY8gOHnIAgwIyk0= +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" +dist: trusty diff --git a/static/bower_components/paper-item/CONTRIBUTING.md b/static/bower_components/paper-item/CONTRIBUTING.md new file mode 100644 index 00000000..f147978a --- /dev/null +++ b/static/bower_components/paper-item/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-item/README.md b/static/bower_components/paper-item/README.md new file mode 100644 index 00000000..18deb629 --- /dev/null +++ b/static/bower_components/paper-item/README.md @@ -0,0 +1,163 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-item.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-item) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-item)_ + + +##<paper-item> + +Material design: [Lists](https://www.google.com/design/spec/components/lists.html) + +`` is an interactive list item. By default, it is a horizontal flexbox. + +```html +Item +``` + +Use this element with `` to make Material Design styled two-line and three-line +items. + +```html + + +
    Show your status
    +
    Your status is visible to everyone
    +
    + +
    +``` + +To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will +already receive focus, you may want to prevent the anchor tag from receiving +focus as well by setting its tabindex to -1. + +```html + + Polymer Project + +``` + +If you are concerned about performance and want to use `paper-item` in a `paper-listbox` +with many items, you can just use a native `button` with the `paper-item` class +applied (provided you have correctly included the shared styles): + +```html + + + + + + + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-min-height` | Minimum height of the item | `48px` | +| `--paper-item` | Mixin applied to the item | `{}` | +| `--paper-item-selected-weight` | The font weight of a selected item | `bold` | +| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` | +| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` | +| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` | +| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` | +| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` | + +### Accessibility + +This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set +`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`. + +```html + + + Show your status + + + +``` + + + +##<paper-icon-item> + +`` is a convenience element to make an item with icon. It is an interactive list +item with a fixed-width icon area, according to Material Design. This is useful if the icons are of +varying widths, but you want the item bodies to line up. Use this like a ``. The child +node with the attribute `item-icon` is placed in the icon area. + +```html + + + Favorite + + +
    + Avatar +
    +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-icon-width` | Width of the icon area | `56px` | +| `--paper-item-icon` | Mixin applied to the icon area | `{}` | +| `--paper-icon-item` | Mixin applied to the item | `{}` | +| `--paper-item-selected-weight` | The font weight of a selected item | `bold` | +| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` | +| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` | +| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` | +| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` | +| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` | + + + +##<paper-item-body> + +Use `` in a `` or `` to make two- or +three- line items. It is a flex item that is a vertical flexbox. + +```html + + +
    Show your status
    +
    Your status is visible to everyone
    +
    +
    +``` + +The child elements with the `secondary` attribute is given secondary text styling. + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px` | +| `--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px` | +| `--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color` | +| `--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}` | + + + + diff --git a/static/bower_components/paper-item/all-imports.html b/static/bower_components/paper-item/all-imports.html new file mode 100644 index 00000000..4b1583fe --- /dev/null +++ b/static/bower_components/paper-item/all-imports.html @@ -0,0 +1,13 @@ + + + + + diff --git a/static/bower_components/paper-item/bower.json b/static/bower_components/paper-item/bower.json new file mode 100644 index 00000000..9028ed7f --- /dev/null +++ b/static/bower_components/paper-item/bower.json @@ -0,0 +1,43 @@ +{ + "name": "paper-item", + "version": "1.2.1", + "description": "A material-design styled list item", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "item" + ], + "main": [ + "paper-item.html", + "paper-icon-item.html", + "paper-item-body.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-item" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-item", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" + } +} diff --git a/static/bower_components/paper-item/demo/index.html b/static/bower_components/paper-item/demo/index.html new file mode 100644 index 00000000..bc95e7f9 --- /dev/null +++ b/static/bower_components/paper-item/demo/index.html @@ -0,0 +1,191 @@ + + + + + + + + + + paper-item demo + + + + + + + + + + + + + + + + + +
    +

    Paper-items are simple list elements, ideally used in a paper-listbox or + an element with role="listbox"

    + + + + +

    They can be styled using custom properties

    + + + + +

    To add a leading element, use a paper-icon-item with an item-icon attribute. This + leading image can be an iron-icon, or any other regular element.

    + + + + +

    For two-line items, use a paper-icon-body inside a paper-item or paper-icon-item

    + + + + +

    Complex layouts are usually a combination of all these elements

    + + + + +

    Paper-items can be used as links

    + + + +
    + + diff --git a/static/bower_components/paper-item/index.html b/static/bower_components/paper-item/index.html new file mode 100644 index 00000000..b409ed12 --- /dev/null +++ b/static/bower_components/paper-item/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-item + + + + + + + + + + + + + diff --git a/static/bower_components/paper-item/paper-icon-item.html b/static/bower_components/paper-item/paper-icon-item.html new file mode 100644 index 00000000..e8f6d079 --- /dev/null +++ b/static/bower_components/paper-item/paper-icon-item.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-item/paper-item-behavior.html b/static/bower_components/paper-item/paper-item-behavior.html new file mode 100644 index 00000000..f97b262b --- /dev/null +++ b/static/bower_components/paper-item/paper-item-behavior.html @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/static/bower_components/paper-item/paper-item-body.html b/static/bower_components/paper-item/paper-item-body.html new file mode 100644 index 00000000..5c46cd89 --- /dev/null +++ b/static/bower_components/paper-item/paper-item-body.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-item/paper-item-shared-styles.html b/static/bower_components/paper-item/paper-item-shared-styles.html new file mode 100644 index 00000000..868d4153 --- /dev/null +++ b/static/bower_components/paper-item/paper-item-shared-styles.html @@ -0,0 +1,70 @@ + + + + + + + + + + diff --git a/static/bower_components/paper-item/paper-item.html b/static/bower_components/paper-item/paper-item.html new file mode 100644 index 00000000..60b4692d --- /dev/null +++ b/static/bower_components/paper-item/paper-item.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-item/test/index.html b/static/bower_components/paper-item/test/index.html new file mode 100644 index 00000000..7029d736 --- /dev/null +++ b/static/bower_components/paper-item/test/index.html @@ -0,0 +1,31 @@ + + + paper-item tests + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-item/test/paper-item.html b/static/bower_components/paper-item/test/paper-item.html new file mode 100644 index 00000000..a728d6c1 --- /dev/null +++ b/static/bower_components/paper-item/test/paper-item.html @@ -0,0 +1,218 @@ + + + + + + paper-item tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-material/.gitignore b/static/bower_components/paper-material/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-material/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-material/.travis.yml b/static/bower_components/paper-material/.travis.yml new file mode 100644 index 00000000..1834edca --- /dev/null +++ b/static/bower_components/paper-material/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: PEaqY+YpV0ZhnQbJlNQbmfIFLqy7UvvCtii0sPoGKT5/P7ulMqMOPQV9l/zLAtYi14HEz63FKLqDrpnGaVe7Cz7jtt2WRWrWqTBdarqwSHs73Z2XqztD1+2wW6vgz/lfK00B8UplAk28B7d5dbWzwUF6Kg02zOfQMsawMpulFjo= + - secure: f/3XYrYjM8aXLe9kqM/MjHQ6IEsDRuoxDqM+l2JiR3v2Nw7lP6ZyXSNvKm8bN+VNU7ubSzAmRbUGnRU7e61BhnGzuLXjOqxYeJLWZaqoSm9TDz3re3rd7wB2ddAhRokeSSPO2KeAgr6C02P9M3Au1DiO1G66fuWVH62WtzW4+qY= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/static/bower_components/paper-material/CONTRIBUTING.md b/static/bower_components/paper-material/CONTRIBUTING.md new file mode 100644 index 00000000..7b101415 --- /dev/null +++ b/static/bower_components/paper-material/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-material/README.md b/static/bower_components/paper-material/README.md new file mode 100644 index 00000000..6a74b5e1 --- /dev/null +++ b/static/bower_components/paper-material/README.md @@ -0,0 +1,35 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-material.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-material) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-material)_ + + +##<paper-material> + +Material design: [Cards](https://www.google.com/design/spec/components/cards.html) + +`paper-material` is a container that renders two shadows on top of each other to +create the effect of a lifted piece of paper. + +Example: + +```html + + ... content ... + +``` + + diff --git a/static/bower_components/paper-material/bower.json b/static/bower_components/paper-material/bower.json new file mode 100644 index 00000000..40895d2d --- /dev/null +++ b/static/bower_components/paper-material/bower.json @@ -0,0 +1,35 @@ +{ + "name": "paper-material", + "version": "1.0.6", + "description": "A material design container that looks like a lifted sheet of paper", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "container" + ], + "main": "paper-material.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-material" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-material", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "web-component-tester": "^4.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0" + } +} diff --git a/static/bower_components/paper-material/demo/index.html b/static/bower_components/paper-material/demo/index.html new file mode 100644 index 00000000..c0b6d394 --- /dev/null +++ b/static/bower_components/paper-material/demo/index.html @@ -0,0 +1,84 @@ + + + + + paper-material demo + + + + + + + + + + + + + +
    +

    Paper-materials can have different elevations

    + + + + +

    Changes in elevation can be animated

    + + + +
    + + diff --git a/static/bower_components/paper-material/index.html b/static/bower_components/paper-material/index.html new file mode 100644 index 00000000..7209e6d0 --- /dev/null +++ b/static/bower_components/paper-material/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-material + + + + + + + + + + + + + diff --git a/static/bower_components/paper-material/paper-material-shared-styles.html b/static/bower_components/paper-material/paper-material-shared-styles.html new file mode 100644 index 00000000..b795f4f4 --- /dev/null +++ b/static/bower_components/paper-material/paper-material-shared-styles.html @@ -0,0 +1,42 @@ + + + + + + + diff --git a/static/bower_components/paper-material/paper-material.html b/static/bower_components/paper-material/paper-material.html new file mode 100644 index 00000000..e754d4ea --- /dev/null +++ b/static/bower_components/paper-material/paper-material.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-material/test/index.html b/static/bower_components/paper-material/test/index.html new file mode 100644 index 00000000..08fda477 --- /dev/null +++ b/static/bower_components/paper-material/test/index.html @@ -0,0 +1,24 @@ + + + + paper-material tests + + + + + + + diff --git a/static/bower_components/paper-material/test/paper-material.html b/static/bower_components/paper-material/test/paper-material.html new file mode 100644 index 00000000..7949c112 --- /dev/null +++ b/static/bower_components/paper-material/test/paper-material.html @@ -0,0 +1,88 @@ + + + + + + paper-material basic tests + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/.gitignore b/static/bower_components/paper-menu/.gitignore new file mode 100644 index 00000000..fbe05fc9 --- /dev/null +++ b/static/bower_components/paper-menu/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/static/bower_components/paper-menu/.travis.yml b/static/bower_components/paper-menu/.travis.yml new file mode 100644 index 00000000..429eafc4 --- /dev/null +++ b/static/bower_components/paper-menu/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: Mh0qP0wSbfQ00LpaW8ObBU6CBLqgUgIM/Qvuog7dw7atnZ3a2I7UqLXCJHkH0a66r0bF2PyuS6a8qz/croSr1rQQ0G+1HgNczm7nuQO8cw2ZLXZglpaldYfUzKBw9ip+XGA1zgFQ1+O3uWisy+4pQrsGhRsB1RSmXBcKJsSUjZw= + - secure: QhEW2jW0Uj3dp4xJOYVfP/MUV2UeZW48811cDZRSwWQ/43vrZU/4VCSTFJdODZ4A9nXAhOeKtT+S1BWoH4VslGLCfmrF1dbTxHZEdg2WAt8OkV9XpMNMBYtGomlUs9asnU/Q1294DWolAGG8wwnReibg0r6H3VQCmD4vIE6oEmQ= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/static/bower_components/paper-menu/CONTRIBUTING.md b/static/bower_components/paper-menu/CONTRIBUTING.md new file mode 100644 index 00000000..7b101415 --- /dev/null +++ b/static/bower_components/paper-menu/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-menu/README.md b/static/bower_components/paper-menu/README.md new file mode 100644 index 00000000..9dbd2b2c --- /dev/null +++ b/static/bower_components/paper-menu/README.md @@ -0,0 +1,113 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-menu.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-menu) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-menu)_ + + +##<paper-menu> + +Material design: [Menus](https://www.google.com/design/spec/components/menus.html) + +`` implements an accessible menu control with Material Design styling. The focused item +is highlighted, and the selected item has bolded text. + +```html + + Item 1 + Item 2 + +``` + +An initial selection can be specified with the `selected` attribute. + +```html + + Item 1 + Item 2 + +``` + +Make a multi-select menu with the `multi` attribute. Items in a multi-select menu can be deselected, +and multiple items can be selected. + +```html + + Item 1 + Item 2 + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-menu-background-color` | Menu background color | `--primary-background-color` | +| `--paper-menu-color` | Menu foreground color | `--primary-text-color` | +| `--paper-menu-disabled-color` | Foreground color for a disabled item | `--disabled-text-color` | +| `--paper-menu` | Mixin applied to the menu | `{}` | +| `--paper-menu-selected-item` | Mixin applied to the selected item | `{}` | +| `--paper-menu-focused-item` | Mixin applied to the focused item | `{}` | +| `--paper-menu-focused-item-after` | Mixin applied to the ::after pseudo-element for the focused item | `{}` | + +### Accessibility + +`` has `role="menu"` by default. A multi-select menu will also have +`aria-multiselectable` set. It implements key bindings to navigate through the menu with the up and +down arrow keys, esc to exit the menu, and enter to activate a menu item. Typing the first letter +of a menu item will also focus it. + + + +##<paper-submenu> + +`` is a nested menu inside of a parent ``. It +consists of a trigger that expands or collapses another ``: + +```html + + + Topics + + Topic 1 + Topic 2 + Topic 3 + + + + Faves + + Fave 1 + Fave 2 + + + + Unavailable + + Disabled 1 + Disabled 2 + + + +``` + +Just like in ``, the focused item is highlighted, and the selected +item has bolded text. Please see the `` docs for which attributes +(such as `multi` and `selected`), and styling options are available for the +`menu-content` menu. + + diff --git a/static/bower_components/paper-menu/bower.json b/static/bower_components/paper-menu/bower.json new file mode 100644 index 00000000..66140311 --- /dev/null +++ b/static/bower_components/paper-menu/bower.json @@ -0,0 +1,39 @@ +{ + "name": "paper-menu", + "version": "1.2.2", + "description": "Implements an accessible material design menu", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "menu" + ], + "main": [ + "paper-menu.html", + "paper-submenu.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-menu" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-menu", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-collapse": "PolymerElements/iron-collapse#^1.0.0", + "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/static/bower_components/paper-menu/demo/index.html b/static/bower_components/paper-menu/demo/index.html new file mode 100644 index 00000000..a7cd2c94 --- /dev/null +++ b/static/bower_components/paper-menu/demo/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + paper-menu demo + + + + + + + + + + + + +
    +
    +

    Standard

    +
    + + Inbox + Starred + Sent mail + Drafts + +
    +
    + +
    +

    Pre-selected

    +
    + + Inbox + Starred + Sent mail + Drafts + +
    +
    + +
    +

    Multi-select

    +
    + + Bold + Italic + Underline + Strikethrough + +
    +
    + +
    +

    Sub-menu

    +
    + + + paper-menu + + + Properties + + focusedItem + attrForItemTitle + + + + Methods + + select(value) + + + + + + + paper-submenu + + + Properties + + opened + + + + Methods + + open() + close() + toggle() + + + + + + + Unavailable + + Unavailable 1 + Unavailable 2 + + + +
    +
    +
    + + diff --git a/static/bower_components/paper-menu/hero.svg b/static/bower_components/paper-menu/hero.svg new file mode 100644 index 00000000..eaa0fb55 --- /dev/null +++ b/static/bower_components/paper-menu/hero.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/index.html b/static/bower_components/paper-menu/index.html new file mode 100644 index 00000000..fc884114 --- /dev/null +++ b/static/bower_components/paper-menu/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-menu + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/paper-menu-shared-styles.html b/static/bower_components/paper-menu/paper-menu-shared-styles.html new file mode 100644 index 00000000..9b8788b9 --- /dev/null +++ b/static/bower_components/paper-menu/paper-menu-shared-styles.html @@ -0,0 +1,47 @@ + + + + + diff --git a/static/bower_components/paper-menu/paper-menu.html b/static/bower_components/paper-menu/paper-menu.html new file mode 100644 index 00000000..10e562b4 --- /dev/null +++ b/static/bower_components/paper-menu/paper-menu.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/paper-submenu.html b/static/bower_components/paper-menu/paper-submenu.html new file mode 100644 index 00000000..e1c1d111 --- /dev/null +++ b/static/bower_components/paper-menu/paper-submenu.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/test/index.html b/static/bower_components/paper-menu/test/index.html new file mode 100644 index 00000000..7956bc1c --- /dev/null +++ b/static/bower_components/paper-menu/test/index.html @@ -0,0 +1,37 @@ + + + + + + paper-menu tests + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/test/paper-menu.html b/static/bower_components/paper-menu/test/paper-menu.html new file mode 100644 index 00000000..d92e6737 --- /dev/null +++ b/static/bower_components/paper-menu/test/paper-menu.html @@ -0,0 +1,64 @@ + + + + + + paper-menu tests + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-menu/test/paper-submenu.html b/static/bower_components/paper-menu/test/paper-submenu.html new file mode 100644 index 00000000..4b12fbca --- /dev/null +++ b/static/bower_components/paper-menu/test/paper-submenu.html @@ -0,0 +1,203 @@ + + + + + + paper-submenu tests + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..0a8739ed --- /dev/null +++ b/static/bower_components/paper-radio-button/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-radio-button/.gitignore b/static/bower_components/paper-radio-button/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-radio-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-radio-button/.travis.yml b/static/bower_components/paper-radio-button/.travis.yml new file mode 100644 index 00000000..ff46d558 --- /dev/null +++ b/static/bower_components/paper-radio-button/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + GigwuEaV52dS0ZJk4iaUTWOW7zZTtD/j3KqPny9XS71GxDFve3KKAXvhPCHHKuZwsOKWJ3JnBIXDgEVxHwkS6jUVAEVPDrmF6OZxs5rkRTDFeGKVfoYzCkssj6NE+/XnDMOF5gFdRuI4ZBS/kMB9OASeNsH84wgkMazh9GPu9Lk= + - secure: >- + EURQh/CaC+RBsHTw5xbyZAFPc6cgQQWFFvp35A8ZHTLvHrhAIybnBb/wisGpPyulSZUd72wdIMNxaUAmP9bniwLs94tzmqbDuBtgZ4a1IPHIm9qGzn7q4JMU2mUYriP/HDIc9Liu6nfccrf7YgYrYKVupu72WU5FktvyWedUj7w= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/paper-radio-button/CONTRIBUTING.md b/static/bower_components/paper-radio-button/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-radio-button/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-radio-button/README.md b/static/bower_components/paper-radio-button/README.md new file mode 100644 index 00000000..a99fda07 --- /dev/null +++ b/static/bower_components/paper-radio-button/README.md @@ -0,0 +1,56 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-radio-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-button) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-radio-button)_ + + +##<paper-radio-button> + +Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button) + +`paper-radio-button` is a button that can be either checked or unchecked. +User can tap the radio button to check or uncheck it. + +Use a `` to group a set of radio buttons. When radio buttons +are inside a radio group, exactly one radio button in the group can be checked +at any time. + +Example: + +```html + +Item label +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent` | +| `--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color` | +| `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color` | +| `--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color` | +| `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color` | +| `--paper-radio-button-size` | Size of the radio button | `16px` | +| `--paper-radio-button-label-color` | Label color | `--primary-text-color` | +| `--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px` | + +This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`. +In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`. + + diff --git a/static/bower_components/paper-radio-button/bower.json b/static/bower_components/paper-radio-button/bower.json new file mode 100644 index 00000000..efa9ad78 --- /dev/null +++ b/static/bower_components/paper-radio-button/bower.json @@ -0,0 +1,38 @@ +{ + "name": "paper-radio-button", + "version": "1.3.1", + "description": "A material design radio button", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "radio", + "control" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-radio-button" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-radio-button", + "ignore": [], + "dependencies": { + "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#~1.3.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.1.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "paper-radio-button.html" +} diff --git a/static/bower_components/paper-radio-button/demo/index.html b/static/bower_components/paper-radio-button/demo/index.html new file mode 100644 index 00000000..930e399e --- /dev/null +++ b/static/bower_components/paper-radio-button/demo/index.html @@ -0,0 +1,79 @@ + + + + + paper-radio-button demo + + + + + + + + + + + + + + +
    +

    Radio buttons can be checked or unchecked, or disabled entirely

    + + + + +

    Radio buttons can hide the ripple effect using the noink attribute

    + + + + +

    Radio buttons can be styled using custom properties

    + + + +
    + + diff --git a/static/bower_components/paper-radio-button/hero.svg b/static/bower_components/paper-radio-button/hero.svg new file mode 100644 index 00000000..7835c217 --- /dev/null +++ b/static/bower_components/paper-radio-button/hero.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-button/index.html b/static/bower_components/paper-radio-button/index.html new file mode 100644 index 00000000..04b0c661 --- /dev/null +++ b/static/bower_components/paper-radio-button/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-radio-button + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-button/paper-radio-button.html b/static/bower_components/paper-radio-button/paper-radio-button.html new file mode 100644 index 00000000..1493feb1 --- /dev/null +++ b/static/bower_components/paper-radio-button/paper-radio-button.html @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-button/test/basic.html b/static/bower_components/paper-radio-button/test/basic.html new file mode 100644 index 00000000..288f1b2d --- /dev/null +++ b/static/bower_components/paper-radio-button/test/basic.html @@ -0,0 +1,207 @@ + + + + + + paper-radio-button basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-button/test/index.html b/static/bower_components/paper-radio-button/test/index.html new file mode 100644 index 00000000..fdf44bfb --- /dev/null +++ b/static/bower_components/paper-radio-button/test/index.html @@ -0,0 +1,28 @@ + + + + paper-radio-button tests + + + + + + + diff --git a/static/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..c30f8cf1 --- /dev/null +++ b/static/bower_components/paper-radio-group/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-radio-group/.gitignore b/static/bower_components/paper-radio-group/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-radio-group/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-radio-group/.travis.yml b/static/bower_components/paper-radio-group/.travis.yml new file mode 100644 index 00000000..51df875d --- /dev/null +++ b/static/bower_components/paper-radio-group/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: MERTTM+t9rMsIccJ4em6ocmNYm1w1r2Zy9qRxhdM1ya0xT2dAlV7UZY7t1jZ4MEdvqtTro1oEzfUr0zgD/mwBJUxLAB0RLRIbYAJEAfngaUUMgbbIgj3yLUZ/bZCvPtfhDPA1W/VsyldhUGCxojzgJthWgAoqWRj6jFX6X+QeWw= + - secure: FvMxnNJsGlUg31KGuGjb0PpWHYFlMf9UPFzmLcFQAbc0kiWVoOl5adCfnv3yySf9EAKnolO02zR3K8KcCBQJ0SpWBlQ1pIgEdOxTXtWQRhlKHttKkj5L2X+qYAw4q5z0sy7lvb0VIjIOceabhvTTcnYmaF+OcrrVxd90ZpIckvk= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/paper-radio-group/CONTRIBUTING.md b/static/bower_components/paper-radio-group/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-radio-group/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-radio-group/README.md b/static/bower_components/paper-radio-group/README.md new file mode 100644 index 00000000..2f258bb9 --- /dev/null +++ b/static/bower_components/paper-radio-group/README.md @@ -0,0 +1,59 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-radio-group.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-group) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-radio-group)_ + + +##<paper-radio-group> + +Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button) + +`paper-radio-group` allows user to select at most one radio button from a set. +Checking one radio button that belongs to a radio group unchecks any +previously checked radio button within the same group. Use +`selected` to get or set the selected radio button. + +The inside the group must have the `name` attribute +set. + +Example: + +```html + + Small + Medium + Large + +``` + +Radio-button-groups can be made optional, and allow zero buttons to be selected: + +```html + + Small + Medium + Large + +``` + +See paper-radio-button for more +information about `paper-radio-button`. + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-radio-group-item-padding` | The padding of the item | `12px` | + + diff --git a/static/bower_components/paper-radio-group/bower.json b/static/bower_components/paper-radio-group/bower.json new file mode 100644 index 00000000..9e59068d --- /dev/null +++ b/static/bower_components/paper-radio-group/bower.json @@ -0,0 +1,38 @@ +{ + "name": "paper-radio-group", + "version": "1.2.1", + "description": "A group of material design radio buttons", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "radio", + "control" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-radio-group.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-radio-group", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.7", + "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "paper-radio-group.html" +} diff --git a/static/bower_components/paper-radio-group/demo/index.html b/static/bower_components/paper-radio-group/demo/index.html new file mode 100644 index 00000000..cfb613d2 --- /dev/null +++ b/static/bower_components/paper-radio-group/demo/index.html @@ -0,0 +1,76 @@ + + + + + paper-radio-group demo + + + + + + + + + + + + + + + +
    +

    A paper-radio-group allows only one item to be selected

    + + + + +

    It can have an initial selection

    + + + + +

    It can optionally allow items to be deselected

    + + + + +
    + + diff --git a/static/bower_components/paper-radio-group/hero.svg b/static/bower_components/paper-radio-group/hero.svg new file mode 100644 index 00000000..291001c9 --- /dev/null +++ b/static/bower_components/paper-radio-group/hero.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-group/index.html b/static/bower_components/paper-radio-group/index.html new file mode 100644 index 00000000..966c7172 --- /dev/null +++ b/static/bower_components/paper-radio-group/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-radio-group + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-group/paper-radio-group.html b/static/bower_components/paper-radio-group/paper-radio-group.html new file mode 100644 index 00000000..5027e11d --- /dev/null +++ b/static/bower_components/paper-radio-group/paper-radio-group.html @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-group/test/basic.html b/static/bower_components/paper-radio-group/test/basic.html new file mode 100644 index 00000000..d123c7fd --- /dev/null +++ b/static/bower_components/paper-radio-group/test/basic.html @@ -0,0 +1,249 @@ + + + + + + paper-radio-group basic tests + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-radio-group/test/index.html b/static/bower_components/paper-radio-group/test/index.html new file mode 100644 index 00000000..cf387c5d --- /dev/null +++ b/static/bower_components/paper-radio-group/test/index.html @@ -0,0 +1,24 @@ + + + + paper-radio-group tests + + + + + + + diff --git a/static/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..689423da --- /dev/null +++ b/static/bower_components/paper-ripple/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-ripple/.gitignore b/static/bower_components/paper-ripple/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-ripple/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-ripple/.travis.yml b/static/bower_components/paper-ripple/.travis.yml new file mode 100644 index 00000000..787deed9 --- /dev/null +++ b/static/bower_components/paper-ripple/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +env: + global: + - secure: eLNXQngbn6nHUirBVQAroarZUJHGZAj8sqSJaxRBqaL08//nzaOpnzuavYUeNSJ1fOnbL95jS5yZJy8+oCUW0a6BCXZUHJCrj/N6ywG4KpgPYQnUZVnpvsLdXZJuq4L4l5jYL1GsPydMePfAlrDpSu+QzEc1+C0q7sprxsbHbbQ= + - secure: YLIZR4/tqr25Ty+daEdTInLVXoV/lSwagZCGMfT84SgHj94UYHr9u9Te3tNDeI8I83Kq1PSUn1kKE6ptT+EjuGhTDsyLx2IboVDtNlngDIo5GTSO1RBBzIlHRIb2eMS6om9cfLiOEWM3gFS/Mos/VYO3/A3ZSLE5BcNFagij724= +node_js: stable +addons: + firefox: '46.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + sauce_connect: true +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +dist: trusty diff --git a/static/bower_components/paper-ripple/CONTRIBUTING.md b/static/bower_components/paper-ripple/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-ripple/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-ripple/README.md b/static/bower_components/paper-ripple/README.md new file mode 100644 index 00000000..359b1319 --- /dev/null +++ b/static/bower_components/paper-ripple/README.md @@ -0,0 +1,90 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-ripple.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-ripple) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-ripple)_ + + +##<paper-ripple> + +Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction) + +`paper-ripple` provides a visual effect that other paper elements can +use to simulate a rippling effect emanating from the point of contact. The +effect can be visualized as a concentric circle with motion. + +Example: + +```html +
    + +
    +``` + +Note, it's important that the parent container of the ripple be relative position, otherwise +the ripple will emanate outside of the desired container. + +`paper-ripple` listens to "mousedown" and "mouseup" events so it would display ripple +effect when touches on it. You can also defeat the default behavior and +manually route the down and up actions to the ripple element. Note that it is +important if you call `downAction()` you will have to make sure to call +`upAction()` so that `paper-ripple` would end the animation loop. + +Example: + +```html + +... +downAction: function(e) { + this.$.ripple.downAction({detail: {x: e.x, y: e.y}}); +}, +upAction: function(e) { + this.$.ripple.upAction(); +} +``` + +Styling ripple effect: + + Use CSS color property to style the ripple: + +```css +paper-ripple { + color: #4285f4; +} +``` + + Note that CSS color property is inherited so it is not required to set it on + the `paper-ripple` element directly. + +By default, the ripple is centered on the point of contact. Apply the `recenters` +attribute to have the ripple grow toward the center of its container. + +```html + +``` + +You can also center the ripple inside its container from the start. + +```html + +``` + +Apply `circle` class to make the rippling effect within a circle. + +```html + +``` + + diff --git a/static/bower_components/paper-ripple/bower.json b/static/bower_components/paper-ripple/bower.json new file mode 100644 index 00000000..f5e3dceb --- /dev/null +++ b/static/bower_components/paper-ripple/bower.json @@ -0,0 +1,35 @@ +{ + "name": "paper-ripple", + "version": "1.0.9", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Adds a material design ripple to any container", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "ripple" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-ripple.git" + }, + "main": "paper-ripple.html", + "dependencies": { + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.1.5", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/static/bower_components/paper-ripple/demo/index.html b/static/bower_components/paper-ripple/demo/index.html new file mode 100644 index 00000000..e12cde5c --- /dev/null +++ b/static/bower_components/paper-ripple/demo/index.html @@ -0,0 +1,415 @@ + + + + + paper-ripple demo + + + + + + + + + + + + + + + + + +
    + +
    +
    SUBMIT
    + +
    + +
    +
    NO INK
    + +
    + +
    +
    CANCEL
    + +
    + +
    +
    COMPOSE
    + +
    + +
    +
    OK
    + +
    + +
    + +
    + +
    +
    +1
    + +
    + +
    +
    +1
    + +
    + +
    +
    +1
    + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + + + + + +
    + +
    + +
    + +
    +
    Permission

    +
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
    +
    + +
    +
    ACCEPT
    + +
    + +
    +
    DECLINE
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + diff --git a/static/bower_components/paper-ripple/hero.svg b/static/bower_components/paper-ripple/hero.svg new file mode 100644 index 00000000..96f0b4c7 --- /dev/null +++ b/static/bower_components/paper-ripple/hero.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-ripple/index.html b/static/bower_components/paper-ripple/index.html new file mode 100644 index 00000000..e552b0bb --- /dev/null +++ b/static/bower_components/paper-ripple/index.html @@ -0,0 +1,27 @@ + + + + + + paper-ripple + + + + + + + + + + + + + diff --git a/static/bower_components/paper-ripple/paper-ripple.html b/static/bower_components/paper-ripple/paper-ripple.html new file mode 100644 index 00000000..3fb18a37 --- /dev/null +++ b/static/bower_components/paper-ripple/paper-ripple.html @@ -0,0 +1,763 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-ripple/test/index.html b/static/bower_components/paper-ripple/test/index.html new file mode 100644 index 00000000..865c40eb --- /dev/null +++ b/static/bower_components/paper-ripple/test/index.html @@ -0,0 +1,24 @@ + + + + Tests + + + + + + + diff --git a/static/bower_components/paper-ripple/test/paper-ripple.html b/static/bower_components/paper-ripple/test/paper-ripple.html new file mode 100644 index 00000000..559f9cd3 --- /dev/null +++ b/static/bower_components/paper-ripple/test/paper-ripple.html @@ -0,0 +1,253 @@ + + + + + + + paper-ripple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/bower_components/paper-styles/.github/ISSUE_TEMPLATE.md b/static/bower_components/paper-styles/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..90f15acd --- /dev/null +++ b/static/bower_components/paper-styles/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/static/bower_components/paper-styles/.gitignore b/static/bower_components/paper-styles/.gitignore new file mode 100644 index 00000000..8d4ae253 --- /dev/null +++ b/static/bower_components/paper-styles/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/static/bower_components/paper-styles/.travis.yml b/static/bower_components/paper-styles/.travis.yml new file mode 100644 index 00000000..2b215285 --- /dev/null +++ b/static/bower_components/paper-styles/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +sudo: required +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: >- + n1GTikMyHiZ8pFwPNIo2E26rcJ4qsXsWgoN9QvuhKEOikqZD9XHyLb4tuy1IkFgeAldnbSmX+erfjgM8ZQyrpJD52WjTFV/HFJiEmrMly23HQEPueQ8xykYWIusEOfOjEHyVH4EKM+lidQIw7Ac7BLBPNWxOb85DAeeCorVPN20= + - secure: >- + X2osrH6z2xoMz1AHz3vsU4LXqZqMZggUfGDLNUZLeXzY7jwearGdRGSdXS+UFvnZ5a1s7QlWQcbOHfbZm9wVfjHRSFkl3nccVZiTz0PQ+hYoDyAPC6f4L6rC+1IabE3B/fbNbjYePfJMKI/Pwuxl8xeS+ZzIGrNWjkPlFV4MZR4= +node_js: '6' +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - true || xvfb-run wct + - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then true || wct -s ''default''; fi' +dist: trusty diff --git a/static/bower_components/paper-styles/CONTRIBUTING.md b/static/bower_components/paper-styles/CONTRIBUTING.md new file mode 100644 index 00000000..093090d4 --- /dev/null +++ b/static/bower_components/paper-styles/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/static/bower_components/paper-styles/README.md b/static/bower_components/paper-styles/README.md new file mode 100644 index 00000000..ca555bdb --- /dev/null +++ b/static/bower_components/paper-styles/README.md @@ -0,0 +1,49 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-styles.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-styles) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-styles)_ + + +##<paper-styles> + +The `` component provides simple ways to use Material Design CSS styles +in your application. The following imports are available: + +1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html): +a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html) + + +1. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text, +background and accent colors that match the default Material Design theme + + +1. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design +[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles + + +1. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html): +Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes + + +1. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles +used in the PolymerElements demo pages + + + +We recommend importing each of these individual files, and using the style mixins +available in each ones, rather than the aggregated `paper-styles.html` as a whole. + + diff --git a/static/bower_components/paper-styles/bower.json b/static/bower_components/paper-styles/bower.json new file mode 100644 index 00000000..162e0b14 --- /dev/null +++ b/static/bower_components/paper-styles/bower.json @@ -0,0 +1,33 @@ +{ + "name": "paper-styles", + "version": "1.2.0", + "description": "Common (global) styles for Material Design elements.", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-component", + "polymer", + "style" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-styles.git" + }, + "main": "paper-styles.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/polymerelements/paper-styles/", + "ignore": [ + "/.*" + ], + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "font-roboto": "PolymerElements/font-roboto#^1.0.1", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0" + } +} diff --git a/static/bower_components/paper-styles/classes/global.html b/static/bower_components/paper-styles/classes/global.html new file mode 100644 index 00000000..6f0d5dde --- /dev/null +++ b/static/bower_components/paper-styles/classes/global.html @@ -0,0 +1,96 @@ + + + + + diff --git a/static/bower_components/paper-styles/classes/shadow-layout.html b/static/bower_components/paper-styles/classes/shadow-layout.html new file mode 100644 index 00000000..50708be7 --- /dev/null +++ b/static/bower_components/paper-styles/classes/shadow-layout.html @@ -0,0 +1,307 @@ + + + + + diff --git a/static/bower_components/paper-styles/classes/shadow.html b/static/bower_components/paper-styles/classes/shadow.html new file mode 100644 index 00000000..4c40a147 --- /dev/null +++ b/static/bower_components/paper-styles/classes/shadow.html @@ -0,0 +1,52 @@ + + + diff --git a/static/bower_components/paper-styles/classes/typography.html b/static/bower_components/paper-styles/classes/typography.html new file mode 100644 index 00000000..b399395e --- /dev/null +++ b/static/bower_components/paper-styles/classes/typography.html @@ -0,0 +1,169 @@ + + + + + diff --git a/static/bower_components/paper-styles/color.html b/static/bower_components/paper-styles/color.html new file mode 100644 index 00000000..51887901 --- /dev/null +++ b/static/bower_components/paper-styles/color.html @@ -0,0 +1,333 @@ + + + + + diff --git a/static/bower_components/paper-styles/default-theme.html b/static/bower_components/paper-styles/default-theme.html new file mode 100644 index 00000000..cc697281 --- /dev/null +++ b/static/bower_components/paper-styles/default-theme.html @@ -0,0 +1,72 @@ + + + + + + + + diff --git a/static/bower_components/paper-styles/demo-pages.html b/static/bower_components/paper-styles/demo-pages.html new file mode 100644 index 00000000..6e900ad1 --- /dev/null +++ b/static/bower_components/paper-styles/demo-pages.html @@ -0,0 +1,72 @@ + + + + + + + + + + + diff --git a/static/bower_components/paper-styles/demo.css b/static/bower_components/paper-styles/demo.css new file mode 100644 index 00000000..efd8b471 --- /dev/null +++ b/static/bower_components/paper-styles/demo.css @@ -0,0 +1,25 @@ +/** +@license +Copyright (c) 2015 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + +*/ +body { + font-family: 'Roboto', 'Noto', sans-serif; + font-size: 14px; + margin: 0; + padding: 24px; +} + +section { + padding: 20px 0; +} + +section > div { + padding: 14px; + font-size: 16px; +} diff --git a/static/bower_components/paper-styles/demo/index.html b/static/bower_components/paper-styles/demo/index.html new file mode 100644 index 00000000..1080cc66 --- /dev/null +++ b/static/bower_components/paper-styles/demo/index.html @@ -0,0 +1,339 @@ + + + + + + + + + + + paper-styles demo + + + + + + + + + + + + + +

    paper-styles

    + +
    +

    default-theme.html

    + +
    +
    + Title +
    +
    +
    +
    +
    Primary text
    +
    Secondary text
    +
    +
    + Disabled +
    +
    +
    + +
    +

    typography.html

    +

    + Grumpy wizards make toxic brew for the evil Queen and Jack. +

    +
    +
    Display 4
    +
    Display 3
    +
    Display 2
    +
    Display 1
    +
    Headline
    +
    Title
    +
    Subhead
    +
    Body 2
    +
    Body 1
    +
    Caption
    +
    Menu
    +
    Button
    +
    + +

    Paragraphs

    + +

    body2

    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi + tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis + purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis + dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id + egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet, + faucibus in leo. +

    +

    + Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus + interdum neque magna, eget dapibus est auctor et. Donec accumsan + libero nec augue scelerisque, ac egestas ante tincidunt. Proin + sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a + sollicitudin tellus quam non sapien. +

    +
    + +

    body1

    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi + tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis + purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis + dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id + egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet, + faucibus in leo. +

    +

    + Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus + interdum neque magna, eget dapibus est auctor et. Donec accumsan + libero nec augue scelerisque, ac egestas ante tincidunt. Proin + sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a + sollicitudin tellus quam non sapien. +

    +
    +
    + +
    +

    shadow.html

    +
    2dp
    +
    3dp
    +
    4dp
    +
    6dp
    +
    8dp
    +
    12dp
    +
    16dp
    +
    + +
    +

    demo-pages.html

    + +

    Horizontal sections

    +
    +
    +

    Column 1

    +
    +
    Oxygen
    +
    Carbon
    +
    Hydrogen
    +
    Nitrogen
    +
    Calcium
    +
    +
    + +
    +

    Column 2

    +
    +
    Oxygen
    +
    Carbon
    +
    Hydrogen
    +
    Nitrogen
    +
    Calcium
    +
    +
    + +
    +

    Column 3

    +
    +
    Oxygen
    +
    Carbon
    +
    Hydrogen
    +
    Nitrogen
    +
    Calcium
    +
    +
    +
    + +

    Vertical sections

    +
    +
    +

    Section 1

    +
    +
    Oxygen
    +
    Carbon
    +
    Hydrogen
    +
    Nitrogen
    +
    Calcium
    +
    +
    +
    + +
    +

    Section 2 (centered)

    +
    +
    Oxygen
    +
    Carbon
    +
    Hydrogen
    +
    Nitrogen
    +
    Calcium
    +
    +
    +
    + + + diff --git a/static/bower_components/paper-styles/element-styles/paper-item.html b/static/bower_components/paper-styles/element-styles/paper-item.html new file mode 100644 index 00000000..bf4a9732 --- /dev/null +++ b/static/bower_components/paper-styles/element-styles/paper-item.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + diff --git a/static/bower_components/paper-styles/element-styles/paper-material.html b/static/bower_components/paper-styles/element-styles/paper-material.html new file mode 100644 index 00000000..e8c6144c --- /dev/null +++ b/static/bower_components/paper-styles/element-styles/paper-material.html @@ -0,0 +1,63 @@ + + + + + + + + + + diff --git a/static/bower_components/paper-styles/index.html b/static/bower_components/paper-styles/index.html new file mode 100644 index 00000000..8e96ebe0 --- /dev/null +++ b/static/bower_components/paper-styles/index.html @@ -0,0 +1,24 @@ + + + + + + paper-styles + + + + + + + + + + diff --git a/static/bower_components/paper-styles/paper-styles-classes.html b/static/bower_components/paper-styles/paper-styles-classes.html new file mode 100644 index 00000000..ae315a57 --- /dev/null +++ b/static/bower_components/paper-styles/paper-styles-classes.html @@ -0,0 +1,14 @@ + + + + + + diff --git a/static/bower_components/paper-styles/paper-styles.html b/static/bower_components/paper-styles/paper-styles.html new file mode 100644 index 00000000..9eca03a7 --- /dev/null +++ b/static/bower_components/paper-styles/paper-styles.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/static/bower_components/paper-styles/shadow.html b/static/bower_components/paper-styles/shadow.html new file mode 100644 index 00000000..7e0546ee --- /dev/null +++ b/static/bower_components/paper-styles/shadow.html @@ -0,0 +1,76 @@ + + + + + diff --git a/static/bower_components/paper-styles/typography.html b/static/bower_components/paper-styles/typography.html new file mode 100644 index 00000000..055b5f99 --- /dev/null +++ b/static/bower_components/paper-styles/typography.html @@ -0,0 +1,169 @@ + + + + + + diff --git a/static/bower_components/polymer/.eslintignore b/static/bower_components/polymer/.eslintignore new file mode 100644 index 00000000..2fb5b53d --- /dev/null +++ b/static/bower_components/polymer/.eslintignore @@ -0,0 +1,2 @@ +src/**/demo/* +src/**/experimental/* diff --git a/static/bower_components/polymer/.eslintrc.json b/static/bower_components/polymer/.eslintrc.json new file mode 100644 index 00000000..cc13518e --- /dev/null +++ b/static/bower_components/polymer/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": "eslint:recommended", + "rules": { + "no-console": 0 + }, + "env": { + "browser": true + }, + "plugins": [ + "html" + ], + "globals": { + "CustomElements": false, + "HTMLImports": false, + "Polymer": false, + "WeakMap": false + } +} diff --git a/static/bower_components/polymer/.gitattributes b/static/bower_components/polymer/.gitattributes new file mode 100644 index 00000000..176a458f --- /dev/null +++ b/static/bower_components/polymer/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/static/bower_components/polymer/.github/ISSUE_TEMPLATE.md b/static/bower_components/polymer/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..cbc05b4e --- /dev/null +++ b/static/bower_components/polymer/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,47 @@ + + +### Description + + +#### Live Demo + +https://jsbin.com/xukike/edit?html,output + +#### Steps to Reproduce + + + +#### Expected Results + + +#### Actual Results + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Edge +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] IE 11 + +### Versions + +- Polymer: vX.X.X +- webcomponents: vX.X.X diff --git a/static/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md b/static/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..94d43316 --- /dev/null +++ b/static/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,3 @@ + +### Reference Issue + diff --git a/static/bower_components/polymer/.gitignore b/static/bower_components/polymer/.gitignore new file mode 100644 index 00000000..372e20a5 --- /dev/null +++ b/static/bower_components/polymer/.gitignore @@ -0,0 +1,3 @@ +bower_components +node_modules +dist diff --git a/static/bower_components/polymer/.travis.yml b/static/bower_components/polymer/.travis.yml new file mode 100644 index 00000000..35428a2b --- /dev/null +++ b/static/bower_components/polymer/.travis.yml @@ -0,0 +1,28 @@ +language: node_js +sudo: required +dist: trusty +node_js: stable +addons: + firefox: latest + sauce_connect: true + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +cache: + directories: + - node_modules +before_script: +- npm install -g bower gulp-cli@1 +- bower install +- gulp lint +- gulp switch +script: +- xvfb-run wct +- "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s default; fi" + +env: + global: + - secure: eFrp9xwSYG579rAR9/XyXYKh+UtIQJ1xS5q5PABu4ndYFckdJb8o3m7oXqRSikbiPWbCSd3Fkd6+ZKXlcQFdjJ+nx9gFitGthtH93qkvZCO3XhWEEBPj65igIo3hrRSOB6dIWyiZcnoH9IXLLQtKXY9uL1NCqCcyVHg1omPKr9w= + - secure: EAjjkzqZ8z+PEvdo2N2MiIjkqUYAjVkQABKyMw6N4hUa6YSNEW9PYyn4I0d9Rdvc25GwJ+oLQFdeQepioAkNfp6wYUj2IdMIfmmKa1aJWo5DWvOMDYp3ufRhIoiVi4ZVpLg9sTjw+078UhUQFWE44rwfUtHiIb2UbWe2/ueLOiM= diff --git a/static/bower_components/polymer/CHANGELOG.md b/static/bower_components/polymer/CHANGELOG.md new file mode 100644 index 00000000..34cf32ba --- /dev/null +++ b/static/bower_components/polymer/CHANGELOG.md @@ -0,0 +1,3849 @@ +# Change Log + +##[v1.4.0](https://github.com/Polymer/polymer/tree/v1.4.0) (2016-03-18) +- Fast check in createdCallback to see if registration has finished. ([commit](https://github.com/Polymer/polymer/commit/a3fce19)) + +- even more lazy: defer template lookup and style collection until finish register time. ([commit](https://github.com/Polymer/polymer/commit/103f790)) + +- fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/d7a2baa)) + +- * turn on lazy registration via `Polymer.Settings.lazyRegister` * ensure registration finished by calling `Element.prototype.ensureRegisterFinished()` ([commit](https://github.com/Polymer/polymer/commit/31c785d)) + +- remove crufty smoke test. ([commit](https://github.com/Polymer/polymer/commit/3dd1b61)) + +- fix lint issues ([commit](https://github.com/Polymer/polymer/commit/0447228)) + +- Change `forceRegister` to `eagerRegister` and add `Polymer.Settings.eagerRegister` flag. ([commit](https://github.com/Polymer/polymer/commit/f6597ec)) + +- Add `forceRegister` flag to force an element to fully register when `Polymer` is called. Normally, some work is deferred until the first element instance is created. ([commit](https://github.com/Polymer/polymer/commit/d53323d)) + +- Call registered no prototype. ([commit](https://github.com/Polymer/polymer/commit/812db6a)) + +- Lazy register features we can be deferred until first instance. This is an optimization which can speed up page load time when elements are registered but not needed at time of first paint/interaction ([commit](https://github.com/Polymer/polymer/commit/31702ff)) + +- Do not reflect uppercase properties ([commit](https://github.com/Polymer/polymer/commit/72d35e0)) + +- Make sure event.path is an array ([commit](https://github.com/Polymer/polymer/commit/2dfdd7b)) + +- fix testing failures on assert.notInclude of null ([commit](https://github.com/Polymer/polymer/commit/8066919)) + +- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/58e6713)) + +##[v1.3.1](https://github.com/Polymer/polymer/tree/v1.3.1) (2016-03-02) +- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/44d06f1)) + +- Add test. ([commit](https://github.com/Polymer/polymer/commit/02660c1)) + +- Fix lint error. ([commit](https://github.com/Polymer/polymer/commit/e2c5f9e)) + +- Ensure that dom-bind always waits until DOMContentLoaded to render. This ensures a script can install api on the dom-bind prior to it rendering. Previously dom-bind waited for first render, but an early parser yield can make this occur unexpectedly early. ([commit](https://github.com/Polymer/polymer/commit/cc0e9df)) + +- Refine fix for #3461 so that the decision to apply a static or property stylesheet relies on the same info. ([commit](https://github.com/Polymer/polymer/commit/ff96f9e)) + +- Clean the .eslintignore ([commit](https://github.com/Polymer/polymer/commit/04d06a5)) + +- [ci skip] Add header for those asking questions ([commit](https://github.com/Polymer/polymer/commit/9d6111c)) + +- Fixes #3461: Only avoid creating a statically scoped stylesheet when properties are consumed in an element, properly excluding properties produced as a result of consumption. ([commit](https://github.com/Polymer/polymer/commit/e26a806)) + +- tweaks to new README ([commit](https://github.com/Polymer/polymer/commit/809352d)) + +- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/4f3f463)) + +- Updated the README.md for a non-technical user to understand ([commit](https://github.com/Polymer/polymer/commit/0729cef)) + +##[v1.3.0](https://github.com/Polymer/polymer/tree/v1.3.0) (2016-02-22) +- [ci skip] Add instructions to pull request template ([commit](https://github.com/Polymer/polymer/commit/933c920)) + +- [ci skip] markdown fail ([commit](https://github.com/Polymer/polymer/commit/a8e01e2)) + +- [ci skip] Add instructions to issue template ([commit](https://github.com/Polymer/polymer/commit/ace0f72)) + +- Make sure to configure properties on polymer elements that do not have property effects. ([commit](https://github.com/Polymer/polymer/commit/f93c3e5)) + +- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/5ac5ee7)) + +- Add comment. Ensure Date deserializes to String for correctness. ([commit](https://github.com/Polymer/polymer/commit/69c7087)) + +- Serialize before deserialize when configuring attrs. Fixes #3433. ([commit](https://github.com/Polymer/polymer/commit/ec85582)) + +- Restrict early property set to properties that have accessors. This allows users to set properties in `created` which are listed in `properties` but which have no accessor. ([commit](https://github.com/Polymer/polymer/commit/4cfb245)) + +- fix crlf once and for all ([commit](https://github.com/Polymer/polymer/commit/6c5afe5)) + +- fix test linting from #3350 ([commit](https://github.com/Polymer/polymer/commit/37f7157)) + +- Use the new .github folder for issue and pull request templates ([commit](https://github.com/Polymer/polymer/commit/58529c2)) + +- [ci skip] Use https for jsbin ([commit](https://github.com/Polymer/polymer/commit/3e33fd4)) + +- [ci skip] Add issue and pr template ([commit](https://github.com/Polymer/polymer/commit/cc1ef9a)) + +- Update to gulp-eslint v2 ([commit](https://github.com/Polymer/polymer/commit/dca0dda)) + +- fix lint errors ([commit](https://github.com/Polymer/polymer/commit/7da9a38)) + +- Minor fixes based on review. ([commit](https://github.com/Polymer/polymer/commit/f2c1d4a)) + +- Undo fix on IE10 where the custom elements polyfill's mixin strategy makes this unfeasible. ([commit](https://github.com/Polymer/polymer/commit/ef629f4)) + +- Update comments. ([commit](https://github.com/Polymer/polymer/commit/b870fe0)) + +- Add test that late resolved functions don't warn ([commit](https://github.com/Polymer/polymer/commit/0037c53)) + +- Add support for properties defined in a behavior. ([commit](https://github.com/Polymer/polymer/commit/b6abf26)) + +- Generalized approach supporting compute and observers ([commit](https://github.com/Polymer/polymer/commit/f4486a2)) + +- Proper implementation ([commit](https://github.com/Polymer/polymer/commit/3c12178)) + +- Support dynamic functions for computed annotations. ([commit](https://github.com/Polymer/polymer/commit/3f1bc4e)) + +- ordering issue for when assert is defined in native html imports ([commit](https://github.com/Polymer/polymer/commit/d81f6bc)) + +- Lint the tests ([commit](https://github.com/Polymer/polymer/commit/e5063ca)) + +- Add support for one-of attribute selector while not breaking support for general sibling combinator. Fixes #3023. Fix taken from #3067. ([commit](https://github.com/Polymer/polymer/commit/5a493d8)) + +- Fix bindings with special characters ([commit](https://github.com/Polymer/polymer/commit/d385873)) + +- [ci skip] move linting into before_script stage ([commit](https://github.com/Polymer/polymer/commit/1b5fc9a)) + +- Fix lint error and uncomment test. ([commit](https://github.com/Polymer/polymer/commit/c00c47f)) + +- Add test for overriding property based :host selector from outside. ([commit](https://github.com/Polymer/polymer/commit/71c41ed)) + +- Add comment and fix typo ([commit](https://github.com/Polymer/polymer/commit/b0e16f0)) + +- Ensure _propertySetter is installed first. Fixes #3063 ([commit](https://github.com/Polymer/polymer/commit/6362f60)) + +- Disable tap gesture when track gesture is firing for ancestor node ([commit](https://github.com/Polymer/polymer/commit/6f2c1fc)) + +- Fix parsing of parenthesis in default of variable declaration ([commit](https://github.com/Polymer/polymer/commit/926d0e5)) + +- Rename _mapRule to _mapRuleOntoParent ([commit](https://github.com/Polymer/polymer/commit/cd42595)) + +- Test with ESLint enabled ([commit](https://github.com/Polymer/polymer/commit/acdfc1e)) + +- Make behaviors array unique ([commit](https://github.com/Polymer/polymer/commit/4cde38a)) + +- Use deserialize from the node. ([commit](https://github.com/Polymer/polymer/commit/a3641e2)) + +- Actually execute case-map ([commit](https://github.com/Polymer/polymer/commit/d84d75b)) + +- [ci skip] .eslintrc is deprecated, add .json suffix ([commit](https://github.com/Polymer/polymer/commit/c7554d9)) + +- Make the test more look like a spec ([commit](https://github.com/Polymer/polymer/commit/db7c324)) + +- Configure attr's with property effects. More robust fix for #3288. ([commit](https://github.com/Polymer/polymer/commit/0f55d1d)) + +- Use ESLint for Polymer ([commit](https://github.com/Polymer/polymer/commit/f3c4bb1)) + +- Add test suite for effects order ([commit](https://github.com/Polymer/polymer/commit/56df8f7)) + +- Fix negation when a negated binding is changed ([commit](https://github.com/Polymer/polymer/commit/21383a3)) + +- Add unit test suite for CaseMap ([commit](https://github.com/Polymer/polymer/commit/ee9a600)) + +- Fixes for IE style ordering issue. ([commit](https://github.com/Polymer/polymer/commit/162f81e)) + +- Fixes #3326. Changes inspired by #3276 and #3344 ([commit](https://github.com/Polymer/polymer/commit/b5ba9a8)) + +- Fix for getters/setters for property become inaccessible when property set on element before it is ready ([commit](https://github.com/Polymer/polymer/commit/ecd9b09)) + +- Non-destructive `@keyframes` rule transformation. ([commit](https://github.com/Polymer/polymer/commit/b9f2482)) + +- Fix test regression from PR 3289 ([commit](https://github.com/Polymer/polymer/commit/5205d6a)) + +- Move test and add to runner. ([commit](https://github.com/Polymer/polymer/commit/aeb44de)) + +- make isDebouncerActive actually return a bool ([commit](https://github.com/Polymer/polymer/commit/dee9b98)) + +- Lint the javascript code with eslint ([commit](https://github.com/Polymer/polymer/commit/f7d2bdf)) + +- i suck at git ([commit](https://github.com/Polymer/polymer/commit/b40f639)) + +- Fix for scoping when class is not specified on element (null was prepended instead of empty string) ([commit](https://github.com/Polymer/polymer/commit/24e9fc7)) + +- Using constant rather than plain `:host` and `::content`, also create regexp object only once ([commit](https://github.com/Polymer/polymer/commit/c6c28f5)) + +- Eliminate the need to write `:host ::content` instead of just `::content`, while keeping the same processing under the hood ([commit](https://github.com/Polymer/polymer/commit/d9f3dda)) + +- Fix: There is no effect of kind 'computedAnnotation' ([commit](https://github.com/Polymer/polymer/commit/06cd560)) + +- fix test case in 5d17efc ([commit](https://github.com/Polymer/polymer/commit/4a9ef8e)) + +- add test for 3326 ([commit](https://github.com/Polymer/polymer/commit/854fdbf)) + +- [ci skip] update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/3d2cb71)) + +- Exclude attribute bindings from configuration. Fixes #3288. ([commit](https://github.com/Polymer/polymer/commit/246ea72)) + +- Doubled `Polymer.CaseMap.dashToCamelCase` performance with simplified and once compiled RegExp. 5 times faster `Polymer.CaseMap.camelToDashCase` using simplified replace part, simplified and once compiled RegExp. ([commit](https://github.com/Polymer/polymer/commit/90938e3)) + +- Update PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/bb4d558)) + +- Unit tests ([commit](https://github.com/Polymer/polymer/commit/de371bb)) + +- Allow newlines in computed binding argument list ([commit](https://github.com/Polymer/polymer/commit/b745f45)) + +- Remove redundant assign to window.Polymer ([commit](https://github.com/Polymer/polymer/commit/b2f8e8f)) + +- parentProps should not override argument based props ([commit](https://github.com/Polymer/polymer/commit/898fe89)) + +##[v1.2.4](https://github.com/Polymer/polymer/tree/v1.2.4) (2016-01-27) +- Fixes #3337. When a doc fragment is added, only update the invalidation state of the insertion point list of the shadyRoot IFF it is not already invalid. This fixes an issue that was detected when an a doc fragment that did not include an insertion point was added after one that did but before distribution. ([commit](https://github.com/Polymer/polymer/commit/d26b003)) + +- fix build output with new vulcanize ([commit](https://github.com/Polymer/polymer/commit/c317711)) + +- Revert style properties change from fd5778470551f677c2aa5827398681abb1994a88 ([commit](https://github.com/Polymer/polymer/commit/0a0b580)) + +- Fix shadow dom test. ([commit](https://github.com/Polymer/polymer/commit/6b83911)) + +- Add shadow root support. (tests broken) ([commit](https://github.com/Polymer/polymer/commit/4b7da35)) + +- Ensure dom-if moved into doc fragment is torn down. Fixes #3324 ([commit](https://github.com/Polymer/polymer/commit/6c4f5d5)) + +- improve test. ([commit](https://github.com/Polymer/polymer/commit/d70c40a)) + +- Update comment. ([commit](https://github.com/Polymer/polymer/commit/aa14687)) + +- In addition to fragments, also handle non-distributed elements more completely. ([commit](https://github.com/Polymer/polymer/commit/fe2699e)) + +- Simplify fix for fragment children management. ([commit](https://github.com/Polymer/polymer/commit/713377e)) + +- Fix test under polypill. ([commit](https://github.com/Polymer/polymer/commit/25da63d)) + +- Ensure fragments added via Polymer.dom always have elements removed, even when distribution does not select those elements. ([commit](https://github.com/Polymer/polymer/commit/101eb3d)) + +- Fixes #3321. Only let dom-repeat insert elements in attached if it has been previously detached; correctly avoid re-adding children in document fragments to an element's logical linked list if they are already there. ([commit](https://github.com/Polymer/polymer/commit/9f2464d)) + +- Ugh ([commit](https://github.com/Polymer/polymer/commit/172d93c)) + +- Fixes #3308. Use an explicit undefined check to test if logical tree information exists. ([commit](https://github.com/Polymer/polymer/commit/9106398)) + +- add test ([commit](https://github.com/Polymer/polymer/commit/b1ea014)) + +- use class attribute in applyElementScopeSelector ([commit](https://github.com/Polymer/polymer/commit/07d8c06)) + +- Remove reference to _composedChildren ([commit](https://github.com/Polymer/polymer/commit/9f85acd)) + +- Fix typo in documentation for set() ([commit](https://github.com/Polymer/polymer/commit/aa47515)) + +- Fix typo in dom-tree-api ([commit](https://github.com/Polymer/polymer/commit/ae98a7c)) + +- Correct use of document.contains to document.documentElement.contains on IE. ([commit](https://github.com/Polymer/polymer/commit/0e74810)) + +- Ensure querySelector always returns `null` when a node is not found. Also optimize querySelector such that the matcher halts on the first result. ([commit](https://github.com/Polymer/polymer/commit/b9e5cce)) + +- Fixes #3295. Only cache a false-y result for an element's owner shady root iff the element is currently in the document. ([commit](https://github.com/Polymer/polymer/commit/6e16619)) + +- Use local references to wrapper functions; add test element tree to native shadow tests; reorder test elements. ([commit](https://github.com/Polymer/polymer/commit/47ee2ca)) + +- Remove leftover garbage line ([commit](https://github.com/Polymer/polymer/commit/d7567b7)) + +- Removes the case where activeElement could be in the light DOM of a ShadowRoot. ([commit](https://github.com/Polymer/polymer/commit/e848af8)) + +- DOM API implementation of `activeElement`. ([commit](https://github.com/Polymer/polymer/commit/2984576)) + +- Remove call to `wrap` in deepContains ([commit](https://github.com/Polymer/polymer/commit/4cbdef7)) + +- Fixes #3270. ([commit](https://github.com/Polymer/polymer/commit/7d0485b)) + +- Include more styling tests under ShadowDOM. Fix custom-style media query test to work under both shadow/shady. ([commit](https://github.com/Polymer/polymer/commit/33a24bb)) + +- Remove duplicate code related to dom traversal in Polymer.dom. ([commit](https://github.com/Polymer/polymer/commit/555252b)) + +- Fix parsing of minimized css output also for mixins ([commit](https://github.com/Polymer/polymer/commit/87d02e0)) + +- Set position to relative to make Safari to succeed top/bottom tests ([commit](https://github.com/Polymer/polymer/commit/94f505a)) + +- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/f92f9ff)) + +- Fix for `Polymer.dom(...)._query()` method doesn't exist which causes `Polymer.updateStyles()` to fail ([commit](https://github.com/Polymer/polymer/commit/0eea7a6)) + +- Minor factoring of dom patching. ([commit](https://github.com/Polymer/polymer/commit/8c95014)) + +- use destination insertion points when calculating the path ([commit](https://github.com/Polymer/polymer/commit/3f8b6ee)) + +- Store all dom tree data in `__dom` private storage; implement composed patching via a linked list. ([commit](https://github.com/Polymer/polymer/commit/9a3bead)) + +- Modernize the build ([commit](https://github.com/Polymer/polymer/commit/2b69bb1)) + +- Add more globals to whitelist for safari ([commit](https://github.com/Polymer/polymer/commit/82b2443)) + +- Shady patching: patch element accessors in composed tree; fixes HTMLImports polyfill support. ([commit](https://github.com/Polymer/polymer/commit/d135fef)) + +- remove unused code; minor changes based on review. ([commit](https://github.com/Polymer/polymer/commit/c3fbd10)) + +- added polymer-mini and polymer-micro to main ([commit](https://github.com/Polymer/polymer/commit/da5d781)) + +- Updates the patch-don experiment to work with recent changes. ([commit](https://github.com/Polymer/polymer/commit/b9e6859)) + +- Fixes #3113 ([commit](https://github.com/Polymer/polymer/commit/fadd455)) + +- Polymer.dom: when adding a node, only remove the node from its existing location if it's not a fragment and has a parent. ([commit](https://github.com/Polymer/polymer/commit/9915627)) + +- Consistently use TreeApi.Composed api for composed dom manipulation; use TreeApi.Logical methods to get node leaves. Avoid making a Polymer.dom when TreeApi.Logical can provide the needed info. ([commit](https://github.com/Polymer/polymer/commit/5033fdb)) + +- Produce nicer error on malformed observer ([commit](https://github.com/Polymer/polymer/commit/0e248f5)) + +- Deduplicate setup and verifying in notify-path test suite ([commit](https://github.com/Polymer/polymer/commit/68707ad)) + +- more explicit tests for debouncer wait and no-wait behavior ([commit](https://github.com/Polymer/polymer/commit/8ef7bac)) + +- speed up microtask testing ([commit](https://github.com/Polymer/polymer/commit/9bef4c0)) + +- ensure isDebouncerActive returns a Boolean ([commit](https://github.com/Polymer/polymer/commit/3916493)) + +- add more debouncer tests ([commit](https://github.com/Polymer/polymer/commit/0206852)) + +- remove dead debounce test assertion ([commit](https://github.com/Polymer/polymer/commit/9b898c2)) + +- Factoring of distribution logic in both add and remove cases. ([commit](https://github.com/Polymer/polymer/commit/8272d5e)) + +- Minor typo in docs: call the debounce callback ([commit](https://github.com/Polymer/polymer/commit/02c5c79)) + +- Correct test to avoid using `firstElementChild` on a documentFragment since it is not universally supported. ([commit](https://github.com/Polymer/polymer/commit/dfa6a44)) + +- Remove all TODOs ([commit](https://github.com/Polymer/polymer/commit/6467ae1)) + +- Revert "Add .gitattributes to solve line endings cross-OS (merge after other PRs)" ([commit](https://github.com/Polymer/polymer/commit/b6b8293)) + +- Make renderedItemCount readOnly & add tests. ([commit](https://github.com/Polymer/polymer/commit/e39d5ba)) + +- Revert "Fix parsing of minimized css output" ([commit](https://github.com/Polymer/polymer/commit/d3145e8)) + +- Custom setProperty for bindings to hidden textNodes. Fixes #3157. ([commit](https://github.com/Polymer/polymer/commit/c6be10d)) + +- Ensure dom-if in host does not restamp when host detaches. Fixes #3125. ([commit](https://github.com/Polymer/polymer/commit/bb85e2b)) + +- Avoid making a copy of childNodes when a dom fragment is inserted in the logical tree. ([commit](https://github.com/Polymer/polymer/commit/dcbafbf)) + +- Slightly faster `findAnnotatedNodes` ([commit](https://github.com/Polymer/polymer/commit/43fc853)) + +- Add .gitattributes to solve line endings cross-OS ([commit](https://github.com/Polymer/polymer/commit/94c2bc2)) + +- Ensure literals are excluded from parent props. Fixes #3128. Fixes #3121. ([commit](https://github.com/Polymer/polymer/commit/526fa3c)) + +- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/d458690)) + +- Disable chunked dom-repeat tests on IE due to CI rAF flakiness. ([commit](https://github.com/Polymer/polymer/commit/7fe5e2b)) + +- Add comment. ([commit](https://github.com/Polymer/polymer/commit/d8ecd45)) + +- Make Polymer.dom.flush reentrant-safe. Fixes #3115. ([commit](https://github.com/Polymer/polymer/commit/644105a)) + +- Fixes #3108. Moves `debounce` functionality from polymer-micro to polymer-mini. The functionality belongs at the mini tier and was never actually functional in micro. ([commit](https://github.com/Polymer/polymer/commit/3df4ef2)) + +- Clarify this is for IE. ([commit](https://github.com/Polymer/polymer/commit/63782fa)) + +- Patch rAF to setTimeout to reduce flakiness on CI. ([commit](https://github.com/Polymer/polymer/commit/35abadc)) + +- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/00ed797)) + +- ?Node ([commit](https://github.com/Polymer/polymer/commit/9385891)) + +- Remove closures holding element references after mouseup/touchend ([commit](https://github.com/Polymer/polymer/commit/811f766)) + +- set class attribute instead of using classname ([commit](https://github.com/Polymer/polymer/commit/690838a)) + +- Include wildcard character in identifier. Fixes #3084. ([commit](https://github.com/Polymer/polymer/commit/c36d6c1)) + +- Revert fromAbove in applyEffectValue. Add test. Fixes #3077. ([commit](https://github.com/Polymer/polymer/commit/156122c)) + +- loosen isLightDescendant's @param type to Node ([commit](https://github.com/Polymer/polymer/commit/c635797)) + +- Put beforeRegister in the behaviorProperties. ([commit](https://github.com/Polymer/polymer/commit/445b6cd)) + +- ES5 strict doesn't like function declarations inside inner blocks. ([commit](https://github.com/Polymer/polymer/commit/51d3fa6)) + +- Fixes #3065: Add dom-repeat.renderedItemCount property ([commit](https://github.com/Polymer/polymer/commit/b589f70)) + +- Minor factoring; ensure base properties set on instance. ([commit](https://github.com/Polymer/polymer/commit/da15ff0)) + +- Fix typos. ([commit](https://github.com/Polymer/polymer/commit/c12d3ed)) + +- Simplify more. ([commit](https://github.com/Polymer/polymer/commit/186e053)) + +- Improvements to regex. ([commit](https://github.com/Polymer/polymer/commit/a3d17d5)) + +- Give dom-repeat#_targetFrameTime a type ([commit](https://github.com/Polymer/polymer/commit/adad9ce)) + +- [skip ci] update travis config to firefox latest ([commit](https://github.com/Polymer/polymer/commit/608ce9f)) + +- Add a couple of tests. ([commit](https://github.com/Polymer/polymer/commit/108b7f9)) + +- Suppress warnings and expected errors in test suite ([commit](https://github.com/Polymer/polymer/commit/92d6fcb)) + +- Use linked-list for element tree traversal. Factor Polymer.DomApi into shadow/shady modules. ([commit](https://github.com/Polymer/polymer/commit/306cc81)) + +- Avoid throwing with invalid keys/paths. Fixes #3018. ([commit](https://github.com/Polymer/polymer/commit/5076ee0)) + +- Use stricter binding parsing for efficiency and correctness. Fixes #2705. ([commit](https://github.com/Polymer/polymer/commit/04cd184)) + +- Simpler travis config ([commit](https://github.com/Polymer/polymer/commit/68b457d)) + +- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/7e7600a)) + +- Fix for incorrect CSS selectors specificity as reported in #2531 Fix for overriding mixin properties, fixes #1873 Added awareness from `@apply()` position among other rules so that it is preserved after CSS variables/mixing substitution. `Polymer.StyleUtil.clearStyleRules()` method removed as it is not used anywhere. Some unused variables removed. Typos, unused variables and unnecessary escaping in regexps corrected. Tests added. ([commit](https://github.com/Polymer/polymer/commit/fd57784)) + +- Fix for method parsing in computed binding ([commit](https://github.com/Polymer/polymer/commit/c2e43d3)) + +- Fix doc typo. ([commit](https://github.com/Polymer/polymer/commit/8886c2c)) + +- Filtering causes unexpected issues ([commit](https://github.com/Polymer/polymer/commit/df22564)) + +- Fix using value$ on input element ([commit](https://github.com/Polymer/polymer/commit/05a1e95)) + +- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/338574d)) + +##[v1.2.3](https://github.com/Polymer/polymer/tree/v1.2.3) (2015-11-16) +- Call decorate instead of bootstrap for template prepping ([commit](https://github.com/Polymer/polymer/commit/e2a2cfd)) + +- Fix global leak test. Necessary due to changes to test harness. ([commit](https://github.com/Polymer/polymer/commit/134766f)) + +- Defer property application only when a custom-style is first created. ([commit](https://github.com/Polymer/polymer/commit/4bf0e13)) + +- Update comment. ([commit](https://github.com/Polymer/polymer/commit/27e1dcd)) + +- Simplify custom-style property deferment. ([commit](https://github.com/Polymer/polymer/commit/a970493)) + +- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/98acb3a)) + +- Fixes #2692. Ensures that custom-style properties are applied async but before next render so that all properties are defined before any are consumed by custom-styles. Also refines dom-module's early upgrade code so that it does not affect other elements (corrects for example, custom-styles upgrading before expected). ([commit](https://github.com/Polymer/polymer/commit/b829f2a)) + +- Remove undesired full-stop from outputs ([commit](https://github.com/Polymer/polymer/commit/68d5c55)) + +- Fix Formatting ([commit](https://github.com/Polymer/polymer/commit/724e1bc)) + +##[v1.2.2](https://github.com/Polymer/polymer/tree/v1.2.2) (2015-11-12) +- use local reference for wrap. ([commit](https://github.com/Polymer/polymer/commit/b15e5b9)) + +- Add Polymer.DomApi.wrap ([commit](https://github.com/Polymer/polymer/commit/6cf974a)) + +- For correctness, bind listeners must use a property's current value rather than its passed value. ([commit](https://github.com/Polymer/polymer/commit/aca404f)) + +- Explicitly making an element's `_template` falsy is now considered an allowable setting. This means the element stamps no content, doesn't collect any styles, and avoids looking up a dom-module. This helps address #2708 and the 5 elements Polymer registers that have no template have been set with `_template: null`. ([commit](https://github.com/Polymer/polymer/commit/b905a37)) + +- Make test work under native Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/4f9c2bd)) + +- In `_notifyListener`, only use `e.detail` if the event has a detail. This is necessary for `::eventName` compatibility where `eventName` is a native event like `change`. ([commit](https://github.com/Polymer/polymer/commit/3ece552)) + +- Fix TOC re: host event listeners. ([commit](https://github.com/Polymer/polymer/commit/ce32459)) + +- Fix compound bindings with braces in literals ([commit](https://github.com/Polymer/polymer/commit/561b28b)) + +- Re-enable listeners of the form 'a.b' (todo: make this more efficient). ([commit](https://github.com/Polymer/polymer/commit/139257b)) + +- Avoid stomping on property objects when mixing behaviors. ([commit](https://github.com/Polymer/polymer/commit/ec4d313)) + +- Update test to avoid template polypill issues. ([commit](https://github.com/Polymer/polymer/commit/fa96ff3)) + +- Ensure parent node exists when stamping. Fixes #2685. ([commit](https://github.com/Polymer/polymer/commit/62f2d2a)) + +- Add global leak test to runner. ([commit](https://github.com/Polymer/polymer/commit/dc2255c)) + +- Add global leak test. ([commit](https://github.com/Polymer/polymer/commit/7f71b4c)) + +- Fix typo that prevented correct functioning of Polymer.dom under Shadow DOM and add tests to catch. ([commit](https://github.com/Polymer/polymer/commit/cdc9fde)) + +- maintain compatibility with older `_notifyChange` arguments. ([commit](https://github.com/Polymer/polymer/commit/f5aec30)) + +- Weird assignment fix ([commit](https://github.com/Polymer/polymer/commit/9e6f77a)) + +- add comment. ([commit](https://github.com/Polymer/polymer/commit/f2d5f44)) + +- For efficiency, use cached events in data system, for property and path changes. ([commit](https://github.com/Polymer/polymer/commit/da71dfe)) + +- Fixes #2690 ([commit](https://github.com/Polymer/polymer/commit/d8b78d4)) + +- change after render method to `Polymer.RenderStatus.afterNextRender` ([commit](https://github.com/Polymer/polymer/commit/8949c04)) + +- When effect values are applied via bindings, use fromAbove gambit to avoid unnecessary wheel spinning. (This is now possible since we have fast lookup for readOnly where we want to avoid doing the set at all). ([commit](https://github.com/Polymer/polymer/commit/c520907)) + +- do readOnly check for configured properties where they are handed down, rather than when they are consumed. ([commit](https://github.com/Polymer/polymer/commit/24bcedb)) + +- Minor cleanup. ([commit](https://github.com/Polymer/polymer/commit/0b21506)) + +- Avoid creating unnecessary placeholders for full refresh. ([commit](https://github.com/Polymer/polymer/commit/996289a)) + +- Simplify ([commit](https://github.com/Polymer/polymer/commit/c5e1135)) + +- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/680c56d)) + +- Update docs. ([commit](https://github.com/Polymer/polymer/commit/352ccbe)) + +- _removeInstance -> _detachAndRemoveInstance ([commit](https://github.com/Polymer/polymer/commit/ba7a16f)) + +- Remove limit & chunkCount API. Refactor insert/remove. ([commit](https://github.com/Polymer/polymer/commit/f447c0e)) + +- add back deepContains (got removed incorrectly in merge). ([commit](https://github.com/Polymer/polymer/commit/d53ab57)) + +- fix line endings. ([commit](https://github.com/Polymer/polymer/commit/0233d6d)) + +- revert host attributes ordering change optimization as it was not worth the trouble (barely measurable and more cumbersome impl). ([commit](https://github.com/Polymer/polymer/commit/f9894a0)) + +- rename host functions fix typos afterFirstRender is now raf+setTimeout dom-repeat: remove cruft ([commit](https://github.com/Polymer/polymer/commit/d82840b)) + +- Fix Gestures when using SD polyfill ([commit](https://github.com/Polymer/polymer/commit/96e4bfa)) + +- Fix for multiple consequent spaces present in CSS selectors, fixes #2670 ([commit](https://github.com/Polymer/polymer/commit/ecddb56)) + +- avoid configuration work when unnecessary ([commit](https://github.com/Polymer/polymer/commit/e0fbfbe)) + +- lazily create effect objects so we can more easily abort processing. avoid forEach ([commit](https://github.com/Polymer/polymer/commit/66df196)) + +- provides support for memoizing pathFn on effect; only process effects/listeners if they exist. ([commit](https://github.com/Polymer/polymer/commit/a2376b6)) + +- memoize pathFn on effect (note: notifyPath change made in previous commit); avoid forEach. ([commit](https://github.com/Polymer/polymer/commit/d93340a)) + +- Avoid using .slice and .forEach ([commit](https://github.com/Polymer/polymer/commit/d2c02a9)) + +- Added support for short unicode escape sequences, fixes #2650 ([commit](https://github.com/Polymer/polymer/commit/2c87145)) + +- Fix for BEM-like CSS selectors under media queries, fixes #2639. Small optimization for produced CSS (empty rules produced semicolon before, now empty string). ([commit](https://github.com/Polymer/polymer/commit/35c89f1)) + +- Fix parsing of custom properties with 'var' in value ([commit](https://github.com/Polymer/polymer/commit/61abfbd)) + +- Clean up cruft. ([commit](https://github.com/Polymer/polymer/commit/59c27fa)) + +- Add tests and fix issues. ([commit](https://github.com/Polymer/polymer/commit/e99e5fa)) + +- dom-repeat chunked/throttled render API ([commit](https://github.com/Polymer/polymer/commit/e9aebd7)) + +- Fix formatting. ([commit](https://github.com/Polymer/polymer/commit/56734a7)) + +- Add notes on running unit tests. ([commit](https://github.com/Polymer/polymer/commit/492f310)) + +- Corrected method name. Fixes #2649. ([commit](https://github.com/Polymer/polymer/commit/5168604)) + +- Fix typos in more efficient array copying. ([commit](https://github.com/Polymer/polymer/commit/53f3a7d)) + +- Adds `Polymer.RenderStatus.afterFirstRender` method. Call to perform tasks after an element first renders. ([commit](https://github.com/Polymer/polymer/commit/71b5c2a)) + +- More efficient array management in Polymer.DomApi. ([commit](https://github.com/Polymer/polymer/commit/320d5c7)) + +- Fixes #2652 ([commit](https://github.com/Polymer/polymer/commit/e35c4e9)) + +- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/0dc69df)) + +- Fix whitespace around bindings. ([commit](https://github.com/Polymer/polymer/commit/d7d0ed6)) + +- Add support for `strip-whitespace`. Should fix #2511. ([commit](https://github.com/Polymer/polymer/commit/35a1b94)) + +- Improve efficiency of attribute configuration. ([commit](https://github.com/Polymer/polymer/commit/f7d86e9)) + +- Remove use of Function.bind ([commit](https://github.com/Polymer/polymer/commit/25aab8b)) + +- fix typos. ([commit](https://github.com/Polymer/polymer/commit/5fb20da)) + +- Re-use data change events. Remove unused/undocumented listener object specific node listening feature. ([commit](https://github.com/Polymer/polymer/commit/8bdedf3)) + +- Add flattened properties to dom-bind, templatizer, optimize by 'liming properties that are protected/private and not readOnly from list. ([commit](https://github.com/Polymer/polymer/commit/2ba08ec)) + +- Use flattened list of properties for fast access during configuration and attribute->property ([commit](https://github.com/Polymer/polymer/commit/acdd242)) + +- Assemble effect strings at prototype time. ([commit](https://github.com/Polymer/polymer/commit/4745e8f)) + +- Fallback to string lookup to fix support for extra effects. ([commit](https://github.com/Polymer/polymer/commit/d3c4611)) + +- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/ead9adb)) + +- Correct NodeList copying. ([commit](https://github.com/Polymer/polymer/commit/1d29e19)) + +- Avoid Polymer.dom.setAttribute when unneeded. ([commit](https://github.com/Polymer/polymer/commit/9c5a404)) + +- More efficient iteration. ([commit](https://github.com/Polymer/polymer/commit/23a9a06)) + +- Avoid forEach ([commit](https://github.com/Polymer/polymer/commit/ebeaf80)) + +- Copy dom NodeList faster than slice. ([commit](https://github.com/Polymer/polymer/commit/8cad475)) + +- Avoid function lookup by string. ([commit](https://github.com/Polymer/polymer/commit/e2674bc)) + +- Add test for parsing multi-line css comments ([commit](https://github.com/Polymer/polymer/commit/6f21ae6)) + +##[v1.2.1](https://github.com/Polymer/polymer/tree/v1.2.1) (2015-10-29) +- Fix test for SD polyfill ([commit](https://github.com/Polymer/polymer/commit/dd8b3e9)) + +- Add pre-condition check for completeness. ([commit](https://github.com/Polymer/polymer/commit/89304dc)) + +- Find non distributed children with deepContains ([commit](https://github.com/Polymer/polymer/commit/8e6f55a)) + +- Ensure outer paths aren't forwarded to instance props. Fixes #2556. ([commit](https://github.com/Polymer/polymer/commit/01273e9)) + +- Add `Polymer.dom.deepContains` ([commit](https://github.com/Polymer/polymer/commit/279bf63)) + +- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/e1f83d2)) + +- isLightDescendant should return false for self ([commit](https://github.com/Polymer/polymer/commit/a0debf4)) + +- Fix for mixins declaration with space before colon. Allow any space character or even `{` and `}` (before and after capturing pattern correspondingly) as pattern boundaries instead of new lines only. In minified sources there might be no space, semicolon or line start, so we need to account that as well. ([commit](https://github.com/Polymer/polymer/commit/883aa5c)) + +##[v1.2.0](https://github.com/Polymer/polymer/tree/v1.2.0) (2015-10-22) +- A simpler travis config ([commit](https://github.com/Polymer/polymer/commit/3338b67)) + +- Fix #2587: When Polymer.dom(el).appendChild(node) is called, cleanup work must be performed on the existing parent of node. This change fixes a missing case in this cleanup work: if the existing parent has a observer via `Polymer.dom(parent).observeNodes`, it needs to be notified that node is being removed even if the node does not have specific logical info. For example, if an observed node has no Shady DOM and has a child that is removed. A test for this case was added. ([commit](https://github.com/Polymer/polymer/commit/0d4f418)) + +- add fancy travis status badge to the readme ([commit](https://github.com/Polymer/polymer/commit/e29fca8)) + +- Do not configure compound property/attribute binding if literal if empty. Fixes #2583. ([commit](https://github.com/Polymer/polymer/commit/ca4724a)) + +- Update .travis.yml ([commit](https://github.com/Polymer/polymer/commit/ef366c5)) + +- Remove web-component-tester cache. ([commit](https://github.com/Polymer/polymer/commit/4ae23ce)) + +- Fix IE10 regressions. Fixes #2582 * Copy attribute list before modifying it * Fall back to document for current document if no currentScript ([commit](https://github.com/Polymer/polymer/commit/ee65e68)) + +- Allow _atEndOfMicrotask to be patchable. ([commit](https://github.com/Polymer/polymer/commit/e2d8446)) + +- contributing copy fixup ([commit](https://github.com/Polymer/polymer/commit/ed22c50)) + +- Update CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/0c21efc)) + +- Add travis config ([commit](https://github.com/Polymer/polymer/commit/6fb7684)) + +- Factor into functions. ([commit](https://github.com/Polymer/polymer/commit/b2117dc)) + +- Fix deepEqual on Safari 9 due to Safari enumeration bug. ([commit](https://github.com/Polymer/polymer/commit/445d603)) + +- ensure distribution observers see all changes that can come from attributes under native Shadow DOM; +minor factoring ([commit](https://github.com/Polymer/polymer/commit/344f5cc)) + +- Add .getDistributedNodes observation. Refactor flush. ([commit](https://github.com/Polymer/polymer/commit/8b1face)) + +- Add docs ([commit](https://github.com/Polymer/polymer/commit/0ede79a)) + +- Make shadow attribute tracking automatic based on detecting a that depends on attributes; add tests. ([commit](https://github.com/Polymer/polymer/commit/54911a7)) + +- Add comments. ([commit](https://github.com/Polymer/polymer/commit/758c483)) + +- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/74a87a0)) + +- Replace _compoundInitializationEffect with statically-initialized literals in the template for attributes & textContent, and by configuring literal values of properties in _configureAnnotationReferences. ([commit](https://github.com/Polymer/polymer/commit/2f1bd31)) + +- Simplify change tracking by always dirty checking at the observer level. Under Shadow DOM, use a deep MO to watch for attributes. ([commit](https://github.com/Polymer/polymer/commit/669acaa)) + +- Fix URL to component.kitchen ([commit](https://github.com/Polymer/polymer/commit/d9af504)) + +- Update the Google+ community link ([commit](https://github.com/Polymer/polymer/commit/c6684e5)) + +- Fixes from review. ([commit](https://github.com/Polymer/polymer/commit/a300862)) + +- Remove compound binding limitation from primer. ([commit](https://github.com/Polymer/polymer/commit/b1c1b35)) + +- Exclude compound bindings from configure; revisit later. ([commit](https://github.com/Polymer/polymer/commit/1035e2d)) + +- Apply effect value from compound parts. ([commit](https://github.com/Polymer/polymer/commit/c30ac10)) + +- Store binding parts in notes. ([commit](https://github.com/Polymer/polymer/commit/1026498)) + +- Fix missing var ([commit](https://github.com/Polymer/polymer/commit/68edb83)) + +- Add radix for correctness. ([commit](https://github.com/Polymer/polymer/commit/a79f012)) + +- Separate public & private get, flip conditions, add notifyPath API. ([commit](https://github.com/Polymer/polymer/commit/97503ec)) + +- Fix typo in comments. ([commit](https://github.com/Polymer/polymer/commit/e59dbef)) + +- Improvements to path API. Fixes #2509. * Allows `set` to take paths with array #keys * Allows `notifyPath` to take paths with array indices * Exposes public notifySplices API ([commit](https://github.com/Polymer/polymer/commit/10021cc)) + +- Fix merge issue. ([commit](https://github.com/Polymer/polymer/commit/85c23e1)) + +- Denote keys with # to disambiguate from index. Fixes #2007. ([commit](https://github.com/Polymer/polymer/commit/85d8a3a)) + +- update CHANGELOG to 1.1.5 ([commit](https://github.com/Polymer/polymer/commit/b2b23c4)) + +- make tests work on polyfill. ([commit](https://github.com/Polymer/polymer/commit/9ff2ee4)) + +- add `observeNodes` tests. ([commit](https://github.com/Polymer/polymer/commit/bd90b57)) + +- Add optional attribute tracking to support better distributed node notifications under shadow dom. ([commit](https://github.com/Polymer/polymer/commit/8242a98)) + +- Add `Polymer.dom().notifyObservers` method to 'kick' observers, for example, when attributes change under Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/07261e4)) + +- Add mutation tracking for distributedNodes. ([commit](https://github.com/Polymer/polymer/commit/b11f86b)) + +- Factor dom-api's into separate helpers. ([commit](https://github.com/Polymer/polymer/commit/effedcb)) + +- Adds `Polymer.dom(element).observeChildren(callback)` api ([commit](https://github.com/Polymer/polymer/commit/6499e83)) + +- Adds `getEffectiveChildNodes`, `getEffectiveChildren`, `getEffectiveTextContent` ([commit](https://github.com/Polymer/polymer/commit/f34fb45)) + +##[v1.1.5](https://github.com/Polymer/polymer/tree/v1.1.5) (2015-10-08) +- Simplify ([commit](https://github.com/Polymer/polymer/commit/79dfe1f)) + +- Clean up templatizer _pathEffectorImpl. ([commit](https://github.com/Polymer/polymer/commit/1a89bcf)) + +- Add issue link. ([commit](https://github.com/Polymer/polymer/commit/e4c2433)) + +- Missing var keyword ([commit](https://github.com/Polymer/polymer/commit/45fcbcf)) + +- Make sure we only actually call _listen once ([commit](https://github.com/Polymer/polymer/commit/837e9b8)) + +- Add templatizer tests. Fix issues from tests. ([commit](https://github.com/Polymer/polymer/commit/2d97cd7)) + +- Use 'value' in place of 'object' when referring to detail. ([commit](https://github.com/Polymer/polymer/commit/f17be35)) + +- Allow any type, not just objects, as the detail for fire. ([commit](https://github.com/Polymer/polymer/commit/ec59f57)) + +- Make model param of stamp method optional. ([commit](https://github.com/Polymer/polymer/commit/a2e1e64)) + +- add test to ensure unlisten events do not fire ([commit](https://github.com/Polymer/polymer/commit/bf2f694)) + +- add tests ([commit](https://github.com/Polymer/polymer/commit/900d82b)) + +- Only one real listener per `listen` call ([commit](https://github.com/Polymer/polymer/commit/8bd380a)) + +- add util method for shadow children ([commit](https://github.com/Polymer/polymer/commit/1e9110a)) + +- Add notify-path API to templatized template. Fixes #2505. ([commit](https://github.com/Polymer/polymer/commit/2e086fe)) + +- Parent property values should come from template. Fixes #2504. ([commit](https://github.com/Polymer/polymer/commit/23c883b)) + +- Added note about including a clear repro case. ([commit](https://github.com/Polymer/polymer/commit/e18f009)) + +- added request to submit an issue before sending a PR ([commit](https://github.com/Polymer/polymer/commit/6ed836f)) + +- update CHANGELOG to 1.1.4 ([commit](https://github.com/Polymer/polymer/commit/c2b7c31)) + +##[v1.1.4](https://github.com/Polymer/polymer/tree/v1.1.4) (2015-09-25) +- :memo: Update description ([commit](https://github.com/Polymer/polymer/commit/6afb8be)) + +- :art: Use npm command bin lookup ([commit](https://github.com/Polymer/polymer/commit/84258d4)) + +- :grapes: Add missing test dependency ([commit](https://github.com/Polymer/polymer/commit/5726b8e)) + +- Reset handlers queue after finished replaying events ([commit](https://github.com/Polymer/polymer/commit/76a5f17)) + +- Update the README.md to Polymer 1.1 ([commit](https://github.com/Polymer/polymer/commit/40c455a)) + +- Add note on arrayDelete with array vs. path ([commit](https://github.com/Polymer/polymer/commit/d2b71a5)) + +- Add unlinkPath tests. ([commit](https://github.com/Polymer/polymer/commit/bee110b)) + +- Update changelog ([commit](https://github.com/Polymer/polymer/commit/573ca29)) + +- Remove dead code; add tests. ([commit](https://github.com/Polymer/polymer/commit/ab85884)) + +- Allow multiple paths to be linked using linkPath. Fixes #2048 ([commit](https://github.com/Polymer/polymer/commit/b221dbe)) + +- Fix docs for stamp method ([commit](https://github.com/Polymer/polymer/commit/8adbe60)) + +- http to https for jsbin ([commit](https://github.com/Polymer/polymer/commit/d842435)) + +- Typo ([commit](https://github.com/Polymer/polymer/commit/d558c0d)) + +- Fix typos in PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/cf793f4)) + +##[v1.1.3](https://github.com/Polymer/polymer/tree/v1.1.3) (2015-09-04) +- Fixes #2403 ([commit](https://github.com/Polymer/polymer/commit/a6694b7)) + +- Only try to decrement gesture dependency counter if dependency exists ([commit](https://github.com/Polymer/polymer/commit/8886e8c)) + +- update changelog with v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/d3a7c93)) + +- prepare v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/e78be4f)) + +##[v1.1.2](https://github.com/Polymer/polymer/tree/v1.1.2) (2015-08-28) +- Improve composed parent tracking. ([commit](https://github.com/Polymer/polymer/commit/4d15789)) + +- move the mixing-in of behaviors so that it happens before `register` behaviors are invoked ([commit](https://github.com/Polymer/polymer/commit/637367c)) + +- Fixes #2378 ([commit](https://github.com/Polymer/polymer/commit/a9f081b)) + +- Fixes #2356: issue a warning and don't throw an exception when a style include cannot be found. Fixes #2357: include data now comes before any textContent in a style element. ([commit](https://github.com/Polymer/polymer/commit/a16ada1)) + +- remove unneeded protection code for extends. ([commit](https://github.com/Polymer/polymer/commit/8eada87)) + +- Add test ([commit](https://github.com/Polymer/polymer/commit/47ff0e8)) + +- add test for `registered` behavior affecting a value then used by features ([commit](https://github.com/Polymer/polymer/commit/230528c)) + +- add tests for new Polymer() argument support (and make Base tests aware of new abstract method `_desugarBehaviors`) ([commit](https://github.com/Polymer/polymer/commit/9734a3a)) + +- invoke `registration` behavior before registering features, so behaviors can alter features, this requires calling behavior flattening as part of prototype desugaring instead of as part of behavior prep, so the flattened list is available early ([commit](https://github.com/Polymer/polymer/commit/6224dc3)) + +- do `registered` behaviors before invoking `registerFeatures` so `registered` can affect properties used by features (ref #2329) ([commit](https://github.com/Polymer/polymer/commit/61d611c)) + +- specifically create `Polymer` object on `window` to satisfy strict mode (fixes #2363) ([commit](https://github.com/Polymer/polymer/commit/a75133d)) + +- Remove forceUpgraded check in dom-module.import ([commit](https://github.com/Polymer/polymer/commit/b85b641)) + +- Fixes #2341: branch Polymer.dom to use native dom methods under Shadow DOM for: appendChild, insertBefore, removeChild, replaceChild, cloneNode. ([commit](https://github.com/Polymer/polymer/commit/9b1f706)) + +- Fixes #2334: when composing nodes in shady dom, check if a node is where we expect it to be before removing it from its distributed position. We do this because the node may have been moved by Polymer.dom in a way that triggered distribution of its previous location. The node is already where it needs to be so removing it from its parent when it's no longer distributed is destructive. ([commit](https://github.com/Polymer/polymer/commit/4ea69c2)) + +- use cached template annotations when possible ([commit](https://github.com/Polymer/polymer/commit/b0733d3)) + +- fix comment typos ([commit](https://github.com/Polymer/polymer/commit/a0a3e0c)) + +- Update changelog with v1.1.1 release ([commit](https://github.com/Polymer/polymer/commit/12fa867)) + +##[v1.1.1](https://github.com/Polymer/polymer/tree/v1.1.1) (2015-08-20) +- Fixes #2263: ensure custom-style can parse variable definitions in supported selectors (e.g. /deep/) without exception due to unknown css. ([commit](https://github.com/Polymer/polymer/commit/894492b)) + +- Fixes #2311, #2323: when elements are removed from their previous position when they are added elsewhere, make sure to remove them from composed, not logical parent. ([commit](https://github.com/Polymer/polymer/commit/3d93116)) + +- Update Changelog ([commit](https://github.com/Polymer/polymer/commit/039ef93)) + +- Add selectedItem property ([commit](https://github.com/Polymer/polymer/commit/d65acd0)) + +- Add test for large splice ([commit](https://github.com/Polymer/polymer/commit/c967583)) + +- Use numeric sort when removing dom-repeat instances ([commit](https://github.com/Polymer/polymer/commit/fccbd8a)) + +- Fixes #2267: properly find dom-module for mixed case elements ([commit](https://github.com/Polymer/polymer/commit/76c58b8)) + +- Fixes #2304: avoid trying to read style data from imports that did not load. ([commit](https://github.com/Polymer/polymer/commit/0d1f206)) + +- Avoid saving logical info on parent when a content is added inside a fragment + slight factoring. ([commit](https://github.com/Polymer/polymer/commit/36072be)) + +- Fixes #2276: avoid losing logical information and simplify logical tree handling ([commit](https://github.com/Polymer/polymer/commit/ee61627)) + +- Moved check earlier. Added test for negative literal. ([commit](https://github.com/Polymer/polymer/commit/1a87ab4)) + +- Fixes #2253: refine logical tree check and populate parents of insertion points with logical info only if necessary. Fixes #2283: when a node is removed, we need to potentially distribute not only its host but also its parent. ([commit](https://github.com/Polymer/polymer/commit/6619f6c)) + +- Support for negative numbers in computed bindings ([commit](https://github.com/Polymer/polymer/commit/fc53f50)) + +##[v1.1.0](https://github.com/Polymer/polymer/tree/v1.1.0) (2015-08-13) +- Add comment. ([commit](https://github.com/Polymer/polymer/commit/337b54a)) + +- Add tests for key splice fix. ([commit](https://github.com/Polymer/polymer/commit/4bc055b)) + +- Fixes #2251: resolve imported stylesheets against correct document. ([commit](https://github.com/Polymer/polymer/commit/68af666)) + +- Reduce keySplices to minimum change set before notifying. Fixes #2261 ([commit](https://github.com/Polymer/polymer/commit/f74d072)) + +- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/7497729)) + +- Add logical info iff an element being added is an insertion point; do not add logical info for any element in a shady root. ([commit](https://github.com/Polymer/polymer/commit/45cb150)) + +- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/d55be7d)) + +- Fixes #2235. Manages logical information in shady distribution more directly by capturing it explicitly when needed and not whenever distribution is run. ([commit](https://github.com/Polymer/polymer/commit/21500fb)) + +- ensure path fixup is applied correctly to styles in templates. ([commit](https://github.com/Polymer/polymer/commit/b22f3cd)) + +- Based on feedback, change `module` to `include` in custom-style and dom-module style marshaling. ([commit](https://github.com/Polymer/polymer/commit/f469129)) + +- Document custom-style module property. ([commit](https://github.com/Polymer/polymer/commit/398d9f7)) + +- Add comment. ([commit](https://github.com/Polymer/polymer/commit/4e640c7)) + +- Add tests and require `module` to be on `style` elements. ([commit](https://github.com/Polymer/polymer/commit/58d3c3b)) + +- `custom-style` supports `module` property that accepts a `dom-module` containing style data. `don-module` style data may be specified inside `